10 ' FILE NAME:  MBRS.BAS - Creates, lists, adds to, corrects, and queries
20 ' church member personal information and donation files.
30 ESC$=CHR$(27):CLR$=ESC$+"*"
40 DEF FNCTR$(A$)=SPACE$(40-(LEN(A$)/2))+A$
50 DEF FNAT$(V,H)=ESC$+"="+CHR$(31+V)+CHR$(31+H)
60 RET$=FNAT$(24,1)+FNCTR$("Hit RETURN to continue:  "):BTM$=FNAT$(24,1)
70 HT$="Home Town":ST$="NC":YR$="1984"
80 OPTION BASE 1
90 DATA "ATTENTION, PROGRAMMERS AND USERS",""
100 DATA "For distribution purposes, the World Famous Toad Hall"
110 DATA "Church Membership Record Program (Public Domain)"
120 DATA "needs a few patches to tailor it to YOUR environment and use.",""
130 DATA "Change the name of the program itself from MBRSV13.BAS to MBRS.BAS."
140 DATA "(V13 is to tell apart the versions, but the program itself needs"
150 DATA "the program name to be MBRS.BAS (for file existence checking).",""
160 DATA "At the very beginning of the code, change HT$ and ST$ to your own"
170 DATA "local city/town and state.  Change YR$ to keep up to date."
180 DATA "Change MY CHURCH right below this in code to your own church name."
190 DATA "If you'd like to add your own letterhead to the donation reports,"
200 DATA "fill in the appropriate lines down in the code printing to"
210 DATA "#5 - that's the printout.  You'll see the 'blanks'."
220 DATA "Enjoy it -- just a gesture in the spirit of Public Domain Software."
230 DATA "","(Oh, yeah -- peel out all this stuff too!"
240 DATA "The Author, Toad Hall, March 1984",*
250 PRINT CLR$:RESTORE 90:GOSUB 390:STOP
260 DATA "MY CHURCH Member Records",""
270 DATA "Courtesy of Toad Hall","Home of Bionic Toad Software"
280 DATA "David P Kirschbaum, Author","Version 1.3, 29 Mar 84"
290 DATA "(C) 1983 All rights reserved.",""
300 DATA "Please contact the author for comments, bugs, recommendations.",""
310 DATA "Also, any church group using this software:"
320 DATA "Please drop me a card or call with your name, tel #, and address."
330 DATA "It gives me great personal satisfaction to know people are using"
340 DATA "this program of mine, (my resume could use the references!),"
350 DATA "and I can provide you with updates (my software never stays static!)"
360 DATA "","My address is","Toad Hall","7573 Jennings Lane"
370 DATA "Fayetteville NC  28303","tel (919) 868-3471",***
380 PRINT CLR$:RESTORE 260:GOSUB 390:GOTO 470
390 READ T$
400   IF T$="*" THEN RETURN ELSE IF T$="**" OR T$="***" THEN 420
410 PRINT FNCTR$(T$):GOTO 390
420   IF T$="***" THEN PRINT BTM$;
430 PRINT RET$;
440 INPUT "",T1$:IF T$="***" THEN PRINT CLR$;
450 T$="":RETURN
460 '== Program Start ==
470 DEFINT A-C,E-Z:DEFSNG D:MAX=200
480 DIM MNR(MAX+2),P(MAX+2),FSKIL$(4),FCOMM$(4),SKIL$(4),COMM$(4),F$(4)
490 FOR I=1 TO 3:F$(I)="MBRS-"+MID$(STR$(I),2,1)+".DAT":NEXT I
500   IF F$(4)="" OR QTR$="" OR OPT=9 THEN GOSUB 5720
510 GOSUB 820:GOSUB 920
520 DATA "==== Church Membership Program Menu ====",""
530 DATA "The following options are available:",""
540 DATA "1  - Membership List (with record numbers)"
550 DATA "2  - Add new members.                     "
560 DATA "3  - Correct member information.          "
570 DATA "4  - Query member record.                 "
580 DATA "5  - Enter Weekly Donation.               "
590 DATA "6  - Review Quarterly Donations.          "
600 DATA "7  - Create Formatted Donation Report File"
610 DATA "8  - Set Quarter.                         "
620 DATA "Q  - Return to System.                    ","",*
630 PRINT CLR$:RESTORE 520:GOSUB 390
640   IF QTR$="" THEN 660
650 PRINT FNCTR$("Current Quarter is "+QTR$+" Quarter."):GOTO 670
660 PRINT FNCTR$("No current Quarter initialized.")
670 PRINT:PRINT FNCTR$("Enter option desired:  ");
680 T$=INKEY$:IF LEN(T$)<1 THEN 680 ELSE PRINT T$;
690   IF T$="Q" OR T$="q" THEN PRINT "uit":GOTO 800 ELSE 750
700   IF OPT=6 THEN FLAG=2      'needed in GOSUB
710   IF OPT=8 THEN F$(4)=""
720 ON OPT GOSUB 2490,1300,2700,2200,4510,4510,4510,500:GOTO 630
730 PRINT FNCTR$("Do you wish to continue?  (Y/N):  ");
740 T$=INKEY$:IF LEN(T$)<1 THEN 740 ELSE PRINT T$
750 OPT=INSTR("12345678YyNn",T$)
760   IF OPT=9 OR OPT=10 THEN 670  'get menu selection
770   IF OPT=11 OR OPT=12 THEN 800  'endit
780   IF OPT>0 AND OPT<9 THEN 700 ELSE 730  'make sure in range 1-9
790 DATA "","","Processing complete","","Bye...",*
800 RESTORE 790:GOSUB 390:END
810 '== Open and define files ==
820 RESET:OPEN "R",#1,F$(1)
830 FIELD #1,2 AS FZ1$,2 AS FXNR1$,30 AS FXN$,30 AS FA1$,30 AS FA2$,15 AS FA3$,
    2 AS FA4$,5 AS FA5$,7 AS FTEL$
