home *** CD-ROM | disk | FTP | other *** search
-
- *PAYROLL.CMD
- * This command file generates payroll check stubs showing all deductions; gets
- * the next check number and writes a check in the CheckFile, showing the new
- * balance; and stores the salaries and deductions in a database called Hold82.
- * This file is used to store the monthly, quarterly and annual FIT, FICA, SDI
- * and SIT deductions. The deductions are not picked up from tax tables because
- * there are so few employees. Instead, they are obtained from the individual
- * employee records in the Personnel database.
- * Constants.MEM keeps track of the FICA and SDI percentages and their
- * maximums, as well as the constant for ThisYear. Changes can be thus
- * made in a single spot and will be correct in all the programs in the
- * accounting system.
- * The file is quite long, but breaks down into simpler modules:
- * I. Get the date and End of Month, Quarter and Year flags.
- * II. Compute all deductions and net pay for an individual employee, then
- * place this in the employee record in Personne.DBF
- * III. Operator verifies deductions and payroll stub is printed.
- * IV. Paycheck is written to the Checkfil and all amounts are placed into the
- * Hold82 summary file.
- * V. When all individuals have been paid, the Hold 82 summary file is
- * updated if it is the end of month, quarter or year.
- * VI. Print out the summary file and data so that the physical checkbook
- * can be updated (computer does not print our checks).
- * VII. Delete transient constants, save others back to Constant.MEM for
- * system use.
-
- ******I. Get date and pay period flags******
-
- RESTORE FROM Constant
- DO GetDate
-
- STORE 'Y' TO GetWhen
- DO WHILE !(GetWhen) = 'Y'
- ERASE
- @ 1,18 SAY "PAYROLL PROCESSING"
- STORE " " TO EOY
- @ 4,8 SAY 'Want to change the date?' GET Date
- @ 5,8 SAY '(Press <Return> if okay.)'
- READ
- @ 7,6 SAY "Is it the end of the YEAR?" GET EOY
- @ 7,35 SAY "(Y or N)"
- ? CHR(7)
- READ
- STORE !(EOY) TO EOY
- IF EOY = "Y"
- STORE "Y" TO EOQ
- STORE "Y" TO EOM
- ELSE
- STORE "N" to EOY
- STORE " " TO EOQ
- @ 8,3 SAY "Is it the end of the QUARTER?" GET EOQ
- @ 8,35 SAY "(Y or N)"
- ? CHR(7)
- READ
- STORE !(EOQ) TO EOQ
- IF EOQ = "Y"
- STORE "Y" TO EOM
- ELSE
- STORE "N" TO EOQ
- STORE " " TO EOM
- @ 9,5, SAY "Is it the end of the MONTH?" GET EOM
- @ 9,35 SAY "(Y or N)"
- ? CHR(7)
- READ
- STORE !(EOM) TO EOM
- IF EOM <> "Y"
- STORE "N" TO EOM
- ENDIF
- ENDIF quarter
- ENDIF year
-
- ERASE
- @ 4,25 SAY $(Date,1,2)+'/'+$(Date,3,2)+'/'+$(Date,5,2)
- @ 6,0 SAY "End of Year: "+EOY+" End of QUARTER: "+EOQ+;
- " End of MONTH: "+EOM
- STORE " " TO GetWhen
- ?
- ? ' '
- @ 8,6, say 'The above information MUST be correct. '
- ? CHR(7)
- * 2nd chance at date and flags
- ACCEPT ' Any CHANGES (Y or N)?' TO GetWhen
-
- STORE 'Hold'+STR(ThisYear,2) TO Header
- * Computer now does a date and flag check
- IF !(GetWhen) <> 'Y'
- IF $(Date,5,2)<'26' .AND. EOM = 'Y'
- ?
- ?
- ?"CHECK THE INFO AGAIN. It's the end of the month, but the"
- ?'date is '+Date-'. Do you want to make changes (Y or N)?'
- ? CHR(7)
- WAIT TO GetWhen
- ENDIF
- IF EOY = 'Y'
- SELECT SECONDARY
- USE &Header
- GO BOTTOM
- IF Marker = 'Y'
- ? CHR(7)
- ? 'You blew it--the end of the year has been done!'
- WAIT
- RELEASE All
- STORE T TO Paying
- RETURN
- ENDIF
- ENDIF
- ENDIF
- ENDDO GetWhen
- RELEASE GetWhen
-
-
- ****** II. Calculate decutions and net pay for each individual *****
- * Compute deductions. Decutions for FICA, FIT, SDI and SIT are kept in the
- * individual employee's Personnel record, rather than getting them from tax
- * tables, because there are so few employees. (You have to decide what should
- * and should not be computerized.) The "YTDxxx" variables are the year-to-date
- * totals for these items. Limits and percentages for FICA and SDI are obtained
- * from a file called Constant.MEM. These are the variables FICACut, FICAMax,
- * FICAEnd, SDICut, SDIMax and SDIEnd.
-
- SELECT PRIMARY
-
- USE Personne
- REPLACE ALL FICA WITH (Pay:Rate*FICACUT+0.005);
- SDI WITH (Pay:Rate*SDICUT+0.005)
-
- STORE 0 TO Count
- GO TOP
- DO WHILE .NOT. EOF
- IF Paid .OR. *
- SKIP
- ELSE
- STORE Count + 1 TO Count
-
- ** Save the employee record in case the procedure is ended ***
- STORE STR(#,5) TO Payee
- COPY Record &Payee TO Bak
-
- ** Deductions for partial salary based on number of days worked ***
- ** Ratio is computed in PayMenu.CMD
- IF Ratio < 1.000
- REPLACE Pay:Rate WITH Pay:Rate*Ratio, FICA WITH FICA*Ratio,FIT;
- WITH FIT*Ratio, SDI WITH SDI*Ratio, SIT WITH SIT*Ratio
- ENDIF
- * Deductions and totals are computed then stored in the employee
- * record FedTemp, Statemp and EmpTemp are used to carry forward values
- * for salaries subject to FICA, SDI and stateme unemployment insurance
- * to Hold82, the summary file.
-
- IF YTDSAL > FICAEnd
- STORE 0 TO FedTemp
- REPLACE FICA WITH 0
- ELSE
- IF (YTDSal + Pay:Rate) <= FICAEnd
- REPLACE YTDFICA WITH (YTDFICA + FICA)
- STORE Pay:Rate TO FedTemp
- ELSE
- REPLACE FICA WITH (MAXFICA - YTDFICA), YTDFICA WITH MAXFICA
- STORE (FICAEnd - YTDSal) TO FedTemp
- ENDIF
- ENDIF
-
- IF YTDSal > SDIEnd
- STORE 0 TO StaTemp
- REPLACE SDI WITH 0
- ELSE
- IF (YTDSAL + Pay:Rate) <= SDIEnd
- REPLACE YTDSDI WITH (YTDSDI + SDI)
- STORE Pay:Rate TO StaTemp
- ELSE
- REPLACE SDI WITH (MAXSDI - YTDSDI), YDSDI WITH MAXSDI
- STORE (SDIEnd-YTDSal) TO StaTemp
- ENDIF
- ENDIF
-
- * In California, the employer pays an Unemployment Ins. contribution
- * on employee salary up to the amount of UIEnd. There is nothing
- * deducted from the employee salary for this, so we keep track only of
- * the employer obligation as UISal.
- IF YTDSal > UIEnd
- STORE 0 TO EmpTemp
- ELSE
- IF (YTDSal + Pay:Rate) <= UIEND
- STORE Pay:Rate TO EmpTemp
- ELSE
- STORE (UIEnd - YTDSal) TO EmpTemp
- ENDIF
- ENDIF
- REPLACE Net:Pay WITH (Pay:Rate-FICA-FIT-SDI-SIT)
- REPLACE YTDFIT WITH (YTDFIT + FIT)
- REPLACE YTDSIT WITH (YTDSIT + SIT)
- REPLACE QTDSal WITH (QTDSal + Pay:Rate)
- REPLACE YTDSal WITH (YTDSal + Pay:Rate)
-
- ***** III. Print employee stub ****
- ERASE
- SET PRINT ON
- ? ' '+$(Date,3,2)+'/'+$(Date,5,2)+'/'+$(Date,1,2)+': '+Name;
- +' '+$(SS:Nmbr,1,3)+'-'+$(SS:Nmbr,4,2)+'-'+$(SS:Nmbr,6,4)
- ? ' GROSS PAY* $'-STR(Pay:Rate,7,2)+' NET PAY: $';
- -STR(Net:Pay,7,2)
- ?
- ? ' FICA FIT SDI SIT'
- ? ' THIS CHECK: '+STR(FICA,6,2)+' '+STR(FIT,7,2);
- +' '+STR(SDI,5,2)+' '+STR(SIT,7,2)
- ? ' THIS YEAR: '+STR(YTDFICA,7,2)+' '+STR(YTDFIT,8,2);
- +' '+STR(YTDSDI,6,2)+' '+STR(YTDSIT,7,2)
- ? ' TOTAL SALARY THIS QUARTER: $'-STR(QTDSal,9,2)
- ? ' TOTAL SALARY THIS YEAR: $'-STR(YTDSal,9,2)
- ?
- ?
- ?
- *Pagefeed after every six employee stubs
- IF Count >= 6
- ? CHR(12)
- STORE 0 TO Count
- ENDIF
- SET PRINT OFF
-
- IF EOQ = 'Y' .AND. Paid
- REPLACE QTDSal WITH 0
- ENDIF
-
- ***** IV. Record paycheck in Checkfile and Hold82 ****
- * Now a check is "written" in the CheckFil.
- SELECT SECONDARY
- USE Checkfil
- APPEND BLANK
- REPLACE Check:Nmbr WITH NextCheck, Check:Date WITH Date,;
- Name WITH P.Name, Amount WITH Net:Pay, Emp:Nmbr;
- WITH P.Emp:Nmbr, Client WITH 'OFC', Job:Nmbr WITH 31,;
- Descrip WITH 'SALARY', Balance WITH (MBalance - Amount)
- STORE (MBalance - Amount) TO MBalance
- STORE STR(VAL(NextCheck)+1,4) TO NextCheck
-
- ERASE
- @ 3,25 SAY "**DO NOT INTERRUPT**"
- @ 5,25 SAY "UPDATING MASTER RECORD"
- ? CHR(7)
- * We keep an aggregate record of payroll and deductions. The amounts
- * for each employee are added to the amounts already in the last
- * record in the file represented by "Header". (This was set up at the
- * start of the "GetWhen" loop earlier, and has the name "Hold82" or
- * "Hold--" or whatever "ThisYear" is.)
- * This last record is either a blank (if this is the first payroll
- * of the month), or has data from previous salary payments
- * made during the current month. At the end of the month, quarter and
- * year, totals and a new blank record )except at the end of the year)
- * are added. This is done in the next loop.
-
- USE &Header
-
- * If this is a new year, there are no records in the file so we add a
- * blank record. Otherwise, we go to the last record in the file.
- IF EOF
- APPEND BLANK
- ELSE
- GO BOTTOM
- ENDIF
-
- REPLACE Check:Date WITH Date, Payroll WITH (Payroll+Pay:Rate),;
- FICA WITH (FICA+P.FICA), FICASal WITH (FICASal + FedTemp),;
- FIT WITH (FIT + P.FIT), SDI WITH (SDI+P.SDI),;
- SDISal WITH (SDISal + Statemp), SIT WITH (SIT + P.SIT),;
- UISal WITH (UISal + EmpTemp)
- SELECT PRIMARY
-
- **Reset the employee record if he was paid for part time. **
- **The Bak file is not deleted here, as each copy command **
- **above wipes out the previous contents.
- IF Ratio <> 1.000
- REPLACE Ratio WITH 1.000
- UPDA FROM Bak ON Emp:Nmbr REPL Pay:Rate,FICA,FIT,SDI,SIT,Net:Pay
- ENDIF
- ENDIF
-
- SKIP
- ENDDO personnel file
-
- ************
- *** V: Personnel records are reset and Holdxx is updated ***
- STORE ' ' TO Completed
- REPLACE All Paid WITH F
-
- USE &Header
- GO Bottom
- IF EOM = 'Y'
- REPLACE Marker WITH 'M'
-
- * If it's the end of the quarter, we total the amounts for the previous
- * three months to a new record and mark it with a 'Q'.
- IF EOQ = 'Y'
- STORE STR(#,5) TO Number
- TOTAL ON Marker TO Quarter FOR # >= (VAL(Number)-2)
- APPEND FROM Quarter
- DELETE FILE Quarter
-
- IF $(Date,3,2) = '03'
- REPLACE Check:Date WITH '1st'
- ELSE
- IF $(Date,3,2) = '06'
- REPLACE CHeck:Date WITH '2ND'
- ELSE
- IF $(Date,3,2) = '9'
- REPLACE Check:Date WITH '3RD'
- ELSE
- IF $(Date,3,2) = '12'
- REPLACE Check:Date WITH '4TH'
- ENDIF
- ENDIF
- ENDIF
- ENDIF
-
- REPLACE Marker WITH 'Q'
-
- * If it's the end of the year, we total all the quarterly amounts to
- * a new record and mark it with a 'Y'.
- IF EOY = 'Y'
- TOTAL ON Marker TO Annual FOR Marker = 'Q'
- APPEND FROM Annual
- REPLACE Marker WITH 'Y', Check:Date WITH 'END'
- DELETE FILE Annual
- ENDIF
- ENDIF
-
- * If it's the end of a month but not the end of the year, we add a new
- * blank record for next month's payroll records.
- IF EOY <> 'Y'
- APPEND BLANK
- ENDIF
- ENDIF
-
- ****** VI: Print payroll summary, transfer checks to costbase *****
- USE CheckFil
- COUNT FOR .NOT. * TO Any
- IF Any=0
- ? ' No new checks written.'
- ? ' <Return> to continue.'
- WAIT
- ELSE
- USE &Header
- ERASE
- @ 12,25 SAY "CHECK THE PRINTER, THEN PRESS <RETURN>."
- ? CHR(7)
- WAIT
- ERASE
- SET PRINT ON
- SET MARGIN TO 45
- ? ' MASTER PAYROLL FILE SUMMARY: '+$(Date,3,2) +'/';
- +$(Date,5,2)+'/'+$(Date,1,2)
- ?
- ?
- ?'DATE PAYROLL FICA FICASAL FIT SDI SDISAL '+;
- 'SIT UISal'
- ?
- LIST OFF
- SET MARGIN TO 38
- ? CHR(12)
- SET PRINT OFF
-
- ERASE
- @ 3,25 SAY "*** DO NOT INTERRUPT ***"
- @ 5,25 SAY " UPDATING THE COSTBASE "
- ? CHR(7)
-
- USE CostBase INDEX $Supp
- APPEND FROM Checkfil
-
- DO CheckStu
- ENDIF
-
- ***VII* Dump transient variables, save necessary ones***
- RELEASE Payee,Number,Date,Ratio,Aborted,Printed,EOY,EOQ,EOM,Any,Header,;
- Count,FedTemp,StaTemp,EmpTemp,Marker,Paaying,Salaries
- SAVE TO Constant
-
- USE
- RELEASE All
- DELETE FILE Bak
- RETURN