Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

SimpleMoney

by Fingo (Monk)
on Mar 05, 2001 at 02:17 UTC ( #62136=sourcecode: print w/ replies, xml ) Need Help??

Category: Miscellaneous
Author/Contact Info Maxim Veytsman Email:maxim@bilbo.dynip.com /msg Fingo
Description: SimpleMoney is a quick and *simple* program to manage your funds. Currently it allows simple transaction, but I am planing on a reoccuring transaction feature. Other planed features include an ability to output a gnuplot readable file to draw graphs, the possibility of an optional tk gui, and (distant future) a sort of small scripting language to write more complex things (manage taxes anyone? ;) I want this program while containing many features to still not bog down the user and allow normal things without forcing the user to learn too much.
#!/usr/bin/perl -w
# Please run with -h for help
# Please run with -c for configuration (first time)
use strict;
# use Date::Calc; -- for later
my ($i, %conf);
CheckArg(@ARGV) if @ARGV;
die "file simplemoney.conf does not exist, please run -c to configure\
+n" unless (-e "simplemoney.conf"); #check for existance of configurat
+ion file

open (RCONF, "simplemoney.conf")  || die "Could not open simplemoney.c
+onf $!";

foreach ("rt", "balance", "transaction"){ #load config variables into 
+a hash
    chomp ($conf{$_} = <RCONF>);
}
close (RCONF) || die "Could not close simplemoney.conf $!"; 
unless (-e $conf{rt} && -e $conf{balance} && -e $conf{transaction}) { 
+ 
   die "One of the required files is missing, please run with -c to co
+nfigure\n";
}
while (1) {
    my ($command, $arg1, $arg2);
    print "Your command (help for list of commands):\n";
    chomp ($command = <STDIN>);
    if ($command =~ /^balance/) {
     print CalcBalance($conf{balance});
    } elsif ($command =~ /^help/i) {
    PrintHelp();
    } elsif ($command =~ /^deposit/i) {
    (undef, $arg1, $arg2) = split (/\s+/, $command); 
    CalcBalance($conf{balance},$arg1);
    AddTransaction($conf{transaction},$arg2);
    } elsif ($command =~ /^withdraw/i) {
    (undef, $arg1, $arg2) = split (/\s+/, $command); 
    $arg1 = -$arg1;
    CalcBalance($conf{balance},$arg1);
    AddTransaction($conf{transaction},$arg2);
    } elsif ($command =~ /^rt/i) {
    print "RT is not yet supported.";
    } elsif ($command =~ /^exit/i || $command =~ /^quit/i || $command 
+=~ /^e/i || $command =~ /^q/i) {
    exit 0;
    } else { #must be undefined command, try again.
    print "\nBad Command\n";
    next;
    }
}



###Subs### 

sub PrintHelp {
print "This program calculates your money balance, please run with the
+ -c flag to configure.\n";
        print "Flags:\n";
        print "     -c -- Configure\n";
        print "     -h -- This file\n";
        print "Default Files:\n";
        print "     rt.log -- Reocuring transaction configuration\n";
        print "     balance.log -- Backlog of user's balance\n";
        print "     transaction.log -- Backlog of transaction descript
+ions\n";
        print "     Configuration File: simplemoney.conf\n";
        
print "Commands:\n";
    print "      help -- show this file.\n";
    print "      deposit <arg1> <arg2> -- deposit <arg1> dollars with 
+<arg2> description in the log.\n";
    print "      withdraw <arg1> <arg2> -- same as above, but withdraw
+.\n";
    print "      rt -- not yet supported.\n";  
    print "      exit, quit, e, or q -- quit the program.\n";         
+ 
print "Note: running deposit or withdraw with no arguments will do not
+hing, running with only a value will print 'this description is inten
+tionaly left blank' in balance.log\n"  
}

sub CheckArg {
    my $rargs = (shift @_);
    my $arg;
    foreach ($rargs) {
    if ($_ =~ /^-h/) {
        PrintHelp();
        exit 0;
    }
    elsif ($_ =~ /^-c/) {
        Configure();
    }
    else { #must be an undefined option
        die"Undefined Option: Please run the program with the -h flag 
+for help\n";
    }
    }

}
sub Configure {
    my ($rt, $balance, $transaction);
    print "Welcome, please follow the instructions to configure this p
+rogram (this will overwrite your current configuration)\n";
   
    print "Reoccuring transaction file (rt.log by default)?";
    chomp ($rt = <STDIN>);
    $rt        = "rt.log" unless ($rt); #assumes default if user gave 
+no input.
    open  (WRT, ">$rt");
    close (WRT);
    
    print "Balance file (balance.log by default)";
    chomp ($balance = <STDIN>);
    $balance = "balance.log" unless ($balance); #assumes default if us
+er gave no input.
    open  (WBALANCE, ">$balance") || die "could not open balance.log $
+!";
    print WBALANCE "0\n";
    close (WBALANCE) || die "could not close balance.log $!";
    
    print "Transaction file (transaction.log by default)";
    chomp ($transaction = <STDIN>);
    $transaction = "transaction.log" unless ($transaction); #assumes d
+efault if user gave no input.
    open  (WTRANSACTION, ">$transaction") || die "could not open trans
+action.log $!";
    print WTRANSACTION "start\n";
    close (WTRANSACTION) || die "could not close transaction.log $!";

    #write everything into configuration file
    open  (WCONF, ">simplemoney.conf") || die "could not open simplemo
+eny.conf $!";
    print WCONF "$rt\n$balance\n$transaction";
    close (WCONF) || die "could not close simplemoney.conf $!";
}

sub CalcBalance {
    my ($balance, @log);
    my  $location = shift(@_);
    open (RBALANCE, $location) || die "Can't open $location $!";
    @log = <RBALANCE>;
    close (RBALANCE) || die "Can't close $location $!";
    $balance = $log[-1];
    if ($_[0]) {     # we check to see if there is another 
                                  # argument (the amount to change) an
+d 
                                  # it is not 0.
    my $toChange = shift(@_);     # we only declare this if another 
                                  # argument exists to make the test 
                                  # above work. 
    $balance += $toChange;
    open (WBALANCE, ">>$location") || die "Can't open $location $!";
    print WBALANCE "$balance\n";
    close (WBALANCE) || die "Can't close $location $!";
    }
    return $balance;
}

sub AddTransaction {
    my ($location) = shift(@_); 
    my ($description) = shift(@_) || "This description is intentionaly
+ left blank";
    open (WTRANSACTION, ">>$location") || die "Can't open $location $!
+";
    print WTRANSACTION "$description\n";
    close (WTRANSACTION) || die "Can't close $location $!";

}

Comment on SimpleMoney
Download Code
Replies are listed 'Best First'.
Re: SimpleMoney
by Fingo (Monk) on Mar 05, 2001 at 09:02 UTC
    I have been told that it does not work under windows. Can any windows using Monks please tell me what errors they get if they have any. I sadly don't have the means to test under windows :(
    Thus Spake the Master Programmer: 
    "After three days without programming, life becomes meaningless." 
        ---Tao of Programing
    
    UPDATE: The problem has now been resolved, they had recived a corrupt version of the code.
Re: SimpleMoney
by bladx (Chaplain) on Mar 05, 2001 at 07:07 UTC
    Hi there Fingo!

    This is one cool program that as stated before in the description is a great simple Perl code piece of goodness that helps you manage your funds and so on. It is a very practical program compared to a few of the past programs in this section ^_^ (no offense...)! It's also cool that you have some future plans for this somewhat simple program as well, such as including a graphing/chart type of deal as well, which will be a nice touch if it gets added in later. Last but not least, it's also intuitive to make sure not to create too steep of a learning curve as you continue upgrading the program and such, otherwise it becomes worthless to anyone other than programmers ^_^.

    As stated above, Fingo, you have really done a suberb job on this code!! I can't really seem to find any major errors or slowdowns in this batch of code of yours... of course i'm not superman when it comes to Perl :o) Hope this little comment helps in some way maybe... keep up the great work, and keep on perling for Perl!

    bladx ~ ímuchas veces tengo preguntas!

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://62136]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (4)
As of 2015-07-28 05:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (252 votes), past polls