 
 {Simpleminded billing program for professional services (clinical
 psychology).  Written for ADM-3 CRT.  Copyright 1980 by Richard
 Yensen, Ph.D., 2403 Talbot Rd., Baltimore, MD 21216.  Distribution for 
 profit is prohibited.}
 
 (*$G+*)
 PROGRAM DISKBILL;
 TYPE
 PATIENT=RECORD
 
 NAME:STRING[32];
 STREET,KEY:STRING[40];
 CITYSTATE:STRING[40];
 RATE:REAL;
 RECEIVE, PERCENT:REAL;
 CUT:BOOLEAN;
 HARTMAN:ARRAY[1..2] OF ARRAY[1..18] OF INTEGER;
 DIAGNOSIS:STRING[40];
 SYMPTOMS:STRING[8];
 INSURANCECO:STRING[40];
 ACCTNUMBER:STRING[15];
 SOCSECNUMBER:STRING[10];
 EMPLOYER:STRING[40];
 WKSTREET:STRING[40];
 WKCTYSTATE:STRING[40];
 FIRSTVISIT:STRING[8];
 LASTVISIT:STRING[8];
 BIRTHDATE:STRING[8];
 WORKPHONE:STRING[12];
 HOMEPHONE:STRING[12]
 END;
 
 VAR HANDLE:STRING[32];
 RECNUM:INTEGER;
 BUF:PATIENT;
 TITLE:STRING;
 FID:FILE OF PATIENT;
 GOTCASH,TOTAL,AMT:REAL;
 INDEX,DEFAULT:INTEGER;
 ANSWER:CHAR;
 DATE:ARRAY[1..26] OF STRING[9];
 TIME:ARRAY[1..26] OF REAL;
          SHOWTIME, FOUNDIT, KEEPGOING:BOOLEAN;
 OUT:TEXT;
 
 PROCEDURE WIPESCREEN;
 BEGIN
 WRITE(CHR(26));
 END;

 PROCEDURE SHALI;
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('Shall we continue?  ');
 READ(ANSWER);
 IF (ANSWER='N') OR (ANSWER='n') THEN KEEPGOING:=FALSE;
 END;
 
 PROCEDURE PROMPT;
 BEGIN
 WIPESCREEN;
 GOTOXY(12,12);
 WRITELN('This is a program to prepare bills.  Please enter the name of');
 WRITELN('the person you would like to prepare a bill for:  ');
 READLN(HANDLE);
 END; (*  PROMPT  *)
 
 PROCEDURE SEARCH;
 VAR ANSWER:CHAR;
 BEGIN
 FOUNDIT:=FALSE;
 RECNUM:=0;
 RESET(FID,'PATIENTS');
 WHILE (NOT FOUNDIT) AND (NOT EOF(FID)) DO
 BEGIN
 WITH FID^ DO
 BEGIN
 IF HANDLE=NAME THEN FOUNDIT:=TRUE;
 END;
 IF NOT FOUNDIT THEN
   BEGIN
 RECNUM:=RECNUM+1;
 SEEK(FID,RECNUM);
 GET(FID);
 END; (* IF NOT FOUNDIT *)
 END; (* WHILE *)
 IF (EOF(FID)) AND (NOT FOUNDIT) THEN 
 BEGIN
 WRITELN('Could not find ',HANDLE,' in the file');
                                           WRITELN('Be sure you put in the full name.');
 WRITELN('TYPE A "C" TO TRY AGAIN OR ANY OTHER CHARACTER TO STOP');
 READ(ANSWER);
 IF (ANSWER='C')OR(ANSWER='c')THEN
 BEGIN
 CLOSE(FID,LOCK);
 PROMPT;
 SEARCH;
 END;
 END;
 END; (*  SEARCH  *)
 
  
 PROCEDURE DODOTS(N:INTEGER)   {PRETTIES UP THE DISPLAY};
 VAR I:INTEGER;
 BEGIN
 FOR I:=1 TO N DO
 BEGIN
 WRITE('-');
 *END;
 END   {DODOTS};
 
 PROCEDURE PUTREAL(D:REAL);
 VAR I:INTEGER;
     B:INTEGER;
 BEGIN
 B:=ABS(ROUND((D-TRUNC(D))*100));
 IF B<10 THEN 
 BEGIN
 WRITE(TRUNC(D):3,'.0',B)
 END
 ELSE  {B>=10}
 BEGIN
 IF D>=1.0 THEN 
 BEGIN
 WRITE(TRUNC(D):3,'.',B) 
 END;
 IF D<1 THEN
 BEGIN
 I:=ROUND(D*100); 
 IF I>0 THEN {D is positive} 
 BEGIN 
 WRITE('  0.',B);
 END;
 IF I<0 THEN   {D is negative} 
 BEGIN
 WRITE(' -0.');
 IF B<10 THEN WRITE('0',B)
 ELSE WRITE(B);
 END;
 IF I=0 THEN WRITE('  0   ');
 END; 
 END  {D>=1.0};
 END  {PUTREAL};
 
 
 PROCEDURE PUTIME(D:REAL);
 VAR I:INTEGER;
     B:INTEGER;
       BEGIN
 B:=ABS(ROUND((D-TRUNC(D))*100));
 IF B<10 THEN 
 BEGIN
 WRITE(TRUNC(D):1,'.0',B)
 END
 ELSE  {B>=10}
 BEGIN
 IF D>=1.0 THEN 
 BEGIN
 WRITE(TRUNC(D):1,'.',B) 
 END;
 IF D<1 THEN
 BEGIN
 I:=ROUND(D*100); 
 IF I>0 THEN {D is positive} 
 BEGIN 
 WRITE('  0.',B);
 END;
 IF I<0 THEN   {D is negative} 
 BEGIN
 WRITE(' -0.');
 IF B<10 THEN WRITE('0',B)
 ELSE WRITE(B);
 END;
 IF I=0 THEN WRITE('  0   ');
 END; 
 END  {D>=1.0};
 END  {PUTIME};
 
 PROCEDURE PRINTAB(I:INTEGER);
 VAR J:INTEGER;
 BEGIN
 FOR J:=1 TO I DO
 BEGIN
 WRITE(OUT,' ');
 END;
 END;
 
 PROCEDURE TAB(I:INTEGER);
 VAR J:INTEGER;
 BEGIN
 FOR J:=1 TO I DO
 BEGIN
 WRITE(' ');
 END;
 END;
 
 PROCEDURE LASTHALFOFRECORD(REC:PATIENT);
 BEGIN
 WITH REC DO
 BEGIN
 WRITELN('Key to sort:              ',KEY);
 WRITELN('Diagnosis:                ',DIAGNOSIS);
 WRITELN('Date of First Symptoms:   ',SYMPTOMS);
 WRITELN('Insurance Company:        ',INSURANCECO);
                                             WRITELN('Account Number:           ',ACCTNUMBER);
 WRITELN('Social Security #:        ',SOCSECNUMBER);
 WRITELN('Employer:                 ',EMPLOYER);
 WRITELN('  Address:                ',WKSTREET);
 WRITELN('  City   State:           ',WKCTYSTATE);
 WRITELN('  Telephone:              ',WORKPHONE);
 WRITELN('Birthdate:                ',BIRTHDATE);
 WRITELN('First Visit:              ',FIRSTVISIT);
 WRITELN('Last Visit:               ',LASTVISIT);
 WRITELN('Home Telephone:           ',HOMEPHONE);
 END;
 END;(*  LASTHALFOFRECORD  *)
 
 PROCEDURE SHOWREC(REC:PATIENT);
 BEGIN
 WRITELN;
 WITH REC DO
 BEGIN
 WRITELN('Name:                     ',NAME);
 WRITELN('Street:                   ',STREET);
 WRITELN('City   State:             ',CITYSTATE);
 WRITE('Hourly Rate:              $');PUTREAL(RATE);WRITELN;
 WRITE('Paid Each Visit In Cash:  $');PUTREAL(RECEIVE);WRITELN;
 WRITE('Professional Discount:    ');
 IF CUT THEN
 BEGIN
 WRITELN('Yes');
                                            WRITE('              Amount:     ');WRITELN (TRUNC(100*PERCENT),'%');
 END
 ELSE WRITELN('No');
 LASTHALFOFRECORD(FID^);
 END; 
 END; (*SHOWREC*)
 
 
 
 PROCEDURE GETREC(VAR REC:PATIENT);
 LABEL 1;
 VAR ANSWER:CHAR;
 S:STRING;
 R:REAL;
 Q:INTEGER;
 
 FUNCTION READSTRING(VAR T:STRING):BOOLEAN;
 BEGIN
 WRITE('                               <esc> Return to skip record'); 
 FOR Q:=1 TO 60 DO
 BEGIN
 WRITE(CHR(8));
 END;
 READLN(S);
 READSTRING:=FALSE;
 IF LENGTH(S)>0 THEN
 IF S[LENGTH(S)]=CHR(27(*  ESC  *)) THEN READSTRING:=TRUE
 ELSE
 T:=S;
 END;(*  READSTRING  *)
 
 FUNCTION READBOOL(VAR T:BOOLEAN):BOOLEAN;
 BEGIN
 READLN(S);
 READBOOL:=FALSE;
 IF LENGTH(S)>0 THEN
 IF S[LENGTH(S)]=CHR(27(*  ESC  *)) THEN READBOOL:=TRUE
 ELSE
 BEGIN
 CASE S[1] OF
 'F','f','N','n':T:=FALSE;
 'T','t','Y','y':T:=TRUE
 END
 END;
 END;(*  READBOOL  *)
 
 FUNCTION READREAL(VAR T:REAL): BOOLEAN;
 BEGIN
 WRITE('SKIP TO THE NEXT FIELD? <Yes or No>');
 READ(ANSWER);
                       IF (ANSWER='N') OR (ANSWER='n') THEN
 BEGIN
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(CHR(8));
 END;
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(' ');
 END;
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(CHR(8));
 END;
 WRITE('$             a minus entry will skip entire record');
 FOR Q:=1 TO 50 DO
 BEGIN
 WRITE(CHR(8));
 END;
 READLN(R);
 IF R<0 THEN READREAL:=TRUE
 ELSE T:=R;
 END;(*  IF ANSWER = N  *)
 IF (ANSWER='Y')OR(ANSWER='y') THEN
 WRITELN;
 
 END;
 
 FUNCTION READPCT(VAR T:REAL): BOOLEAN;
 BEGIN
 WRITE('SKIP TO THE NEXT FIELD? <Yes or No>');
 READ(ANSWER);
 IF (ANSWER='N') OR (ANSWER='n') THEN
 BEGIN
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(CHR(8));
 END;
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(' ');
 END;
 FOR Q :=1 TO 36 DO
 BEGIN
 WRITE(CHR(8));
 END;
 WRITE('  %          a minus entry will skip entire record');
 FOR Q:=1 TO 50 DO
 BEGIN
 WRITE(CHR(8));
 END;
 READLN(R);
 IF R<0 THEN READPCT:=TRUE
 ELSE T:=R/100;
 END;(*  IF ANSWER = N  *)
 IF (ANSWER='Y')OR(ANSWER='y') THEN
        WRITELN;
 
 END;
 
 BEGIN(*  GETREC  *)
 WRITELN('Entering a return will skip to next item without changing the present item');
   WRITELN;
 WITH REC DO
 BEGIN
 WRITE('Name:                 ');IF READSTRING(NAME) THEN GOTO 1;
 WRITE('Street:               ');IF READSTRING(STREET) THEN GOTO 1;
 WRITE('City   State:         ');IF READSTRING(CITYSTATE) THEN GOTO 1;
 WRITE('Hourly Rate:          ');IF READREAL(RATE) THEN GOTO 1;
 WRITE('Paid Each Session:    ');IF READREAL(RECEIVE) THEN GOTO 1;
 %WRITE('Professional Discount:');IF READBOOL(CUT) THEN GOTO 1;
 IF CUT THEN
 BEGIN
 WRITE('              Percent:');IF READPCT(PERCENT) THEN GOTO 1;
 END
 ELSE PERCENT:=0;
 WRITE('Key to Sort by:        ');IF READSTRING(KEY) THEN GOTO 1;
 WRITE('Diagnosis:             ');IF READSTRING(DIAGNOSIS) THEN GOTO 1;
 WRITE('Date of First Symptoms:');IF READSTRING(SYMPTOMS) THEN GOTO 1;
 WRITE('Insurance Company:     ');IF READSTRING(INSURANCECO) THEN GOTO 1;
                                                 WRITE('Account Number:        ');IF READSTRING(ACCTNUMBER) THEN GOTO 1;
 WRITE('Social Security #:     ');IF READSTRING(SOCSECNUMBER) THEN GOTO 1;
 WRITE('Employer:              ');IF READSTRING(EMPLOYER) THEN GOTO 1;
 WRITE('  Address:             ');IF READSTRING(WKSTREET) THEN GOTO 1;
 WRITE('  City   State:        ');IF READSTRING(WKCTYSTATE) THEN GOTO 1;
 WRITE('  Telephone:           ');IF READSTRING(WORKPHONE) THEN GOTO 1;
 WRITE('Birthdate:             ');IF READSTRING(BIRTHDATE) THEN GOTO 1;
 WRITE('First Visit:           ');IF READSTRING(FIRSTVISIT) THEN GOTO 1;
 WRITE('Last Visit:            ');IF READSTRING(LASTVISIT) THEN GOTO 1;
 WRITE('Home Telephone:       ');IF READSTRING(HOMEPHONE) THEN GOTO 1;
 END;
 1:    
 END;(*  GETREC  *)
 
