REMARK ************************************\ * P/R090.BAS PAYROLL ACCUMULATE *\ * 5/16/79 1:30 PM *\ ************************************ %INCLUDE CURSOR DIM S(96),R1(2),T2(8),R$(5),G2$(5),G3(5),B1(5),E$(3),R2(5) DEF FNR(Z)=INT(Z*100+.5)/100 REMARK ROUNDING FUNCTION GOTO 6000 %INCLUDE SUBS1 %INCLUDE GENINFO %INCLUDE MSTRIN %INCLUDE MSTROUT 825 A1=39 REMARK **** LINE PRINTER ROUTINE **** IF LINE.COUNT% <55 THEN RETURN REMARK IF SPACE REMAINS ON REPORT PAGE, RETURN PRINT CHR$(0CH); P=P+1 PRINT TAB((A1-LEN(G2$(1)))/2);G2$(1);TAB(A1);"DATE "; REMARK PRINT COMPANY NAME AND REPORT DATE X0=G3(1):GOSUB 680.5 PRINT PRINT TAB((A1-LEN(X4$))/2);X4$;TAB(A1);"PAGE";P REMARK PRINT REPORT TITLE, PAGE NUMBER AND HEADINGS PRINT " EMPLOYEE PAY TYPE ERROR DESCRIPTION" PRINT LINE.COUNT%=5 REMARK RESET LINE COUNTER FOR NEW REPORT PAGE RETURN 843 REMARK ************* READ DEDUCTION RECORD ************ IF D4 > 9 THEN GOSUB 850 X0.0=X0.0+1 READ #Y3,X0.0;D1,D2,D3,D4,D1$,D5,D6 RETURN 850 REMARK ************ WRITE DEDUCTION RECORD ************ PRINT #Y3,X0.0;D1,D2,D3,D4,D1$,D5,D6 RETURN 873 REMARK ********** SAVE TRANSACTION SUMMARY RECORD ********* IF B1(1) >= E1 AND B1(1) <= E2 AND B1(3) < 9 THEN B1(3)=B1(3)+10 PRINT #Y5,X0.1;B1(1),B1(2),B1(3),B1(4),B1(5) RETURN 875 REMARK ********** READ TRANSACTION SUMMARY RECORD ********* IF B1(1)>0 THEN GOSUB 873 X0.1=X0.1+1 READ #Y5,X0.1;B1(1),B1(2),B1(3),B1(4),B1(5) RETURN 876 B1(1)=9000000000:RETURN 4003 IF S(1) > 0 AND S(1) = Z THEN RETURN REMARK IF EMPLOYEE NUMBER HAS NOT CHANGED, RETURN IF S(1) > 0 THEN GOSUB 4600 REMARK SAVE CALCULATED EMPLOYEE RECORD X0=Z:GOSUB 745 REMARK GET NEXT EMPLOYEE MASTER RECORD IF Z <> S(1) THEN\ Z0=1:GOSUB 4050:\ REMARK IF EMPLOYEE RECORD NOT FOUND, PRINT ERROR DATA S(1)=0:RETURN IF S(4)=0 THEN RETURN REMARK IF THIS EMPLOYEE'S SALARY HAS ALREADY BEEN\ ACCUMULATED (CHECK DATE=0), SKIP PROCESSING 4045 IF R2(1) <> 99 THEN\ REMARK INITIALIZE CURRENT EMPLOYEE FIELDS S(4)=0:\ S(5)=0:\ BEFORE ACCUMULATING PAYROLL FOR EMPLOYEE FOR I%=73 TO 90:\ S(I%)=0:\ NEXT I%:\ RETURN 4050 LPRINTER REMARK PRINT ERROR DETAIL ON LINE PRINTER X4$="TRANSACTION ERROR REPORT" GOSUB 825 REMARK PRINT REPORT HEADINGS-CHECK FOR END OF PAGE PRINT USING MASKA$;Z,Z1,E$(Z0) REMARK PRINT EMPLOYEE NUMBER, PAY TYPE AND ERROR LINE.COUNT%=LINE.COUNT%+1 CONSOLE REMARK SELECT CRT AS OUTPUT DEVICE RETURN 4600 IF R2(1) <> 1 THEN S(76)=FNR(S(75)*S(8)/80*G3.0) REMARK PAY SALARIED EMPLOYEE OVERTIME BY ESTIMATING\ HOURLY RATE (BASED ON AN 80-HOUR PAYROLL PERIOD) IF R2(1) = 1 THEN S(74)=FNR(S(73)*S(8)):\ REMARK CALCULATE REGULAR PAY FOR HOURLY EMPLOYEE S(76)=FNR(S(75)*S(8)*G3.0) REMARK CALCULATE OVERTIME "" "" "" "" "" X0=S(1) GOSUB 750 REMARK RESAVE EMPLOYEE RECORD ON DISK RETURN 5300 GOSUB 843 REMARK READ NEXT DEDUCTION RECORD IF D1 > E2 THEN D1=9000000000:RETURN REMARK IF PAST EMPLOYEE RANGE, REJECT RECORD IF D1 < E1\ REMARK IF RECORD IS BELOW ACCUMULATE RANGE OR\ D2 <> 1\ OR RECORD IS NOT MISCELLANEOUS PAY OR\ D4 > 9\ OR RECORD HAS BEEN USED OR\ D4 = 3\ OR FREQUENCY CODE INDICATES 'NOT THIS TIME', OR\ D4 = 4\ THEN GOTO 5300 REMARK THEN READ NEXT DEDUCTION/MISC. PAY RECORD IF D4=5 AND G3(4) <> 1 THEN GOTO 5300 REMARK SKIP THIS RECORD IF FREQUENCY AND \ PAYROLL NUMBER ARE INCOMPATIBLE D4=D4+10:RETURN REMARK IF MARK RECORD 'USED' AND USE IT 5350 GOSUB 875 REMARK READ THE NEXT PAYROLL SUMMARY RECORD IF B1(1) < E1 OR B1(3) > 9 THEN GOTO 5350 REMARK IF RECORD IS USED OR BELOW RANGE, REJECT IT\ AND GET THE NEXT SUMMARY RECORD IF B1(1) > E2 THEN B1(1)=9000000000 REMARK IF BEYOND RANGE, SET FLAG AND RETURN RETURN 5400 S(82)=S(82)+D6 REMARK ADD MISCELLANEOUS INCOME AMOUNT TO OTHER PAY IF D3 = 0 THEN S(84)=S(84)+D6 REMARK ADD TO NON-TAXABLE PAY IF APPLICABLE GOSUB 5300 REMARK READ NEXT MISCELLANEOUS PAY RECORD RETURN 5600 IF B1(3) = 6 THEN GOSUB 5350:RETURN REMARK IGNORE COMP-TIME TRANSACTIONS ON B1(3)+1\ GOSUB 5610,\ REMARK IF PAY TYPE=0, PAY EMPLOYEE FLAT SALARY 5620,\ REMARK " " " " " 1, ADD TO EMPLOYEE REGULAR HOURS 5660,\ " " " " " 2, CALCULATE VACATION PAY 5720,\ " " " " " 3, ACCUMULATE HOLIDAY HOURS 5700,\ " " " " " 4, CALCULATE PIECEWORK PAY 5720 REMARK " " " " " 5, ACCUMULATE OVERTIME HOURS GOSUB 5350 REMARK GET THE NEXT SUMMARY RECORD RETURN 5610 IF R2(1) <> 1 THEN S(74)=S(8):RETURN IF S(1) > 0 THEN Z=S(1):Z0=2:Z1=B1(3):GOSUB 4050 REMARK PRINT INVALID PAY TYPE ERROR MESSAGE\ IF EMPLOYEE TYPE IS INCOMPATIBLE RETURN 5620 S(73)=S(73)+B1(4) REMARK ACCUMULATE REGULAR HOURS RETURN 5660 IF R2(1)=1 THEN S(81)=S(81)+B1(5):RETURN REMARK IF HOURLY EMPLOYEE, ADD UP VACATION PAY IF S(1)=0 THEN RETURN S(14)=S(14)-B1(4) REMARK SUBTRACT VACATION HOURS FROM REMAINING IF S(14) < 0 THEN \ Z=S(1):Z0=3:Z1=B1(3):GOSUB 4050:\ REMARK IF INSUFFICIENT VACATION HOURS, PRINT ERROR S(14)=0 5680 S(80)=S(80)+B1(4) REMARK ADD TO CURRENT VACATION HOURS TAKEN RETURN 5700 S(77)=S(77)+B1(4) REMARK ACCUMULATE PIECEWORK HOURS AND PAY S(78)=S(78)+B1(5) RETURN 5720 S(75)=S(75)+B1(4) REMARK ACCUMULATE OVERTIME/HOLIDAY HOURS RETURN 6000 Y3=3:Y9=10 Y5=4 LINE.COUNT%=60 MASKA$=" ###### ## /##################/" OPEN "P/R0F110.DAT" RECL 1150 AS 1 REMARK OPEN EMPLOYEE MASTER FILE 6005 PRINT CLEAR.SCREEN$;"P/R ACCUMULATE" REMARK DISPLAY PROGRAM I.D. AND ENTRY MASK ON CRT PRINT "ENTER START EMPLOYEE OF ZERO TO EXIT" PRINT PRINT PRINT "START EMPLOYEE NUMBER" PRINT "END EMPLOYEE NUMBER" X1=279:X2=3:X3=0:X4=999:GOSUB 345 REMARK ENTER START EMPLOYEE NUMBER IF X0=0\ REMARK IF START EMPLOYEE NUMBER IS ZERO, ABORT THEN\ X2$="PROGRAM ABORTED":GOSUB 615:\ GOTO 6700 E1=X0 X1=343:X2=3:X3=E1:X4=999:GOSUB 345 REMARK ENTER END EMPLOYEE E2=X0 X2=1:X3=0:X4=1:X2$="ENTRY CORRECT?":GOSUB 665 REMARK VERIFY ENTRY: '1'=O.K.; '0'=RETRY IF X0 <> 1 THEN GOTO 6005 OPEN "P/R0F030.DAT" RECL 38 AS Y3 REMARK OPEN DEDUCTION/MISCELLANEOUS PAY FILE OPEN "P/R0F050.DAT" RECL 30 AS Y5 REMARK OPEN PAYROLL SUMMARY FILE IF END #Y5 THEN 876 OPEN "G/I0F010.DAT" RECL 200 AS Y9 REMARK OPEN AND READ GENERAL INFORMATION FILE GOSUB 700 IF E2 > MSTR.RECORDS THEN E2 = MSTR.RECORDS 6105 E$(1)="NOT FOUND/RELEASED" REMARK SET ACCUMULATE ERROR DESCRIPTIONS E$(2)="INVALID PAY TYPE" E$(3)="INSUFFICIENT HOURS" GOSUB 5300 REMARK GET FIRST DEDUCTION AND PAYROLL SUMMARY RECORDS GOSUB 5350 6200 IF D1 < B1(1) THEN\ REMARK PROCESS MISCELLANEOUS INCOME RECORD Z=D1:\ IF IT IS LOWER THAN SUMMARY RECORD Z1=D2:\ GOSUB 4003:\ GOSUB 5400:\ GOTO 6200 IF B1(1) < D1 THEN\ REMARK IF SUMMARY RECORD IS LOWER, PROCESS IT Z=B1(1):\ Z1=B1(3):\ GOSUB 4003:\ GOSUB 5600:\ GOTO 6200 IF D1=9000000000 THEN 6600 REMARK TERMINATE PROCESSING IF END OF BOTH FILES Z=B1(1) REMARK IF DEDUCTION RECORD EQUALS SUMMARY RECORD,\ PROCESS BOTH Z1=B1(3) GOSUB 4003 GOSUB 5400 GOSUB 5600 GOTO 6200 6600 IF S(1) <> 0 THEN GOSUB 4600 REMARK SAVE LAST ACCUMULATED EMPLOYEE RECORD 6700 PRINT CLEAR.SCREEN$;"P/R ACCUMULATE LOADING MENU" REMARK END PROGRAM HERE CHAIN "P/R000"