home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 February
/
PCWorld_2000-02_cd.bin
/
live
/
usr
/
X11R6
/
lib
/
X11
/
cbb
/
splits.tcl
< prev
next >
Wrap
Text File
|
1998-10-07
|
8KB
|
276 lines
#!/usr/bin/wish -f
# 'CBB' -- Check Book Balancer
#
# splits.tcl -- Routines to handle splits.
#
# 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: splits.tcl,v 2.6 1997/04/23 18:09:42 curt Exp $
# (Log is kept at end of this file)
#------------------------------------------------------------------------------
# Procedures for category split processing
#------------------------------------------------------------------------------
proc cbbWindow.splits {} {
global cbb desc cat credit debit cats coms amts
if {[winfo exists .splits] == 1} {
destroy .splits
}
option add *font $cbb(dialog_font)
toplevel .splits
wm title .splits "Category Splits"
wm iconname .splits "Category Splits"
frame .splits.frame -borderwidth 2 -relief raised
pack .splits.frame -side top -fill both -expand 1
if { "$credit" == "" } {
set credit 0.00
}
if { "$debit" == "" } {
set debit 0.00
}
label .splits.frame.head -text "[string range $desc 0 30] =:= \
[format "%.2f" [expr $credit - $debit]]"
pack .splits.frame.head -anchor w -fill x
if { $cbb(debug) } { puts $cat }
set pieces [split $cat |]
option add *font $cbb(fixed_header_font)
frame .splits.frame.label
label .splits.frame.label.cat -text " Category "
label .splits.frame.label.com -text " Comment "
label .splits.frame.label.amt -text " Amount "
pack .splits.frame.label -side top -fill x
pack .splits.frame.label.cat .splits.frame.label.com \
.splits.frame.label.amt -side left -expand 1
option add *font $cbb(fixed_font)
set i 0
while { $i < $cbb(max_splits) } {
# setup widgets
frame .splits.frame.line$i
entry .splits.frame.line$i.cat$i -relief sunken -width 15 \
-textvariable cats($i)
set command "bindtags .splits.frame.line$i.cat$i \
{.splits.frame.line$i.cat$i Entry .}"
eval $command
# bind .splits.frame.line$i.cat$i <FocusOut>
bind .splits.frame.line$i.cat$i <Tab> {
splitsLeavingCat %W
}
bind .splits.frame.line$i.cat$i <Shift-Tab> {focus [tk_focusPrev %W]}
entry .splits.frame.line$i.com$i -relief sunken -width 15 \
-textvariable coms($i)
entry .splits.frame.line$i.amt$i -relief sunken -width 9 \
-textvariable amts($i)
bind .splits.frame.line$i.amt$i <FocusOut> {
splitsLeavingAmt %W
}
bind .splits.frame.line$i.cat$i <Meta-c> { cbbWindow.catwin }
bind .splits.frame.line$i.cat$i <Alt-c> { cbbWindow.catwin }
bind .splits.frame.line$i.com$i <Meta-c> { cbbWindow.catwin }
bind .splits.frame.line$i.com$i <Alt-c> { cbbWindow.catwin }
bind .splits.frame.line$i.amt$i <Meta-c> { cbbWindow.catwin }
bind .splits.frame.line$i.amt$i <Alt-c> { cbbWindow.catwin }
set cats($i) [lindex $pieces [expr 1 + $i * 3]]
set coms($i) [lindex $pieces [expr 2 + $i * 3]]
set amts($i) [lindex $pieces [expr 3 + $i * 3]]
pack .splits.frame.line$i -side top -fill x -expand 1
pack .splits.frame.line$i.cat$i .splits.frame.line$i.com$i \
.splits.frame.line$i.amt$i -side left -expand 1 -fill x
incr i
}
# try to do some fancier initial splits handling
if { "[string range $cat 0 0]" != "|" } {
if { $cbb(debug) } { puts "not a split = $cat" }
set cats(0) $cat
set amts(0) [format "%.2f" [expr $credit - $debit]]
}
label .splits.frame.total -borderwidth 2 \
-text "Sum = [splitsSum]" -font $cbb(dialog_font)
pack .splits.frame.total -side bottom -after .splits.frame.label \
-fill x -expand 1
button .splits.frame.dismiss -text " Dismiss " -font $cbb(button_font) \
-takefocus 0 -command {
# check to see if splits add up
if { $debit > 0 } {
if { [splitsSum] != [format "%.2f" -$debit] } {
cbbWindow.ok "Warning: Sum of splits, [splitsSum], does not \
match transaction value, -$debit."
tkwait window .ok
}
} else {
if { [splitsSum] != [format "%.2f" $credit] } {
cbbWindow.ok "Warning: Sum of splits, [splitsSum], does not \
match transaction value, $credit."
tkwait window .ok
}
}
# recreate internal splits category record
set i 0
set cat |
while { $i < $cbb(max_splits) } {
if { "$amts($i)" != "" } {
append cat $cats($i) | $coms($i) | [format "%.2f" $amts($i)] |
}
incr i
}
destroy .splits
}
pack .splits.frame.dismiss -side bottom -after .splits.frame.label \
-fill x -padx 8 -pady 4
focus .splits.frame.line0.cat0
update
}
proc splitsLeavingCat { field } {
global cbb eng cats addcat
# just left a split category field
set pos [string last cat $field]
set cur_split [string range $field [expr $pos + 3] end]
if { $cbb(debug) } { puts "$cats($cur_split)" }
puts $eng "find_cat $cats($cur_split)"; flush $eng
gets $eng result
if { "$result" != "none" } {
if { $cbb(debug) } { puts $result }
if { [string range $result 0 13] == "partial_match:" } {
set cats($cur_split) [string range $result 14 end]
.status.line configure -text \
"Partial completion: '$cats($cur_split)'"
} else {
set cats($cur_split) $result
.status.line configure -text "Unique category found."
focus [tk_focusNext $field];
}
} elseif { "$cats($cur_split)" == "" } {
# empty field, allow tabbing
focus [tk_focusNext $field];
} else {
set addcat(cat) $cats($cur_split)
set addcat(mode) "missing"
cbbWindow.newcat
tkwait window .newcat
}
if { $cbb(debug) } { puts "Leaving $cur_split --> $cats($cur_split)" }
}
proc splitsLeavingAmt { field } {
global cbb
# just left an amt field
set text "Sum = [splitsSum]"
.splits.frame.total configure -text $text
if { $cbb(debug) } { puts "Leaving amount field" }
}
proc splitsSum {} {
global cbb debit credit cats amts
set trans_total [expr $credit - $debit]
set total 0
set i 0
while { $i < $cbb(max_splits) } {
set amount $amts($i)
set diff [format "%.2f" [expr $trans_total - $total]]
if { "$amount" != "" } {
if { "$cats($i)" != "" } {
if { $cbb(debug) } { puts "$i $amount" }
set total [expr $total + $amount]
} else {
if { $diff != 0.00 } {
set amts($i) $diff
} else {
set amts($i) ""
}
set amount $diff
set total [expr $total + $amount]
if { $cbb(debug) } { puts "auto replacing difference with $diff" }
}
} else {
if { [format "%.2f" $diff] != 0.00 } {
set amts($i) $diff
set amount $amts($i)
set total [expr $total + $amount]
if { $cbb(debug) } { puts "auto entering difference" }
}
}
incr i
}
return [format "%.2f" $total]
}
# ----------------------------------------------------------------------------
# $Log: splits.tcl,v $
# Revision 2.6 1997/04/23 18:09:42 curt
# Added meta-c binding to splits window to open category list.
#
# Revision 2.5 1997/01/09 03:57:01 curt
# Added contrib script loan.pl.
# User sizable account list.
# Removed some old gnuplot baggage from install.pl.
#
# Revision 2.4 1996/12/17 14:54:03 curt
# Updated copyright date.
#
# Revision 2.3 1996/12/16 04:18:23 curt
# Continuing the great overhaul of December 1996.
#
# Revision 2.2 1996/12/14 17:15:26 curt
# The great overhaul of December '96.
#
# Revision 2.1 1996/12/08 07:37:49 curt
# Initial revision.
#