home *** CD-ROM | disk | FTP | other *** search
/ Software Du Jour / SoftwareDuJour.iso / BUSINESS / DBASE / DB3.ARC / PAYBILLS.PRG < prev    next >
Text File  |  1984-10-25  |  10KB  |  257 lines

  1.       ***********  Paybills COMMAND FILE  ***********
  2. * Before this procedure can be accessed, the check number and balance must
  3. * not too complicated.    Repetitive procedures in the main loop (controlled
  4. * by the variable 'T_Finish') could have been put in separate command files
  5. * to make this file easier to understand and maintain, but this way it
  6. * minimizes disk accesses and increases speed.
  7. *      This file finds bills to be paid in the Costbase, generates the next
  8. * check number, writes a check in the Checkfil and maintains the checkbook
  9. * balance.
  10. *      The next check number and checkbook balance are recalled from a file
  11. * called Konstant.mem.    The final values for both of these are stored in the
  12. * same file after all the bills have been paid.                    
  13. *      Entries must include at least the name of the party being paid.
  14. *      Balances are automatically computed and shown to the operator.
  15. *      Check numbers are automatically assigned by the computer.
  16. *      If several entries are made against a single check number (the
  17. * operator has this option), these are added and shown as a single
  18. * item in the printout.
  19. ********************************************************************
  20. *
  21. RESTORE FROM Konstant
  22. *
  23. T_Begin = 1
  24. DO WHILE T_Begin < LEN(NextCheck) .AND. SUBSTR(NextCheck,T_Begin,1)=' '
  25.    T_Begin = T_Begin + 1
  26. ENDDO
  27. Nextcheck = SUBSTR(NextCheck,T_Begin)
  28. *
  29. *
  30. * Initialize.  'T_New' is used to determine whether the program should generate
  31. * a new check number or use the old one (where several bills to a single
  32. * supplier are being paid).  'T_Finish' is the control variable that determines
  33. * whether we should run through the procedure again, or are done paying bills.
  34. STORE 'N' TO T_New, T_Finish
  35. DO WHILE LEN(T_Finish) <> 0
  36.    T_Enter = 'C'
  37.    DO WHILE LEN(T_Enter) <> 0
  38.       CLEAR
  39.       @  2, 0 SAY 'WRITING CHECK: '+NextCheck+'     BALANCE: '+STR(MBalance,9,2)
  40.       @  5, 0
  41.       ACCEPT '    MAKE CHECK TO:  ' TO T_Name
  42.       ACCEPT '   INVOICE NUMBER:  ' TO T_Bill_No
  43.       INPUT '     ENTER AMOUNT:  ' TO T_Amount 
  44.       T_Name = UPPER(T_Name)
  45.       T_Bill_No = UPPER(T_Bill_No)
  46.       @  6,20 SAY T_Name
  47.       @  7,20 SAY T_Bill_No
  48.       IF TYPE('T_Amount') = 'U' .OR. TYPE('T_Amount') = 'L'
  49.          @ 8,20 SAY 'No Amount'
  50.          T_Amount = 0.00
  51.       ELSE
  52.          T_Amount = T_Amount * 1.00
  53.          @  8,20 SAY T_Amount PICTURE '999,999.99'
  54.       ENDIF
  55.       @ 11, 0 SAY 'Any key to CHANGE,'
  56.       WAIT '<ENTER> if O.K. ' TO T_Enter 
  57.    ENDDO T_Enter
  58.    *
  59.    IF LEN(T_Name) > 10
  60.       T_Key = SUBSTR(T_Name,1,10)
  61.    ELSE
  62.       T_Key = TRIM(T_Name)
  63.    ENDIF
  64.    *
  65.    IF T_Key <> ' '
  66.       T_Look = .T.
  67.       T_Start = 0
  68.       @ 12, 0
  69.       @ 11, 0 SAY "Searching for bill"
  70.       * Selecting file Costbase.Dbf
  71.       SELECT 3
  72.       FIND &T_Key
  73.       IF RECNO() = 0
  74.      @ 11, 0
  75.      ? " I CAN'T FIND THE NAME.  Please check the spelling."
  76.      ? " Or maybe it hasn't been posted to the Costbase yet."
  77.      WAIT 'Press <ENTER> to continue.'
  78.       ELSE
  79.      DO Payfind WITH T_Bill_No,T_Amount,T_Key,T_Look,T_Start
  80.       ENDIF there is an unpaid bill for the supplier
  81.       *
  82.       * 'T_Start' is brought in from Payfind.prg.  If we started at the first
  83.       * entry for a name (had only the name), T_Start=0.    If we had more than
  84.       * the name, T_Start contains the record numerber we started on.  Since this
  85.       * could be in the middle of the listing, we use 'T_Count' so that we can
  86.       * come back to the top of the listing for the name once.
  87.       IF T_Start > 0
  88.      T_Count = 0
  89.       ELSE
  90.      T_Count = 1
  91.       ENDIF
  92.       *
  93.       Confirm = ' '
  94.       DO WHILE UPPER(Confirm) <> 'P' .AND. .NOT. T_Look
  95.      @  9,0 CLEAR
  96.      ? 'RECORD     NAME                     AMOUNT  BILL #';
  97.        +'   DATE   JOB'
  98.      ? 
  99.      DISPLAY '    '+Name, Amount, Bill_Nmbr, Bill_Date,Client+'-';
  100.                             + STR(Job_Nmbr,4)
  101.      ?
  102.      ?
  103.      ? '           P to PAY this bill,'
  104.      ? '           Q to QUIT without paying,'
  105.      WAIT '        <ENTER> to continue. ' TO CONFIRM
  106.          *
  107.      IF UPPER(Confirm) = 'Q'
  108.         IF UPPER(T_New) = 'S'
  109.            NextCheck = STR(VAL(NextCheck)+1,5)
  110.            T_Begin = 1
  111.            DO WHILE T_Begin<LEN(NextCheck).AND.SUBSTR(NextCheck,T_Begin,1)=' '
  112.           T_Begin = T_Begin + 1
  113.            ENDDO
  114.            NextCheck = SUBSTR(NextCheck,T_Begin)
  115.         ENDIF
  116.         T_New = ' '
  117.         T_Look = .T.
  118.      ELSE
  119.         IF UPPER(Confirm) = 'P'
  120.            T_Found = STR(RECNO(),5)
  121.            REPLACE Check_Date WITH Date(), Check_Nmbr WITH NextCheck
  122.            MBalance = (MBalance-Amount)
  123.                *
  124.            SELECT 6
  125.            APPEND BLANK
  126.            REPLACE Check_Date WITH C->Check_Date, Name WITH C->Name,;
  127.                Check_Nmbr WITH C->Check_Nmbr, Balance WITH MBalance,;
  128.                Amount WITH C->Amount, Bill_Nmbr WITH C->Bill_Nmbr;
  129.                Client WITH C->Client, Job_Nmbr WITH C->Job_Nmbr
  130.            SELECT 3
  131.            CLEAR
  132.            @ 3, 0 SAY 'CHECK WRITTEN: '+NextCheck+;
  133.               '     NEW BALANCE: '+STR(MBalance,9,2)
  134.            ?
  135.            DISPLAY 'PAYMENT MADE:',Check_Date, Name, Amount, Bill_Nmbr,;
  136.                Bill_Date, Client, Job_Nmbr OFF
  137.            ?
  138.            ? '       S for SAME SUPPLIER (Repeats check #)'
  139.            ?
  140.            WAIT '     <ENTER> to continue.' TO T_New
  141.            IF UPPER(T_New) <> 'S'
  142.           NextCheck = STR(VAL(NextCheck)+1,5)
  143.           T_Begin = 1
  144.           DO WHILE T_Begin < LEN(NextCheck) .AND. ;
  145.                SUBSTR(NextCheck,T_Begin,1)=' '
  146.              T_Begin = T_Begin + 1
  147.           ENDDO
  148.           NextCheck = SUBSTR(NextCheck,T_Begin)
  149.            ELSE
  150.           Confirm = ' '
  151.            ENDIF
  152.         ENDIF
  153.             *
  154.         IF UPPER(T_New) = 'S' .OR. UPPER(Confirm) <> 'P'
  155.            * If Confirm <> 'P', we rejected the first unpaid bill that was
  156.            * shown.  Rather than going back to the beginning, the loop
  157.            * below SKIPs to the next INDEXed name until we find an unpaid
  158.            * bill, or go beyond the records for the name we are paying.
  159.            *      The same applies if we want to pay another bill to the
  160.            * same supplier (T_New='S').  Since we are in the file on the name
  161.            * we want we SKIP to the next record until we find an unpaid
  162.            * bill or run out of records for that name.
  163.            *      If we had only the name and started with the first unpaid
  164.            * bill we stop now since we have looked at all the unpaid bills
  165.            * for that supplier.
  166.            *      If we could have entered the list of records for this
  167.            * supplier in the middle (more than the name provided), we look
  168.            * at the unpaid bills between where we are and the end of the
  169.            * list, then go up to the first entry for that name and check
  170.            * all of the unpaid bills that we had previously skipped past.
  171.            * This is controlled by T_Count.
  172.            *      After the second FIND in the command file (below), we
  173.            * stop looking when the record number we are on is greater than
  174.            * or equal to the number of the record we start on (T_Start).
  175.                *
  176.            SKIP
  177.            DO WHILE Check_Nmbr <> '    ' .AND. Name=T_Key .AND. .NOT. EOF()
  178.           SKIP
  179.            ENDDO
  180.                *  
  181.            * We enter this loop when we reach the end of the records with 
  182.            * names that match the one we are looking for.  If we started
  183.            * with the first unpaid bill, the record number is greater than
  184.            * T_Start (because T_Start=0) and T_Count=1 (because we set it to
  185.            * that value).  The second IF below is True and we terminate the
  186.            * search.
  187.            *      If T_Start>0, T_Count=0 the first time we run out of
  188.            * records with a matching name, so the program does the ELSE
  189.            * commands below.
  190.            *      T_Start is still >0 and Count is now 1, so the last term in
  191.            * the first IF applies.    On this second pass when we get to a
  192.            * record number >=T_Start, we drop into the loop and do the IF to
  193.            * terminate the search because we have now looked at all the
  194.            * unpaid bills for the name we entered.
  195.            IF EOF() .OR. Name <> T_Key .OR. (RECNO() >= T_Start .AND.;
  196.                  T_Start <> 0 .AND. T_Count >0)
  197.           IF (RECNO() >= T_Start    .AND. T_Count > 0)
  198.              T_Look = .T.
  199.              @ 4, 0 CLEAR
  200.              ? '     We have now looked at all the entries for '+ T_Name
  201.              ? '  <ENTER> to continue.'
  202.              ?
  203.              IF UPPER(T_New)='S'
  204.             NextCheck = STR(VAL(NextCheck)+1,5)
  205.             T_Start = 1
  206.             DO WHILE T_Start < LEN(NextCheck) .AND.;
  207.                  SUBSTR(NextCheck,T_Start,1) =' '
  208.                T_Start = T_Start + 1
  209.             ENDDO
  210.             NextCheck = SUBSTR(NextCheck,T_Start)
  211.             T_New = 'N'
  212.              ENDIF
  213.              WAIT
  214.           ELSE
  215.              T_Count = T_Count + 1
  216.              @ 13, 0 CLEAR
  217.              @ 16, 0 SAY "I'M WORKING AS FAST AS I CAN -- HANG ON! "
  218.              FIND &T_Key
  219.              DO WHILE Check_Nmbr <> '    '
  220.             SKIP
  221.              ENDDO
  222.           ENDIF
  223.            ENDIF
  224.         ENDIF is it the right record
  225.      ENDIF
  226.       ENDDO Confirm the record
  227.    ENDIF
  228.    *
  229.    IF UPPER(T_New) <> 'S'
  230.       @ 4, 0 CLEAR
  231.       ? 'Type any key to continue.    '
  232.       WAIT 'Press <ENTER> to exit ' TO T_Finish
  233.    ENDIF
  234. ENDDO T_Finish
  235. *
  236. RELEASE T_Name,T_Bill_No,T_Key,T_Amount,T_Start,T_Found,T_Look,T_New,;
  237.         T_Enter,T_Count,Abort,Continue,T_Finish,Confirm,T_Begin
  238. SAVE TO Konstant
  239. *
  240. SELECT 6
  241. PACK
  242. COUNT TO Any
  243. @ 3,0 CLEAR
  244. IF Any=0
  245.    ? '        No new checks in the checkfile.'
  246.    WAIT '     <ENTER> to continue.'
  247. ELSE
  248.    ? 'There are '+STR(Any,5)+' new checks in the CheckFile.'
  249.    WAIT 'Do you want to print the checkstubs now (Y or N)? ' TO Hardcopy 
  250.    IF UPPER(Hardcopy) = 'Y'
  251.       DO Nametest WITH '6'
  252.       DO Checkstu
  253.    ENDIF
  254. ENDIF
  255. *
  256. RETURN
  257.