REMARK *************************************\ * P/R100.BAS PAYROLL CALCULATE *\ * 5/14/79 12:50 P.M. *\ ************************************* %INCLUDE CURSOR REMARK THE NUMBERS IN THE FOLLOWING DATA STATEMENTS ARE FROM REMARK CALIFORNIA'S "EMPLOYER'S TAX GUIDE" (METHOD C) FOR 1979 PP. 46-47 RESTORE DATA "REGULAR","NEW MONTH","NEW QUARTER","NEW YEAR",5000,10000 REMARK TABLE A DATA 750 REMARK TABLE C DATA 1000,2000,2100,4200,4210,1580,3160,2100,1580,3160,1580 REMARK TABLE E DATA 0,25,33,8,0,25,50,8,1570,3140,1570 REMARK TABLE D & TABLE E (STEP 10) DIM F1$(2),F1(36),S1$(2),S1(32),S(96),R2(5),G3(5),R1(2),T2(8),\ G2$(5),R$(5) DEF FNR(Z1)=INT(Z1*100+.5)/100 REMARK ROUNDING FUNCTION GOTO 6000 %INCLUDE SUBS1 %INCLUDE GENINFO %INCLUDE MSTRIN %INCLUDE MSTROUT 4150 IF STATE.TAXABLE.PAY GROSS.PAY THEN DEDUCTION.AMOUNT=GROSS.PAY GROSS.PAY=GROSS.PAY - DEDUCTION.AMOUNT S(A1)=S(A1) + DEDUCTION.AMOUNT REMARK ADD DEDUCTION AND ACCUMULATE TO TOTALS S(90)=S(90) + DEDUCTION.AMOUNT RETURN 5300 FOR I2%=2 TO 7 REMARK ROUTINE TO WITHHOLD FEDERAL INCOME TAX X1%=(I2%*2)+(I5*15)-9 IF ANNUAL.PAY <= F1(X1%-1) THEN 5345 REMARK IF ANNUAL PAY IS TOO LOW FOR TAX, JUMP OUT IF ANNUAL.PAY <= F1(X1%+1) THEN\ DEDUCTION.AMOUNT=\ DEDUCTION.AMOUNT+(ANNUAL.PAY-F1(X1%-1))*F1(X1%-2)/10000:\ GOTO 5345\ ELSE\ DEDUCTION.AMOUNT=\ DEDUCTION.AMOUNT+(F1(X1%+1)-F1(X1%-1))*F1(X1%-2)/10000 5340 NEXT I2% DEDUCTION.AMOUNT=\ DEDUCTION.AMOUNT+(ANNUAL.PAY-F1(X1%+1))*F1(X1%)/10000 5345 DEDUCTION.AMOUNT=DEDUCTION.AMOUNT/PAY.PERIODS A1=85:GOSUB 4200 RETURN 6000 PRINT CLEAR.SCREEN$;"P/R CALCULATE" REMARK DISPLAY PROGRAM I.D. AND ENTRY MASK PRINT "ENTER START EMPLOYEE OF ZERO TO EXIT" PRINT PRINT PRINT "START EMPLOYEE NUMBER" PRINT "END EMPLOYEE NUMBER" PRINT "PERIOD END DATE" Y9=10:OPEN "G/I0F010.DAT" RECL 200 AS Y9:GOSUB 700 REMARK OPEN AND READ GENERAL INFORMATION FILE Y6=3 Y7=4 Z=INT(G3(3) / 10000) REMARK DETERMINE IF MONTHLY OR QUARTERLY PAYROLL IF G3(4) <> 1 THEN P1=1 ELSE P1=2 REMARK IF NOT NEW MONTH, SET 'REGULAR PAYROLL' FLAG IF INT((Z-1)/3)=(Z-1)/3 THEN P1=3 IF Z=1 THEN P1=4 6030 X1=403:X0=G3(3):GOSUB 680 REMARK DISPLAY PERIOD END DATE RESTORE FOR I2%=1 TO P1 READ X0$ REMARK READ PAYROLL DESCRIPTIONS FROM TABLE NEXT I2% PRINT " ";X0$;" PAYROLL" OPEN "P/R0F110.DAT" RECL 1150 AS 1 REMARK OPEN EMPLOYEE MASTER FILE 6040 X1=279:X2=3:X3=0:X4=999:GOSUB 345 REMARK ENTER START EMPLOYEE NUMBER IF X0=0 THEN 7000 REMARK IF START EMPLOYEE NUMBER=0, END PROGRAM E1=X0 X1=343:X2=3:X3=E1:X4=999:GOSUB 345 REMARK ENTER END EMPLOYEE NUMBER E2=X0 IF E2 > MSTR.RECORDS THEN E2 = MSTR.RECORDS X2 = 1:X3=0:X4=1:X2$="ENTRY CORRECT?":GOSUB 665 REMARK VERIFY ENTRY: '1'=O.K.; '0'=RETRY IF X0 <> 1 THEN 6040 X1=64:GOSUB 210 PRINT "WORKING...DO NOT INTERRUPT" OPEN "P/R0F060.DAT" AS Y6 REMARK OPEN AND READ FEDERAL TAX FILE READ #Y6;F1(1),F1(2),F1(3),F1(4),F1(5),F1(6),F1(7),F1(8),F1(9),\ F1(10),F1(11),F1(12),F1(13),F1(14),F1(15),F1(16),F1(17),F1(18),\ F1(19),F1(20),F1(21),F1(22),F1(23),F1(24),F1(25),F1(26),F1(27),\ F1(28),F1(29),F1(30),F1(31),F1(32),F1(33),F1(34),F1(35),F1(36) OPEN "P/R0F070.DAT" AS Y7 REMARK OPEN AND READ STATE TAX FILE READ #Y7;S1$,S1(1),S1(2),S1(3),S1(4),S1(5),S1(6),S1(7),S1(8) RESTORE REMARK READ STATE TAX TABLES FROM DATA STATEMENT FOR I2%=1 TO 4:READ X0$:NEXT I2% FOR I2%=8 TO 32 READ S1(I2%) NEXT I2% 6100 FOR INDEX = E1 TO E2 REMARK PROCESS EMPLOYEE RANGE X0=INDEX GOSUB 745 REMARK READ EMPLOYEE MASTER RECORD IF S(1) = 0 THEN GOTO 6365 REMARK IF RECORD IS DELETED, SKIP PROCESSING IF P1=4 THEN\ REMARK ZERO OUT YEARLY TOTALS FOR I2%=25 TO 48:\ S(I2%)=0:\ NEXT I2%:\ S(15)=0 IF P1=3 OR P1=4\ THEN\ FOR I2%=49 TO 72:\ REMARK RESET QUARTERLY TOTALS S(I2%)=0:\ NEXT I2% IF P1=2 OR P1=3 OR P1=4 THEN S(6)=0:S(7)=0:S(10)=0 REMARK RESET MONTHLY TOTALS 6130 IF S(5) <> 0 OR R2(1)=99\ REMARK IF CHECK NUMBER <> 0 OR EMPLOYEE INACTIVE, THEN\ SKIP PROCESSING FOR I2%=73 TO 90:\ S(I2%)=0:\ NEXT I2%:GOTO 6360 IF R2(1) = 1 THEN A1=S(80) ELSE A1=0 REMARK CALCULATE HEALTH AND WELFARE PAY 6146 S(79)=FNR((S(73)+S(75)+A1)*S(9)) REMARK CALCULATE GROSS PAY AND TAXABLE PAY S(83)=S(74)+S(76)+S(78)+S(79)+S(81)+S(82) GROSS.PAY=S(83) IF GROSS.PAY=0 THEN 6360 TAXABLE.PAY=GROSS.PAY-S(84) IF R3$="S" THEN I1=1 REMARK SET TAX LEVEL POINTER BASED ON MARITAL STATUS IF R3$="M" THEN I1=2 IF R3$="H" THEN I1=3 6165 PAY.PERIODS=26 6170 I5=I1-INT(I1/3)*2 ANNUAL.PAY=TAXABLE.PAY*PAY.PERIODS - F1(I5*15-8)*R2(2) DEDUCTION.AMOUNT=0 GOSUB 5300 REMARK CALCULATE AND WITHHOLD FEDERAL INCOME TAX DEDUCTION.AMOUNT=S(35)-S(36)+TAXABLE.PAY REMARK CALCULATE AND WITHHOLD FICA TAX IF DEDUCTION.AMOUNT-TAXABLE.PAY > F1(6) THEN\ DEDUCTION.AMOUNT=F1(5)*F1(6)-S(39)*10000\ ELSE\ DEDUCTION.AMOUNT=TAXABLE.PAY*F1(5) 6210 DEDUCTION.AMOUNT=DEDUCTION.AMOUNT/10000 A1=87:GOSUB 4200 6215 STATE.TAXABLE.PAY=TAXABLE.PAY*PAY.PERIODS REMARK CALCULATE AND WITHHOLD STATE INCOME TAX DEDUCTION.AMOUNT=0 IF I1=1 THEN I5=1 REMARK SET TAX CUTOFF POINTER IF I1=3 OR R2(3) >=2 THEN I5=2 6235 IF STATE.TAXABLE.PAY <= S1(I5+7) THEN 6290 IF R2(4)>0 THEN\ STATE.TAXABLE.PAY=STATE.TAXABLE.PAY-FNR(R2(4)*S1(10)) REMARK DEDUCT ADDITIONAL STATE EXEMPTIONS X=S1(I5+10):GOSUB 4150 IF X>0 THEN X=S1(I1+12):GOSUB 4150 ELSE GOTO 6275 IF X>0 THEN X=S1(I1+15):GOSUB 4150 ELSE GOTO 6275 IF X>0 THEN I=0 ELSE GOTO 6275 6265 X=S1(I1+18):GOSUB 4150 IF X>0 THEN I=I+1 ELSE GOTO 6275 IF I<4 THEN 6265 X=S1(I1+29):GOSUB 4150 IF X>0 THEN I=0 ELSE GOTO 6275 6270 X=S1(I1+18):GOSUB 4150 IF X>0 THEN I=I+1 ELSE GOTO 6275 IF I<3 THEN 6270 6275 DEDUCTION.AMOUNT=DEDUCTION.AMOUNT/100 X=22 + SGN(I1-1)*4+R2(3) A1=0 IF R2(3)>=3 THEN X=X-R2(3)+2:A1=R2(3)-2 6283 DEDUCTION.AMOUNT=DEDUCTION.AMOUNT-S1(X)-A1*S1(SGN(I1-1)*4+25) DEDUCTION.AMOUNT=DEDUCTION.AMOUNT/PAY.PERIODS A1=86:GOSUB 4200 REMARK DEDUCT WITHHOLDING AMOUNT FROM EMPLOYEE 6290 DEDUCTION.AMOUNT=S(35)-S(36)+TAXABLE.PAY REMARK CALCULATE AND WITHHOLD SDI TAX IF DEDUCTION.AMOUNT-TAXABLE.PAY>S1(4) THEN 6320 REMARK IF PAST SDI CUTOFF, DO NOT DEDUCT IT IF DEDUCTION.AMOUNT < S1(4) THEN\ REMARK IF CUTOFF NOT REACHED, DEDUCT SDI NORMALLY DEDUCTION.AMOUNT=TAXABLE.PAY*S1(3):GOTO 6315 6310 DEDUCTION.AMOUNT=S1(4)*S1(3)-S(40)*10000 REMARK CALCULATE REMAINING SDI IF PART OF THIS CHECK\ IS SUBJECT TO A DEDUCTION 6315 DEDUCTION.AMOUNT = DEDUCTION.AMOUNT/10000 REMARK DEDUCT SDI TAX FROM TAXABLE PAY A1=88:GOSUB 4200 6320 FOR I2%=73 TO 90 REMARK ACCUMULATE ALL DEDUCTIONS FROM Y-T-D AND Q-T-D S(I2%-24) = S(I2%-24) + S(I2%) S(I2%-48)=S(I2%-48) + S(I2%) NEXT I2% S(6)=S(6)+S(73)+S(75)+S(77)+S(80) REMARK ACCUMULATE TO MONTHLY HOURS 6323 IF R2(1)<> 1 THEN X0=80 ELSE X0=1 X0 = S(76) - FNR(S(8)/X0*S(75)) REMARK WITH O/T PAY AND CORPORATE OFFICER PAY 6325 IF R2(5) <>1 THEN 6330 REMARK ABOVE $1733.00 EXCLUDABLE IF S(7) + TAXABLE.PAY - X0 <1733 THEN 6330 S(10) = S(10) + TAXABLE.PAY - X0 IF S(7)>1733 THEN 6330 S(10) = S(10) + S(7) - 1733 6330 S(7) = S(7) + TAXABLE.PAY REMARK ACCUMULATE MONTHLY PAY 6340 S(10) = S(10) + X0 REMARK ACCUMULATE INSURANCE REPORT EXCLUDABLE AMOUNT S(4)=G3(3) REMARK SET CHECK DATE AT PERIOD END DATE S(5)=G2 REMARK ASSIGN CHECK NUMBER TO EMPLOYEE G2=G2+1 REMARK INCREMENT NEXT CHECK NUMBER IF G2>999999 THEN G2=1 REMARK 'ROLL' CHECK NUMBER IF MORE THAN SIX DIGITS 6360 X0=INDEX:GOSUB 750 REMARK WRITE OUT THE CALCULATED RECORD 6365 NEXT INDEX 6370 GOSUB 720 7000 PRINT CLEAR.SCREEN$;"P/R CALCULATE LOADING MENU" REMARK TERMINATE PROGRAM AND LOAD MENU CHAIN "P/R000"