#!/usr/bin/perl
#  trimold.pl - move all cleared transactions to date out of account file.
#
#  warning:  This program is rather slow ... but hey, you only have
#            to run it occasionally and it gives the impression that
#            it is really working hard. :)
#
#  Written by Lionel Mallet (with pieces from Curtis Olson).
#
#  Copyright (C) 1997  Lionel Mallet  - l.mallet@gr.opengroup.org
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

# $Id: trimold.pl,v 2.2 1997/07/04 14:24:42 curt Exp $
# (Log is kept at end of this file)

package CBB;

use strict;

my($account, $base_account, $old_account, $olddir, %CL_TRANS);
my($description, $comment, $todate, $vst_category, $running_balance);
my($new_debit, $new_credit, $new_trans, $response, $result, $arg);
my($key, $date, $check, $desc, $debit, $credit, $cat, $com, $cleared, $total);
my($niceto, $last_date, $month, $day, $year);

# specify the installed location of the necessary pieces.
$CBB::cbb_incl_dir = "/usr/X11R6/lib/X11/cbb";
unshift(@INC, $CBB::cbb_incl_dir);

require "categories.pl";
require "engine.pl";
require "memorized.pl";
require "common.pl";

(($#ARGV >= 4) && ($#ARGV <= 6)) || 
    die "Usage: trimold.pl account -to mm/dd/[yy]yy -cat vst_category [ -d 
old_dir ]";

$account = shift(@ARGV);
$base_account = &file_basename($account);
$olddir = ".";
%CL_TRANS = {};
$running_balance = 0.0;
$description = "Balance";
$comment = "Trimmed";

while ($#ARGV >= 0) {
    $arg = shift(@ARGV);
    if ( substr($arg, 0 , 1) eq "-" ) {
	if ( $arg eq "-to" ) {
	    $niceto = shift(@ARGV);
	    
	    my($month, $day, $year) = split(/\//, $niceto);
	    $month = &pad($month);
	    $day = &pad($day);
	    if ( defined($year) ) {
		$year = &pad($year);
	    } else {
		$year = $CBB::cur_year;
	    }
	    $year = &pad($year);
	    if ( length($year) == 2 ) {
		$year = &century() . "$year";
	    }
	    $todate = "$year" . "$month" . "$day";
	} elsif ( $arg eq "-d" ) {
	    $olddir = shift(@ARGV);
	} elsif ( $arg eq "-cat" ) {
	    $vst_category = shift(@ARGV);
	}
    }
}

# check arguments
( defined($todate) && defined($vst_category) ) ||
    die "Usage: trimold.pl account -to mm/dd/[yy]yy -cat vst_category [ -d 
old_dir ]";

$old_account = $olddir."/".&file_root($base_account)."_".
    $todate.".".&file_extension($base_account);

print "Trimming up to ".&fmt_date($todate)." into $old_account.\n\n";
print "This program will MOVE all cleared transactions to date from\n";
print "the specified account to the specified export file. These\n";
print "transactions WILL BE DELETED from the specified account.\n";
print "You are strongly encouraged to make BACKUPS of all your data\n";
print "before attempting to do this.\n\n";
print "Do you wish to continue?  (yes/no) ";

$response = <STDIN>;

if ( $response =~ m/yes/i ) {
    print "Ok, continuing...";
} else {
    die "Bailing out ... nothing was done to your data.\n";
}


(&load_trans($account) eq "ok") || die "\nCannot open account:  $account";

$result = &first_trans();
while ( $result ne "none" ) {
    my($key, $date, $check, $desc, $debit, $credit, $cat, $com, $cleared,
     $total) = split(/\t/, $result);

    last if ($date > $todate);
    if ( $cleared ne "x" ) {
	print "\nFound uncleared transaction on ".&fmt_date($date).
	    ", won't go further!\n";
	last;
    }

    # keep some info
    $running_balance = $running_balance + $credit - $debit;
    $last_date = $date;

    $CL_TRANS{$key} = $CBB::TRANS{$key};
    print ".";

    # these two lines should be in that order or we may miss one transaction!!!
    $result = &next_trans();
    &delete_trans($key);
}

# create transaction to restore current balance
if ($running_balance < 0) {
    $new_debit = $running_balance * -1;
    $new_credit  = 0.00;
} else {
    $new_debit = 0.00;
    $new_credit = $running_balance;
}

# create new transaction to restore running balance
$new_trans = "$last_date\t\t$description (".&fmt_date($last_date).")\t".
    sprintf("%.2f", $new_debit)."\t".sprintf("%.2f", $new_credit).
    "\t$vst_category\t$comment\tx\t".sprintf("%.2f", $running_balance);
&create_trans($new_trans);

(&save_trans("$account") eq "ok") || die "Cannot save account:  $account";

# now create old transaction account
&init_trans;
%CBB::TRANS = %CL_TRANS;
(&save_trans("$old_account") eq "ok") || 
    die "Cannot save account:  $old_account";

print "Done.\n";

sub fmt_date {
    my($raw_date) = @_;
    my($year) = substr($raw_date, 2, 2);
    my($month) = substr($raw_date, 4, 2);
    my($day) = substr($raw_date, 6, 2);

    return("$month/$day/$year");
}
    
# ----------------------------------------------------------------------------
# $Log: trimold.pl,v $
# Revision 2.2  1997/07/04 14:24:42  curt
# Lionel Mallet upgraded to run in perl's strict mode.
#
# Revision 2.1  1997/05/07 01:17:50  curt
# Added contrib script "trimold.pl"
#