840 OPEN "R",#2,F$(2)
850 FIELD #2,2 AS FZ1$,2 AS FXNR1$,6 AS FANNIV$,6 AS FTDJN$,10 AS FPSN$,
    4 AS FXREF$,6 AS FBDAY$,10 AS FSKIL$(1), 10 AS FSKIL$(2),10 AS FSKIL$(3),
    10 AS FSKIL$(4), 10 AS FCOMM$(1),10 AS FCOMM$(2),10 AS FCOMM$(3),
    10 AS FCOMM$(4)
860 OPEN "R",#3,F$(3)
870 FIELD #3,2 AS FZ1$,2 AS FXNR1$,120 AS FCMT$
880 OPEN "R",#4,F$(4)
890 FIELD #4,2 AS FZ1$,2 AS FXNR1$,2 AS FWK$,52 AS FTD$,15 AS FSP1N$,
    52 AS FSP1D$
900 RETURN
910 '== Table Build ==
920 FOR REC=1 TO MAX
930   GET #1,REC:IF LEFT$(FXN$,1)="Z" THEN MNR(REC)=0 ELSE MNR(REC)=REC
940 GET #1,REC:X$=FXN$:IF LEFT$(X$,1)="Z" THEN MNR(REC)=0:GOTO 950
950 NEXT REC
960 RETURN
970 '== Find Member Record ==
980 FOR N=1 TO MAX
990   IF REC=MNR(N) THEN 1030  'found it; return
1000 NEXT N:IF FLAG=5 THEN REC=0:GOTO 1030  'special use
1010 PRINT:PRINT FNCTR$("Member # "+STR$(REC)+" not presently in use."):PRINT
1020 FOR N=1 TO 500:REC=0:NEXT
1030 RETURN
1040 '== File Write ==
1050 LSET FZ1$="**"
1060 LSET FXNR1$=MKI$(REC)
1070 LSET FXN$=NAM$
1080 LSET FA1$=T1$
1090 LSET FA2$=T2$
1100 LSET FA3$=T3$
1110 LSET FA4$=T4$
1120 LSET FA5$=T5$
1130 LSET FTEL$=TEL$
1140 LSET FANNIV$=ANNIV$
1150 LSET FTDJN$=DTJN$
1160 LSET FPSN$=PSN$
1170 LSET FXREF$=XREF$
1180 LSET FBDAY$=BDAY$
1190 FOR I=1 TO 4:LSET FSKIL$(I)=SKIL$(I):NEXT I
1200 FOR I=1 TO 4:LSET FCOMM$(I)=COMM$(I):NEXT I
1210 LSET FCMT$=CMT$
1220 '== File Rewrite Entry Point ==
1230 PUT #1,REC
1240 PUT #2,REC
1250 PUT #3,REC
1260 PUT #4,REC
1270 '
1280 RETURN
1290 '== Add New Member(s) ==
1300 DATA "== Entering New Members ==",""
1310 DATA "Enter new Member Number (up to 4 digits), RETURN to quit,"
1320 DATA "or ? for me to find an unused Member number.","",*
1330 PRINT CLR$:RESTORE 1300:GOSUB 390
1340 PRINT FNCTR$("Enter selection (# or ? and RETURN) or RETURN to quit:  ");
1350   INPUT "",A$:IF A$="" THEN 2030  'return
1360   IF A$="?" THEN FLAG=1 ELSE FLAG=0  'find next avail mbr #
1370 GOSUB 2060         'find member #
1380   IF FLAG=1 THEN FLAG=0:GOTO 2030  'a problem - gotta quit.
1390 PRINT FNCTR$("Family Head Member # (1-3 digits) or RETURN if Head:  ");
1400 INPUT "",XREF$:IF XREF$="" OR XREF$=STR$(REC) THEN XREF=0:GOTO 1560
1410 XREF=VAL(XREF$)
1420 TEMP=REC:REC=XREF:GOSUB 980:XREF=RC=TEMP
1430 IF XREF>0 THEN 1540
1440 DATA "ERROR!  The Family Head Member # is not on file!"
1450 DATA "Enter the correct number, or this member # for now.","",*
1460 RESTORE 1440:GOSUB 390:GOTO 1390
1470 DATA "","Because you've cross-referenced this member to another member,"
1480 DATA "you may use the 'Head of Family' (HOF) information for addresses,"
1490 DATA "telephone numbers, date joined church, anniversary, etc."
1500 DATA "(Fields that will accept a HOF default are marked with an *."
1510 DATA "Just hit RETURN to use the HOF data.)",""
1520 DATA "This does NOT work for church position, skills, and those personal"
1530 DATA "things not shared with a Head of Family.","",*
1540 RESTORE 1470:GOSUB 390
1550 GET #1,XREF:GET #2,XREF:GET #3,XREF
1560 PRINT TAB(10);:LINE INPUT "Member name (L<sp>,F<sp>MI):  ",NAM$
1570   IF NAM$="Q" THEN MNR(REC)=0:GOTO 1330
1580   IF LEN(NAM$)>1 THEN 1610
1590 PRINT FNCTR$("You really must enter a name, you know, or Q to quit.")
1600 GOTO 1560
1610 PRINT TAB(10);:INPUT "First address line:  *",T1$
1620   IF T1$<>"" THEN 1640 ELSE IF XREF<=0 THEN T1$="~":GOTO 1640
1630   T1$=FA1$:T2$=FA2$:T3$=FA3$:T4$=FA4$:T5$=FA5$:GOTO 1720   'Use HOF data
1640 PRINT TAB(10);:INPUT "Second address line:  *",T2$:IF T2$="" THEN T2$="~"
1650 PRINT TAB(10);"City (if ";HT$;", enter H):  *";:INPUT "",T3$
1660   IF T3$="H" THEN T3$=HT$:T4$=ST$:GOTO 1710
1670   IF T3$<>"" THEN 1690 ELSE IF XREF<=0 THEN T3$="~":GOTO 1690
1680   T3$=FA3$:T4$=FA4$:T5$=FA5$:GOTO 1720     'Use HOF data
1690 PRINT TAB(10);"State (2-char, if ";ST$;" hit RETURN):  ";:INPUT "",T4$
1700   IF T4$="" THEN T4$=ST$
1710 PRINT TAB(10);:INPUT "ZIP code (5 digits):  ",T5$
1720 PRINT TAB(10);:INPUT "Telephone number (7 digits, no dash):  *",TEL$
1730   IF TEL$="" THEN IF XREF>0 THEN TEL$=FTEL$ ELSE TEL$="~"
1740   IF LEN(TEL$)<=7 THEN 1760
1750 PRINT FNCTR$("ERROR!  7 numbers only, please."):GOTO 1720
1760 PRINT TAB(10);:INPUT "Date joined church (YYMMDD):  *",DTJN$
1770   IF DTJN$="" THEN IF XREF>0 THEN DTJN$=FDTJN$ ELSE DTJN$="~"
1780 PRINT TAB(10);:INPUT "Anniversary date (YYMMDD):  *",ANNIV$
1790   IF ANNIV$="" THEN IF XREF>0 THEN ANNIV$=FANNIV$ ELSE ANNIV$="~"
1800 PRINT TAB(10);:INPUT "Church Position (max 10 chars):  ",PSN$
1810   IF PSN$="" THEN PSN$="~"
1820 PRINT TAB(10);:INPUT "Birth Date (YYMMDD):  ",BDAY$
1830   IF BDAY$="" THEN BDAY$="~"
1840 PRINT "Enter up to 4 Special Skills (max 10 chars, RETURN to stop):"
1850 FLAG=0
1860 FOR I=1 TO 4
1870     IF FLAG=1 THEN SKIL$(I)="~":GOTO 1900
1880   PRINT TAB(10);"Skill";I;:INPUT ":  ",SKIL$(I)
1890     IF SKIL$(I)="" THEN SKIL$(I)="~":FLAG=1
1900 NEXT I:FLAG=0
1910 PRINT "Enter up to 4 Committee memberships (present and past;"
1920 PRINT "put past ones in parentheses, e.g., '(Building)')."
1930 PRINT "(max 10 characters, RETURN to stop):"
1940 FOR I=1 TO 4
1950     IF FLAG=1 THEN COMM$(I)="~":GOTO 1980
1960   PRINT TAB(10);"Committee";I;:INPUT ":  ",COMM$(I)
1970     IF COMM$(I)="" THEN COMM$(I)="~":FLAG=1
1980 NEXT I:FLAG=0
1990 PRINT "Enter other desired information or comments (up to 1 line):"
2000 PRINT:LINE INPUT "",CMT$:IF CMT$="" THEN CMT$="None"
2010 GOSUB 1050:GOSUB 820
2020 GOTO 1300
2030 RETURN
2040 '== Find Record Number for New Member ==
2050 ' Must bring in A$
2060   IF A$="?" THEN 2130 ELSE IF A$="" THEN FLAG=1:GOTO 2180
2070 REC=VAL(A$)
2080     IF MNR(REC)=0 THEN 2160
2090 PRINT "ERROR!  Duplicate Member Number.  Select another, please,"
2100 PRINT "? for next available number, or RETURN to quit."
2110 INPUT "Enter selection ( # or ? ) or RETURN to quit:  ",A$
2120 GOTO 2060
2130   FOR REC=1 TO MAX:IF MNR(REC)=0 THEN 2160:NEXT REC
2140 PRINT FNCTR$("Sorry - no more records are available.")
2150 FLAG=1:REC=0:GOTO 2180
2160   FLAG=0:MNR(REC)=REC
2170 PRINT FNCTR$("Confirming Member Record #"+STR$(REC))
2180 RETURN
2190 '== Query Member Record ==
2200 REC=0:PRINT CLR$;FNCTR$("== Query Member Record =="):PRINT
2210 PRINT FNCTR$("Enter Member Number (#, ?-Listing, A-All, Q-Quit):  ");
2220 INPUT; "",A$:IF A$="Q" OR A$="q" THEN PRINT "uit":GOTO 2300
2230 PRINT:IF A$="?" THEN GOSUB 2490:GOTO 2200
2240   IF A$<>"A" AND A$<>"a" THEN 2270
2250 IF REC<MAX THEN   REC=REC+1:IF MNR(REC)>0 THEN GOSUB 2330:GOTO 2280
2260   IF REC>=MAX THEN 2200 ELSE 2250
2270 REC=VAL(A$):GOSUB 980:IF REC=0 THEN 2200 ELSE GOSUB 2330:REC=0
2280   IF T$="Q" OR T$="q" THEN PRINT "uitting...":GOTO 2300
2290   IF REC=0 THEN 2200 ELSE 2250
2300 RETURN
2310 PRINT FNCTR$("Getting Member #");REC:GOTO 2250
2320 '-- gosub to show member rec --
2330 GET #1,REC:GET #2,REC:GET #3,REC
2340 T7$=MID$(FTEL$,1,3):T8$=MID$(FTEL$,4,4)
2350 PRINT CLR$;"MBR #";TAB(12);"NAME";TAB(40);"ADDRESS":PRINT
2360 PRINT REC;TAB(10);FXN$;TAB(40);FA1$
2370   IF ASC(FA2$)>32 THEN PRINT TAB(40);FA2$
2380 PRINT TAB(40);FA3$;FA4$;"  ";FA5$:PRINT
2390 PRINT "Position:       ";FPSN$;TAB(40);"Tel #:        ";T7$;"-";T8$
2400 PRINT "Joined:         ";FTDJN$;TAB(40);"Birth Date:   ";FBDAY$
2410 PRINT "Family Head #:  ";FXREF$;TAB(40);"Anniversary:  ";FANNIV$
2420 PRINT:PRINT TAB(15);"Skills";TAB(40);"Committees ('(past)')"
2430 FOR I=1 TO 4:PRINT TAB(15);FSKIL$(I);TAB(40);FCOMM$(I):NEXT I
2440 PRINT:PRINT:PRINT FCMT$
2450 PRINT FNCTR$("Hit RETURN to continue, or Q to quit:  ");
2460 T$=INKEY$:IF LEN(T$)<1 THEN 2460
2470 RETURN
2480 '== Print Member Numbers ==
2490 GOSUB 2500:GOTO 2540
2500 PRINT CLR$;FNCTR$("== Member Number List =="):PRINT
2510 PRINT "NBR";TAB(5);"NAME";TAB(35);"XREF";
2520 PRINT TAB(40);"NBR";TAB(45);"NAME";TAB(75);"XREF"
2530 RETURN
2540 T=MAX/2            '2 columns
2550 FOR REC=1 TO T
2560   T0=0:T1=REC:T2=0
2570     IF MNR(T1)=0 THEN 2620
2580   GET #1,T1:GET #2,T1
2590   PRINT TAB(T2);:PRINT USING "###";REC;
2600   PRINT TAB(T2+5);FXN$;TAB(T2+35);FXREF$;
2610   IF T2=0 THEN PRINT "|"; ELSE PRINT
2620   IF T2>0 THEN 2650
2630   IF T2=0 THEN T1=T+REC:T2=40:GOTO 2570
2640   IF REC MOD 20=0 AND REC<T THEN GOSUB 2660:GOSUB 2500
2650 NEXT REC
2660 PRINT RET$;
2670 T$=INKEY$:IF LEN(T$)<1 THEN 2670
2680 RETURN
2690 '== Correct Member Information ==
2700 PRINT CLR$;FNCTR$("== Member Record Corrections =="):PRINT
2710 PRINT FNCTR$("Enter Member Number, ? for a Listing, or RETURN to quit:  ");
2720 INPUT; "",A$:IF A$="" THEN PRINT "Quit.":GOTO 2900 'return
2730   IF A$="?" THEN PRINT:GOSUB 2490:GOTO 2700
2740   REC=VAL(A$):PRINT CLR$:GOSUB 980
2750   IF REC=0 THEN 2900       'return
2760 GET #1,REC:GET #2,REC:GET #3,REC:GET #4,REC
2770 PRINT REC,FXN$:PRINT
2780 GOTO 2920
2790 '-- Delete record --
2800 PRINT FNCTR$("Delete this Member Record?  ('DELETE' or RETURN for No):  ");
2810 INPUT "",T$:IF T$<>"DELETE" THEN 2900 ELSE IF FLAG=1 THEN 2890
2820 DATA "","WARNING!    If you delete this record, ALL record of ALL data"
2830 DATA "on this member is PERMANENTLY and FOREVER destroyed in this file."
2840 DATA "There are other options available:  Change the member's number;"
2850 DATA "Move the member to an inactive file."
2860 DATA "Consider these, and be ABSOLUTELY sure you want to delete this!"
2870 DATA "If you do not, enter ANYTHING but 'DELETE' to abort.","",*
2880 RESTORE 2820:GOSUB 390:IF FLAG=1 THEN FLAG=0 ELSE FLAG=1:GOTO 2800
2890 TEMP=REC:GOSUB 3770        'delete rec
2900 FLAG=0:RETURN
2910 '== Regular member data change ==
2920 PRINT FNCTR$("== Member Record Correction =="):PRINT
2930 PRINT "Enter the information to be changed (only one at a time, please):"
2940 DATA "Member Number:","#","Member Name:","N","Position:","P"
2950 DATA "Telephone:","T","Address:","A","Birth Date:","B"
2960 DATA "Date Joined:","J","Anniversary:","M","Skill(s):","S"
2970 DATA "Committee(s):","C","Family Head:","H","Other Comments:","O"
2980 DATA "Delete Member:","D"
2990 RESTORE 2940:FOR N=1 TO 13:READ A$,B$:PRINT,A$;TAB(30);B$:NEXT N
3000 PRINT:PRINT FNCTR$("(#,N,P,T,A,B,J,M,S,C,H,O,D, or ESC to quit):  ");
3010 A$=INKEY$:IF LEN(A$)<1 THEN 3010 ELSE IF ASC(A$)=11 OR ASC(A$)=17 THEN 3010
3020   IF A$=ESC$ THEN PRINT "ESC" ELSE PRINT A$:GOTO 3050
3030     PRINT FNCTR$("Now updating all changes to files...")
3040     GOSUB 1230:PRINT CLR$:GOTO 2700
3050 T=INSTR("#NPTABJMSCHOD",A$)
3060  IF T<1 THEN PRINT FNCTR$("ERROR!  Try again, please."):PRINT:GOTO 3000
3070 DATA "Remember, use RETURN to accept Present data, 'ERASE' to erase"
3080 DATA "an entry, or enter new data as desired.  DO NOT use this utility"
3090 DATA "to go right back and check a new entry (and then hit RETURN to"
3100 DATA "accept that new entry) -- the new data is not actually written"
3110 DATA "to the disk yet, and your RETURN will erase it!","",*
3120 PRINT CLR$:RESTORE 3070:GOSUB 390
3130 ON T GOSUB 3600,3170,4030,3260,3330,3890,3820,3960,4280,4390,4100,4170,2800
3140   IF T=1 THEN 3030 ELSE IF T=13 THEN 2700
3150 PRINT:PRINT:PRINT FNCTR$("Change posted."):FOR I=1 TO 500:NEXT:GOTO 2920
3160 '== Change Name ==
3170 PRINT "Present Name:  ";FXN$
3180 LINE INPUT; "Enter corrected name (max 30 char):  ",A$
3190   IF A$="" THEN PRINT FXN$:GOTO 3240 ELSE PRINT
3200   IF A$<>"ERASE" THEN  3230
3210 PRINT FNCTR$("ERROR!  You cannot ERASE a name field, only change.")
3220 PRINT:GOTO 3170
3230 LSET FXN$=A$
3240 RETURN
3250 '== Change Telephone Number ==
3260 PRINT "Present Telephone Number:  ";FTEL$
3270 INPUT; "Enter new telephone number (max 7 characters, no dashes):  ",A$
3280   IF A$="" THEN PRINT FTEL$:GOTO 3310
3290   IF A$="ERASE" THEN A$="~"
3300 PRINT:LSET FTEL$=A$
3310 RETURN
3320 '== Change Address ==
3330 PRINT "Present Address:  ";TAB(20);FA1$
3340 PRINT TAB(20);FA2$:PRINT TAB(20);FA3$
3350 PRINT TAB(20);FA4$:PRINT TAB(20);FA5$
3360 PRINT:PRINT FNCTR$("Enter new information, or RETURN to accept the old:")
3370 PRINT:INPUT; "Enter first address line:  ",A$
3380   IF A$=""
THEN PRINT FA1$:GOTO 3410
3390   IF A$="ERASE" THEN A$="~":PRINT A$
3400 LSET FA1$=A$
3410 PRINT:INPUT; "Enter second address line:  ",A$
3420   IF A$="" THEN PRINT FA2$:GOTO 3450
3430   IF A$="ERASE" THEN A$="~":PRINT A$
3440 LSET FA2$=A$
3450 PRINT:INPUT; "Enter City (20 char):  ",A$
3460   IF A$<>"" THEN 3480
3470 PRINT "City & State:  ";FA3$;"  ";FA4$:GOTO 3540
3480   IF A$="ERASE" THEN A$="~":PRINT A$
3490 LSET FA3$=A$
3500 PRINT:INPUT; "Enter State (2 char abbrev.):  ",A$
3510   IF A$="" THEN PRINT FA4$:GOTO 3540
3520   IF A$="ERASE" THEN A$="~":PRINT A$
3530 LSET FA4$=A$
3540 PRINT:INPUT; "Enter ZIP code (5 char):  ",A$
3550   IF A$="" THEN PRINT FA5$:GOTO 3580
3560   IF A$="ERASE" THEN A$="~":PRINT A$
3570 LSET FA5$=A$
3580 PRINT:RETURN
3590 '== Change Member Number ==
3600 DATA "== Changing Member Numbers ==",""
3610 DATA "You may assign a member a new number.  However it CANNOT be one"
3620 DATA "already assigned.  You must first Delete that other member"
3630 DATA "from the files, COMPLETELY and FOREVER erasing all data you have"
3640 DATA "on that person -- and that's pretty drastic!",""
3650 DATA "I recommend you change the old member's number to a high unused"
3660 DATA "number, and then assign the vacant number as you desire.","",***
3670 PRINT CLR$:RESTORE 3600:GOSUB 390:TEMP=REC
3680 FOR I=1 TO 4:GET #I,REC:NEXT
3690 PRINT:PRINT FNCTR$("Present Member's Number:  "+STR$(REC))
3700 PRINT FNCTR$("Enter new desired number (4 digits, or RETURN to quit):  ");
3710 INPUT "",A$:IF A$="" THEN 3800
3720   IF A$="ERASE" THEN PRINT "ERROR!":GOTO 3690
3730 GOSUB 2060:IF REC=0 OR FLAG=1 THEN 3800
3740 '-- OK to use new number --
3750 LSET FXNR1$=MKI$(REC):MNR(REC)=REC:GOSUB 1230      'post new data
3760 LSET FZ1$="ZZ":LSET FXNR1$=MKI$(0):LSET FXN$=""
3770 REC=TEMP:MNR(REC)=0:GOSUB 1230     'purge old
3780 PRINT FNCTR$("Deletion Posted"):PRINT RET$;
3790 A$=INKEY$:IF LEN(A$)<1 THEN 3790
3800 RETURN
3810 '== Change Date Joined ==
3820 PRINT "Present Date Joined:  ";FTDJN$
3830 INPUT; "Enter new Date Joined (YYMMDD):  ",A$
3840   IF A$="" THEN PRINT FTDJN$:GOTO 3870
3850   IF A$="ERASE" THEN A$="~":PRINT A$
3860 LSET FTDJN$=A$
3870 RETURN  'to member field change
3880 '== Change Birth Date ==
3890 PRINT "Present Birth Date:  ";FBDAY$
3900 INPUT; "Enter new Birth Date (YYMMDD):  ",A$
3910   IF A$="" THEN PRINT FBDAY$:GOTO 3940
3920   IF A$="ERASE" THEN A$="~":PRINT A$
3930 LSET FBDAY$=A$
3940 RETURN
3950 '== Change Anniversary ==
3960 PRINT "Present Anniversary:  ";FANNIV$
3970 INPUT; "Enter new Anniversary (YYMMDD):  ",A$
3980   IF A$="" THEN PRINT FANNIV$:GOTO 4010
3990   IF A$="ERASE" THEN A$="~":PRINT A$
4000 LSET FANNIV$=A$
4010 RETURN
4020 '== Change Church Position ==
4030 PRINT "Present Church Position:  ";FPSN$
4040 INPUT; "Enter new Church Position (10 char):  ",A$
4050   IF A$="" THEN PRINT FPSN$:GOTO 4080
4060   IF A$="ERASE" THEN A$="~":PRINT A$
4070 LSET FPSN$=A$
4080 RETURN
4090 '== Change Family Head # ==
4100 PRINT "Present Family Head Member #:  ",FXREF$
4110 INPUT; "Enter new Family Head Member #:  ",A$
4120   IF A$="" THEN PRINT FXREF$:GOTO 4150
4130   IF A$="ERASE" THEN A$="~":PRINT A$
4140 LSET FXREF$=A$
4150 RETURN  'to member field change
4160 '== Change Other Comments ==
4170 PRINT "Present Comment Line:":PRINT:PRINT FCMT$:PRINT:T$=FCMT$
4180 PRINT "Enter new Comment Line:":LINE INPUT; "*",A$
4190   IF A$="" THEN PRINT T$:A$=T$:GOTO 4250
4200   IF A$="ERASE" THEN A$="None.":GOTO 4250
4210 PRINT "A double-check ... here's your new line.  If OK, hit RETURN."
4220 PRINT "If you don't like it, do it again."
4230 PRINT:PRINT A$:PRINT:T$=A$
4240 GOTO 4180
4250 LSET FCMT$=A$
4260 RETURN
4270 '== Change Skills ==
4280 PRINT "Present Skills:"
4290 FOR I=1 TO 4:PRINT USING "#. ";I;
4300   PRINT FSKIL$(I);:IF I<>4 THEN PRINT ", ";
4310 NEXT I:PRINT
4320 PRINT "Enter new skills (10 chars):"
4330 FOR I=1 TO 4:PRINT USING "#. ";I;:INPUT; "",A$
4340     IF A$="" THEN PRINT FSKIL$(I):GOTO 4360 ELSE IF A$="ERASE" THEN A$="~"
4350   LSET FSKIL$(I)=A$
4360 PRINT:NEXT I
4370 RETURN
4380 '== Change Committee Membership ==
4390 PRINT "Present Committee Membership:"
4400 FOR I=1 TO 4:PRINT USING "#. ";I;
4410   PRINT FCOMM$(I);:IF I<>4 THEN PRINT ", ";
4420 NEXT I:PRINT
4430 PRINT "Enter new Committee Membership(s) (10 chars):"
4440 FOR I=1 TO 4:PRINT USING "#. ";I;:INPUT; "",A$
4450     IF A$="" THEN PRINT FCOMM$(I):GOTO 4480
4460     IF A$="ERASE" THEN A$="~":PRINT A$
4470   LSET FCOMM$(I)=A$
4480 PRINT:NEXT I
4490 RETURN  'to member field change
4500 '== Actual Donation Posting/Listing ==
4510 PRINT CLR$;FNCTR$("== Donation Posting/Listing ==")
4520 PRINT FNCTR$("Current Quarter:  "+QTR$+" Quarter"):PRINT
4530 REC=1:IF OPT=7 THEN OPEN "O",#5,"MBRS-DON.RPT"
4540 LSET FSP1N$=""
4550 PRINT FNCTR$("Enter Member Number (or ?-Listing, A-All, RETURN-quit):  ");
4560 INPUT "",A$:REC=1
4570   IF A$="A" OR A$="a" THEN FLAG=1:GOTO 4610
4580   IF A$="" THEN IF OPT=7 THEN CLOSE #5:RETURN ELSE RETURN
4590   IF A$="?" THEN GOSUB 2490:GOTO 4510
4600 REC=VAL(A$):FLAG=0:GOSUB 980:IF REC=0 THEN 4550
4610   IF MNR(REC)=0 THEN 4720
4620 GET #1,REC:GET #2,REC:GET #4,REC
4630 A=CVI(FXNR1$):IF ASC(FSP1N$)>32 THEN L=1 ELSE LSET FSP1N$="None":L=0
4640   IF LEN(FWK$)=0 THEN WK=0:TD$="":SP1D$="":GOTO 4680
4650 T=CVI(FWK$):WK=T
4660 TD$=LEFT$(FTD$,T*4)
4670 SP1D$=LEFT$(FSP1D$,T*4)
4680 WK=WK+1:LSET FWK$=MKI$(WK)
4690   IF OPT=5 THEN GOSUB 4740
4700   IF OPT=6 THEN GOSUB 4980:IF T$="Q" THEN A$="":GOTO 4580
4710   IF OPT=7 THEN GOSUB 5340
4720   IF FLAG=0 OR REC>MAX THEN 4550 ELSE REC=REC+1:GOTO 4610
4730 '-- Donation Entry --
4740 LSET FZ1$="**":LSET FSP1D$="":LSET FTD$=""
4750 PRINT CLR$;"Donation for Member ";FXN$
4760 PRINT "Type Donation (S - Special, RETURN - Sunday, ESC - Next Mbr):  ";
4770 TYP$=INKEY$:IF LEN(TYP$)<1 THEN 4770
4780   IF TYP$=ESC$ THEN PRINT "Next Member...":GOTO 4960  'return
4790   IF TYP$="S" OR TYP$="s" THEN TYP=1:TYP$="Special":GOTO 4810
4800   TYP$="Regular":TYP=0
4810 PRINT:PRINT:PRINT "Now posting ";TYP$;" Donation, Week #";WK
4820   IF TYP=0 THEN 4890
4830 PRINT FNCTR$("The Special Donation name is "+FSP1N$)
4840 PRINT FNCTR$("Enter name of new Special Donation (max 15 chars),")
4850 PRINT FNCTR$("or RETURN for no change/none:  ");:LINE INPUT;"",A$
4860   IF L=1 AND LEN(A$)=0 THEN PRINT "Accepted.":GOTO 4890
4870   IF L=0 AND LEN(A$)=0 THEN A$="None":PRINT A$
4880 LSET FSP1N$=A$:GOTO 4830
4890 PRINT "Enter ";TYP$;" Donation Amount (no $ or ,):  ";:INPUT "",DNEW
4900 PRINT "The amount entered is ";:PRINT USING "$###.##";DNEW
4910 PRINT "Hit RETURN to accept, or enter corrected donation amount:  ";
4920 INPUT "",A:IF A<>0 THEN DNEW=A:GOTO 4900
4930 DNEW$=MKS$(DNEW)
4940   IF TYP=1 THEN LSET FSP1D$=SP1D$+DNEW$ ELSE LSET FTD$=TD$+DNEW$
4950 PUT #4,REC:GOTO 4760
4960 CLOSE #4:GOSUB 880:RETURN
4970 '== Screen Donation Report ==
4980 PRINT CLR$;FNCTR$("DONATIONS")
4990 PRINT TAB(30);FXN$;TAB(70);FXNR1$
5000 PRINT TAB(30);FA1$
5010   IF ASC(FA2$)<>32 AND ASC(FA2$)<>126 THEN PRINT TAB(30);FA2$
5020 PRINT TAB(30);FA3$;FA4$;"  ";FA5$
5030 PRINT FNCTR$(QTR$+" Quarter "+YR$):PRINT
5040 PRINT TAB(20);"Sunday";TAB(50);"Special"
5050 PRINT TAB(10);"Week";TAB(20);"Donation";TAB(50);"Donation";
5060 PRINT TAB(60);"Purpose"
5070 PRINT TAB(10);"----";TAB(20);"--------";TAB(50);"--------";
5080 PRINT TAB(60);"-------"
5090 DT=0:DSP1T=0
5100 FOR I=1 TO 13
5110   IF WK=1 THEN PRINT:PRINT FNCTR$("No donations entered."):GOTO 5280
5120   IF I=WK THEN 5220
5130   D$=MID$(FTD$,((I-1)*4)+1,4)
5140   SP1D$=MID$(FSP1D$,((I-1)*4)+1,4)
5150   D=CVS(D$):DSP1=CVS(SP1D$)
5160   PRINT TAB(10);:PRINT USING "###";I;
5170     PRINT TAB(20);:PRINT USING "  ###.##";D;
5180     PRINT TAB(50);:PRINT USING "  ###.##";DSP1;
5190     PRINT TAB(60);:IF I=WK-1 THEN PRINT FSP1N$ ELSE PRINT
5200   DT=DT+D:DSP1T=DSP1T+DSP1
5210 NEXT I
5220 DAV=DT/(I-1)
5230 PRINT TAB(20);"---------";TAB(50);"---------":PRINT
5240 PRINT TAB(10);"Total:";TAB(20);:PRINT USING " $###.##";DT;
5250 PRINT TAB(50);:PRINT USING " $###.##";DSP1T
5260 PRINT "Weekly average:";TAB(20);:PRINT USING " $###.##";DAV;
5270 PRINT TAB(35);"Comb. Total:";TAB(50);:PRINT USING " $###.##";DT+DSP1T
5280 PRINT BTM$;FNCTR$("Hit RETURN to continue or Q to quit:  ");
5290 T$=INKEY$:IF LEN(T$)<1 THEN 5290 ELSE PRINT CLR$:RETURN
5300 '== Print Formatted Donation Report to File ==
5310 PRINT #5,CLR$;     'FNCTR$("MY CHURCH")
5320 'PRINT #5,FNCTR$("100 Sanctity Lane")
5330 'PRINT #5,FNCTR$(HT$+" "+ST$+"  28303"):PRINT #5,""
5340 PRINT #5,FNCTR$("DONATIONS"):PRINT #5,""
5350 PRINT #5,TAB(30);FXN$;TAB(70);FXNR1$
5360 PRINT #5,TAB(30);FA1$
5370   IF ASC(FA2$)<>32 AND ASC(FA2$)<>126 THEN PRINT #5,TAB(30);FA2$
5380 PRINT #5,TAB(30);FA3$;FA4$;"  ";FA5$:PRINT #5,""
5390 PRINT #5,FNCTR$(QTR$+" Quarter +YR$):PRINT #5,""
5400 PRINT #5,TAB(20);"Sunday";TAB(50);"Special"
5410 PRINT #5,TAB(10);"Week";TAB(20);"Donation";TAB(50);"Donation";
5420 PRINT #5,TAB(60);"Purpose"
5430 PRINT #5,TAB(10);"----";TAB(20);"--------";TAB(50);"--------";
5440 PRINT #5,TAB(60);"-------"
5450 DT=0:DSP1T=0
5460 FOR I=1 TO 13:IF WK<>1 THEN 5480
5470   PRINT #5,"":PRINT #5,FNCTR$("No donations entered."):GOTO 5580
5480     IF I=WK THEN 5580
5490   FD$=MID$(FTD$,(I-1)*4+1,4)
5500   SP1D$=MID$(FSP1D$,(I-1)*4+1,4)
5510   D=CVS(FD$):DSP1=CVS(SP1D$)
5520   PRINT #5,TAB(10);:PRINT #5,USING "###";I;
5530     PRINT #5,TAB(20);:PRINT #5,USING "  ###.##";D;
5540     PRINT #5,TAB(50);:PRINT #5,USING "  ###.##";DSP1;
5550     PRINT #5,TAB(60);:IF I=WK-1 THEN PRINT #5,FSP1N$ ELSE PRINT #5
5560   DT=DT+D:DSP1T=DSP1T+DSP1
5570 NEXT I
5580 DAV=DT/I
5590 PRINT #5,TAB(20);"---------";TAB(50);"---------":PRINT #5,""
5600 PRINT #5,TAB(10);"Total:";TAB(20);:PRINT #5,USING " $###.##";DT;
5610 PRINT #5,TAB(50);:PRINT #5,USING " $###.##";DSP1T
5620 PRINT #5,"":PRINT #5,"Weekly average:";TAB(20);
5630 PRINT #5,USING " $###.##";DAV;:PRINT #5,TAB(35);"Comb. Total:";
5640 PRINT #5,TAB(50);:PRINT #5,USING " $###.##";DT+DSP1T;:PRINT #5,CHR$(12)
5650 RETURN
5660 '-- Small Gosub to field all files --
5670 FOR I=1 TO 4
5680   OPEN "R",#I,F$(I):FIELD #I,126 AS FA$
5690 PRINT FNCTR$("Now opening and fielding "+F$(I)+" (File #"+STR$(I)+").")
5700 NEXT I:RETURN
5710 '== Quarter File Init==
5720 DATA "== Quarter Initialization ==",""
5730 DATA "You may now set the present Quarter to access current Quarterly"
5740 DATA "Donation Files.  If this is a new Quarter, that file will be"
5750 DATA "created automatically.","",*
5760 PRINT CLR$:RESTORE 5720:GOSUB 390
5770 GOSUB 6150:IF T$<>"Q" THEN 5820
5780   IF LEN(F$(4))>0 THEN 6120
5790 PRINT FNCTR$("Your file names are NOT initialized, and you cannot access")
5800 PRINT FNCTR$("your files until that is done!  Please select a Quarter.")
5810 GOTO 5770
5820 QTR$=MID$("1st2nd3rd4th",(VAL(T$)-1)*3+1,3)
5830 PRINT:PRINT FNCTR$("Here are your file names for the "+QTR$+" Quarter:")
5840 PRINT:PRINT TAB(20);
5850 FOR I=1 TO 4:PRINT F$(I);"  ";:NEXT I:PRINT
5860 RESET:ON ERROR GOTO 5940
5870 ' The following file test requires that MBRS.BAS exist on this disk.
5880 ' So DON'T change MBRS.BAS to anything else, or change these names.
5890 NAME "MBRS.BAS" AS F$(1)
5900 NAME F$(1) AS "MBRS.BAS":ON ERROR GOTO 0
5910 GOTO 6050
5920 NAME "MBRS.BAS" AS F$(4)
5930 NAME F$(4) AS "MBRS.BAS":GOTO 5980
5940   IF ERR=58 AND ERL=5890 THEN RESUME 5920
5950   IF ERR=58 AND ERL=5920 THEN RESUME 6120
5960 PRINT "Untrapped ERR=";ERR;"at Line ";ERL:STOP
5970 '--Quarter files do not exist - initialize them.--
5980 ON ERROR GOTO 0
5990 PRINT FNCTR$("Creating new "+QTR$+" Quarter Donation File "+F$(4)+"...")
6000 OPEN "R",#4,F$(4):FIELD #4,2 AS FZ1$,2 AS FXNR1$,2 AS FWK$,120 AS FA$
6010 LSET FZ1$="ZZ":LSET FXNR1$=MKI$(0):LSET FWK$=MKI$(0)
6020 FOR REC=1 TO MAX:PUT #4,REC:NEXT REC:CLOSE #4
6030 GOTO 6120
6040 '-- Initialize All Files --
6050 FOR I=1 TO 3
6060   PRINT FNCTR$("Creating File "+F$(I))
6070   OPEN "R",#I,F$(I):FIELD #I,2 AS FZ1$,2 AS FXNR1$,122 AS FA$
6080   LSET FZ1$="ZZ":LSET FXNR1$=MKI$(0)
6090   FOR REC=1 TO MAX:PUT #I,REC:NEXT REC:CLOSE #I
6100 NEXT I:GOTO 5980
6110 '-- End of All File Initialization --
6120 ON ERROR GOTO 0
6130 RETURN
6140 '-- Prompt for and Get Quarter Data --
6150 IF QTR$="" THEN T$="No Quarter Initialized" ELSE T$=QTR$+" Quarter"
6160 PRINT FNCTR$("Current Quarter:  "+T$):PRINT
6170 PRINT FNCTR$("Enter Quarter desired (1,2,3,4) or ESC or RET to quit:  ");
6180 T$=INKEY$:IF LEN(T$)<1 THEN 6180
6190   IF T$=ESC$ OR T$="" THEN T$="Q":PRINT "Quit":GOTO 6220
6200 F$(4)="DONQTR"+T$+".DAT"
6210   IF INSTR("1234",T$)<1 THEN PRINT FNCTR$("ERROR!  Try again."):GOTO 6170
6220 RETURN