880 lines
20 KiB
Plaintext
Executable File
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
|