home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / cbb / balance.tcl next >
Text File  |  1998-10-07  |  10KB  |  347 lines

  1. #!/usr/bin/wish -f
  2. #  'CBB' -- Check Book Balancer
  3. #
  4. #   balance.tcl -- Routines for balancing the account.
  5. #
  6. #  Written by Curtis Olson.  Started December 7, 1996.
  7. #
  8. #  Copyright (C) 1994 - 1997  Curtis L. Olson  - curt@sledge.mn.org
  9. #
  10. #  This program is free software; you can redistribute it and/or modify
  11. #  it under the terms of the GNU General Public License as published by
  12. #  the Free Software Foundation; either version 2 of the License, or
  13. #  (at your option) any later version.
  14. #
  15. #  This program is distributed in the hope that it will be useful,
  16. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. #  GNU General Public License for more details.
  19. #
  20. #  You should have received a copy of the GNU General Public License
  21. #  along with this program; if not, write to the Free Software
  22. #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23. #
  24. # $Id: balance.tcl,v 2.8 1997/04/03 03:40:00 curt Exp $
  25. # (Log is kept at end of this file)
  26.  
  27.  
  28. #------------------------------------------------------------------------------
  29. # Procedures for balancing
  30. #------------------------------------------------------------------------------
  31.  
  32. proc balance {} {
  33.     global debits credits diff
  34.  
  35.     set debits 0.00
  36.     set credits 0.00
  37.     set diff [balanceCalcDiff]
  38.  
  39.     # create or bring forward window
  40.     cbbWindow.bal
  41.  
  42.     # refresh the list
  43.     balanceRefresh
  44. }
  45.  
  46.  
  47. # create window
  48. proc cbbWindow.bal {} {
  49.     global cbb debits credits diff
  50.  
  51.     if {[winfo exists .bal] == 1} {
  52.     wm withdraw .bal
  53.         wm deiconify .bal
  54.     return                
  55.     }
  56.  
  57.     toplevel .bal
  58.     
  59.     option add *font $cbb(dialog_font)
  60.  
  61.     wm title .bal "Balance ..."
  62.     wm iconname .bal "Balance ..."
  63.     frame .bal.frame -borderwidth 2 -relief raised
  64.     frame .bal.frame.head1 -relief raised
  65.     frame .bal.frame.head2 -relief raised
  66.     frame .bal.frame.head3 -relief raised
  67.     frame .bal.frame.f -relief raised
  68.     frame .bal.frame.bar -relief sunken
  69.  
  70.     label .bal.frame.head1.label -text "Statement Starting Balance = "
  71.     entry .bal.frame.head1.entry -textvariable cbb(state_start) -relief sunken \
  72.         -width 17 -font $cbb(default_font)
  73.     label .bal.frame.head2.label -text "Statement Ending Balance   = "
  74.     entry .bal.frame.head2.entry -textvariable cbb(state_end) -relief sunken \
  75.         -width 17 -font $cbb(default_font)
  76.     label .bal.frame.head3.label \
  77.             -text "Debits = $debits  Credits = $credits  Difference = $diff"
  78.  
  79.     listbox .bal.frame.f.list -width 47 -height 15 -relief sunken \
  80.     -exportselection false -takefocus 0 \
  81.     -yscrollcommand ".bal.frame.f.scroll set" -font $cbb(fixed_font)
  82.  
  83.     bind .bal <KeyPress-Down> { .bal.frame.f.list \
  84.         yview scroll 1 units }
  85.     bind .bal <Control-KeyPress-n> { .bal.frame.f.list \
  86.         yview scroll 1 units }
  87.  
  88.     bind .bal <KeyPress-Up> { .bal.frame.f.list \
  89.         yview scroll -1 units }
  90.     bind .bal <Control-KeyPress-p> { .bal.frame.f.list \
  91.         yview scroll -1 units }
  92.  
  93.     bind .bal <KeyPress-Next> { .bal.frame.f.list \
  94.         yview scroll 1 pages }
  95.     bind .bal <Control-KeyPress-v> { .bal.frame.f.list \
  96.         yview scroll 1 pages }
  97.  
  98.     bind .bal <KeyPress-Prior> { .bal.frame.f.list \
  99.         yview scroll -1 pages }
  100.     bind .bal <Alt-KeyPress-v> { .bal.frame.f.list \
  101.         yview scroll -1 pages }
  102.  
  103.     scrollbar .bal.frame.f.scroll -takefocus 0 -relief flat \
  104.         -command { .bal.frame.f.list yview }
  105.     
  106.  
  107.     button .bal.frame.bar.refresh -text "Refresh" -font $cbb(button_font) \
  108.         -takefocus 0 -command { balanceRefresh }
  109.  
  110.     button .bal.frame.bar.update -text "Update" -font $cbb(button_font) \
  111.         -takefocus 0 -command {
  112.     balanceUpdateSelected .bal.frame.f.list
  113.     clear_entry_area
  114.     destroy .bal
  115.     }
  116.  
  117.     button .bal.frame.bar.dismiss -text "Dismiss" -font $cbb(button_font) \
  118.         -takefocus 0 -command {
  119.     clear_entry_area
  120.     destroy .bal
  121.     }    
  122.  
  123.     pack .bal.frame -side top -fill both -expand 1
  124.     pack .bal.frame.head1 -side top -fill x
  125.     pack .bal.frame.head2 -side top -fill x
  126.     pack .bal.frame.head3 -side top -fill x
  127.     pack .bal.frame.bar -side bottom -fill x
  128.     pack .bal.frame.f -side top -fill both -expand 1
  129.  
  130.     pack .bal.frame.head1.label .bal.frame.head1.entry -side left -anchor w
  131.     pack .bal.frame.head2.label .bal.frame.head2.entry -side left -anchor w
  132.     pack .bal.frame.head3.label -side top -anchor w
  133.     pack .bal.frame.f.scroll -side right -fill y
  134.     pack .bal.frame.f.list -side left -fill both -expand 1
  135.     pack .bal.frame.bar.refresh .bal.frame.bar.update .bal.frame.bar.dismiss \
  136.         -side left -expand 1 -fill x -padx 8 -pady 4
  137.  
  138.     bind .bal.frame.head1.entry <FocusOut> {
  139.         set diff [balanceCalcDiff]
  140.         .bal.frame.head3.label configure \
  141.              -text "Debits = $debits  Credits = $credits  Difference = $diff"
  142.     }
  143.  
  144.     bind .bal.frame.head2.entry <FocusOut> {
  145.         set diff [balanceCalcDiff]
  146.         .bal.frame.head3.label configure \
  147.              -text "Debits = $debits  Credits = $credits  Difference = $diff"
  148.     }
  149.  
  150.     bind .bal.frame.f.list <Double-Button> {
  151.     set selection [.bal.frame.f.list curselection]
  152.     if [llength $selection] {
  153.         acctSetDirty
  154.         balanceUpdateList .bal.frame.f.list $selection
  155.         set diff [balanceCalcDiff]
  156.         .bal.frame.head3.label configure \
  157.                 -text "Debits = $debits  Credits = $credits  Difference = $diff"
  158.     }
  159.     }
  160.     focus .bal.frame.head1.entry
  161. }
  162.  
  163. # refresh balance window
  164. proc balanceRefresh {} {
  165.     global cbb eng debit debits credit credits desc cleared check nicedate 
  166.     global cutdesc amt key index
  167.  
  168.     set debits 0.00
  169.     set credits 0.00
  170.     set diff [balanceCalcDiff]
  171.  
  172.     # wipe the current contents
  173.     .bal.frame.f.list delete 0 end
  174.  
  175.     # get the statement starting balance
  176.     puts $eng "get_cleared_bal"; flush $eng
  177.     gets $eng cbb(state_start)
  178.  
  179.     # load the list
  180.     puts $eng "first_uncleared_trans"; flush $eng
  181.     gets $eng result
  182.     while { $result != "none" } {
  183.         update_globals $result
  184.  
  185.     # handles case where we have a $debit and a $credit
  186.     set amt [expr $credit - $debit]
  187.  
  188.     set cutdesc [string range $desc 0 14]
  189.  
  190.         puts $eng "get_current_index"; flush $eng
  191.         gets $eng index
  192.     
  193.         .bal.frame.f.list insert end \
  194.         [format "%1s %5.5s %8s %-15s %12.2f   %-9s %5s"\
  195.         $cleared $check $nicedate $cutdesc $amt $key $index]
  196.  
  197.         if { "$cleared" == "*" } {
  198.         set debits [expr $debits + $debit]
  199.         set credits [expr $credits + $credit]
  200.         }
  201.  
  202.         puts $eng "next_uncleared_trans"; flush $eng
  203.         gets $eng result
  204.     }
  205.  
  206.     # avoid something like 6.5999999999999
  207.     set debits [format "%.2f" $debits]
  208.     set credits [format "%.2f" $credits]
  209.  
  210.     set diff [balanceCalcDiff]
  211.  
  212.     .bal.frame.head3.label configure \
  213.         -text "Debits = $debits  Credits = $credits  Difference = $diff"; \
  214. }
  215.  
  216.  
  217. proc balanceCalcDiff {} {
  218.     global cbb debits credits
  219.  
  220.     set value [expr $cbb(state_start) - $cbb(state_end) - $debits + $credits]
  221.     return [format "%.2f" $value]
  222. }
  223.  
  224.  
  225. # called when user double clicks on a line in the balance window
  226. proc balanceUpdateList args {
  227.     global cbb eng debits credits diff
  228.  
  229.     set arglist [split $args]
  230.     set list [lindex $arglist 0]
  231.     set sel [lindex $arglist 1]
  232.  
  233.     if { $cbb(debug) } { puts "$list $sel" }
  234.  
  235.     set line [$list get $sel]
  236.     set key [string range $line 48 58]
  237.     set index [expr [string range $line 60 64] * 2 - 1]
  238.     set tail [string range $line 2 end]
  239.     set amt [string range $line 34 45]
  240.     if { $cbb(debug) } { puts "amt = $amt" }
  241.  
  242.     $list delete $sel
  243.     if { "[string range $line 0 0]" != "*" } {
  244.         $list insert $sel "* $tail"
  245.         puts $eng "select_trans $key"; flush $eng
  246.         gets $eng result
  247.     if { $cbb(debug) } { puts $result }
  248.     set pieces [split $result "\t"]
  249.     set debit [lindex $pieces 4]
  250.     set credit [lindex $pieces 5]
  251.  
  252.     if { "$credit" == "" } {
  253.         set credit 0.00
  254.     }
  255.  
  256.     if { "$debit" == "" } {
  257.         set debit 0.00
  258.     }
  259.  
  260.     set debits [expr $debits + $debit]
  261.     set credits [expr $credits + $credit]
  262.     } else {
  263.         $list insert $sel "  $tail"
  264.         puts $eng "unselect_trans $key"; flush $eng
  265.         gets $eng result
  266.     set pieces [split $result "\t"]
  267.     set debit [lindex $pieces 4]
  268.     set credit [lindex $pieces 5]
  269.  
  270.     if { "$credit" == "" } {
  271.         set credit 0.00
  272.     }
  273.  
  274.     if { "$debit" == "" } {
  275.         set debit 0.00
  276.     }
  277.  
  278.     set debits [expr $debits - $debit]
  279.     set credits [expr $credits - $credit]
  280.     }
  281.  
  282.     # avoid something like 6.5999999999999
  283.     set debits [format "%.2f" $debits]
  284.     set credits [format "%.2f" $credits]
  285.  
  286.     update_line $index $key
  287.  
  288.     if { $cbb(debug) } { puts $line; puts $key; puts $index }
  289. }
  290.  
  291.  
  292. proc balanceUpdateSelected list {
  293.     global cbb eng
  294.  
  295.     .status.line configure -text "Updating all cleared transactions."
  296.     update
  297.  
  298.     acctSetDirty
  299.  
  300.     puts $eng "clear_trans"; flush $eng
  301.     gets $eng result
  302.  
  303.     update_rest 0 00000000-00
  304.  
  305.     goto [listGetSize]
  306. }
  307.  
  308.  
  309. # ----------------------------------------------------------------------------
  310. # $Log: balance.tcl,v $
  311. # Revision 2.8  1997/04/03 03:40:00  curt
  312. # Fixed a small balance bug introduced recently.
  313. #
  314. # Revision 2.7  1997/03/05 18:58:32  curt
  315. # Added additional bindings to scrolling lists: categories list, balance
  316. # window list, text help, and report list.
  317. #
  318. # Revision 2.6  1997/02/19 18:08:05  curt
  319. # Fixed a bug with long check numbers (> 5 char) in the balance window.
  320. # Nailed a bug which caused cbb to forget the last check # entered when
  321. # using +/- in the check number field.
  322. #
  323. # Revision 2.5  1997/01/02 04:38:30  curt
  324. # Changes over the 1996 holidays:
  325. #   - Converted listbox to text widget.  This allows us to do nice
  326. #     things with alternating background colors, highliting, red
  327. #     negative numbers, etc.
  328. #   - Negative transactions are now drawn in red.
  329. #   - Added a Goto <Today> option.
  330. #   - <Home> & <End> were double bound.  Now, listbox can be traversed with
  331. #     <Meta-Home> and <Meta-End>
  332. #
  333. # Revision 2.4  1996/12/17 20:15:43  curt
  334. # Version incremented to 0.70.
  335. # No longer save running total in .cbb files.
  336. # Miscellaneous tweaks.
  337. #
  338. # Revision 2.3  1996/12/17 14:53:51  curt
  339. # Updated copyright date.
  340. #
  341. # Revision 2.2  1996/12/11 04:15:14  curt
  342. # Added a "Refresh" button.  Reworked some of the code.
  343. #
  344. # Revision 2.1  1996/12/08 07:37:50  curt
  345. # Initial revision.
  346. #
  347.