rick@sesame.UUCP (Rick Richardson) (07/07/85)
The following 'shar' archive contains a simple, yet powerful checkbook acounting system. Since it uses 'awk', it is more portable than 'C', and is easy to modify, even by novice programmers. -Rick Richardson ..talcott!sesame!rick ---------------------------- CUT HERE ------------------------------- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # balance # demo # prbook # pracct sed 's/^X//' << 'SHAR_EOF' > README X awkWARD ACCOUNTING MADE EASY X ------- ---------- ---- ---- X shareware from X PC Research, Inc. X XINTRODUCTION X------------ XThis directory contains a simple, yet powerful checkbook accounting Xsystem, based upon 'awk(1)'. Since awk provides great power, with Xa minimum of fuss, these tools were easily created, and are portable Xto any machine running UNIX. The tools operate on a common database, Xcalled the "book", which follows the format of a checkbook register. XThe file is easily created and updated using any convenient text Xeditor. X XThis package is provided as shareware. If you find this package Xuseful or educational, you are encouraged to help support the Xcreation of additional 'shareware packages', by making a contribution X($10 suggested) to: X PC Research, Inc. X 93 Garrison Drive X Neptune, NJ 07753 X (201) 922-1124 XawkWARD Accounting is (C) Copyright PC Research, Inc. 1985. Unlimited Xnon-profit use of this package is hereby granted. X XBOOK FILE FORMAT X---------------- XEach line in the "book" can be one of: X X # comment, useful for column headers to maintain sanity. X H output page header, used to document account title/number X c entry which has cleared the bank X - entry which has not cleared the bank X XThe accounting entries are composed of 6 fields, separated by whitespace: X X CLEAR DATE CHECK AMOUNT ACCOUNT DESCRIPTION X XWhere: X CLEAR is "c" for cleared entries, "-" for outstanding ones X DATE is date of entry, in MM/DD/YY format X CHECK is the check number X AMOUNT is the amount of the entry X ACCOUNT is any 1-7 character name for the account. X The name "+" is special, it is for deposits. X Account names are useful for obtaining summaries X of all transactions of a particular type, e.g. X "rent", "util", "food", etc. Use all lowercase, X if possible. X DESCRIPTION Any descriptive text you want to enter, 1-35 chars. X The first character should be capitalized. X XAn example "book" file is provided in "demo". It is reproduced here: X X H Debbie S. Confused, In Solvent Bank #999 999 999 X # X # Accounts: X # + Deposit X # rent House Rent X # util Utilities (gas, electric, water) payments X # food Food expenses X # X # Clear Date Number Amount Account Description X # ----- ---- ------ ------ ------- ----------- X c 12/28/84 - 700 + Deposit, Sweatshop Clothiers X c 6/1/85 101 600 rent Guido Slumlord, june rent X c 6/1/85 102 75 food Bob's Greasy Spoon X c 6/1/85 103 13.31 util Three Mile Island Electric X - 6/28/85 - 700 + Deposit, Sweatshop Clothiers X - 7/1/85 101 600 rent Guido Slumlord, june rent X - 7/1/85 102 75 food Tanduri Rat Restaurant X - 7/1/85 103 17.55 util Three Mile Island Electric X XPROGRAMS X-------- XThree "awk(1)" programs are provided which operate upon the database. X X balance book [YR=yr] X prbook book [YR=yr] X pracct book account [YR=yr] X XBALANCE X------- XThe "balance" command is used to reconcile the "book" with the bank Xstatement. Once per month, you edit the book, marking the entries Xwhich have cleared the bank with a "c". Then you use "balance" to Xcompute the banks idea of your account balance, as well as the current X"book" balance. Your bank statement and the bank balance must agree, Xor else the bank has made a mistake, or you've forgotten to enter Xsomething. Additionally, running totals for all accounts are printed, Xso you can immediately see where all the money has gone. The optional Xparameter "YR=yy" restricts the accumlation of account totals to the Xyear "yy" (e.g. 84). X XA sample run of "balance demo" follows: X X XAccount Reconciliation for Debbie S. Confused, In Solvent Bank #999 999 999 X X XBank balance = 11.69 XCurrent balance = 19.14 X XTotal for food = 150.00 XTotal for rent = 1200.00 XTotal for + = 1400.00 XTotal for util = 30.86 X XPRBOOK X------ XThe "prbook" command is used to print the "book" entries, usually Xto a line printer. The optional parameter "YR=yy" restricts the Xentries printed to those for year "yy". Executing "prbook demo" Xproduces: X X XCheck Transactions for Debbie S. Confused, In Solvent Bank #999 999 999, Page 1 X XC CHEK DATE DESCRIPTION PAYMENT DEPOSIT BALANCE X- ---- -------- ----------------------------------- ------- ------- ------- Xc - 12/28/84 Deposit, Sweatshop Clothiers 700.00 700.00 Xc 101 6/1/85 Guido Slumlord, june rent 600.00 100.00 Xc 102 6/1/85 Bob's Greasy Spoon 75.00 25.00 Xc 103 6/1/85 Three Mile Island Electric 13.31 11.69 X- - 6/28/85 Deposit, Sweatshop Clothiers 700.00 711.69 X- 101 7/1/85 Guido Slumlord, june rent 600.00 111.69 X- 102 7/1/85 Tanduri Rat Restaurant 75.00 36.69 X- 103 7/1/85 Three Mile Island Electric 17.55 19.14 X XPRACCT X------ XThe "pracct" command is used to print just the entries in the "book" Xwhich are for "account". The optional "YR=yy" parameter restricts the Xentries printed to those found during year "yy". XExecuting "pracct demo food" produces: X X Xfood Transactions for Debbie S. Confused, In Solvent Bank #999 999 999, Page 1 X XC CHEK DATE DESCRIPTION PAYMENT DEPOSIT BALANCE X- ---- -------- ----------------------------------- ------- ------- ------- Xc 102 6/1/85 Bob's Greasy Spoon 75.00 -75.00 X- 102 7/1/85 Tanduri Rat Restaurant 75.00 -150.00 X XACCOUNT NAMES X------------- XAccount names are a very useful way to categorize expenses. If used Xconsistently, it becomes possible to summarize all expenses for Xa particular type of item. For example, an account called "taxded" Xcould be used to group all tax deductable expenditures. Then, on April X15th, you could use "pracct mybook taxded YR=85" to get a list and total Xof all tax deductible expenditures, for Schedule A. X XHARDCOPY X-------- XThe output of each of the programs has been designed to be printed directly Xon a line printer having a page length of 66 lines. Header and trailer Xwhitespace is automatically supplied. Thus there is no need to use Xan additional filter to prepare the output for the printer. Simply Xuse the command: X prbook | lp Xon UNIX System V and derivatives, or X prbook | lpr Xon UNIX Version 7 and derivatives. X XIf your lineprinter has a page length other than 66 lines, you may Xmodify "pracct" and "prbook" to adjust for this. Simply change the Xthe number "58" in the line: X if ( (ln % 58) == 0) Xso that the number is the page length of your printer minus eight. X XNOTES X----- XThe whitespace in the command files themselves has been compressed Xwhen necessary, in order to allow operation on systems which Xrestrict the UNIX command line length to a smaller number of Xcharacters than is usual (e.g. Venix/86). The "YR" option depends Xupon using a relatively new version of "awk(1)". On older UNIX Xreleases, this option may not operate at all, although all other Xfeatures should operate normally. X XUse the comment feature to replicate the column headers for the "book" Xevery 24 lines, so they will always be visible when editing the file. X XDue to implementation restrictions, it is best to use all lowercase Xfor account names, and to capitalize the first letter of the Xdescription for an entry in the "book". Otherwise, surprises may Xresult. X X"awk(1)" has poor error diagnostics. No sanity checking is performed Xupon the format of the "book". A bad "book" means garbage out. X XThe speed of the commands is a direct function of the length of the X"book". When the execution time becomes unacceptable, you may Xwant to split the "book" into pieces, placing previous years data Xin another file. Don't forget to make an initial "Carryover from Xprevious year" deposit to the current "book". X XIf you type "pracct mybook", and do not specify an account, a list Xof all accounts is printed. This feature can be used to remind Xyourself of the accounts you have defined. You should periodically Xcheck this list to make sure that you have not duplicated an account Xunder another name. The number of accounts is essentially unlimited, Xbut for esthetic reasons it is usually a good idea to limit the number Xof accounts. It is suggested that you list the accounts you have Xdefined as comments in the beginning of the "book" file. X XYou should endeavor to enter items into the "book" in date order, Xrather than by check number. Otherwise, you may be surprised by the Xoutput of "prbook" when year selection is used. SHAR_EOF sed 's/^X//' << 'SHAR_EOF' > balance X: awkWARD Accounting Made Easy X: [C] Copyright PC Research, Inc. 1985 X: X: balance book [YR=yy]: X: print balances of all accounts [for year yy]. X: X: FILE FORMAT: X: CLEAR DATE CHECK AMOUNT ACCOUNT COMMENT X: # ignored X: c mm/dd/yy nnnn dddd.cc name cleared bank X: - mm/dd/yy nnnn dddd.cc name not cleared bank X: H page header line X: XBOOK=$1; Xif [ ! -f "$BOOK" ] Xthen X echo "usage: balance book [YR=yy]" X exit 1; Xfi Xshift; OPTS="$*" Xawk ' X{ X if ($1 == "#") X continue; X else if ($1 == "H") X { X printf "\n\nAccount Reconciliation for %s\n", substr($0, 3) X continue; X } X if ($5 == "+") X { X if ($1 == "c") X bank += $4; X curr += $4; X } X else X { X if ($1 == "c") X bank -= $4; X curr -= $4; X } X yr=split($2, date, "/"); if (YR != "" && date[yr] != YR) continue; X expense[$5] += $4; X} XEND { X printf "\n\n" X printf "Bank balance = %8.2f\n", bank X printf "Current balance = %8.2f\n\n", curr X for (acctnum in expense) X if (YR != "") X printf "19%s Total for %-8s = %8.2f\n",\ X YR, acctnum,expense[acctnum] X else X printf "Total for %-8s = %8.2f\n",\ X acctnum,expense[acctnum] X}' $OPTS $BOOK SHAR_EOF sed 's/^X//' << 'SHAR_EOF' > demo XH Debbie S. Confused, In Solvent Bank #999 999 999 X# X# Accounts: X# + Deposit X# rent House Rent X# util Utilities (gas, electric, water) payments X# food Food expenses X# X# Clear Date Number Amount Account Description X# ----- ---- ------ ------ ------- ----------- Xc 12/28/84 - 700 + Deposit, Sweatshop Clothiers Xc 6/1/85 101 600 rent Guido Slumlord, june rent Xc 6/1/85 102 75 food Bob's Greasy Spoon Xc 6/1/85 103 13.31 util Three Mile Island Electric X- 6/28/85 - 700 + Deposit, Sweatshop Clothiers X- 7/1/85 101 600 rent Guido Slumlord, june rent X- 7/1/85 102 75 food Tanduri Rat Restaurant X- 7/1/85 103 17.55 util Three Mile Island Electric SHAR_EOF sed 's/^X//' << 'SHAR_EOF' > prbook X: awkWARD Accounting Made Easy X: [C] Copyright PC Research, Inc. 1985 X: X: prbook book [YR=yy]: print checkbook [for year yy] X: FILE FORMAT X: CLEAR DATE CHECK AMOUNT ACCOUNT COMMENT XBOOK=$1; Xif [ ! -f "$BOOK" ] Xthen X echo "usage: prbook book [YR=yy]" X exit 1; Xfi Xshift; OPTS="$*" Xawk ' X{ X if ($1 == "#") X continue; X if ( $1 == "H" ) X { X h = "Check Transactions for " substr($0, 3); X continue; X } X yr=split($2, date, "/"); X if (YR != "" && date[yr] != YR) X { if ($5 == "+") cur += $4; else cur -= $4; continue; } X l = substr($0, index($0, $6)); X if ( (ln % 58) == 0) X { X if (ln != 0) printf "\n\n" X printf "\n\n%s, Page %d\n\n", h, ln/58+1 X printf "C CHEK DATE %-35s PAYMENT DEPOSIT BALANCE\n",\ X "DESCRIPTION" X printf "- ---- -------- %-35s ------- ------- -------\n",\ X "-----------------------------------" X } X if ($5 == "+") X { X cur += $4; X printf "%s %4s %8s %-35s %8s %8.2f %8.2f\n",$1,$3,$2,l,"",$4,cur X } X else X { X cur -= $4; X printf "%s %4s %8s %-35s %8.2f %8s %8.2f\n",$1,$3,$2,l,$4,"",cur X } X ++ln X}' $OPTS $BOOK SHAR_EOF sed 's/^X//' << 'SHAR_EOF' > pracct X: awkWARD Accounting Made Easy X: [C] Copyright PC Research, Inc. 1985 X: X: pracct book account [YR=yy]: X: print 'account' transactions for 'book' [for year yy]. X: FILE FORMAT X: CLEAR DATE CHECK AMOUNT ACCOUNT COMMENT Xif [ "$#" = 0 ] Xthen X echo "usage: pracct book account [YR=yy]" X exit 1; Xfi XBOOK=$1; shift Xif [ "$1" = "" ] Xthen X echo "usage: pracct book account [YR=yy]" X echo " accounts for $BOOK:" X awk ' X { X if ($1 == "#") X continue; X account[$5] = 1 X } X END { X for (acctnum in account) X printf "\t\t%s\n", acctnum X }' $BOOK X exit 1; Xfi XACCT=$1; shift XOPTS="$*" Xawk ' X{ X if ($1=="H") { h = ACCT " Transactions for " substr($0,3); continue; } X if ($1=="#" || $5!=ACCT) continue; X yr = split($2,date,"/"); if (YR!="" && YR!=date[yr]) continue; X l = substr($0,index($0,$6)); X if ((ln%58)==0) X { X if (ln!=0) printf "\n\n" X printf "\n\n%s, Page %d\n\n", h, ln/58+1 X printf "C CHEK DATE %-35s PAYMENT DEPOSIT BALANCE\n",\ X "DESCRIPTION" X printf "- ---- -------- %-35s ------- ------- -------\n",\ X "-----------------------------------" X } X if ($5=="+") X { X cur+=$4; X printf "%s %4s %8s %-35s %8s %8.2f %8.2f\n",$1,$3,$2,l,"",$4,cur X } X else X { X cur-=$4; X printf "%s %4s %8s %-35s %8.2f %8s %8.2f\n",$1,$3,$2,l,$4,"",cur X } X ++ln X}' $OPTS "ACCT=$ACCT" $BOOK SHAR_EOF exit -- Rick Richardson, PC Research, Inc. {genrad|ihnp4|ima}!wjh12!talcott!sesame!{rick|pcrat!rick} {cbosgd|harvard}!talcott!sesame!{rick|pcrat!rick} rick%sesame@harvard.ARPA