284 lines
6.5 KiB
Plaintext
284 lines
6.5 KiB
Plaintext
|
*-------------------------------*
|
||
|
* PAY.RPT
|
||
|
* BY DON BELL
|
||
|
************** ORIGINAL PROGRAM BEFORE TOTALS WERE ADDED (KJC)***************
|
||
|
*-------------------------------*
|
||
|
CS=@(-1) ; CR=@(-3) ; CL=@(-4) ; RV=@(-13) ; ERV=@(-14)
|
||
|
VM=CHAR(253) ; SVM=CHAR(252) ; AM=CHAR(254) ; BEEP=CHAR(7)
|
||
|
FF=CHAR(12)
|
||
|
PF1='<' ; PF2='P' ; PF3='/'
|
||
|
PROMPT " "
|
||
|
LNCNT='START'
|
||
|
PRINTER ON
|
||
|
*
|
||
|
OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT
|
||
|
OPEN 'USER' TO USER.FILE ELSE ABORT
|
||
|
OPEN 'JOB' TO JOB.FILE ELSE ABORT
|
||
|
*
|
||
|
5 *
|
||
|
EXCL.JOBS=''
|
||
|
SELECT JOB.FILE
|
||
|
LOOP
|
||
|
READNEXT ID ELSE ID='EOF'
|
||
|
UNTIL ID='EOF' DO
|
||
|
READV ANY FROM JOB.FILE,ID,2 THEN
|
||
|
IF ANY='Y' ELSE
|
||
|
LOCATE(ID,EXCL.JOBS,1;NDX) ELSE
|
||
|
EXCL.JOBS=INSERT(EXCL.JOBS,1,NDX;ID)
|
||
|
END
|
||
|
END
|
||
|
END
|
||
|
REPEAT
|
||
|
*
|
||
|
10 *
|
||
|
CRT CS
|
||
|
CRT @(0,0):"PAY.RPT"
|
||
|
CRT @(23,3):RV:" TIMECLOCK PAYROLL SUMMARY REPORT ":ERV
|
||
|
CRT @(0,22):"Enter the FIRST DATE of the Pay Period (mm/dd/yy)":CL
|
||
|
CRT @(28,5):CL:"FIRST DATE ":
|
||
|
INPUT FDATE
|
||
|
IF FDATE='' OR FDATE='/' THEN GO 9999
|
||
|
FDATE=ICONV(FDATE,'D')
|
||
|
IF OCONV(FDATE,'DW') # 7 THEN
|
||
|
CRT @(0,22):BEEP:"The FIRST DATE must be a SUNDAY!":CL
|
||
|
RQM
|
||
|
GO 10
|
||
|
END
|
||
|
CRT @(40,5):OCONV(FDATE,'D2/')
|
||
|
*
|
||
|
20 *
|
||
|
LDATE=FDATE+13
|
||
|
CRT @(28,7):CL:"LAST DATE ":
|
||
|
CRT @(40,7):OCONV(LDATE,'D2/')
|
||
|
CRT @(0,22):CL:"Is this Correct (y/n)":
|
||
|
INPUT ANS
|
||
|
IF ANS='Y' OR ANS='y' ELSE GO 10
|
||
|
*
|
||
|
TCL=\SSELECT CLOCKFILE WITH DATE GE "\
|
||
|
TCL=TCL:OCONV(FDATE,'D2/')
|
||
|
TCL=TCL:\" AND WITH DATE LE "\
|
||
|
TCL=TCL:OCONV(LDATE,'D2/')
|
||
|
TCL=TCL:\" BY EMPNO BY DATE (R,10\
|
||
|
CRT @(20,10):"SELECTING TIMECLOCK RECORDS - PLEASE WAIT"
|
||
|
EXECUTE TCL
|
||
|
*
|
||
|
LAST.USER=''
|
||
|
*
|
||
|
LOOP
|
||
|
READNEXT ID ELSE ID='EOF'
|
||
|
UNTIL ID='EOF' DO
|
||
|
USER=OCONV(ID,'G0|1')
|
||
|
DATE=OCONV(ID,'G1|1')
|
||
|
IF DATE >= FDATE AND DATE <=LDATE THEN
|
||
|
IF USER # LAST.USER THEN
|
||
|
READ USER.INFO FROM USER.FILE,USER ELSE USER.INFO=''
|
||
|
Z=0; ZCT=0; ZPOS=0; MAX=15; SW=0; POS=6; COL=2
|
||
|
ZRAY=''
|
||
|
IRAY=''
|
||
|
*
|
||
|
* ZRAY<1>=DATES ; MV
|
||
|
* ZRAY<2>=TIMES ; MV
|
||
|
* ZRAY<3>=PRJCTS; MV
|
||
|
*
|
||
|
FOR D=LDATE TO FDATE STEP -1
|
||
|
DKEY=USER:"|":D
|
||
|
READ DREC FROM CLOCKFILE,DKEY THEN
|
||
|
ZCT=DCOUNT(DREC<1>,VM)
|
||
|
FOR Z=ZCT TO 1 STEP -1
|
||
|
ZRAY=INSERT(ZRAY,1,1;D)
|
||
|
ZRAY=INSERT(ZRAY,2,1;DREC<1,Z>)
|
||
|
ZRAY=INSERT(ZRAY,3,1;DREC<2,Z>)
|
||
|
NEXT Z
|
||
|
END
|
||
|
NEXT D
|
||
|
CALL CLOCK.CALC(ZRAY)
|
||
|
LAST.USER=USER
|
||
|
GOSUB 1000
|
||
|
END
|
||
|
END
|
||
|
REPEAT
|
||
|
9999 * END OF PROCESS
|
||
|
PRINTER OFF
|
||
|
CRT @(0,22):CL:"HIT RETURN TO CONTINUE":
|
||
|
INPUT ANY
|
||
|
STOP
|
||
|
1000 *
|
||
|
TOT.HRS=0
|
||
|
ZCT=DCOUNT(ZRAY<1>,VM)
|
||
|
FOR Z=2 TO ZCT STEP 2
|
||
|
LOCATE("?",ZRAY,4;FND) THEN ZRAY="?" ; GO 2000
|
||
|
IF ZRAY<1,Z> >= FDATE AND ZRAY<1,Z> <= LDATE-7 THEN
|
||
|
FIRST=1
|
||
|
CLIENT=OCONV(ZRAY<3,Z-1>,"G0-1")
|
||
|
JOB=OCONV(ZRAY<3,Z-1>,"G1-1")
|
||
|
JOB1=JOB[1,1]
|
||
|
IF JOB1='S' OR JOB1='V' OR JOB1='W' OR JOB1='H' THEN
|
||
|
LOCATE(JOB1,ZRAY,9;JDX) THEN
|
||
|
ZRAY<10,JDX>=ZRAY<10,JDX>+ZRAY<4,Z>
|
||
|
END ELSE
|
||
|
ZRAY=INSERT(ZRAY,9,JDX;JOB1)
|
||
|
ZRAY=INSERT(ZRAY,10,JDX;ZRAY<4,Z>)
|
||
|
END
|
||
|
END
|
||
|
ZRAY<5,1>=ZRAY<5,1>+ZRAY<4,Z>
|
||
|
LOCATE(JOB,EXCL.JOBS,1;NDX) THEN
|
||
|
ZRAY<5,2>=ZRAY<5,2>+ZRAY<4,Z>
|
||
|
END
|
||
|
LOCATE(CLIENT,ZRAY,7;NDX) THEN
|
||
|
ZRAY<8,NDX>=ZRAY<8,NDX>+ZRAY<4,Z>
|
||
|
END ELSE
|
||
|
ZRAY=INSERT(ZRAY,7,NDX;CLIENT)
|
||
|
ZRAY=INSERT(ZRAY,8,NDX;ZRAY<4,Z>)
|
||
|
END
|
||
|
END ELSE
|
||
|
FIRST=0
|
||
|
CLIENT=OCONV(ZRAY<3,Z-1>,"G0-1")
|
||
|
JOB=OCONV(ZRAY<3,Z-1>,"G1-1")
|
||
|
JOB1=JOB[1,1]
|
||
|
IF JOB1='S' OR JOB1='V' OR JOB1='W' OR JOB1='H' THEN
|
||
|
LOCATE(JOB1,ZRAY,9;JDX) THEN
|
||
|
ZRAY<10,JDX>=ZRAY<10,JDX>+ZRAY<4,Z>
|
||
|
END ELSE
|
||
|
ZRAY=INSERT(ZRAY,9,JDX;JOB1)
|
||
|
ZRAY=INSERT(ZRAY,10,JDX;ZRAY<4,Z>)
|
||
|
END
|
||
|
END
|
||
|
ZRAY<6,1>=ZRAY<6,1>+ZRAY<4,Z>
|
||
|
LOCATE(JOB,EXCL.JOBS,1;NDX) THEN
|
||
|
ZRAY<6,2>=ZRAY<6,2>+ZRAY<4,Z>
|
||
|
END
|
||
|
LOCATE(CLIENT,ZRAY,7;NDX) THEN
|
||
|
ZRAY<8,NDX>=ZRAY<8,NDX>+ZRAY<4,Z>
|
||
|
END ELSE
|
||
|
ZRAY=INSERT(ZRAY,7,NDX;CLIENT)
|
||
|
ZRAY=INSERT(ZRAY,8,NDX;ZRAY<4,Z>)
|
||
|
END
|
||
|
END
|
||
|
NEXT Z
|
||
|
*-----------------------*
|
||
|
* CALC OVERTIME HOURS
|
||
|
*-----------------------*
|
||
|
EXCLHRS=ZRAY<5,2>
|
||
|
TOTHRS=ZRAY<5,1>
|
||
|
IF TOTHRS-EXCLHRS >144000 THEN
|
||
|
ZRAY<5,2>=(TOTHRS-EXCLHRS)-144000 ;* OVERTIME HOURS
|
||
|
ZRAY<5,1>=(TOTHRS-ZRAY<5,2>) ;* REGULAR HOURS
|
||
|
END ELSE
|
||
|
ZRAY<5,2>=0
|
||
|
END
|
||
|
EXCLHRS=ZRAY<6,2>
|
||
|
TOTHRS=ZRAY<6,1>
|
||
|
IF TOTHRS-EXCLHRS >144000 THEN
|
||
|
ZRAY<6,2>=(TOTHRS-EXCLHRS)-144000 ;* OVERTIME HOURS
|
||
|
ZRAY<6,1>=(TOTHRS-ZRAY<6,2>) ;* REGULAR HOURS
|
||
|
END ELSE
|
||
|
ZRAY<6,2>=0
|
||
|
END
|
||
|
*-----------------------*
|
||
|
JCT=DCOUNT(ZRAY<9>,VM)
|
||
|
YCT=DCOUNT(ZRAY<7>,VM)
|
||
|
IF JCT > YCT THEN YCT=JCT
|
||
|
IF YCT<2 THEN YCT=2
|
||
|
FOR Y=1 TO YCT STEP 1
|
||
|
IF Y=1 THEN
|
||
|
IF LNCNT # 'START' THEN
|
||
|
PRINT; LNCNT=LNCNT+1
|
||
|
END
|
||
|
LN=USER.INFO<6>'L#10'
|
||
|
NAME=USER.INFO<2>:", ":USER.INFO<1>[1,1]:"."
|
||
|
LN=LN:NAME'L#20'
|
||
|
END ELSE
|
||
|
LN=SPACE(30)
|
||
|
END
|
||
|
BEGIN CASE
|
||
|
CASE Y=1
|
||
|
IF ZRAY<5,1> > 0 THEN
|
||
|
ITIME=ZRAY<5,1>; GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END ELSE
|
||
|
LN=LN:"00:00"'L#10'
|
||
|
END
|
||
|
IF ZRAY<5,2> > 0 THEN
|
||
|
ITIME=ZRAY<5,2>; GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END ELSE
|
||
|
LN=LN:"00:00"'L#10'
|
||
|
END
|
||
|
ITIME=SUM(ZRAY<5>)+SUM(ZRAY<6>); GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
CASE Y=2
|
||
|
IF ZRAY<6,1> > 0 THEN
|
||
|
ITIME=ZRAY<6,1>; GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END ELSE
|
||
|
LN=LN:"00:00"'L#10'
|
||
|
END
|
||
|
IF ZRAY<6,2> > 0 THEN
|
||
|
ITIME=ZRAY<6,2>; GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END ELSE
|
||
|
LN=LN:"00:00"'L#10'
|
||
|
END
|
||
|
LN=LN:SPACE(10)
|
||
|
CASE 1
|
||
|
LN=LN:SPACE(30)
|
||
|
END CASE
|
||
|
LN=LN:ZRAY<7,Y>'L#10'
|
||
|
IF ZRAY<8,Y> > 0 THEN
|
||
|
ITIME=ZRAY<8,Y>; GOSUB 1100
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END ELSE
|
||
|
OTIME="00:00"
|
||
|
LN=LN:OTIME'L#10'
|
||
|
END
|
||
|
IF ZRAY<9,Y> # '' THEN
|
||
|
ITIME=ZRAY<10,Y> ; GOSUB 1100
|
||
|
LN=LN:ZRAY<9,Y>'L#3':OTIME'L#10'
|
||
|
END
|
||
|
GOSUB 2000
|
||
|
NEXT Y
|
||
|
RETURN
|
||
|
1100 * CALC 1/100th TIME
|
||
|
ITIME=OCONV(ITIME,'MT')
|
||
|
OTIME=OCONV(ITIME,'G0:1'):":":INT((OCONV(ITIME,'G1:1')*100)/60)'R%2'
|
||
|
RETURN
|
||
|
2000 * PRINT REPORT
|
||
|
IF LNCNT='START' THEN
|
||
|
LNCNT=100
|
||
|
STRNG="Internal Data Management, Inc."
|
||
|
SLEN=LEN(STRNG)
|
||
|
HL1=SPACE(40-(SLEN/2)):STRNG
|
||
|
STRNG="Timeclock Summary Report by Employee #"
|
||
|
SLEN=LEN(STRNG)
|
||
|
HL2=SPACE(40-(SLEN/2)):STRNG
|
||
|
STRNG="For the Pay Period '":OCONV(FDATE,'D2/'):"' through '":OCONV(LDATE,'D2/'):"'"
|
||
|
SLEN=LEN(STRNG)
|
||
|
HL3=SPACE(40-(SLEN/2)):STRNG
|
||
|
HL4="EMPLOYEE ":"EMPLOYEE"'L#20':"TOTAL"'L#10':"TOTAL"'L#10':"TOTAL"'L#10':"CLIENT"'L#10':"HOURS"'L#10':"JOB HOURS"
|
||
|
HL5=" NUMBER ":" NAME "'L#20':" REG"'L#10':" OT"'L#10':"PERIOD"
|
||
|
END
|
||
|
IF LNCNT > 55 THEN
|
||
|
PRINT FF
|
||
|
PRINT HL1
|
||
|
PRINT HL2
|
||
|
PRINT HL3
|
||
|
PRINT
|
||
|
PRINT HL4
|
||
|
PRINT HL5
|
||
|
PRINT
|
||
|
LNCNT=7
|
||
|
END
|
||
|
IF ZRAY = '?' THEN
|
||
|
LN2=USER.INFO<6>'L#10'
|
||
|
NAME=USER.INFO<2>:", ":USER.INFO<1>[1,1]:"."
|
||
|
LN2=LN2:NAME'L#20'
|
||
|
LN2=LN2:SPACE(3)
|
||
|
LN2=LN2:"TIMECARD IS IN AN AMBIGUOUS STATE - UNABLE TO PROCESS"
|
||
|
PRINT
|
||
|
PRINT LN2
|
||
|
END ELSE
|
||
|
PRINT LN
|
||
|
END
|
||
|
LNCNT=LNCNT+1
|
||
|
RETURN
|