[BACK]Return to pta_import.pl CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / pta

File: [cvsweb.bsd.lv] / pta / pta_import.pl (download)

Revision 1.1, Sat Oct 31 01:02:57 2020 UTC (5 weeks ago) by schwarze
Branch: MAIN

Helper script to convert CSV files received from banks
to journal entries, supporting the Chase CSV format for now.
Designed and implemented by Freda Bundchen, work in progress.

#!/usr/bin/perl 

# Copyright (c) 2020 Freda Bundchen

# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

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'
	);
	while (<CSV>) {
		chomp;
		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);
		if ($amount <= 0) {
			$amount = substr $amount, 1;
			$credit = $accounts{CHASE_CREDIT_CARD};
			$debit = $contra;
		} else {
			$debit = $accounts{CHASE_CREDIT_CARD};
			$credit = $contra;
		}
		print "$post_date $booking $debit $credit $amount " .
		    "$description\n";
	}
}

# === MAIN PROGRAM =====================================================

my $chase_credit_card_header = "Transaction Date,Post Date," .
    "Description,Category,Type,Amount";
my $firstLine;

open CSV, '<', $ARGV[0];
chomp($firstLine = <CSV>);
if ($firstLine eq $chase_credit_card_header) {
	import_chase_credit_card;
} else {
	print "Undefined bank header\n";
}
close CSV;