tldm-universe/CMS/BP.CLOCK/CLOCK.EXP
2024-09-10 15:25:06 -04:00

232 lines
5.1 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
*EXECUTE 'SETPTR ,,,,,,AT mtk4si,FORM 6,NHEAD,INFORM,BRIEF'
*
$INCLUDE CLOCK.PAY.DATES
*
OPEN 'CLOCK.PAY.DATES' TO CLOCK.PAY.DATES ELSE ABORT
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 'CLOCKFILE.WORK' TO WFILE THEN
CLEARFILE WFILE
END ELSE
EXECUTE \CREATE-FILE CLOCKFILE.WORK 1 11\
OPEN 'CLOCKFILE.WORK' TO WFILE ELSE ABORT
END
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
*
SELECT CLOCKFILE
LOOP
READNEXT ID ELSE ID='EOF'
UNTIL ID='EOF' DO
DATE=OCONV(ID,"G1|1")
USER=OCONV(ID,"G0|1")
LOCATE(DATE,QRAY,1;NDX;'AR') THEN
IF QRAY<2,NDX> THEN
GOSUB 500
END
END ELSE
IF NDX > 1 THEN NDX=NDX-1
IF QRAY<2,NDX> THEN
IF DATE >= QRAY<1,NDX> AND DATE <= QRAY<1,NDX>+13 THEN
GOSUB 500
END
END
END
REPEAT
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=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
LOCATE(DATE,QRAY,1;FND.DT;"AR") ELSE FND.DT=FND.DT-1
WREC<5>=1 ; TEST.DT=QRAY<3,FND.DT>
IF DATE GT TEST.DT THEN WREC<5>=2
WRITE WREC ON WFILE,ID
WCT=WCT+1
CRT @(0,22):CL:"RECORDS PROCESSED :":WCT
RETURN
*
2000 *
CRT CS
CRT @(0,0):"CLOCK.EXP"
*CRT @(0,22):CL:"Enter the DEPARTMENT to build analysis for or 'ALL' :":
*INPUT DEPT
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."
CRT @(0,5):"Select the period to rebuild from those found below."
COL=0
POS=5
MAXCOL=70
MAXPOS=20
QRAY=''
GOSUB 2200
QCT=DCOUNT(QRAY<1>,VM)
FOR Q=1 TO QCT
IF POS>=MAXPOS THEN COL=COL+20;POS=5
POS=POS+1
CRT @(COL,POS):" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" "
NEXT Q
CRT @(0,22):"Enter SPACE(toggle selection)":
COL=0; POS=5
FOR Q=1 TO QCT
IF POS>=MAXPOS THEN COL=COL+20;POS=5
POS=POS+1
CRT @(COL,POS):RV:" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" "
CRT @(COL,POS):
INPUT ANS,1:
CRT ERV
BEGIN CASE
CASE ANS=' '
IF QRAY<2,Q> THEN
CRT @(COL,POS):" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" "
QRAY<2,Q>=0
END ELSE
CRT @(COL,POS):RV:" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" ":ERV
QRAY<2,Q>=1
END
CASE ANS='/'
STOP
CASE 1
IF QRAY<2,Q>=0 THEN
CRT @(COL,POS):" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" "
END ELSE
CRT @(COL,POS):RV:" ":OCONV(QRAY<1,Q>,'D2/'):"-":OCONV(QRAY<1,Q>+13,'D2/'):" ":ERV
END
END CASE
NEXT Q
CRT @(0,22):CL:BEEP:"IS THIS CORRECT (Y/N)":
INPUT ANS
IF ANS='/' THEN STOP
IF ANS='Y' ELSE GO 2000
FOR Q=1 TO QCT
IF QRAY<2,Q> THEN
CRT @(0,1):CR
CRT @(23,12):RV:"PLEASE WAIT FOR REPORT!!!":ERV
END
NEXT Q
GOSUB 2300 ;* CLEAR EXISTING WORKFILE RECORDS FOR THIS DEPT/PERIOD(S)
RETURN
2200 * CALC DATES
EDATE=0; SDATE=0
PRDAYS=14; PRDATE=ICONV('12/23/90','D')
CRT @(0,22):CL:BEEP:"Enter Payroll Year (yy format) else RETURN":
INPUT CYR
IF NUM(CYR) AND CYR > 89 AND CYR < 100 THEN
TODAY="1/1/":CYR
END ELSE
TODAY="1/1/":OCONV(DATE(),'D2Y')
END
TODAY=ICONV(TODAY,'D')
TODAY=TODAY-14
LOOP
TODAY=TODAY+14
SDATE=TODAY-PRDATE
IF SDATE <= PRDAYS THEN
EDATE=PRDATE
END ELSE
EDATE=PRDATE+(INT(SDATE/PRDAYS)*PRDAYS)
END
SDATE=EDATE+PRDAYS
ODATE=EDATE
WK.DT=ODATE+6
QRAY=INSERT(QRAY,1,-1;ODATE)
QRAY=INSERT(QRAY,2,-1;'0')
QRAY=INSERT(QRAY,3,-1;WK.DT)
UNTIL SDATE > DATE() DO REPEAT
RETURN
2300 *
SELECT WFILE
LOOP
READNEXT ID ELSE ID='EOF'
UNTIL ID='EOF' DO
READ WREC FROM WFILE,ID ELSE WREC=''
DATE=WREC<1>
DEPARTMENT=OCONV(ID,'G0|1')
IF DEPARTMENT=DEPT OR DEPT='ALL' ELSE
CRT @(10,20):"SKIPPED RECORD ":ID:CL
GO 2399
END
LOCATE(DATE,QRAY,1;NDX;'AR') THEN
IF QRAY<2,NDX> THEN
GOSUB 2500
END
END ELSE
IF NDX > 1 THEN NDX=NDX-1
IF QRAY<2,NDX> THEN
IF DATE >= QRAY<1,NDX> AND DATE <= QRAY<1,NDX>+13 THEN
GOSUB 2500
END
END
END
2399 *
REPEAT
RETURN
2500 *
CRT @(0,22):CL:"DELETING WORKFILE RECORD ":ID
*DELETE WFILE,ID
RETURN