home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / cbb / graphs / desc-pie.pl < prev    next >
Perl Script  |  1998-10-07  |  6KB  |  230 lines

  1. #!/usr/bin/perl
  2. #  desc-pie.pl - Graph pie chart of expenses by description inside given 
  3. #                category
  4. #
  5. #  Modidied by Alexandr E. Bravo (abravo@tctube.spb.su)
  6. #
  7. #  Modified by Arlindo L. Oliveira (aml@inesc.pt)
  8. #
  9. #  Copyright (C) 1994  Curtis L. Olson  - curt@sledge.mn.org
  10. #
  11. #  This program is free software; you can redistribute it and/or modify
  12. #  it under the terms of the GNU General Public License as published by
  13. #  the Free Software Foundation; either version 2 of the License, or
  14. #  (at your option) any later version.
  15. #
  16. #  This program is distributed in the hope that it will be useful,
  17. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. #  GNU General Public License for more details.
  20. #
  21. #  You should have received a copy of the GNU General Public License
  22. #  along with this program; if not, write to the Free Software
  23. #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  
  25. # $Id: desc-pie.pl,v 1.3 1998/10/07 08:23:51 phil Exp $
  26. # (Log is kept at end of this file)
  27.  
  28.  
  29. package CBB;
  30.  
  31. use strict;    # don't take no guff
  32.  
  33.  
  34. my($tmp, $temp, $cbb_incl_dir);
  35. my($key, $date, $check, $desc, $debit, $credit, $cat, $com, $cleared, $total);
  36. my($credit_total, $debit_total, $amt, $lkey, $lcat, $subtotal);
  37. my($ldesc);
  38. my($tcom, $tamt, $tcat);
  39. my(@keys, %ALLTRANS, @splits);
  40. my($graphpath, $account, $name, $result);
  41.  
  42.  
  43. # return the directory of a file name (this is duplicated in common.pl
  44. # but we need this to find the include directory for common.pl :-(
  45. sub my_file_dirname {
  46.     my($file) = @_;
  47.     my($pos);
  48.  
  49.     $pos = rindex($file, "/");
  50.     if ( $pos >= 0 ) {
  51.     return substr($file, 0, ($pos + 1));
  52.     } else { 
  53.     return "./"; 
  54.     }
  55. }
  56.  
  57. # specify the installed location of the necessary pieces.
  58. $temp = &my_file_dirname($0); chop($temp);
  59. $cbb_incl_dir = &my_file_dirname($temp);
  60. unshift(@INC, $cbb_incl_dir);
  61.  
  62. $graphpath = "/usr/X11R6/lib/X11/cbb/graphs";
  63.  
  64. require "common.pl";
  65. require "reports.pl";
  66. require "engine.pl";
  67. require "memorized.pl";
  68.  
  69. ($#ARGV >= 0) || die "Usage: report [ -from date ] [ -to date] accounts";
  70.  
  71.  
  72. # process arguments
  73.  
  74. my($fromdate, $todate, @account_list) = &process_rep_args();
  75.  
  76. if ( $fromdate eq "all" ) {
  77.     $fromdate = "";
  78. }
  79.  
  80. if ( $todate eq "all" ) {
  81.     $todate = "";
  82. }
  83.  
  84. # print "'$fromdate' '$todate' '@account_list'\n";
  85.  
  86. %ALLTRANS = ();
  87.  
  88. # load all matching transactions from all specified accounts (ignoring
  89. # those that are outside the specified date range)
  90.  
  91. my(%tmp_cat) = ();
  92. my(%tmp_desc)= ();
  93.  
  94. foreach $account ( @account_list ) {
  95.     $name = &file_basename($account);
  96.  
  97.     # open the account
  98.     (&load_trans($account) eq "ok") || die "Cannot open account:  $account";
  99.  
  100.     $result = &first_trans();
  101.     while ( $result ne "none" ) {
  102.         ($key, $date, $check, $desc, $debit, $credit, $cat, $com, $cleared,
  103.          $total) = split(/\t/, $result);
  104.  
  105.         $amt = $credit - $debit;
  106.  
  107.         if ( (($fromdate == 0) || ($fromdate <= $date)) && 
  108.             (($todate == 0) || ($todate >= $date)) ) {
  109.  
  110.             $ALLTRANS{"$key$name"} = $result;
  111.  
  112.     $tmp_desc{$desc} .= $cat . "," . $amt . ",";
  113.  
  114.             if ( substr($cat, 0, 1) ne "|" ) {
  115.                 $tmp_cat{$cat} .= "$key$name" . "," . $amt . ",";
  116.             } else {
  117.                 # process split
  118.  
  119.                 @splits = split(/\|/, $cat);
  120.                 shift(@splits);
  121.  
  122.                 $tmp = 0;
  123.                 while ( $#splits >= 0 ) {
  124.                     $tcat = shift(@splits);
  125.                     $tcom = shift(@splits);
  126.                     $tamt = shift(@splits);
  127.  
  128.                     $tmp += $tamt;
  129.  
  130.                     # print "processing $tcat $tamt\n";
  131.                     $tmp_cat{$tcat} .= "$key$name" . "," . $tamt . ",";
  132.                     $tmp_desc{$desc} .= $tcat . "," . $tamt . ",";
  133.                 }
  134.                 if ( sprintf("%.2f", $tmp) ne sprintf("%.2f", $amt) ) {
  135.                     printf("WARNING:  Incorrect splits in $date: $desc\n");
  136.                     printf("    %.2f != %.2f\n\n", $tmp, $amt);
  137.                 }
  138.             }
  139.         }
  140.  
  141.         $result = &next_trans();
  142.     }
  143. }
  144.  
  145.  
  146. $credit_total = 0.00;
  147. $debit_total = 0.00;
  148.  
  149. if ( ! -x "$graphpath/graphpie") {
  150.     die "Cannot launch $graphpath/graphpie\n";
  151. }
  152.  
  153. open(DATA,"| $graphpath/descpie") || die "Cannot launch graph\n";
  154.  
  155. foreach $lcat (sort keys(%tmp_cat)) {
  156.     
  157.     chop($tmp_cat{$lcat});  # Delete final comma
  158.  
  159.     @keys = split(/,/, $tmp_cat{$lcat});
  160.  
  161.     $subtotal = 0.00;
  162.  
  163.     while ( $#keys >= 0 ) {
  164.         $lkey = shift(@keys);
  165.         $amt  = shift(@keys);
  166.  
  167.         $result = $ALLTRANS{$lkey};
  168.  
  169.         ($key, $date, $check, $desc, $debit, $credit, $cat, $com, $cleared,
  170.          $total) = split(/\t/, $result);
  171.  
  172.         $subtotal = $subtotal + $amt;
  173.         if ( $amt > 0 ) {
  174.             $credit_total = $credit_total + $amt;
  175.         } else {
  176.             $debit_total = $debit_total + $amt;
  177.         }
  178.     }
  179.  
  180.     $lcat =~ s/ /-/g;
  181.     $lcat eq "" and $lcat="<empty>";
  182.     print DATA "$lcat $subtotal\n";
  183. #    print  "$lcat $subtotal\n";
  184.     # printf(" = %9.2f\n", $subtotal);
  185. }
  186.  
  187.     print DATA "!\n";
  188. #    print  "!\n";
  189.  
  190. foreach $ldesc (sort keys(%tmp_desc)) {
  191.     
  192.     chop($tmp_desc{$ldesc});  # Delete final comma
  193.  
  194.     @keys = split(/,/, $tmp_desc{$ldesc});
  195.  
  196.     $subtotal = 0.00;
  197.  
  198.     while ( $#keys >= 0 ) {
  199.         $lcat  = shift(@keys);
  200.         $amt   = shift(@keys);
  201.  
  202.         $subtotal = $subtotal + $amt;
  203.  
  204.     }
  205.  
  206.     $ldesc =~ s/ /-/g;
  207.     $ldesc eq "" and $ldesc="<empty>";
  208.     print DATA "$lcat $ldesc $subtotal\n";
  209. #    print  "$lcat $ldesc $subtotal\n";
  210. }
  211.  
  212.  
  213. close(DATA);
  214.  
  215.  
  216. # ----------------------------------------------------------------------------
  217. # $Log: desc-pie.pl,v $
  218. # Revision 1.3  1998/10/07 08:23:51  phil
  219. # *** empty log message ***
  220. #
  221. # Revision 1.2  1998/10/07 08:02:02  phil
  222. # *** empty log message ***
  223. #
  224. # Revision 1.1.1.1  1998/10/07 07:11:44  phil
  225. #
  226. #
  227. # Revision 1.1  1998/08/14 14:24:03  curt
  228. # Initial revision.
  229. #
  230.