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 >
Wrap
Text File
|
1998-10-07
|
10KB
|
347 lines
#!/usr/bin/wish -f
# 'CBB' -- Check Book Balancer
#
# balance.tcl -- Routines for balancing the account.
#
# Written by Curtis Olson. Started December 7, 1996.
#
# Copyright (C) 1994 - 1997 Curtis L. Olson - curt@sledge.mn.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: balance.tcl,v 2.8 1997/04/03 03:40:00 curt Exp $
# (Log is kept at end of this file)
#------------------------------------------------------------------------------
# Procedures for balancing
#------------------------------------------------------------------------------
proc balance {} {
global debits credits diff
set debits 0.00
set credits 0.00
set diff [balanceCalcDiff]
# create or bring forward window
cbbWindow.bal
# refresh the list
balanceRefresh
}
# create window
proc cbbWindow.bal {} {
global cbb debits credits diff
if {[winfo exists .bal] == 1} {
wm withdraw .bal
wm deiconify .bal
return
}
toplevel .bal
option add *font $cbb(dialog_font)
wm title .bal "Balance ..."
wm iconname .bal "Balance ..."
frame .bal.frame -borderwidth 2 -relief raised
frame .bal.frame.head1 -relief raised
frame .bal.frame.head2 -relief raised
frame .bal.frame.head3 -relief raised
frame .bal.frame.f -relief raised
frame .bal.frame.bar -relief sunken
label .bal.frame.head1.label -text "Statement Starting Balance = "
entry .bal.frame.head1.entry -textvariable cbb(state_start) -relief sunken \
-width 17 -font $cbb(default_font)
label .bal.frame.head2.label -text "Statement Ending Balance = "
entry .bal.frame.head2.entry -textvariable cbb(state_end) -relief sunken \
-width 17 -font $cbb(default_font)
label .bal.frame.head3.label \
-text "Debits = $debits Credits = $credits Difference = $diff"
listbox .bal.frame.f.list -width 47 -height 15 -relief sunken \
-exportselection false -takefocus 0 \
-yscrollcommand ".bal.frame.f.scroll set" -font $cbb(fixed_font)
bind .bal <KeyPress-Down> { .bal.frame.f.list \
yview scroll 1 units }
bind .bal <Control-KeyPress-n> { .bal.frame.f.list \
yview scroll 1 units }
bind .bal <KeyPress-Up> { .bal.frame.f.list \
yview scroll -1 units }
bind .bal <Control-KeyPress-p> { .bal.frame.f.list \
yview scroll -1 units }
bind .bal <KeyPress-Next> { .bal.frame.f.list \
yview scroll 1 pages }
bind .bal <Control-KeyPress-v> { .bal.frame.f.list \
yview scroll 1 pages }
bind .bal <KeyPress-Prior> { .bal.frame.f.list \
yview scroll -1 pages }
bind .bal <Alt-KeyPress-v> { .bal.frame.f.list \
yview scroll -1 pages }
scrollbar .bal.frame.f.scroll -takefocus 0 -relief flat \
-command { .bal.frame.f.list yview }
button .bal.frame.bar.refresh -text "Refresh" -font $cbb(button_font) \
-takefocus 0 -command { balanceRefresh }
button .bal.frame.bar.update -text "Update" -font $cbb(button_font) \
-takefocus 0 -command {
balanceUpdateSelected .bal.frame.f.list
clear_entry_area
destroy .bal
}
button .bal.frame.bar.dismiss -text "Dismiss" -font $cbb(button_font) \
-takefocus 0 -command {
clear_entry_area
destroy .bal
}
pack .bal.frame -side top -fill both -expand 1
pack .bal.frame.head1 -side top -fill x
pack .bal.frame.head2 -side top -fill x
pack .bal.frame.head3 -side top -fill x
pack .bal.frame.bar -side bottom -fill x
pack .bal.frame.f -side top -fill both -expand 1
pack .bal.frame.head1.label .bal.frame.head1.entry -side left -anchor w
pack .bal.frame.head2.label .bal.frame.head2.entry -side left -anchor w
pack .bal.frame.head3.label -side top -anchor w
pack .bal.frame.f.scroll -side right -fill y
pack .bal.frame.f.list -side left -fill both -expand 1
pack .bal.frame.bar.refresh .bal.frame.bar.update .bal.frame.bar.dismiss \
-side left -expand 1 -fill x -padx 8 -pady 4
bind .bal.frame.head1.entry <FocusOut> {
set diff [balanceCalcDiff]
.bal.frame.head3.label configure \
-text "Debits = $debits Credits = $credits Difference = $diff"
}
bind .bal.frame.head2.entry <FocusOut> {
set diff [balanceCalcDiff]
.bal.frame.head3.label configure \
-text "Debits = $debits Credits = $credits Difference = $diff"
}
bind .bal.frame.f.list <Double-Button> {
set selection [.bal.frame.f.list curselection]
if [llength $selection] {
acctSetDirty
balanceUpdateList .bal.frame.f.list $selection
set diff [balanceCalcDiff]
.bal.frame.head3.label configure \
-text "Debits = $debits Credits = $credits Difference = $diff"
}
}
focus .bal.frame.head1.entry
}
# refresh balance window
proc balanceRefresh {} {
global cbb eng debit debits credit credits desc cleared check nicedate
global cutdesc amt key index
set debits 0.00
set credits 0.00
set diff [balanceCalcDiff]
# wipe the current contents
.bal.frame.f.list delete 0 end
# get the statement starting balance
puts $eng "get_cleared_bal"; flush $eng
gets $eng cbb(state_start)
# load the list
puts $eng "first_uncleared_trans"; flush $eng
gets $eng result
while { $result != "none" } {
update_globals $result
# handles case where we have a $debit and a $credit
set amt [expr $credit - $debit]
set cutdesc [string range $desc 0 14]
puts $eng "get_current_index"; flush $eng
gets $eng index
.bal.frame.f.list insert end \
[format "%1s %5.5s %8s %-15s %12.2f %-9s %5s"\
$cleared $check $nicedate $cutdesc $amt $key $index]
if { "$cleared" == "*" } {
set debits [expr $debits + $debit]
set credits [expr $credits + $credit]
}
puts $eng "next_uncleared_trans"; flush $eng
gets $eng result
}
# avoid something like 6.5999999999999
set debits [format "%.2f" $debits]
set credits [format "%.2f" $credits]
set diff [balanceCalcDiff]
.bal.frame.head3.label configure \
-text "Debits = $debits Credits = $credits Difference = $diff"; \
}
proc balanceCalcDiff {} {
global cbb debits credits
set value [expr $cbb(state_start) - $cbb(state_end) - $debits + $credits]
return [format "%.2f" $value]
}
# called when user double clicks on a line in the balance window
proc balanceUpdateList args {
global cbb eng debits credits diff
set arglist [split $args]
set list [lindex $arglist 0]
set sel [lindex $arglist 1]
if { $cbb(debug) } { puts "$list $sel" }
set line [$list get $sel]
set key [string range $line 48 58]
set index [expr [string range $line 60 64] * 2 - 1]
set tail [string range $line 2 end]
set amt [string range $line 34 45]
if { $cbb(debug) } { puts "amt = $amt" }
$list delete $sel
if { "[string range $line 0 0]" != "*" } {
$list insert $sel "* $tail"
puts $eng "select_trans $key"; flush $eng
gets $eng result
if { $cbb(debug) } { puts $result }
set pieces [split $result "\t"]
set debit [lindex $pieces 4]
set credit [lindex $pieces 5]
if { "$credit" == "" } {
set credit 0.00
}
if { "$debit" == "" } {
set debit 0.00
}
set debits [expr $debits + $debit]
set credits [expr $credits + $credit]
} else {
$list insert $sel " $tail"
puts $eng "unselect_trans $key"; flush $eng
gets $eng result
set pieces [split $result "\t"]
set debit [lindex $pieces 4]
set credit [lindex $pieces 5]
if { "$credit" == "" } {
set credit 0.00
}
if { "$debit" == "" } {
set debit 0.00
}
set debits [expr $debits - $debit]
set credits [expr $credits - $credit]
}
# avoid something like 6.5999999999999
set debits [format "%.2f" $debits]
set credits [format "%.2f" $credits]
update_line $index $key
if { $cbb(debug) } { puts $line; puts $key; puts $index }
}
proc balanceUpdateSelected list {
global cbb eng
.status.line configure -text "Updating all cleared transactions."
update
acctSetDirty
puts $eng "clear_trans"; flush $eng
gets $eng result
update_rest 0 00000000-00
goto [listGetSize]
}
# ----------------------------------------------------------------------------
# $Log: balance.tcl,v $
# Revision 2.8 1997/04/03 03:40:00 curt
# Fixed a small balance bug introduced recently.
#
# Revision 2.7 1997/03/05 18:58:32 curt
# Added additional bindings to scrolling lists: categories list, balance
# window list, text help, and report list.
#
# Revision 2.6 1997/02/19 18:08:05 curt
# Fixed a bug with long check numbers (> 5 char) in the balance window.
# Nailed a bug which caused cbb to forget the last check # entered when
# using +/- in the check number field.
#
# Revision 2.5 1997/01/02 04:38:30 curt
# Changes over the 1996 holidays:
# - Converted listbox to text widget. This allows us to do nice
# things with alternating background colors, highliting, red
# negative numbers, etc.
# - Negative transactions are now drawn in red.
# - Added a Goto <Today> option.
# - <Home> & <End> were double bound. Now, listbox can be traversed with
# <Meta-Home> and <Meta-End>
#
# Revision 2.4 1996/12/17 20:15:43 curt
# Version incremented to 0.70.
# No longer save running total in .cbb files.
# Miscellaneous tweaks.
#
# Revision 2.3 1996/12/17 14:53:51 curt
# Updated copyright date.
#
# Revision 2.2 1996/12/11 04:15:14 curt
# Added a "Refresh" button. Reworked some of the code.
#
# Revision 2.1 1996/12/08 07:37:50 curt
# Initial revision.
#