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

880 lines
20 KiB
Plaintext
Executable File

*---------------------------- *
* PROGRAM: CLOCK
* REQUIRES: CM,PROJECTS,TIMES
* BY: D.BELL
* ON: 12/24/90
* ON: 06/25/91 KJC DISPLAYS HOURLY TOTAL FOR PAY PERIOD
* ON: 02/28/95 STR DISPLAYS HOURLY TOTAL FOR WEEK ONE & TWO
*-----------------------------*
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 ""
PORT=OCONV('','U50BB')
PORT=FIELD(PORT," ",1)
*
JOB.CODE='00'
OFF.CODE=''
OVERTIME.DISP=0
*
$INCLUDE CLOCK.PAY.DATES
$INCLUDE USER
*
OPEN 'CLOCK.PAY.DATES' TO CLOCK.PAY.DATES ELSE ABORT
OPEN 'USER' TO USER.FILE ELSE ABORT
OPEN 'PROJECT' TO PROJECT ELSE ABORT
OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT
OPEN 'PT' TO PT.FILE ELSE ABORT
OPEN 'JOB' TO JOB ELSE ABORT
*
READV PT FROM PT.FILE,PORT,1 ELSE PT=''
BEGIN CASE
CASE PT='2020'; ADDS=1
CASE PT='4000'; ADDS=2
CASE PT='2025'; ADDS=2
CASE 1 ; ADDS=0
END CASE
* IF ADDS THEN
* TA ON; TA CLEAR
* END
*
GOSUB 7000 ;* figure beginning and ending day of pay period
CRT CS
HELP.TBL=''; GOSUB 4000 ;* LOAD PROJECT CODES INTO ARRAY
COL=0
POS=10
PSW=0
CSW=0
OLD.TIME="0"
NEW=0
DONE=0
TOTAL.HRS = ''
*
*FLOATING MODE*
*
ANY=''
LOOP
TIME=TIME()
TODAY=DATE()
IF ADDS THEN
IF TIME = OLD.TIME AND NEW#0 ELSE
OLD.TIME=TIME
IF REM(TIME,10)=0 OR NEW='0' THEN
GOSUB 500
GOSUB 50
GOSUB 75
END
GOSUB 200
END
NEW=1
ANY=''
INPUTIF ANY,1 THEN
*TA CLEAR
GOSUB 1000
POS=10; COL=0
*TA CLEAR
NEW=0
END
END ELSE
GOSUB 1000
DONE=1
END
UNTIL DONE DO REPEAT
STOP
40 * 2020 LOGIC
TLEN=LEN(TSTRING1)
TSTRING1.TEMP=''
FOR TL=1 TO TLEN
TSTRING1.TEMP=TSTRING1.TEMP:TSTRING1[TL,1]:" "
NEXT TL
TSTRING1=TSTRING1.TEMP
RETURN
50 * DRAW BOX
CRT CS
IF ADDS THEN
CRT CHAR(23)
TSTRING1="#<<<<<<<<<<<<<<<<<<D"
TCOL=COL; TPOS=POS; GOSUB 100
TSTRING1=">"
TCOL=COL; TPOS=POS+2; GOSUB 100
TSTRING1=">"
IF ADDS=1 THEN
TCOL=COL+38; GOSUB 100
END ELSE
TCOL=COL+19; GOSUB 100
END
TSTRING1="B<<<<<<<<<<<<<<<<<<F"
TCOL=COL; TPOS=POS+4; GOSUB 100
END ELSE
TSTRING1="|~~~~~~~~~~~~~~~~~~|"
TCOL=COL+9; TPOS=POS+1; GOSUB 175
TSTRING1="| |"
TPOS=POS+2; GOSUB 175
TPOS=POS+3; GOSUB 175
TSTRING1=" ~~~~~~~~~~~~~~~~~~ "
TPOS=POS+4; GOSUB 175
END
RETURN
75 * MESSAGES
TSTRING1="TIMECLOCK"
IF ADDS=1 THEN
TCOL=COL+13; TPOS=POS-1; GOSUB 175
END ELSE
TCOL=(COL*2)+13; TPOS=POS-1; GOSUB 175
END
TSTRING1="PRESS ANY KEY"
IF ADDS=1 THEN
TCOL=COL+11; TPOS=POS+6; GOSUB 175
END ELSE
TCOL=(COL*2)+11; TPOS=POS+6; GOSUB 175
END
RETURN
100 * PRINT GRAPHICS
IF ADDS=1 THEN GOSUB 40
CRT @(TCOL,TPOS):CHAR(27):CHAR(72):CHAR(2):CHAR(27):CHAR(9):"2":TSTRING1:CHAR(27):CHAR(72):CHAR(3)
CRT @(TCOL,TPOS+1):CHAR(27):CHAR(72):CHAR(2):CHAR(27):CHAR(9):"3":TSTRING1:CHAR(27):CHAR(72):CHAR(3)
RETURN
150 * DOUBLE HIGH/WIDE
IF ADDS=1 THEN GOSUB 40
CRT @(TCOL,TPOS):CHAR(27):CHAR(9):"2":TSTRING1:
CRT @(TCOL,TPOS+1):CHAR(27):CHAR(9):"3":TSTRING1:
RETURN
175 * REGULAR PRINT
CRT @(TCOL+1,TPOS):TSTRING1
RETURN
200 * PRINT DOUBLE WIDE/DOUBLE HIGH
TSTRING1=OCONV(TIME,"MTHS")
TSTRING1=OCONV(TSTRING1,'MCL')
IF ADDS THEN
TCOL=COL+6; TPOS=POS+2; GOSUB 150
IF ADDS=1 THEN TCOL=TCOL+2
END ELSE
TCOL=COL+14; TPOS=POS+2; GOSUB 175
END
RETURN
500 * CALCULATE POS/COL
IF POS < 3 OR POS > 15 THEN PSW=PSW+1
IF COL < 1 OR COL > 17 THEN CSW=CSW+1
IF REM(PSW,2) THEN
POS=POS-1
END ELSE
POS=POS+1
END
IF REM(CSW,2) THEN
COL=COL+2
END ELSE
COL=COL-2
END
RETURN
1000 *
CRT CS
POS=0; COL=0; GOSUB 50; GOSUB 200
IF ADDS THEN
TSTRING1="Today Is"
TLEN=LEN(TSTRING1)
IF ADDS=1 THEN
TCOL=COL+60-(INT(TLEN/2)); TPOS=POS
END ELSE
TCOL=COL+30-(INT(TLEN/2)); TPOS=POS
END
GOSUB 150
TSTRING1=OCONV(TODAY,'DWA'):" "
TLEN=LEN(TSTRING1)
IF ADDS=1 THEN
TCOL=COL+60-(INT(TLEN/2)); TPOS=POS+2
IF REM(TCOL,2) THEN TCOL=TCOL+1
END ELSE
TCOL=COL+30-(INT(TLEN/2)); TPOS=POS+2
END
GOSUB 150
END ELSE
TSTRING1="Today Is"
TLEN=LEN(TSTRING1)
TCOL=COL+50-(INT(TLEN/2)); TPOS=POS+1
GOSUB 175
TSTRING1=OCONV(TODAY,'DWA'):" ":OCONV(TODAY,'D2/')
TLEN=LEN(TSTRING1)
TCOL=COL+50-(INT(TLEN/2)); TPOS=POS+2
GOSUB 175
END
IF ADDS THEN
CRT CHAR(24)
END
CRT @(COL+10,POS+6):"WELCOME TO TIMECLOCK"
*
CRT @(0,22):RV:"Enter Your 4 digit Employee Identification Number":ERV:CL
TSTRING="EMPLOYEE ID #:____"
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+10):TSTRING
CRT @(COL+20-(INT(TLEN/2))+14,POS+10):
INPUT USER
IF USER='OFF' THEN STOP
IF USER='' OR USER='/' THEN
CRT @(0,22):RV:"Thank You - Goodbye!":ERV:CL:
RQM
GO 1999
END
READ UREC FROM USER.FILE,USER THEN
TSTRING=UREC<1>:" ":UREC<2>
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+8):RV:TSTRING:ERV
END ELSE
CRT @(0,22):RV:BEEP:"INVALID USER CODE - Try Again!":ERV:CL
RQM
GO 1000
END
*
TRY=0
1500 * PASSWORD INPUT
POS=0; COL=0
CRT @(0,22):RV:"Please enter your Password Now - It'll be our secret!":ERV:CL
TSTRING="PASSWORD :"
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+11):TSTRING
CRT @(COL+20-(INT(TLEN/2))+10,POS+11):
ECHO OFF
INPUT PSWD
ECHO ON
IF PSWD='' OR PSWD='/' THEN
CRT @(0,22):RV:"Thank You - Goodbye!":ERV:CL:
RQM
GO 1999
END
IF UREC<4> = PSWD ELSE
IF TRY THEN
CRT @(0,22):RV:BEEP:"You have TWICE entered an incorrect password - Goodbye":ERV:CL
RQM
GO 1999
END ELSE
TRY=1
CRT @(0,22):RV:BEEP:"INVALID PASSWORD - Try Again!":ERV:CL
RQM
GO 1500
END
END
PRJCT=''
CLKKEY=USER:"|":TODAY
READ CLKREC FROM CLOCKFILE,CLKKEY THEN
GOSUB 2500
END ELSE
CLKREC=''
END
GOSUB 6000
*
1750 * PROJECT CODES
POS=0; COL=0 ; OFF.CODE=''
CRT @(0,22):RV:"Enter Project # to CLOCK IN, 'OFF' to CLOCK OUT, '?'(help), 'T'(timecard)":ERV:CL:
TSTRING="PROJECT :___"
TLEN=LEN(TSTRING)
CRT @(COL+22-(INT(TLEN/2)),POS+12):TSTRING
CRT @(COL+22-(INT(TLEN/2))+TLEN-3,POS+12):
INPUT PRJCT
PRJCT=OCONV(PRJCT,"MCU")
IF PRJCT='T' THEN GOSUB 2000; GOSUB 2500; GO 1750
IF PRJCT='?' THEN PRJCT=''; GOSUB 3000; GOSUB 2500
IF PRJCT='OUT' THEN PRJCT='OFF'
IF PRJCT='OFF' THEN
OFF.CODE=1
GOSUB 5000
IF CLKREC # '' THEN
* GOSUB 2500
END ELSE
GO 1750
END
CRT @(0,22):RV:"Hit Return to Continue":ERV:CL:
INPUT ANY
GO 1999
END
IF PRJCT='/' THEN
CRT @(0,22):"Thank You - Goodbye!":CL:
RQM
GO 1999
END
IF PRJCT='' THEN GO 1750
LOCATE(PRJCT,HELP.TBL,1;INDX) THEN
TSTRING=HELP.TBL<2,INDX>
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+14):TSTRING
GOSUB 7400 ;* INPUT JOB CODE
GOSUB 5000 ;* UPDATE RECORD
GOSUB 2500 ;* DISPLAY TODAYS CARD
END ELSE
CRT @(0,22):RV:BEEP:"INVALID PROJECT CODE - Try Again!":ERV:CL
RQM
GO 1750
END
1999 *
PSW=0;CSW=0
RETURN
*
2000 * TIMECARD HEADER
POS=0; COL=0
TIME=TIME()
GOSUB 200
POS=6; COL=0
CRT @(COL,POS):CR
GOSUB 2225
TSTRING=" DATE"'L#9':"TIME IN"'L#9':"TIME OUT"'L#9':"PROJECT"'L#9'
CRT @(COL+2,POS):TSTRING
CRT @(COL+42,POS):TSTRING
*
SDATE=PAY.END
EDATE=PAY.BEGIN
*
Z=0; ZCT=0; ZPOS=0; MAX=14; SW=0; POS=6; COL=2
D=TODAY+1
TOTAL.HRS = 0
LOOP
D=D-1
UNTIL D < EDATE DO
DKEY=USER:"|":D
READ DREC FROM CLOCKFILE,DKEY THEN
ZCT=DCOUNT(DREC<1>,VM)
DAILY.HRS = 0
FOR Z=1 TO ZCT STEP 2
DATE=D
INTIME = DREC<1,Z>
OUTTIME = DREC<1,Z + 1>
IF OUTTIME = '' THEN INTIME = 0
DAILY.HRS = DAILY.HRS + (OUTTIME - INTIME)
ZPOS=ZPOS+1
IF INT(ZPOS/MAX) THEN
SW=SW+1
IF REM(SW,2) THEN
COL=42
END ELSE
COL=2
GOSUB 2100
IF ANS='B' THEN GO 2000
END
ZPOS=1
END
ZTIME=OCONV(DREC<1,Z>,"MTH")
ZTIME=OCONV(ZTIME,"MCL")
TSTRING=OCONV(DATE,"D2/")'L#9':ZTIME'L#9':SPACE(10):DREC<2,Z>'L#7'
CRT @(COL,POS+ZPOS):TSTRING
IF DREC<2,Z+1>='OFF' THEN
TSTRING=OCONV(DREC<1,Z+1>,"MTH")
TSTRING=OCONV(TSTRING,'MCL')
CRT @(COL+18,POS+ZPOS):TSTRING
END ELSE
Z=Z-1
END
NEXT Z
TOTAL.HRS = TOTAL.HRS + DAILY.HRS ;*CALCS TOTAL HRS FOR DISPLAY
ZPOS=ZPOS+1 ;* THIS WILL CAUSE THE BLANK LINE BETWEEN DAYS
END
REPEAT
*
GOSUB 2100
IF ANS='B' THEN GO 2000
COL=0; POS=6
CRT @(COL,POS):CR
PRJCT=''; INDX=''; GOSUB 2550
RETURN
*
2100 *
CRT @(54,22):"TOTAL HOURS: ":RV:OCONV(TOTAL.HRS,"MT"):ERV:
CRT @(0,22):RV:"Enter N(next page), B(back page), else RETURN ":ERV:
INPUT ANS
IF ANS='' OR ANS='/' THEN
GO 2199
END
IF ANS='B' THEN
Z=Z-(ZPOS+(MAX*6))
IF Z < 0 THEN Z=0
SW=0
END ELSE
IF ANS='N' THEN
IF Z > ZCT THEN
CRT @(0,22):"End of list!":CL
RQM
GO 2100
END
END ELSE
CRT @(0,22):BEEP:"INVALID ENTRY - Try Again!":CL:
END
END
2199 *
COL=2; POS=6
RETURN
*
2225 * DRAW BOX
IF ADDS THEN
FOR X=POS TO 21
IF X=POS THEN
TSTRING1="#"
TCOL=COL; TPOS=X; GOSUB 2275
TSTRING1="L"
TCOL=COL+39; GOSUB 2275
TSTRING1="D"
TCOL=COL+79; GOSUB 2275
END ELSE
IF X=21 THEN
TSTRING1="B":STR("<",38):"M":STR("<",39):"F"
TCOL=COL; TPOS=X; GOSUB 2275
END ELSE
TSTRING1=">"
TCOL=COL; TPOS=X; GOSUB 2275
TCOL=COL+39; GOSUB 2275
TCOL=COL+79; GOSUB 2275
END
END
NEXT X
END ELSE
FOR X=POS TO 21
IF X=POS THEN
TSTRING1="|"
TCOL=COL; TPOS=X; GOSUB 2285
TSTRING1="|"
TCOL=COL+39; GOSUB 2285
TSTRING1="|"
TCOL=COL+79; GOSUB 2285
END ELSE
IF X=21 THEN
TSTRING1=STR("~",80)
TCOL=COL; TPOS=X; GOSUB 2285
END ELSE
TSTRING1="|"
TCOL=COL; TPOS=X; GOSUB 2285
TCOL=COL+39; GOSUB 2285
TCOL=COL+79; GOSUB 2285
END
END
NEXT X
END
RETURN
2275 * PRINT GRAPHICS
CRT CHAR(27):CHAR(72):CHAR(2)
CRT @(TCOL,TPOS):TSTRING1:
CRT CHAR(27):CHAR(72):CHAR(3)
RETURN
2285 * PRINT LINE
CRT @(TCOL,TPOS):TSTRING1:
RETURN
*
2500 * TIMECARD HEADER
POS=0; COL=0
GOSUB 200 ;* UPDATE TIME IN BOX
POS=6
GOSUB 2550
GOSUB 2525
POS=6; COL=0
TSTRING="TIME IN"'L#9':"TIME OUT"'L#9':"PROJECT DESCRIPTION"
CRT @(COL+41,POS):TSTRING
*
ZPOS=0
ZCT=DCOUNT(CLKREC<1>,VM)
FOR Z=1 TO ZCT
DATE=FIELD(CLKKEY,"|",2)
IF CLKREC<2,Z>='OFF' THEN
TSTRING=OCONV(CLKREC<1,Z>,"MTH")
TSTRING=OCONV(TSTRING,'MCL')
CRT @(COL+50,POS+ZPOS):TSTRING
END ELSE
ZPOS=ZPOS+1
ZTIME=OCONV(CLKREC<1,Z>,"MTH")
ZTIME=OCONV(ZTIME,"MCL")
LOCATE(OCONV(CLKREC<2,Z>,'G0-1'),HELP.TBL,1;ZINDX) THEN
ZDESC=HELP.TBL<2,ZINDX>
END ELSE
ZDESC='UNKNOWN'
END
TSTRING=ZTIME'L#9':SPACE(9):CLKREC<2,Z>'L#7':ZDESC'L#12'
CRT @(COL+41,POS+ZPOS):TSTRING
END
NEXT Z
*
IF PRJCT='' ELSE
CRT @(0,22):RV:"Press RETURN to continue":ERV:CL:
INPUT ANY
END
RETURN
*
2525 * 1/2 DRAW BOX
COL=0; POS=6
CRT @(COL,POS):CR
GOSUB 2550
IF ADDS THEN
FOR X=POS TO 21
IF X=POS THEN
TSTRING1="#"
TCOL=COL+39; TPOS=X; GOSUB 2275
TSTRING1="D"
TCOL=COL+79; GOSUB 2275
END ELSE
IF X=21 THEN
TSTRING1="B":STR("<",39):"F"
TCOL=COL+39; TPOS=X; GOSUB 2275
END ELSE
TSTRING1=">"
TCOL=COL+39; TPOS=X; GOSUB 2275
TCOL=COL+79; GOSUB 2275
END
END
NEXT X
END ELSE
FOR X=POS TO 21
IF X=POS THEN
TSTRING1="|"
TCOL=COL+39; TPOS=X; GOSUB 2285
TCOL=COL+79; GOSUB 2285
END ELSE
IF X=21 THEN
TSTRING1=STR("~",41)
TCOL=COL+39; TPOS=X; GOSUB 2285
END ELSE
TSTRING1="|"
TCOL=COL+39; TPOS=X; GOSUB 2285
TCOL=COL+79; GOSUB 2285
END
END
NEXT X
END
RETURN
2550 * REDISPLAY USER INFORMATION
POS=6; COL=0
CRT @(COL+10,POS):"WELCOME TO TIMECLOCK"
TSTRING="EMPLOYEE ID #:":USER
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+4):TSTRING
TSTRING=UREC<1>:" ":UREC<2>
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+2):RV:TSTRING:ERV
TSTRING="PROJECT :":PRJCT
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+6):TSTRING
IF INDX = '' OR PRJCT='OFF' OR PRJCT='' ELSE
TSTRING=HELP.TBL<2,INDX>
TLEN=LEN(TSTRING)
CRT @(COL+20-(INT(TLEN/2)),POS+8):TSTRING
END
GOSUB 6000
RETURN
*
3000 * HELP HEADER
POS=0; COL=0
TIME=TIME()
GOSUB 200
POS=6; COL=0
CRT @(COL,POS):CR
GOSUB 2225
TSTRING="PROJECT"'L#9':"DESCRIPTION"'L#27'
CRT @(COL+2,POS):TSTRING
CRT @(COL+42,POS):TSTRING
*
X=0;XX=0; MAX=14; SW=0; COL=2
XCT=DCOUNT(HELP.TBL<1>,VM)
LOOP
X=X+1
XX=XX+1
TSTRING=HELP.TBL<1,X>'L#9':HELP.TBL<2,X>[1,27]'L#27'
CRT @(COL,POS+XX):TSTRING
IF INT(XX/MAX) THEN
SW=SW+1
IF REM(SW,2) THEN
COL=42
END ELSE
COL=2
GOSUB 3100
END
XX=0
END
UNTIL PRJCT # '' DO REPEAT
IF PRJCT='/' THEN PRJCT=''
RETURN
*
3100 *
CRT @(0,22):RV:"Enter Project #, N(next page), B(back page)":ERV:CL:
INPUT ANS
IF ANS='' OR ANS='/' THEN
PRJCT='/'
GO 3199
END
IF ANS='B' THEN
X=X-(XX+(MAX*3))
IF X < 0 THEN X=0
SW=0
END ELSE
IF ANS='N' THEN
IF X > XCT THEN
CRT @(0,22):"End of list!":CL
RQM
*X=X-(MAX*2)
GO 3100
END
END ELSE
LOCATE(ANS,HELP.TBL,1;INDX) THEN
PRJCT=ANS
END ELSE
CRT @(0,22):RV:BEEP:"INVALID PROJECT CODE - Try Again!":ERV:CL:
END
END
END
3199 *
RETURN
*
4000 * LOAD PROJECT TABLE
IF HELP.TBL # '' ELSE
SELECT PROJECT
LOOP
READNEXT ID ELSE ID='EOF'
UNTIL ID='EOF' DO
READ PREC FROM PROJECT,ID THEN
LOCATE(PREC<1>,HELP.TBL,2;INDX;'AL') ELSE
HELP.TBL=INSERT(HELP.TBL,1,INDX;ID)
HELP.TBL=INSERT(HELP.TBL,2,INDX;OCONV(PREC<1>,'MCU'))
END
END
REPEAT
END
RETURN
*
5000 * HANDLE TIME DATA
*---------------------------------------*
* THIS PORTION OF LOGIC BUILDS THE TIMECLOCK ENTRIES
*
* CLOCKFILE RECORD LAYOUT AS FOLLOWS:
* <0> USER|DATE
* <1> TIME MV
* <2> PROJECT MV
*
*---------------------------------------*
CLKKEY=USER:"|":TODAY
TIME=TIME()
IF TODAY # DATE() THEN
TODAY=DATE()
CLKKEY=USER:"|":TODAY
READ CLKREC FROM CLOCKFILE,CLKKEY ELSE
CLKREC=''
END
END
IF CLKREC # '' THEN
LAST=DCOUNT(CLKREC<1>,VM)
IF PRJCT='OFF' THEN
IF CLKREC<2,LAST> = 'OFF' THEN
CRT @(0,22):BEEP:"HEY! YOU ARE ALREADY CLOCKED OUT!":CL:
RQM
END ELSE
CLKREC=INSERT(CLKREC,1,-1;TIME)
CLKREC=INSERT(CLKREC,2,-1;PRJCT)
CRT @(0,22):"You are now OFF THE CLOCK!":CL:
RQM
END
END ELSE
IF CLKREC<2,LAST> # 'OFF' THEN
CLKREC=INSERT(CLKREC,1,-1;TIME)
CLKREC=INSERT(CLKREC,2,-1;"OFF")
CLKREC=INSERT(CLKREC,1,-1;TIME)
CLKREC=INSERT(CLKREC,2,-1;PRJCT:"-":JOB.CODE)
CRT @(0,22):"Your work Project has been Logged - Thanks!":CL:
RQM
END ELSE
CLKREC=INSERT(CLKREC,1,-1;TIME)
CLKREC=INSERT(CLKREC,2,-1;PRJCT:"-":JOB.CODE)
CRT @(0,22):"Welcome Back! You are now ON THE CLOCK!":CL:
RQM
END
END
END ELSE
CLKREC=''
IF PRJCT='OFF' THEN
YKEY=OCONV(CLKKEY,"G0|1"):"|":OCONV(CLKKEY,"G1|1")-1
READ YREC FROM CLOCKFILE,YKEY THEN
YCT=DCOUNT(YREC<1>,VM)
IF YREC<2,YCT>#'OFF' THEN
CLKREC<1>=0
CLKREC<2>=YREC<2,YCT>
WRITE CLKREC ON CLOCKFILE,CLKKEY
YREC=INSERT(YREC,1,-1;'86400');* 11:59 PM
YREC=INSERT(YREC,2,-1;'OFF') ;* CLOCK OUT
WRITE YREC ON CLOCKFILE,YKEY
GO 5000
END
END
CRT @(0,22):BEEP:"HEY! YOU ARE ALREADY CLOCKED OUT!":CL:
RQM
GO 5999
END ELSE
CLKREC=TIME
CLKREC<2>=PRJCT:"-":JOB.CODE
CRT @(0,22):"You are now ON THE CLOCK! - Have a great day":CL:
RQM
END
END
WRITE CLKREC ON CLOCKFILE,CLKKEY
IF OFF.CODE ELSE
UREC<UR$JOB.CODE.DEFAULT>=JOB.CODE'R%2'
WRITE UREC ON USER.FILE,USER
END
GOSUB 6000 ;*CALCULATES TOTAL HOURS FOR DISPLAY
5999 *
RETURN
*********************************************
6000 ;*CALCULATES TOTAL HOURS FOR DISPLAY
*
EDATE=0; SDATE=0 ; WEEK.ONE=0 ; WEEK.TWO=0 ; WEEK.THREE=0
EDATE=PAY.BEGIN
SDATE=PAY.END
*
Z=0; ZCT=0
D=TODAY+1
TOTAL.HRS = 0
LOOP
D=D-1
UNTIL D < EDATE DO
DKEY=USER:"|":D
READ DREC FROM CLOCKFILE,DKEY THEN
DAILY.HRS=0
ZCT=DCOUNT(DREC<1>,VM)
FOR Z=1 TO ZCT STEP 2
DATE=D
INTIME = DREC<1,Z>
OUTTIME = DREC<1,Z + 1>
IF OUTTIME = '' THEN INTIME = 0
DAILY.HRS = DAILY.HRS + (OUTTIME - INTIME)
NEXT Z
IF D >= PAY.BEGIN AND D <= WEEK.ONE.END THEN
WEEK.ONE=WEEK.ONE+DAILY.HRS
END
IF D > WEEK.ONE.END AND D <= WEEK.TWO.END THEN
WEEK.TWO=WEEK.TWO+DAILY.HRS
END
IF D > WEEK.TWO.END AND D <= WEEK.THREE.END THEN
WEEK.THREE=WEEK.THREE+DAILY.HRS
END
TOTAL.HRS = TOTAL.HRS + DAILY.HRS
END
REPEAT
IF TOTAL.HRS > 0 THEN
CRT @(10,16):" WEEK ONE HOURS : ":OCONV(WEEK.ONE,"MT")
CRT @(10,17):" WEEK TWO HOURS : ":OCONV(WEEK.TWO,"MT")
IF WEEK.THREE > 0 THEN
CRT @(10,18):" WEEK THREE HOURS: ":OCONV(WEEK.THREE,"MT")
END
END
01234 *
IF WEEK.ONE > 144000 OR WEEK.TWO > 144000 OR WEEK.THREE > 144000 THEN
IF NOT(OVERTIME.DISP) THEN
CRT @(0,18):CR:BEEP:RV:SPACE(79)
CRT @(0,19):SPACE(79)
CRT @(0,20):SPACE(79)
CRT @(0,21):SPACE(79)
CRT @(0,22):SPACE(79)
CRT @(0,19):"Warning - You have exceeded the maximum number of weekly hours (40) allowed!"
CRT @(0,20):" Prior written authorization from your supervisor and"
CRT @(0,21):" the EXECUTIVE department is required for overtime pay!"
CRT @(0,22):"Press 'Y' to record your understanding of this --> ":ERV:
ANS5=''
INPUT ANS5
IF ANS5 # 'Y' THEN GO 01234
CRT @(0,18):CR
OVERTIME.DISP=1
END
END
*
CRT @(0,19):SPACE(3):" TOTAL PAY PERIOD HOURS: ":RV:OCONV(TOTAL.HRS,"MT"):ERV:
RETURN
***********************************************************
9999 * END OF PROCESS
STOP
*
7000 *---- determine pay period/dates --------------------*
ZTODAY=DATE() ; ZPERIOD='' ; PAY.BEGIN='' ; PAY.END=''
ZZ.PER=OCONV(DATE(),"D2/")
ZPERIOD=ZZ.PER[7,2]:ZZ.PER[1,2]
7100 *
READ DATE.REC FROM CLOCK.PAY.DATES,ZPERIOD THEN
ZFOUND='' ; ZPOS=''
FOR ZZ=1 TO 3
IF ZTODAY >= DATE.REC<CPD$PERIOD.BEGIN,ZZ> THEN
IF ZTODAY <= DATE.REC<CPD$PERIOD.END,ZZ> THEN
ZFOUND=1
ZPOS=ZZ
END
END
NEXT ZZ
IF ZFOUND THEN
PAY.BEGIN =DATE.REC<CPD$PERIOD.BEGIN,ZPOS>
PAY.END =DATE.REC<CPD$PERIOD.END,ZPOS>
WEEK.ONE.END =DATE.REC<CPD$WEEK.ONE.END,ZPOS>
WEEK.TWO.END =DATE.REC<CPD$WEEK.TWO.END,ZPOS>
WEEK.THREE.END=DATE.REC<CPD$WEEK.THREE.END,ZPOS>
END ELSE
ZPERIOD=DATE.REC<CPD$NEXT.PERIOD>
GO 7100
END
END
RETURN
*
7400 * INPUT JOB CODE
GOSUB 7600 ;* display job codes
HOLD.JOB=''
IF UREC<UR$JOB.CODE.DEFAULT>#'' THEN
JOB.CODE=UREC<UR$JOB.CODE.DEFAULT>
END ELSE
JOB.CODE='00'
END
HOLD.JOB=JOB.CODE
CRT @(0,22):CL:RV:" Enter Job code else <return> for '":JOB.CODE'R%2':"' ":ERV:
CRT @(15,13):"JOB CODE :":JOB.CODE'L#10'
CRT @(25,13):
INPUT JOB.CODE,5
IF JOB.CODE='' THEN JOB.CODE=HOLD.JOB
BEGIN CASE
CASE JOB.CODE='/'
CRT @(0,22):"Thank You - Goodbye!":CL:
RQM
RETURN TO 1999
CASE NUM(JOB.CODE)
READ JOBREC FROM JOB,JOB.CODE ELSE
CRT @(0,22):CL:BEEP:RV:" Invalid Job Code! :":ERV:
RQM
GO 7400
END
CASE 1
CRT @(0,22):CL:BEEP:RV:" Invalid Job Code! :":ERV:
RQM
GO 7400
END CASE
*
FOR WW = 1 TO 21 ;* clear time card display
CRT @(39,WW):CL
NEXT WW
CRT @(45,2):CL:"Today is ":OCONV(DATE(),'DWA'):" ":OCONV(DATE(),'D2/')
RETURN
*
7600 * DISPLAY JOB CODES
EOE=0 ; EE=0 ; JOB.TABLE=''
SELECT JOB
LOOP
READNEXT JOB.ID ELSE EOE=1
UNTIL EOE DO
READ JJREC FROM JOB,JOB.ID THEN
IF NUM(JOB.ID) THEN
LOCATE(JJREC<1>,JOB.TABLE,2;JJD;"AL") ELSE
JOB.TABLE=INSERT(JOB.TABLE,1,JJD;JOB.ID)
JOB.TABLE=INSERT(JOB.TABLE,2,JJD;JJREC<1>)
END
END
END
REPEAT
*
FOR WW = 1 TO 21 ;* clear time card display
CRT @(39,WW):CL
NEXT WW
*
XROW=1 ; XCOL=45
XRCT=DCOUNT(JOB.TABLE<1>,VM)
CRT @(XCOL,XROW):CL:RV:STR(' ',28):ERV:
CRT @(XCOL+10,XROW):RV:"JOB CODES":ERV:
FOR XR = 1 TO XRCT
XROW=XROW+1
IF XROW <=20 THEN
CRT @(XCOL,XROW):CL:RV:" ":ERV:" ":JOB.TABLE<1,XR>'L#3':SPACE(2):JOB.TABLE<2,XR>'L#20':RV:" ":ERV:
END
NEXT XR
XROW=XROW+1
CRT @(XCOL,XROW):CL:RV:STR(' ',28):ERV:
RETURN