PROCEDURE DIDNTPAY(VAR REC:PATIENT);
 VAR ANSWER:CHAR;
 CASH:REAL;
 BEGIN
 WITH REC DO
 REPEAT
 GOTCASH:=0;
 IF (RECEIVE>0)  THEN
  REPEAT
 WIPESCREEN;GOTOXY(12,12);
 WRITE('Enter number of times ', NAME ,' did not pay $');
                  PUTREAL(RECEIVE);
 WRITELN;
 READLN(DEFAULT);
 GOTCASH:=RECEIVE*(INDEX-DEFAULT);
 WIPESCREEN;GOTOXY(12,12);
 WRITE('If ',NAME,' paid $');
 PUTREAL(RECEIVE);
 WRITELN(' each visit.');
 WRITE('Then you received $');PUTREAL(GOTCASH);WRITE(' Is this okay?');
 READ (ANSWER);
 IF (ANSWER='Y') OR (ANSWER='y') THEN ANSWER:='X';
 UNTIL ANSWER='X';
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('Have you received any additional cash from ',NAME,' ?');
 READ(ANSWER);
 IF (ANSWER='N')OR(ANSWER='n')OR(ANSWER='F')OR(ANSWER='f')THEN ANSWER:='Q';
 IF (ANSWER ='Y') OR (ANSWER='y') OR (ANSWER ='T') OR (ANSWER='t') THEN
 BEGIN
 REPEAT
 WIPESCREEN;GOTOXY(12,12);
 CASH:=0;
 WRITE('Enter the amount received from ',NAME,' $');
 READLN(CASH);
 WRITE('$');PUTREAL(CASH);
 WRITELN('  Is this okay?');
 READ(ANSWER);
 IF (ANSWER ='Y') OR (ANSWER='y') OR (ANSWER='T') OR (ANSWER='t') THEN ANSWER:='X';
 UNTIL ANSWER='X';
 GOTCASH:=GOTCASH+CASH;
 WIPESCREEN;GOTOXY(0,12);
 WRITE('You have received a total of $');
         PUTREAL(GOTCASH);
 WRITELN(' from ',NAME,' in cash. ');
 WRITE(' Is this Correct?');
 READ(ANSWER);
 END; (* IF THEN *)
   UNTIL (ANSWER='Y')OR(ANSWER='y')OR(ANSWER='T')OR(ANSWER='t')OR(ANSWER='Q'); 
 (*  WITH REC DO *)
 WIPESCREEN;
 END; (*  DIDNTPAY  *)
 
 
 PROCEDURE DATES(VAR REC:PATIENT);
 VAR I:INTEGER;
 SAMETIME:BOOLEAN;
 LONG:REAL;
 BEGIN
 WITH REC DO
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 I:=0;
 WRITELN('Enter the dates of service followed by the time spent.');
 WRITELN('Hit RETURN to proceed.');
 READ(ANSWER);
 WIPESCREEN;GOTOXY(1,12);
 WRITE('Do you want the time displayed on the bill');
 READ(ANSWER);
 IF (ANSWER='N')OR(ANSWER='n') THEN SHOWTIME:=FALSE ELSE SHOWTIME:=TRUE;
 WIPESCREEN;GOTOXY(1,12);
 WRITE('Does this patient come for the same number of hours each week? ');
 READ(ANSWER);LONG:=0;
 IF (ANSWER='Y')OR(ANSWER='y') THEN
 BEGIN
 WIPESCREEN; GOTOXY(12,12);
 SAMETIME:=TRUE;
 WRITE('How many hours? ');
 READLN(LONG);
 END
 ELSE SAMETIME:=FALSE;
 REPEAT
    I:=I+1;
 WIPESCREEN;GOTOXY(12,12);
 WRITE('date #',I,'=');
 READLN(DATE[I]);
 WIPESCREEN;GOTOXY(12,12);
 WRITE(DATE[I],' Correct?');
 READ(ANSWER);
 IF ANSWER='N' THEN 
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITE('date #',I,'=');
 READLN(DATE[I]);
 END;
 IF ANSWER='n' THEN 
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITE('date #',I,'=');
 READLN(DATE[I]);
 END;
 IF NOT SAMETIME THEN
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITE('length of appointment=');
 READLN(TIME[I]);
 WIPESCREEN;GOTOXY(12,12);
 WRITE(DATE[I],' ', NAME  ,' spent ');
 PUTREAL(TIME[I]);WRITE(' hours.   Correct?');
 READ(ANSWER);
 IF ANSWER='N' THEN 
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITE('time for ',DATE[I],'= ');
 READLN(TIME[I]);
 END;
 IF ANSWER='n' THEN 
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITE('time for ',DATE[I],'= ');
 READLN(TIME[I]);
 END;
 END;  (* IF NOT SAMETIME *)
 IF SAMETIME THEN TIME[I]:=LONG;
 UNTIL DATE[I]='';
 INDEX:=I-1;
 END;
 END;(*  DATES  *)
 
 
                                     PROCEDURE DOBILL(VAR REC:PATIENT);
 VAR J:INTEGER;
 BEGIN
 WITH REC DO
 BEGIN
 WIPESCREEN;
 TOTAL:=0;
 TAB(15);
 WRITELN(NAME);
 TAB(15);
 WRITELN(STREET);
 TAB(15);
 WRITELN(CITYSTATE);
 WRITELN;
 WRITELN;
 WRITELN('Individual Psychotherapy:');
 WRITELN;
 WRITELN;
 FOR J:=1 TO INDEX DO
 BEGIN
 WRITE(DATE[J]);
 DODOTS(15-LENGTH(DATE[J]));
 IF SHOWTIME THEN
  BEGIN
 WRITE('(');
 PUTIME(TIME[J]);
 WRITE(' hour');
 IF TIME[J]>1 THEN WRITE('s')
 ELSE WRITE(' ');
 WRITE(')');
 DODOTS(13);
 END
 ELSE DODOTS(25);
 WRITE('$');
 AMT:=(TIME[J]*RATE);
 PUTREAL(AMT);
 WRITELN;
 TOTAL:=TOTAL+AMT;
 END;
 IF (CUT) OR (RECEIVE>0) OR (GOTCASH>0) THEN
 BEGIN
 WRITELN;
 WRITELN;
 WRITE('Total');
 DODOTS(35);
 WRITE('$');
 PUTREAL(TOTAL);
 END;
 IF CUT THEN
 BEGIN
 WRITELN;
 WRITELN;
 WRITE('Professional Discount');
 DODOTS(19);
 WRITE('$');
 PUTREAL(PERCENT*TOTAL);
 TOTAL:=TOTAL-(PERCENT*TOTAL);
 END;
 IF (RECEIVE>0) OR (GOTCASH>0) THEN
 BEGIN
 WRITELN;
 WRITELN;
    WRITE('Received from ',NAME);
 DODOTS(26-LENGTH(NAME));
 WRITE('$');
 PUTREAL(GOTCASH);
 END;
 WRITELN;
 WRITELN;
 WRITE('Balance Due');
 DODOTS(29);
 WRITE('$');
 IF (CUT) OR (RECEIVE>0) OR (GOTCASH>0)THEN TOTAL:=(TOTAL-(GOTCASH));
 PUTREAL(TOTAL);
 END;
 END; (*  DOBILL  *)
 
 PROCEDURE PRINTDOTS(N:INTEGER)   {PRETTIES UP THE DISPLAY};
 VAR I:INTEGER;
 BEGIN
 FOR I:=1 TO N DO
 BEGIN
 WRITE(OUT,'-');
 END;
 END   {PRINTDOTS};
 
 PROCEDURE PRINTREAL(D:REAL);
 VAR I:INTEGER;
     B:INTEGER;
 BEGIN
 B:=ABS(ROUND((D-TRUNC(D))*100));
 IF B<10 THEN 
 BEGIN
 WRITE(OUT,TRUNC(D):3,'.0',B)
 END
 ELSE  {B>=10}
 BEGIN
 IF D>=1.0 THEN 
 BEGIN
 WRITE(OUT,TRUNC(D):3,'.',B) 
 END;
 IF D<1 THEN
 BEGIN
 I:=ROUND(D*100); 
 IF I>0 THEN {D is positive} 
 BEGIN 
 WRITE(OUT,'  0.',B);
 END;
 IF I<0 THEN   {D is negative} 
 BEGIN
 WRITE(OUT,' -0.');
 IF B<10 THEN WRITE(OUT,'0',B)
 ELSE WRITE(OUT,B);
 END;
 IF I=0 THEN WRITE(OUT,'  0   ');
 END; 
 END  {D>=1.0};
                END  {PRINTREAL};
 
 PROCEDURE PRINTIME(D:REAL);
 VAR I:INTEGER;
     B:INTEGER;
 BEGIN
 B:=ABS(ROUND((D-TRUNC(D))*100));
 IF B<10 THEN 
 BEGIN
 WRITE(OUT,TRUNC(D):1,'.0',B)
 END
 ELSE  {B>=10}
 BEGIN
 IF D>=1.0 THEN 
 BEGIN
 WRITE(OUT,TRUNC(D):1,'.',B) 
 END;
 IF D<1 THEN
 BEGIN
 I:=ROUND(D*100); 
 IF I>0 THEN {D is positive} 
 BEGIN 
 WRITE(OUT,'  0.',B);
 END;
 IF I<0 THEN   {D is negative} 
 BEGIN
 WRITE(OUT,' -0.');
 IF B<10 THEN WRITE(OUT,'0',B)
 ELSE WRITE(OUT,B);
 END;
 IF I=0 THEN WRITE(OUT,'  0   ');
 END; 
 END  {D>=1.0};
 END  {PRINTIME};
 
 PROCEDURE PRINTBILL(VAR REC:PATIENT);
 VAR C,Q,M,J,X:INTEGER;
 BEGIN
 WITH REC DO
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 C:=0;
 WRITELN('How many bills?');
 READLN (M);WRITELN;
 FOR Q:=1 TO M DO
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('READY WITH BILL IN PRINTER?');
 READ(ANSWER);
 WIPESCREEN;GOTOXY(12,12);
 C:=C+1;WRITELN('THIS IS THE #',C,' COPY I AM ABOUT TO PRINT.  DO YOU WANT MORE THAN ',M,'?');
          READ(ANSWER);WIPESCREEN;
 IF ANSWER='Y' THEN
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('HOW MANY EXTRA?');
 READ(X);WRITELN;
 M:=M+X;
 END;
 IF ANSWER='y' THEN
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('HOW MANY EXTRA?');
 READ(X);
 M:=M+X;
 END;
 WRITELN(OUT);
 PRINTAB(12);
 WRITELN(OUT,NAME);
 PRINTAB(12);
 WRITELN(OUT,STREET);
 PRINTAB(12);
 WRITELN(OUT,CITYSTATE);
 WRITELN(OUT);
 WRITELN(OUT);
 WRITELN(OUT);
 WRITELN(OUT);
 WRITELN(OUT);
 WRITELN(OUT,'Individual Psychotherapy:');
 WRITELN(OUT);
 WRITELN(OUT);
 TOTAL:=0;
 FOR J:=1 TO INDEX DO
 BEGIN
 WRITE(OUT,DATE[J]);
 PRINTDOTS(15-LENGTH(DATE[J]));
 IF SHOWTIME THEN
 BEGIN
 WRITE(OUT,'(');
 PRINTIME(TIME[J]);
 WRITE(OUT,' hour');
 IF TIME[J]>1 THEN WRITE(OUT,'s')
 ELSE WRITE(OUT,' ');
 WRITE(OUT,')');
 PRINTDOTS(13);
 END
 ELSE PRINTDOTS(25);
 WRITE(OUT,'$');
 AMT:=(TIME[J]*RATE);
 PRINTREAL(AMT);
 TOTAL:=TOTAL+AMT;
 WRITELN(OUT);
 END;
 IF (CUT) OR (RECEIVE>0) OR (GOTCASH>0) THEN
 BEGIN
          WRITELN(OUT);
 WRITELN(OUT);
 WRITE(OUT,'Total');
 PRINTDOTS(35);
 WRITE(OUT,'$');
 PRINTREAL(TOTAL);
 END;
 IF CUT THEN
 BEGIN
 WRITELN(OUT);
 WRITELN(OUT);
 WRITE(OUT,'Professional Discount');
 PRINTDOTS(19);
 WRITE(OUT,'$');
 PRINTREAL(PERCENT*TOTAL);
 TOTAL:=TOTAL-(PERCENT*TOTAL);
 END;
 IF (RECEIVE>0) OR (GOTCASH>0) THEN
 BEGIN
 WRITELN(OUT);
 WRITELN(OUT);
 WRITE(OUT,'Received from ',NAME);
 PRINTDOTS(26-LENGTH(NAME));
 WRITE(OUT,'$');
 PRINTREAL(GOTCASH);
 END;
 WRITELN(OUT);
 WRITELN(OUT);
 WRITE(OUT,'Balance Due');
 PRINTDOTS(29);
 WRITE(OUT,'$');
 PRINTREAL(TOTAL-GOTCASH);
 END;
 END;
 END; (*  PRINTBILL  *)
 
 PROCEDURE OKAY;
 BEGIN
 WRITELN;
 WRITELN('Is this bill in the form you wish printed?');
 READ(ANSWER);
 IF (ANSWER='N') OR (ANSWER='n') THEN
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('Is the error in the entry of visits and charges?');
 READ(ANSWER);
 IF (ANSWER='Y') OR (ANSWER='y') THEN
   BEGIN
 DATES(FID^);
 DOBILL(FID^);
 OKAY;
        ANSWER:=' ';
 END;
 END;
 END;  (*  OKAY  *)
 
 
 PROCEDURE ENVELOPE(VAR REC:PATIENT);
 BEGIN
 WITH REC DO
 BEGIN
 WIPESCREEN;GOTOXY(12,12);
 WRITELN('Shall I print an envelope for you?');
 READ(ANSWER);WIPESCREEN;
 IF ANSWER='Y' THEN
 BEGIN
 PRINTAB(30);
 WRITELN(OUT,NAME);
 PRINTAB(30);
 WRITELN(OUT,STREET);
 PRINTAB(30);
 WRITELN(OUT,CITYSTATE);
 END;
 IF ANSWER='y' THEN
 BEGIN
 PRINTAB(30);
 WRITELN(OUT,NAME);
 PRINTAB(30);
 WRITELN(OUT,STREET);
 PRINTAB(30);
 WRITELN(OUT,CITYSTATE);
 END;
   WIPESCREEN;GOTOXY(12,12);
 WRITELN('ANOTHER?');
 READ(ANSWER);WIPESCREEN;
 IF (ANSWER='Y') OR (ANSWER='y') THEN ENVELOPE(FID^);
 END;
 END;
 
 PROCEDURE MOREBILLS;
 BEGIN
 GOTOXY(12,12);
 WRITELN('MORE BILLS WITH SAME ADRESS?');
 READ(ANSWER);WIPESCREEN;
 IF (ANSWER='Y') OR (ANSWER='y') THEN
 BEGIN
 DATES(FID^);
 DIDNTPAY(FID^);
 DOBILL(FID^);
 OKAY;
 PRINTBILL(FID^);
 END;
 END    {MOREBILLS};
 
 
 
 PROCEDURE FOUNDTHERECORD(REC:PATIENT);
 BEGIN
              SHOWREC(FID^);
 WRITE('Is this record okay?');
 READ(ANSWER);
 IF (ANSWER='N') OR (ANSWER='n') THEN 
 BEGIN
 GETREC(FID^);
 SEEK(FID,RECNUM);
 PUT(FID);
 END;
 WITH REC DO
 BEGIN
 DATES(FID^);
 DIDNTPAY(FID^);
 DOBILL(FID^);
 OKAY;
 REWRITE(OUT,'PRINTER:');
 PRINTBILL(FID^);
 WRITELN('More Copies? ');
 READ(ANSWER);
 WIPESCREEN;
 IF (ANSWER='Y') OR (ANSWER='y') THEN PRINTBILL(FID^);
 ENVELOPE(FID^);
 MOREBILLS;
 CLOSE(OUT);
 END;
 END;(* FOUNDTHERECORD *)

 
 BEGIN  (*  MAIN PROGRAM  *)
 KEEPGOING:=TRUE;
 WHILE KEEPGOING DO
 BEGIN
 PROMPT;
 RECNUM:=0;
 FOUNDIT:=FALSE;
 SEARCH;
 IF FOUNDIT THEN FOUNDTHERECORD(FID^);
 SHALI;
 CLOSE(FID,LOCK);
 END; (* WHILE KEEPGOING *)
 END.

                                                                                                                                                                                                                                                                                                                                                                                                                                   
