=================================================================== RCS file: /cvs/pta/pta_import.pl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- pta/pta_import.pl 2020/11/01 20:12:08 1.2 +++ pta/pta_import.pl 2020/11/02 19:36:53 1.3 @@ -16,66 +16,55 @@ use warnings; use strict; -use autodie; -# Please change the account numbers below to match the -# desired accounts in your accounts.txt. - -my %accounts = ( - CHASE_CREDIT_CARD => '1234', - CHASE_PAYMENT_ACCOUNT => '5678', - AUTO => '1111', - BILLS => '2222', - FEES => '3333', - FOOD => '4444', - GAS => '5555', - GIFTS => '6666', - GROCERIES => '7777', - HEALTH => '8888', - HOME => '9999', - PERSONAL => '9998', - PRO => '9997', - SHOP => '9996' -); - -# This is the end of the user-configurable section. - # === SUBROUTINES ===================================================== -sub import_chase_credit_card() { - my %categories = ( - 'Automotive' => 'AUTO', - 'Bills & Utilities' => 'BILLS', - 'Fees & Adjustments' => 'FEES', - 'Food & Drink' => 'FOOD', - 'Gas' => 'GAS', - 'Gifts & Donations' => 'GIFTS', - 'Groceries' => 'GROCERIES', - 'Health & Wellness' => 'HEALTH', - 'Home' => 'HOME', - 'Personal' => 'PERSONAL', - 'Professional Services' => 'PRO', - 'Shopping' => 'SHOP' - ); +sub import_chase_credit_card { + my $csv_account = "1234"; # DEBUG. hard-coded for now + my $fn = 'import_chase_credit.txt'; + my (@compiled, %bookings, %accounts); + open my $in, $fn or die "$fn: $!"; + while (<$in>) { + chomp; + next if /^(?:#|$)/; + my $line = $_; + s/^(.*),\s+(\d+)\s+(\S+)// or + die "$fn import parse error: $line"; + my ($reg, $account, $booking) = ($1, $2, $3); + $reg =~ s/,,/,.*?/g; + $reg = qr/$reg/; + push @compiled, $reg; + $bookings{$reg} = $booking; + $accounts{$reg} = $account; + } + close $in; while (<>) { chomp; + s#(\d+)/(\d+)/(\d+)#$3$1$2#g; + my $line = $_; my ($trans_date, $post_date, $description, $category, $type, $amount) = split /,/; - - $trans_date =~ s#(\d+)/(\d+)/(\d+)#$3$1$2#; - $post_date =~ s#(\d+)/(\d+)/(\d+)#$3$1$2#; $description =~ s/#//g; - my $booking = $categories{$category} || - 'CHASE_PAYMENT_ACCOUNT'; - my $contra = $accounts{$booking}; my ($debit, $credit); + my $booking = ""; + my $account = ""; + foreach my $regex (@compiled) { + if ($line =~ /$regex/) { + $account = $accounts{$regex}; + $booking = $bookings{$regex}; + next; + } + } + if ($booking eq "" || $account eq "") { + die "$fn import parse error: $line"; + } if ($amount <= 0) { $amount = substr $amount, 1; - $credit = $accounts{CHASE_CREDIT_CARD}; - $debit = $contra; + $credit = $csv_account; + $debit = $account; } else { - $debit = $accounts{CHASE_CREDIT_CARD}; - $credit = $contra; + $debit = $csv_account; + $credit = $account; } print "$post_date $booking $debit $credit $amount " . "$description\n"; @@ -84,13 +73,12 @@ sub import_chase_credit_card() { # === MAIN PROGRAM ===================================================== -my $chase_credit_card_header = "Transaction Date,Post Date," . +my ($chase_credit_card_header, $firstLine); +$chase_credit_card_header = "Transaction Date,Post Date," . "Description,Category,Type,Amount"; -my $firstLine; - chomp($firstLine = <>); if ($firstLine eq $chase_credit_card_header) { import_chase_credit_card; } else { - print "Undefined bank header\n"; + print "Undefined header\n"; }