230 lines
5.4 KiB
Plaintext
Executable File
230 lines
5.4 KiB
Plaintext
Executable File
*---------------------------*
|
|
* CLOCK.EXP
|
|
* BY D.BELL
|
|
*---------------------------*
|
|
CS=@(-1) ; CR=@(-3) ; CL=@(-4) ; RV=@(-13) ; ERV=@(-14)
|
|
VM=CHAR(253) ; SVM=CHAR(252) ; AM=CHAR(254) ; BEEP=CHAR(7)
|
|
PF1='<' ; PF2='P' ; PF3='/'
|
|
PROMPT ""
|
|
HR.TOT=0
|
|
TOT.HOURS=0
|
|
ARAY=''
|
|
WCT=0
|
|
RCT=0
|
|
*
|
|
OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT
|
|
OPEN 'DEPT' TO DEPT.FILE ELSE ABORT
|
|
OPEN 'USER' TO USER.FILE ELSE ABORT
|
|
OPEN 'PL' TO PL ELSE ABORT
|
|
OPEN 'LRTES' TO LRTES ELSE ABORT
|
|
OPEN 'CLOCKFILE.WORK.PROJECT' TO OUTFILE THEN
|
|
CLEARFILE OUTFILE
|
|
END ELSE
|
|
EXECUTE \CREATE-FILE CLOCKFILE.WORK.PROJECT 1 11\
|
|
OPEN 'CLOCKFILE.WORK.PROJECT' TO OUTFILE ELSE ABORT
|
|
END
|
|
GOSUB 2000
|
|
*
|
|
PLREC=\PQ\
|
|
PLREC<2>=\HSORT CWP\
|
|
PLREC<3>=\H BY CLIENT\
|
|
PLREC<4>=\H BY DEPT\
|
|
PLREC<5>=\H BY DATE\
|
|
PLREC<6>=\H BY LNAME\
|
|
PLREC<7>=\H BY FNAME\
|
|
PLREC<8>=\H BREAK-ON CLIENT.DESC\
|
|
PLREC<9>=\H BREAK-ON DEPT.DESC\
|
|
PLREC<10>=\H PROJECT\
|
|
PLREC<11>=\H DATE\
|
|
PLREC<12>=\H LNAME\
|
|
PLREC<13>=\H FNAME\
|
|
PLREC<14>=\H TOTAL HOURS\
|
|
PLREC<15>=\H TOTAL LABOR\
|
|
PLREC<16>=\H HEADING "'C'Labor Expense by Client for \:OCONV(SDATE,'D2/'):\ thru \:OCONV(EDATE,'D2/'):\ 'L'"\
|
|
IF PANS='Y' THEN
|
|
PLREC<17>=\H (IP\
|
|
END ELSE
|
|
PLREC<17>=\H (I\
|
|
END
|
|
PLREC<18>=\PP\
|
|
IF PANS#'Y' THEN
|
|
PLREC=INSERT(PLREC,2;\HTERM 132\)
|
|
PLREC=INSERT(PLREC,3;\P\)
|
|
END
|
|
WRITE PLREC ON PL,"CWP.RPT"
|
|
*
|
|
PLREC=\PQ\
|
|
PLREC<2>=\HSORT CWP\
|
|
PLREC<3>=\H BY LNAME\
|
|
PLREC<4>=\H BY FNAME\
|
|
PLREC<5>=\H BY DEPT\
|
|
PLREC<6>=\H BY DATE\
|
|
PLREC<7>=\H CLIENT\
|
|
PLREC<8>=\C\
|
|
PLREC<9>=\H BREAK-ON DEPT.DESC\
|
|
PLREC<10>=\H PROJECT\
|
|
PLREC<11>=\H DATE\
|
|
PLREC<12>=\H LNAME\
|
|
PLREC<13>=\H BREAK-ON FNAME\
|
|
PLREC<14>=\H TOTAL HOURS\
|
|
PLREC<15>=\H TOTAL LABOR\
|
|
PLREC<16>=\H HEADING "'C'Labor Expense by Employee for \:OCONV(SDATE,'D2/'):\ thru \:OCONV(EDATE,'D2/'):\ 'L'"\
|
|
IF PANS='Y' THEN
|
|
PLREC<17>=\H (IP\
|
|
END ELSE
|
|
PLREC<17>=\H (I\
|
|
END
|
|
PLREC<18>=\PP\
|
|
IF PANS#'Y' THEN
|
|
PLREC=INSERT(PLREC,2;\HTERM 132\)
|
|
PLREC=INSERT(PLREC,3;\P\)
|
|
END
|
|
WRITE PLREC ON PL,"CWP.RPT2"
|
|
*
|
|
SELECT CLOCKFILE
|
|
LOOP
|
|
READNEXT ID ELSE ID='EOF'
|
|
UNTIL ID='EOF' DO
|
|
IF REM(RCT,500) ELSE
|
|
CRT @(0,22):CL:"RECORDS READ :":RCT:" PROCESSED :":WCT
|
|
END
|
|
RCT=RCT+1
|
|
DATE=OCONV(ID,"G1|1")
|
|
USER=OCONV(ID,"G0|1")
|
|
READ UREC FROM USER.FILE,USER ELSE GO 10
|
|
READV RATE FROM LRTES,USER,1 ELSE RATE="*****"
|
|
IF NOT(NUM(RATE)) THEN
|
|
CRT BEEP:"USER WITH NO RATE: ":USER:" - <RETURN>"
|
|
ANY=""; INPUT ANY
|
|
RATE=0
|
|
END
|
|
IF DATE >= SDATE AND DATE <= EDATE THEN
|
|
GOSUB 500
|
|
END
|
|
10 *
|
|
REPEAT
|
|
EXECUTE \EX CWP.RPT\
|
|
EXECUTE \EX CWP.RPT2\
|
|
STOP
|
|
500 * DATE IS WITHIN SELECTED RANGES
|
|
READ ARAY FROM CLOCKFILE,ID THEN
|
|
GOSUB 1000
|
|
END
|
|
RETURN
|
|
1000 *
|
|
WREC=ARAY<1>
|
|
WREC<2>=ARAY<2>
|
|
ACT=DCOUNT(ARAY<1>,VM)
|
|
FOR A=1 TO ACT
|
|
TIME=ARAY<1,A>
|
|
PRJCT=ARAY<2,A>
|
|
IF REM(A,2) THEN
|
|
IF PRJCT='OFF' THEN
|
|
CRT @(0,22):BEEP:"The TIMECARD is in an ambiguous state - Unable to process!":
|
|
RQM
|
|
TOT.HOURS=0
|
|
ONTIME='UNKNOWN'
|
|
END ELSE
|
|
* OPRJCT=FIELD(PRJCT,"-",1)
|
|
OPRJCT=PRJCT
|
|
ONTIME=TIME
|
|
END
|
|
END ELSE
|
|
IF PRJCT # 'OFF' THEN
|
|
CRT @(0,22):BEEP:"The TIMECARD is in an ambiguous state - Unable to process!":
|
|
RQM
|
|
TOT.HOURS=0
|
|
OFFTIME='UNKNOWN'
|
|
END ELSE
|
|
OFFTIME=TIME
|
|
END
|
|
IF OFFTIME='UNKNOWN' OR ONTIME='UNKNOWN' THEN
|
|
HOURS='?'
|
|
END ELSE
|
|
IF ONTIME > OFFTIME THEN
|
|
OFFTIME=OFFTIME+86400
|
|
END
|
|
HOURS=OFFTIME-ONTIME
|
|
END
|
|
LOCATE(OPRJCT,WREC,3;IDX) THEN
|
|
WREC<4,IDX>=WREC<4,IDX>+HOURS
|
|
END ELSE
|
|
WREC=INSERT(WREC,3,IDX;OPRJCT)
|
|
WREC=INSERT(WREC,4,IDX;HOURS)
|
|
END
|
|
END
|
|
NEXT A
|
|
READV WDEPT FROM USER.FILE,USER,5 ELSE WDEPT='999'
|
|
WCNT=DCOUNT(WREC<3>,VM)
|
|
FOR W=1 TO WCNT
|
|
WPROJECT=WREC<3,W>
|
|
WKEY=WDEPT:"_":WPROJECT:"_":DATE:"_":USER
|
|
OREC=WREC<4,W>
|
|
*----*
|
|
OREC<1>=OCONV(OREC<1>,'MT')
|
|
GOSUB 5050 ;* convert minutes to quarter hours
|
|
OREC<1>=ICONV(OREC<1>,'MT')
|
|
OREC<2>=OREC<1>*RATE/3600
|
|
*----*
|
|
WRITE OREC ON OUTFILE,WKEY
|
|
NEXT W
|
|
WCT=WCT+1
|
|
RETURN
|
|
*
|
|
2000 *
|
|
CRT CS
|
|
CRT @(0,0):"CLOCK.EXP.EXPANDED"
|
|
DEPT='ALL'
|
|
DEPT.DESC='ALL'
|
|
CRT @(0,2):"This process will build an analysis workfile for '":DEPT.DESC:"'"
|
|
CRT @(0,3):"departments and for the specified payroll period."
|
|
2001 *
|
|
CRT @(0,5):"Select the START DATE to build ":;INPUT SDATE
|
|
SDATE=ICONV(SDATE,'D')
|
|
IF NUM(SDATE) THEN
|
|
END ELSE
|
|
CRT @(0,22):"INVALID FORMAT - PRESS RETURN":;INPUT DUMMY;GO 2001
|
|
END
|
|
CRT @(0,5):"Select the START DATE to build ":OCONV(SDATE,'D2/')
|
|
2002 *
|
|
CRT @(0,6):"Select the LAST DATE to build ":;INPUT EDATE
|
|
EDATE=ICONV(EDATE,'D')
|
|
IF NUM(EDATE) THEN
|
|
CRT @(0,6):"Select the LAST DATE to build ":OCONV(EDATE,'D2/')
|
|
END ELSE
|
|
CRT @(0,22):"INVALID FORMAT - PRESS RETURN":;INPUT DUMMY;GO 2002
|
|
END
|
|
*
|
|
2003 *
|
|
CRT @(0,7):"Output to printer (Y/N)":
|
|
INPUT PANS
|
|
IF PANS#'Y' THEN PANS='N'
|
|
IF PANS='Y' THEN
|
|
EXECUTE \PRINTER.ASSIGNMENT.FMT\
|
|
END
|
|
CRT @(0,22):CL:BEEP:"IS THIS CORRECT (Y/N)":
|
|
INPUT ANS
|
|
IF ANS='/' THEN STOP
|
|
IF ANS='Y' ELSE GO 2000
|
|
CRT @(23,12):RV:"PLEASE WAIT FOR REPORT!!!":ERV
|
|
RETURN
|
|
*
|
|
5050 *----- round hours to nearest quarter hour -----------------*
|
|
MINTS=OCONV(OREC<1>,'G1:1')
|
|
OURS =OCONV(OREC<1>,'G0:1')
|
|
BEGIN CASE
|
|
CASE MINTS >= 0 AND MINTS <= 7
|
|
MINTS = '00'
|
|
CASE MINTS >= 8 AND MINTS <= 21
|
|
MINTS = '15'
|
|
CASE MINTS >= 22 AND MINTS <= 37
|
|
MINTS = '30'
|
|
CASE MINTS >= 38 AND MINTS <= 51
|
|
MINTS = '45'
|
|
CASE MINTS >= 52
|
|
OURS=OURS+1
|
|
MINTS='00'
|
|
END CASE
|
|
OREC<1>=OURS'R%2':":":MINTS
|
|
RETURN
|