#!/usr/bin/perl -w # (C) 2003 S. Smeenk. # GNU Pubic License version 2 code. Please obey :) # use strict; use GD::Graph::bars; use Data::Dumper; $Data::Dumper::Indent = 0; #### Config :) my $rekeningno = "0123456789"; # Moet matchen aan ^"$rekeningno" in mut.txt my $graphfile = "./saldo.png"; my $debug = 1; #### Internal :) if (!$ARGV[0] || ($ARGV[0] !~ /^-?\d+\.\d{2}$/)) { die "Type of arg 1 to $0 should be floating point like '1234.56' or '0.00'\n"; } my $startsaldo = $ARGV[0]; my (@lines, $saldohash); #### Inlezen bewaarde saldohash if (open (FD, "mut.dat")) { print "Geschiedenis gelezen uit mut.dat\n" if ($debug); local $/ = undef; my $blob = ; $saldohash = eval 'my ' . $blob; close(FD); } else { print "Geen mut.dat -> geen geschiedenis\n" if ($debug); } #### Inlezen mut.txt open (FD, "mut.txt") or die "Kan mut.txt niet openen? ($!)\n"; while () { next if ($_ !~ /^"$rekeningno"/); chomp; push @lines, $_; } close(FD); #### Verwerk de mut.txt regels in omgekeerde volgorde zodat we kunnen terug- #### rekenen wat het saldo was op de eerst bekende datum. foreach (reverse @lines) { my ($ownrek, $valuta, $date, $direction, $amount) = split /"?,"?/; if ($direction eq "C") { print "-" if ($debug); $startsaldo -= $amount; } elsif ($direction eq "D") { print "+" if ($debug); $startsaldo += $amount; } $$saldohash{$date} = $startsaldo; } print "\nAantal verwerkte mutaties: ".scalar(@lines)."\n" if ($debug); #### Opslaan "oude" gegevens open (FD, ">mut.dat") or die "Kan niet schrijven naar mut.dat? ($!)\n"; print FD Dumper($saldohash); close(FD); print "Geschiedenis opgeslagen in mut.dat\n" if ($debug); #### Zet de gegevens in een voor GD-snapbare array. my @graph_array = ( [], [] ); foreach my $key (sort keys %$saldohash) { push @{$graph_array[0]}, $key; push @{$graph_array[1]}, $$saldohash{$key}; } #### Maak GD object, en zet wat opties. my $graph = GD::Graph::bars->new(1024, 768); $graph->set( x_label => 'Datum', y_label => 'Saldo', title => "Saldografiek voor $rekeningno", accentclr => "#ff0000", # boxclr => undef, bar_spacing => 1, transparent => undef, interlaced => undef, x_label_skip => 7, y_tick_number => 16, y_label_skip => 0, ) or die $graph->error; #my $gd = $graph->plot(\@graph_array) or die $graph->error; open (IMG, ">$graphfile") or die "Kan niet schrijven naar $graphfile? ($!)\n"; binmode(IMG); print IMG $graph->plot(\@graph_array)->png; close(IMG); print "Grafiek gemaakt!\n" if ($debug);