*---------------------------- *
* 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
*-----------------------------*
$INCLUDE GEN.COMMON
***** CLERK MASTER (CM) FILE LAYOUT *****
*
* USER ATTRIBUTES
*
EQU CM$FNAME             TO 1
EQU CM$LNAME             TO 2
EQU CM$PHONE             TO 3
EQU CM$PASSWD            TO 4
EQU CM$DEPT              TO 5
EQU CM$FILLER1           TO 6
EQU CM$PASSWD.SET.DATE   TO 7
EQU CM$PASSWD.EXP.DATE   TO 8
EQU CM$POSITION          TO 9
EQU CM$UNIX.USER         TO 10 ; * IN-HOUSE ACCOUNTS ONLY
EQU CM$STATUS            TO 11
EQU CM$FILLER2           TO 12
EQU CM$FILLER3           TO 13
EQU CM$ACCOUNTS          TO 14
*
* SECURITY ATTRIBUTES
*
EQU CM$TECHNICAL.MENU    TO 15
EQU CM$FILLER4           TO 16
EQU CM$FILLER5           TO 17
EQU CM$FILLER6           TO 18
EQU CM$FILLER7           TO 19
EQU CM$FILLER8           TO 20
EQU CM$DAILY.PROCESSING  TO 21
EQU CM$DEPOSIT.ENTRIES   TO 22
EQU CM$BATCH.MAINT       TO 23
EQU CM$DOC.PROCESSING    TO 24
EQU CM$DAILY.REPORTS     TO 25
EQU CM$ACK.LETTERS       TO 26
EQU CM$BALANCE.CLOSE.DAY TO 27
EQU CM$ACCOUNT.MAINT     TO 28
EQU CM$FINANCIAL.INQ     TO 29
EQU CM$UPDATE.ACCOUNT    TO 30
EQU CM$XFER.TRANS        TO 31
EQU CM$BACKOUT.TRANS     TO 32
EQU CM$WORD.PROCESSING   TO 33
EQU CM$LETTER.MAINT      TO 34
EQU CM$ACKNOWLEDGE.UPDT  TO 35
EQU CM$REPORTS.MAIN.MENU TO 36
EQU CM$ORDER.AND.INV     TO 37
EQU CM$PROCESS.ORDERS    TO 38
EQU CM$INV.CONTROL       TO 39
EQU CM$SYSTEM.UTILS      TO 40
EQU CM$TABLE.FILE.MAINT  TO 41
EQU CM$PRINTER.FUNCTIONS TO 42
EQU CM$SECURITY          TO 43
EQU CM$MONTHLY.ON.REQ    TO 44
EQU CM$SETUP.NEW.ACCOUNT TO 45
EQU CM$SPECIAL.FEATURES  TO 46
EQU CM$PLEDGE.AND.CLUB   TO 47
EQU CM$SUBS.PROCESSING   TO 48
EQU CM$LEADER.ACCESS     TO 49
EQU CM$ATTENDANCE.SYSTEM TO 50
EQU CM$CASSETTE.LABEL    TO 51
EQU CM$SPECIAL.CUSTOM    TO 52
EQU CM$EDIT.MENUS        TO 53
EQU CM$ONLINE.TABLE.UPDT TO 54
EQU CM$VIP.ACCESS        TO 55
EQU CM$ACCOUNT.DELETE    TO 56
EQU CM$SPECIAL.UTILITIES TO 57
EQU CM$800.PHONE.CENTER  TO 58 ; * IN-HOUSE ACCOUNTS ONLY
*
OPEN 'CM'      TO CM   ELSE ABORT 201,'CM'
OPEN 'PT'      TO PT   ELSE ABORT 201,'PT'
OPEN 'CM.XREF' TO XREF ELSE ABORT 201,'CM.XREF'
OPEN 'USER' TO USER.FILE ELSE ABORT
OPEN 'PROJECT' TO PROJECT ELSE ABORT
OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT
OPEN 'PORTS' TO PT.FILE ELSE ABORT
*
EMSG=@(0,22):BEEP:"Access to CMS has been denied - check with your supervisor!!"
*EMSG2=@(0,22):BEEP:"You are already logged on!!"
READ XREF.REC FROM XREF,@LOGNAME ELSE
  CRT EMSG:
  RQM;RQM
  CHAIN "OFF"
  STOP
END
UID=XREF.REC<1>
USER=UID[2,4]
READ CM.DATA FROM CM,UID ELSE
  CRT EMSG:
  RQM;RQM
  CHAIN "OFF"
  STOP
END
IF CM.DATA<CM$STATUS> # "A" THEN
  CRT EMSG:
  RQM;RQM
  CHAIN "OFF"
  STOP
END
PROMPT ""
PORT=@USERNO 
*
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
*
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 #:":USER
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 - See Supervisor!":ERV:CL
 RQM
 GO 1000
END
*
GO 1599
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
1599 *
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
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+20-(INT(TLEN/2)),POS+12):TSTRING
CRT @(COL+20-(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
 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 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
*
EDATE=0; SDATE=0
PRDAYS=14; PRDATE=ICONV('12/23/90','D')
SDATE=TODAY-PRDATE
IF SDATE <= PRDAYS THEN
 EDATE=PRDATE
END ELSE
 EDATE=PRDATE+(INT(SDATE/PRDAYS)*PRDAYS)
END
*
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:"-00")
   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:"-00")
   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:'-00'
  CRT @(0,22):"You are now ON THE CLOCK! - Have a great day":CL:
  RQM
 END
END
WRITE CLKREC ON CLOCKFILE,CLKKEY
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
PRDAYS=14; PRDATE=ICONV('12/23/90','D')
SDATE=TODAY-PRDATE
IF SDATE <= PRDAYS THEN
 EDATE=PRDATE
END ELSE
 EDATE=PRDATE+(INT(SDATE/PRDAYS)*PRDAYS)
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)
     *CRT "HERE ":DAILY.HRS:" ":OUTTIME:" ":INTIME:;INPUT DUMMY
  NEXT Z
 IF D >= EDATE+7 THEN
   WEEK.TWO=WEEK.TWO+DAILY.HRS
 END ELSE
   WEEK.ONE=WEEK.ONE+DAILY.HRS
 END
 TOTAL.HRS = TOTAL.HRS + DAILY.HRS
 END
REPEAT
IF TOTAL.HRS > 0 THEN
  CRT @(12,17):" WEEK ONE HOURS: ":OCONV(WEEK.ONE,"MT")
  CRT @(12,18):" WEEK TWO HOURS: ":OCONV(WEEK.TWO,"MT")
END
CRT @(0,19):SPACE(3):"  TOTAL PAY PERIOD HOURS: ":RV:OCONV(TOTAL.HRS,"MT"):ERV: 
RETURN
***********************************************************
9999 * END OF PROCESS
STOP