version 1.25, 2020/11/29 14:00:50 |
version 1.27, 2020/11/30 16:22:36 |
|
|
"wellsfargo" => \&import_wellsfargo, |
"wellsfargo" => \&import_wellsfargo, |
); |
); |
|
|
|
my %date_formats = ( |
|
'MM/DD/YYYY' => 's#(\d+)/(\d+)/(\d+)#$3$1$2#', |
|
'MM/DD/YY' => 's#(\d+)/(\d+)/(\d+)#20$3$1$2#', |
|
'YYYY-MM-DD' => 's#(\d+)-(\d+)-(\d+)#$1$2$3#', |
|
'DD.MM.YY' => 's#(\d+)\.(\d+)\.(\d+)#20$3$2$1#', |
|
); |
|
|
# === SUBROUTINES ===================================================== |
# === SUBROUTINES ===================================================== |
sub get_accounts_by_amount_sign ($$$) { |
|
my ($amount, $account, $csv_account) = @_; |
|
my ($debit, $credit); |
|
if ($amount <= 0) { |
|
$amount = substr $amount, 1; |
|
$credit = $csv_account; |
|
$debit = $account; |
|
} else { |
|
$debit = $csv_account; |
|
$credit = $account; |
|
} |
|
return ($amount, $debit, $credit); |
|
} |
|
|
|
sub get_accounts_by_csv_col ($$$$) { |
|
my ($account, $csv_account, $csv_debit, $csv_credit) = @_; |
|
my ($amount, $debit, $credit); |
|
if ($csv_debit eq "") { |
|
$amount = $csv_credit; |
|
$credit = $account; |
|
$debit = $csv_account; |
|
} else { |
|
$amount = $csv_debit; |
|
$credit = $csv_account; |
|
$debit = $account; |
|
} |
|
return ($amount, $debit, $credit); |
|
} |
|
|
|
sub usage () { |
sub usage () { |
printf STDERR "usage: %s -I accountname csvfilename\n", $0; |
printf STDERR "usage: %s -I accountname csvfilename\n", $0; |
exit 1; |
exit 1; |
Line 80 $banks{$account_name} or die "unknown accountname: $ac |
|
Line 59 $banks{$account_name} or die "unknown accountname: $ac |
|
# Parse the configuration file. |
# Parse the configuration file. |
my $fn = "import/" . $account_name . ".txt"; |
my $fn = "import/" . $account_name . ".txt"; |
open my $in, '<', $fn or die "$fn: $!"; |
open my $in, '<', $fn or die "$fn: $!"; |
my ($cost_center_field, $csv_account, $date_field, $date_format, |
my ($cost_center_field, $csv_account, $date_field, $date_regex, |
$delim, $header, $quantity_field, $quote, @amount_fields, |
$delim, $header, $quantity_field, $quote, @amount_fields, |
@compiled, @description_fields, @ignored); |
@compiled, @description_fields, @ignored); |
while (<$in>) { |
while (<$in>) { |
|
|
} |
} |
if (/^DATE\s+(\d+)\s+(\S+)/) { |
if (/^DATE\s+(\d+)\s+(\S+)/) { |
$date_field = $1 - 1; |
$date_field = $1 - 1; |
$date_format = $2; |
$date_regex = $date_formats{$2} |
|
or die "unknown date format: $2"; |
next; |
next; |
} |
} |
if (/^DELIM\s+(\S)$/) { |
if (/^DELIM\s+(\S)$/) { |
Line 188 LINE: while (<STDIN>) { |
|
Line 168 LINE: while (<STDIN>) { |
|
$matches or die "unmatched CSV line: $line"; |
$matches or die "unmatched CSV line: $line"; |
my $date = $fields[$date_field] or |
my $date = $fields[$date_field] or |
die "date parse error: $line"; |
die "date parse error: $line"; |
if ($date_format eq "MM/DD/YYYY") { |
eval '$date =~ ' . $date_regex; |
$date =~ s#(\d+)/(\d+)/(\d+)#$3$1$2#; |
|
} elsif ($date_format eq "MM/DD/YY") { |
|
$date =~ s#(\d+)/(\d+)/(\d+)#20$3$1$2#; |
|
} elsif ($date_format eq "YYYY-MM-DD") { |
|
$date =~ s#(\d+)-(\d+)-(\d+)#$1$2$3#; |
|
} elsif ($date_format eq "DD.MM.YY") { |
|
$date =~ s#(\d+)\.(\d+)\.(\d+)#20$3$2$1#; |
|
} else { |
|
die "unhandled date format: $line"; |
|
} |
|
foreach my $i (@amount_fields) { |
foreach my $i (@amount_fields) { |
if (defined($fields[$i])) { |
if (defined($fields[$i])) { |
$fields[$i] =~ s/,/./; |
$fields[$i] =~ s/,/./; |
Line 206 LINE: while (<STDIN>) { |
|
Line 176 LINE: while (<STDIN>) { |
|
$fields[$i] = "-$1" if $fields[$i] =~ /^\((\d+\.\d+)\)/; |
$fields[$i] = "-$1" if $fields[$i] =~ /^\((\d+\.\d+)\)/; |
} |
} |
} |
} |
my $description = join ' ', @fields[@description_fields]; |
my $debit = $csv_account; |
my ($amount, $credit, $debit); |
my $credit = $account; |
if ($#amount_fields) { |
my $amount = $fields[$amount_fields[-1]] || -$fields[$amount_fields[0]]; |
($amount, $debit, $credit) = |
if ($amount < 0) { |
get_accounts_by_csv_col($account, |
$amount *= -1; |
$csv_account, $fields[$amount_fields[0]], |
$credit = $csv_account; |
$fields[$amount_fields[1]]); |
$debit = $account; |
} else { |
|
($amount, $debit, $credit) = |
|
get_accounts_by_amount_sign( |
|
$fields[$amount_fields[0]], |
|
$account, $csv_account); |
|
} |
} |
|
$amount = sprintf "%.2f", $amount; |
|
my $description = join ' ', @fields[@description_fields]; |
$date && $amount && $debit && $credit && $description |
$date && $amount && $debit && $credit && $description |
or die "import parse error: $line"; |
or die "import parse error: $line"; |
$description =~ s/#//g; |
$description =~ s/#//g; |