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

903 lines
27 KiB
Plaintext
Executable File

SUBROUTINE MSD.USER.MAINT
*
*
*-------------------------------------------------------------------*
*
$INCLUDE GEN.COMMON
$INCLUDE USER
*
*-------------------------------------------------------------------*
*
OPEN 'USER' TO USER.FILE ELSE ABORT 201, 'USER'
*OPEN 'CUSTOMER.TRANS' TO CUSTOMER.TRANS ELSE ABORT 201, 'CUSTOMER.TRANS'
OPEN 'PROJECT' TO PROJECT ELSE ABORT 201, 'PROJECT'
OPEN 'INFO.ACCRUAL' TO INFO.ACCRUAL ELSE ABORT 201, 'INFO.ACCRUAL'
OPEN 'PT' TO PT.FILE ELSE ABORT 201, 'PT'
OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT 201, 'CLOCKFILE'
OPEN 'CLOCK.GEN.KEYS' TO CLOCK.GEN.KEYS ELSE ABORT 201, 'CLOCK.GEN.KEYS'
OPEN 'CM' TO CM ELSE ABORT 201, 'CM'
OPEN 'HP.CONTROL' TO HP.CONTROL ELSE ABORT 201, 'HP.CONTROL'
OPEN 'INFO.LOG' TO INFO.LOG ELSE ABORT 201, 'INFO.LOG'
*
*-------------------------------------------------------------------*
*
USER.ADD='' ; USER.REC='' ; TODAY=DATE()
*
*-------------------------------------------------------------------*
PASSWORD=CHAR(73):CHAR(88):CHAR(79):CHAR(89):CHAR(69)
5 *
CRT @(0,22):CL:RV:" ENTER PASSWORD TO CONTINUE :":ERV:
HUSH ON
INPUT PASS,19
HUSH OFF
IF PASS # PASSWORD THEN RETURN
*
10 *
CRT CS
HDG='MICAHTEK & IDM TIME CLOCK USER MAINTENANCE UTILITY'
HDL=(80 - LEN(HDG)) / 2
CRT @(0,0):CL:RV:STR(' ',80):ERV
CRT @(HDL,0):RV:HDG:ERV:
*
5000 *--- update manager/user records ------------------------*
*
GOSUB 5800 ;* refresh main screen
*
5001 *
CRT @(0,22):CL:RV:" ENTER USER CODE OR LAST NAME (OR PARTIAL LAST NAME) ":ERV:
CRT @(5,3):CL:RV:" USER CODE/LAST NAME :":ERV:
INPUT REQUEST,30
IF REQUEST=PF3 OR REQUEST='' THEN RETURN
IF NUM(REQUEST) THEN
OTITLE=" ":REQUEST ; GOSUB 41000
READ USER.REC FROM USER.FILE,REQUEST THEN
USER.CODE=REQUEST
HOLD.REC=USER.REC
GOSUB 5850 ;* display data
GOSUB 5875 ;* display last pay period data
END ELSE
CRT @(0,22):CL:BEEP:RV:" USER NOT ON FILE 'A'dd :":ERV:
INPUT ADD.ANS,4
IF ADD.ANS[1,1]='A' THEN
USER.CODE=REQUEST
USER.REC=''
ADD.USER=1
UPDATE=''
GO 5010 ;* input data in fields
END
GO 5001 ;* return to prompt
END
END ELSE
GOSUB 10000 ;* search & display users meeting criteria
HOLD.REC=USER.REC
OTITLE=" ":USER.CODE ; GOSUB 41000
GOSUB 5800 ;* display main screen
GOSUB 5850 ;* display data
GOSUB 5875 ;* display last pay period data
END
*
5005 *---- main screen prompt -----------------------------------*
CRT @(0,22):CL:RV:" ENTER #, 'N'ext period, 'L'ast period, 'P'ersonal begin, 'E'nd, :":ERV:
INPUT FIVE.ANS,8
BEGIN CASE
CASE NUM(FIVE.ANS)
IF FIVE.ANS >= 1 AND FIVE.ANS <= 23 THEN
UPDATE=1
ON FIVE.ANS GOSUB 5010,5020,5030,5040,5050,5060,5070,5080,5090,5100,5110,5120,5130,5140,5150,5160,5161,5162,5163,5164,5165,5170,5170
UPDATE=''
END
CASE FIVE.ANS='VV' ; GOSUB 30000
CASE FIVE.ANS='PP' ; GOSUB 31000
CASE FIVE.ANS='P' ; GOSUB 39000
CASE FIVE.ANS='DELETE' ; GOSUB 32000
CASE FIVE.ANS='SAL' ; GOSUB 33700
CASE FIVE.ANS='N'
IF USER.REC<UR$CLOCK.SYSTEM> = 'M' ELSE
CRT @(0,22):CL:BEEP:RV:" USER MUST HAVE MANUAL CLOCK CODE! <return> :":ERV:
INPUT ANY,3 ; GO 5005
END
GOSUB 5885 ;* display next period data
CASE FIVE.ANS='L' ; GOSUB 5875 ;* display last period data
CASE FIVE.ANS='E'
GOSUB 7000 ;* write record
GO 5000 ;* return to screen prompt
CASE FIVE.ANS=PF3
IF USER.REC # HOLD.REC THEN
5007 *
CRT @(0,22):CL:BEEP:RV:" RECORD HAS BEEN UPDATED! 'X'exit or 'S'ave changes :":ERV:
INPUT SAVE.ANS,5
IF SAVE.ANS[1,1]='S' THEN
GOSUB 7000 ;* write changes
GO 5000
END
IF SAVE.ANS[1,1]='X' THEN GO 5000 ;* return to user prompt
GO 5007
END ELSE
CRT @(0,22):CL:RV:" RECORD HAS NOT BEEN UPDATED! <return> :":ERV:
INPUT ANY,4
GO 5000 ;* return to user prompt
END
CASE 1
GO 5005
END CASE
GO 5005
*
5010 *--- add/update user code ----------------------------------*
HOLD=''
IF UPDATE THEN
CRT @(0,22):CL:BEEP:RV:" THE USER CODE MAY NOT BE UPDATED! ":ERV:
INPUT ANY
RETURN
END ELSE
CRT @(25,5):USER.CODE'L#20'
END
*
5020 *--- add/update last name ----------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$LNAME> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER LAST NAME ":ERV:
CRT @(25,6):HOLD'L#15'
CRT @(24,6):
INPUT LNAME,15
IF LNAME='' THEN LNAME=HOLD
IF LNAME=PF3 THEN RETURN
IF LNAME='' OR LNAME='*' THEN GO 5020
CRT @(25,6):LNAME'L#15'
USER.REC<UR$LNAME>=LNAME
IF UPDATE THEN RETURN
*
5030 *--- add/update first name ---------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$FNAME> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER FIRST NAME ":ERV:
CRT @(25,7):HOLD'L#15'
CRT @(24,7):
INPUT FNAME,15
IF FNAME='' THEN FNAME=HOLD
IF FNAME=PF3 THEN RETURN
IF FNAME='' OR FNAME='*' THEN GO 5030
CRT @(25,7):FNAME'L#15'
USER.REC<UR$FNAME>=FNAME
IF UPDATE THEN RETURN
*
5040 *--- add/update department ---------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$DEPT> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER DEPARTMENT ":ERV:
CRT @(25,8):HOLD'L#15'
CRT @(24,8):
INPUT DEPT,20
IF DEPT='' THEN DEPT=HOLD
IF DEPT=PF3 THEN RETURN
IF DEPT='' OR DEPT='*' THEN GO 5040
CRT @(25,8):DEPT'L#15'
USER.REC<UR$DEPT>=DEPT
IF UPDATE THEN RETURN
*
5050 *--- add/update type code ---------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$TYPE.CODE> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER USER TYPE CODE 'M'anager, 'F'ull-time, 'P'art-time, 'O'ther ":ERV:
CRT @(25,9):HOLD'L#15'
CRT @(24,9):
INPUT TYPE.CODE,4
IF TYPE.CODE='' THEN TYPE.CODE=HOLD
IF TYPE.CODE=PF3 THEN RETURN
IF TYPE.CODE='' OR TYPE.CODE='*' THEN GO 5050
IF TYPE.CODE='M' OR TYPE.CODE='F' OR TYPE.CODE='P' OR TYPE.CODE='O' ELSE GO 5050
USER.REC<UR$TYPE.CODE>=TYPE.CODE
IF TYPE.CODE='M' THEN TYPE.CODE='Manager'
IF TYPE.CODE='F' THEN TYPE.CODE='Full-time'
IF TYPE.CODE='P' THEN TYPE.CODE='Part-time'
IF TYPE.CODE='O' THEN TYPE.CODE='Other'
CRT @(25,9):TYPE.CODE'L#15'
IF UPDATE THEN RETURN
*
5060 *--- add/update status -------------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$STATUS> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER STATUS 'A'ctive, 'I'nactive :":ERV:
CRT @(25,10):HOLD'L#15'
CRT @(24,10):
INPUT STATUS.CODE,4
IF STATUS.CODE='' THEN STATUS.CODE=HOLD
IF STATUS.CODE=PF3 THEN RETURN
IF STATUS.CODE='' OR STATUS.CODE='*' THEN GO 5060
IF STATUS.CODE='A' OR STATUS.CODE='I' ELSE GO 5060
USER.REC<UR$STATUS>=STATUS.CODE
IF STATUS.CODE='A' THEN STATUS.CODE='Active'
IF STATUS.CODE='I' THEN STATUS.CODE='Inactive'
CRT @(25,10):STATUS.CODE'L#15'
IF UPDATE THEN RETURN
*
5070 *--- add/update hire date ----------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$HIRE.DATE> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER HIRE DATE ":ERV:
CRT @(25,11):OCONV(HOLD,'D2/')'L#15'
CRT @(24,11):
INPUT HIRE.DATE,20
IF HIRE.DATE='' THEN HIRE.DATE=OCONV(HOLD,'D')
IF HIRE.DATE=PF3 THEN RETURN
HIRE.DATE=ICONV(HIRE.DATE,'D')
IF HIRE.DATE='' OR HIRE.DATE='*' THEN GO 5070
IF HIRE.DATE <= 0 THEN GO 5070
CRT @(25,11):OCONV(HIRE.DATE,'D2/')'L#15'
USER.REC<UR$HIRE.DATE>=HIRE.DATE
IF UPDATE THEN RETURN
*
5080 *--- add/update calc factor --------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$CALC.FACTOR> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER VACATION DAYS/YEAR ":ERV:
CRT @(25,12):HOLD'L#15'
CRT @(24,12):
INPUT CALC.FACTOR,20
IF CALC.FACTOR='' THEN CALC.FACTOR=HOLD
IF CALC.FACTOR=PF3 THEN RETURN
CRT @(25,12):CALC.FACTOR'L#15'
USER.REC<UR$CALC.FACTOR>=CALC.FACTOR
IF UPDATE THEN RETURN
*
5090 *--- add/update clock system -------------------------------*
HOLD=''
IF UPDATE THEN HOLD=USER.REC<UR$CLOCK.SYSTEM> ELSE HOLD=''
CRT @(0,22):CL:RV:" ENTER THE USER CLOCK SYSTEM: 'C'lock, 'P'roject, 'M'anual ":ERV:
CRT @(25,13):HOLD'L#15'
CRT @(24,13):
INPUT CLOCK.SYSTEM,3
IF CLOCK.SYSTEM='' THEN CLOCK.SYSTEM=HOLD
IF CLOCK.SYSTEM=PF3 THEN RETURN
IF CLOCK.SYSTEM='' OR CLOCK.SYSTEM='*' THEN GO 5090
IF CLOCK.SYSTEM='C' OR CLOCK.SYSTEM='P' OR CLOCK.SYSTEM='M' ELSE GO 5090
CRT @(25,13):CLOCK.SYSTEM'L#15'
USER.REC<UR$CLOCK.SYSTEM>=CLOCK.SYSTEM
IF UPDATE THEN RETURN
*
5100 *--- add/update last update date----------------------------*
HOLD=''
IF UPDATE THEN
CRT @(0,22):CL:BEEP:RV:" SYSTEM UPDATED FIELD - CANNOT UPDATE! ":ERV:
INPUT ANY
RETURN
END ELSE
CRT @(25,14):OCONV(TODAY,'D2/')
END
5110 *--- add/update operator ----------------------------------*
UNK.SW=''
PORT=FIELD(OCONV(0, "U50BB")," ",1)
READ PT.REC FROM PT.FILE,PORT ELSE
UNK.SW=1
ADD.OPER='UNKNOWN'
ADD.LNAME=''
END
IF NOT(UNK.SW) THEN
ADD.OPER=PT.REC<1>
ADD.FNAME=PT.REC<2>
ADD.LNAME=PT.REC<3>
END
HOLD=''
IF UPDATE THEN
CRT @(0,22):CL:BEEP:RV:" SYSTEM UPDATED FIELD - CANNOT UPDATE! ":ERV:
INPUT ANY
RETURN
END ELSE
CRT @(25,15):ADD.OPER:" ":ADD.LNAME'L#14'
END
*
GO 5005 ;* return to prompt after adding
*
5120 *--- add/update regular time -------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN=''
HOLD=USER.REC<UR$NEXT.REG>'R26'
CRT @(70,4):HOLD'L#6'
CRT @(69,4):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5120
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,4):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.REG>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5130 *--- add/update overtime -----------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.OT>'R26'
CRT @(70,5):HOLD'L#6'
CRT @(69,5):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5130
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,5):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.OT>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5140 *--- add/update vacation time ---------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.VACATION>'R26'
CRT @(70,6):HOLD'L#6'
CRT @(69,6):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5140
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,6):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.VACATION>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5150 *--- add/update sick used--------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.SICK>'R26'
CRT @(70,7):HOLD'L#6'
CRT @(69,7):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,7):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.SICK>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5160 *--- add/update holiday used ---------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN=''
HOLD=USER.REC<UR$NEXT.HOLIDAY>'R26'
CRT @(70,8):HOLD'L#6'
CRT @(69,8):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5160
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,8):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.HOLIDAY>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5161 *--- add/update funeral used--------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.FUNERAL>'R26'
CRT @(70,9):HOLD'L#6'
CRT @(69,9):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,9):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.FUNERAL>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5162 *---- add/update personal time -------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.PERSONAL>'R26'
CRT @(70,10):HOLD'L#6'
CRT @(69,10):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,10):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.PERSONAL>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5163 *--- add/update bonus used--------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.BONUS>'R26'
CRT @(70,11):HOLD'L#6'
CRT @(69,11):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,11):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.BONUS>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5164 *--- add/update workmans comp used--------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.WORKMANS>'R26'
CRT @(70,12):HOLD'L#6'
CRT @(69,12):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,12):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.WORKMANS>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5165 *--- add/update jury duty time ------------------------------*
IF NEXT.FLAG THEN
CRT @(0,22):CL:RV:" ENTER THE TIME (In Quarter-hour increments, Ex. 14.25) ":ERV:
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
HOLD=USER.REC<UR$NEXT.JURY>'R26'
CRT @(70,13):HOLD'L#6'
CRT @(69,13):
INPUT REG.HRS,7
IF REG.HRS='' THEN REG.HRS=(HOLD*100)'R26'
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM'R%2':TWO.NUM'L%2'
END
CRT @(70,13):REG.HRS'L26(#5)'
USER.REC<UR$NEXT.JURY>=REG.HRS
*
GOSUB 5175 ;* calc total time
*
END ELSE
CRT @(0,22):CL:BEEP:RV:" CANNOT UPDATE LAST PERIOD TOTALS! <return> :":ERV:
INPUT ANY,3
END
RETURN
5170 *--- add/update total time ---------------------------------*
CRT @(0,22):CL:BEEP:RV:" SYSTEM CALCULATES TOTALS! <return> :":ERV:
INPUT ANY,3
RETURN
*
5175 *--- add/update total time ---------------------------------*
TOTAL.TIME=0 ; OTHER.TIME=0
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.SICK>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.VACATION>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.HOLIDAY>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.FUNERAL>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.JURY>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.WORKMANS>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.BONUS>
OTHER.TIME=OTHER.TIME+USER.REC<UR$NEXT.PERSONAL>
USER.REC<UR$NEXT.OTHER>=OTHER.TIME
*
TOTAL.TIME=TOTAL.TIME+USER.REC<UR$NEXT.REG>
TOTAL.TIME=TOTAL.TIME+USER.REC<UR$NEXT.OT>
TOTAL.TIME=TOTAL.TIME+USER.REC<UR$NEXT.OTHER>
USER.REC<UR$NEXT.TOTAL>=TOTAL.TIME
CRT @(70,14):CL:USER.REC<UR$NEXT.OTHER>'R26'
CRT @(70,15):CL:RV:USER.REC<UR$NEXT.TOTAL>'R26':ERV:
RETURN
*
5800 *---- display screen ----------------------------------------*
CRT @(0,1):CR:
CRT @(5,3):CL:RV:" USER CODE/LAST NAME :":ERV:
CRT @(5,5):CL:RV:" 1. USER CODE :":ERV
CRT @(5,6):CL:RV:" 2. LAST NAME :":ERV
CRT @(5,7):CL:RV:" 3. FIRST NAME :":ERV
CRT @(5,8):CL:RV:" 4. DEPARTMENT :":ERV
CRT @(5,9):CL:RV:" 5. TYPE CODE :":ERV
CRT @(5,10):CL:RV:" 6. STATUS :":ERV
CRT @(5,11):CL:RV:" 7. HIRE DATE :":ERV
CRT @(5,12):CL:RV:" 8. VAC DAYS/YR. :":ERV
CRT @(5,13):CL:RV:" 9. CLOCK SYSTEM :":ERV
CRT @(5,14):CL:RV:"10. LAST UPDATE :":ERV
CRT @(5,15):CL:RV:"11. LAST OPERATOR:":ERV
*CRT @(8,16):CL:RV:" PERSONAL BEG.:":ERV:
*
CRT @(5,18):RV:" VACATION AVAILABLE :":ERV:
CRT @(5,20):RV:" PERSONAL AVAILABLE :":ERV:
CRT @(43,1):CL:"LAST PAY PERIOD PROCESSED :"
RETURN
*
5850 *---- display data ------------------------------------------*
CRT @(28,3):USER.CODE'L#20'
CRT @(25,5):USER.CODE
CRT @(25,6):USER.REC<UR$LNAME>
CRT @(25,7):USER.REC<UR$FNAME>
CRT @(25,8):USER.REC<UR$DEPT>
TYPE.CODE=''
IF USER.REC<UR$TYPE.CODE>='M' THEN TYPE.CODE='Manager'
IF USER.REC<UR$TYPE.CODE>='F' THEN TYPE.CODE='Full-time'
IF USER.REC<UR$TYPE.CODE>='P' THEN TYPE.CODE='Part-time'
IF USER.REC<UR$TYPE.CODE>='O' THEN TYPE.CODE='Other'
CRT @(25,9):TYPE.CODE
USTAT=''
IF USER.REC<UR$STATUS>='A' THEN USTAT='Active'
IF USER.REC<UR$STATUS>='I' THEN USTAT='Inactive'
CRT @(25,10):USTAT
CRT @(25,11):OCONV(USER.REC<UR$HIRE.DATE>,'D2/')
IF USER.REC<UR$INTERNAL.CALC> > 0 THEN
CRT @(25,12):USER.REC<UR$CALC.FACTOR>:" (":USER.REC<UR$INTERNAL.CALC>:"/hour)"
END ELSE
CRT @(25,12):USER.REC<UR$CALC.FACTOR>
END
CRT @(25,13):USER.REC<UR$CLOCK.SYSTEM>
CRT @(25,14):OCONV(USER.REC<UR$LAST.UPDATE>,'D2/')
CRT @(25,15):USER.REC<UR$LAST.UPDATE.OPER>
*CRT @(25,16):OCONV(USER.REC<UR$PERSONAL.BEGIN>,'D2/')
READ CM.REC FROM CM,USER.REC<UR$LAST.UPDATE.OPER> THEN
LAST.OPER=CM.REC<2>
END ELSE
LAST.OPER='UNKNOWN'
END
CRT @(31,15):LAST.OPER'L#14'
*
CRT @(70,1):OCONV(USER.REC<UR$LAST.PAY.DATE>,'D2/')
CRT @(28,18):OCONV(USER.REC<UR$VACATION.AVAIL>,'MR2')'L#7'
CRT @(28,20):OCONV(USER.REC<UR$PERSONAL.AVAIL>,'MR2')'L#7'
RETURN
*
5875 *---- display last pay period info --------------------------*
CRT @(48,3):RV:"LAST PAY PERIOD.....":OCONV(USER.REC<UR$LAST.PAY.DATE>,'D2/'):" ":ERV:
*
CRT @(48,4):CL:"12. Regular Hours : ":USER.REC<UR$REGULAR.HOURS>'R26'
CRT @(48,5):CL:"13. Overtime Hours : ":USER.REC<UR$OT.HOURS>'R26'
CRT @(48,6):CL:"14. Vacation Hours : ":USER.REC<UR$VACATION.HOURS>'R26'
CRT @(48,7):CL:"15. Sick Hours : ":USER.REC<UR$SICK.HOURS>'R26'
CRT @(48,8):CL:"16. Holiday Hours : ":USER.REC<UR$HOLIDAY.HOURS>'R26'
CRT @(48,9):CL:"17. Funeral Hours : ":USER.REC<UR$FUNERAL.HOURS>'R26'
*
CRT @(48,10):CL:"18. Personal Hours : ":USER.REC<UR$PERSONAL.HOURS>'R26'
CRT @(48,11):CL:"19. Bonus Hours : ":USER.REC<UR$BONUS.HOURS>'R26'
CRT @(48,12):CL:"20. Workmans Comp. : ":USER.REC<UR$WORKMANS.HOURS>'R26'
CRT @(48,13):CL:"21. Jury Duty Hours : ":USER.REC<UR$JURY.DUTY.HOURS>'R26'
CRT @(48,14):CL:"22. Non-Regular Hrs.: ":USER.REC<UR$OTHER.HOURS>'R26'
CRT @(48,15):CL:"23. Total Hours : ":RV:USER.REC<UR$TOTAL.HOURS>'R26':ERV:
IF USER.REC<UR$CLOCK.SYSTEM>='P' THEN
CRT @(48,16):CL:RV:" BILLING HOUR DETAIL...... ":ERV:
CRT @(48,17):CL:"24. Billable Hours : ":USER.REC<UR$BILL.BILL>'R26'
CRT @(48,18):CL:"25. Service Hours : ":USER.REC<UR$BILL.SERVICE>'R26'
CRT @(48,19):CL:"26. Free Hours : ":USER.REC<UR$BILL.FREE>'R26'
END
NEXT.FLAG=''
RETURN
*
5885 *---- display next pay period info --------------------------*
CRT @(48,3):RV:"NEXT PAY PERIOD.....":OCONV(USER.REC<UR$NEXT.PAY.DATE>,'D2/'):" ":ERV:
*
CRT @(48,4):CL:"12. Regular Hours : ":USER.REC<UR$NEXT.REG>'R26'
CRT @(48,5):CL:"13. Overtime Hours : ":USER.REC<UR$NEXT.OT>'R26'
CRT @(48,6):CL:"14. Vacation Hours : ":USER.REC<UR$NEXT.VACATION>'R26'
CRT @(48,7):CL:"15. Sick Hours : ":USER.REC<UR$NEXT.SICK>'R26'
CRT @(48,8):CL:"16. Holiday Hours : ":USER.REC<UR$NEXT.HOLIDAY>'R26'
CRT @(48,9):CL:"17. Funeral Hours : ":USER.REC<UR$NEXT.FUNERAL>'R26'
*
CRT @(48,10):CL:"18. Personal Hours : ":USER.REC<UR$NEXT.PERSONAL>'R26'
CRT @(48,11):CL:"19. Bonus Hours : ":USER.REC<UR$NEXT.BONUS>'R26'
CRT @(48,12):CL:"20. Workmans Comp. : ":USER.REC<UR$NEXT.WORKMANS>'R26'
CRT @(48,13):CL:"21. Jury Duty Hours : ":USER.REC<UR$NEXT.JURY>'R26'
CRT @(48,14):CL:"22. Non-Regular Hrs.: ":USER.REC<UR$NEXT.OTHER>'R26'
CRT @(48,15):CL:"23. Total Hours : ":RV:USER.REC<UR$NEXT.TOTAL>'R26':ERV:
*
NEXT.FLAG=1
RETURN
*
7000 *---write changes to disk ----------------------------------*
PORT=FIELD(OCONV(0, "U50BB")," ",1)
READ PT.REC FROM PT.FILE,PORT THEN
NEW.OPER=PT.REC<1>
END ELSE
NEW.OPER=''
END
USER.REC<UR$LAST.UPDATE>=TODAY
USER.REC<UR$LAST.UPDATE.OPER>=NEW.OPER
WRITE USER.REC ON USER.FILE,USER.CODE
CRT @(0,22):CL:RV:" RECORDS HAVE BEEN UPDATED! <return> :":ERV:
INPUT ANY,2
RETURN
*
10000 *--- search & display users meeting criteria ----------------*
USER.FIND=''
EOF=0
HUSH ON
EXECUTE "SELECT USER WITH LNAME \[":REQUEST:"]\"
HUSH OFF
LOOP
READNEXT USER.CODE ELSE EOF=1
UNTIL EOF DO
READ USER.REC FROM USER.FILE,USER.CODE THEN
LOCATE(USER.REC<UR$LNAME>,USER.FIND,2;FND;'AL') THEN NULL
USER.FIND=INSERT(USER.FIND,1,FND;USER.CODE)
USER.FIND=INSERT(USER.FIND,2,FND;USER.REC<UR$LNAME>)
USER.FIND=INSERT(USER.FIND,3,FND;USER.REC<UR$FNAME>)
USER.FIND=INSERT(USER.FIND,4,FND;USER.REC<UR$STATUS>)
END
REPEAT
13000 *
LINENUM=10
IF USER.FIND='' THEN
CRT @(0,22):CL:BEEP:RV:"NO MATCHING USERS FOUND - RETURN: ":ERV:
INPUT DUMMY
RETURN TO 5000
END
*
CT=DCOUNT(USER.FIND<1>,VM)
CRT @(0,9):CR
CRT @(0,9):RV:STR(' ',80):ERV:
CRT @(32,9):RV:" U S E R S ":ERV
FOR X = 1 TO CT
LN=X'L#4'
LN=LN:USER.FIND<1,X>'L#8'
NAME=USER.FIND<2,X>:", ":USER.FIND<3,X>
DIS.STATUS=USER.FIND<4,X>
IF DIS.STATUS[1,1]='A' THEN DIS.STATUS='Active'
IF DIS.STATUS[1,1]='C' THEN DIS.STATUS='Cancelled'
IF DIS.STATUS[1,1]='I' THEN DIS.STATUS='Inactive'
RSW=''
LN=LN:SPACE(5):NAME'L#25':DIS.STATUS'L#15'
GOSUB 14000 ;* DISPLAY THE LINE
IF RSW THEN RETURN
NEXT X
GO 15000
*
14000 * DISPLAY THE LINE
CRT @(0,LINENUM):LN
LN=''
LINENUM=LINENUM+1
IF LINENUM = 20 THEN
14100 *
15000 *
CRT @(0,22):CL:"Enter number next to User, 'P'(page), 'R'(ref), else return: ":
ANS=''
INPUT ANS
IF ANS='' THEN
GO 15000
END
IF ANS=PF3 THEN
GO 5000 ;* go to user prompt
END
IF ANS='R' THEN GOTO 13000
IF ANS = 'P' THEN
IF X >= CT THEN
CRT @(0,22):CL:BEEP:RV:" LAST PAGE CURRENTLY DISPLAYED <return> ":ERV:
INPUT DUMMY
GOTO 14100
END
CRT @(0,10):CR
LINENUM=10
RETURN
END
IF NOT(ANS MATCHES "0N") THEN GO 14100
IF ANS < 1 THEN GOTO 14100
IF USER.FIND<1,ANS>='' THEN GO 15000
USER.KEY=USER.FIND<1,ANS>
USER.CODE=USER.KEY
READ USER.REC FROM USER.FILE,USER.KEY THEN
RSW=1
RETURN
END ELSE
CRT @(0,22):CL:BEEP:RV:" USER CODE NOT FOUND! <return> ":ERV:
INPUT DUMMY
GOTO 15000
END
15200 *
RSW=1
END
RETURN
RETURN
*
30000 *
OTITLE='* UPDATE VACATION' ; GOSUB 41000
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
CRT @(0,22):CL:"ENTER VACATION TIME :":
INPUT REG.HRS
IF REG.HRS='' OR REG.HRS='/' ELSE
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
* GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM:TWO.NUM'L%2'
END
USER.REC<UR$VACATION.AVAIL>=REG.HRS
END
*
GOSUB 5850
*
RETURN
31000 *
OTITLE='* UPDATE PERSONAL' ; GOSUB 41000
ONE.NUM='' ; TWO.NUM='' ; HOLD='' ; COLN='' ; REG.HRS=''
CRT @(0,22):CL:"ENTER PERSONAL TIME :":
INPUT REG.HRS,7
IF REG.HRS='' OR REG.HRS='/' ELSE
COLN=INDEX(REG.HRS,":",1)
IF COLN > 0 THEN
* GO 5150
END ELSE
ONE.NUM=OCONV(REG.HRS,'G0.1')
TWO.NUM=OCONV(REG.HRS,'G1.1')
REG.HRS=ONE.NUM:TWO.NUM'L%2'
END
USER.REC<UR$PERSONAL.AVAIL>=REG.HRS
END
*
GOSUB 5850
RETURN
*
32000 *----- delete user -----------------------------------------*
CRT @(0,22):CL:BEEP:RV:" ENTER PASSWORD TO DELETE USER >>:":ERV:
HUSH ON
INPUT DEL.ANS,10
HUSH OFF
IF DEL.ANS = PASSWORD THEN
DELETE USER.FILE,USER.CODE
CRT @(0,22):CL:RV:" USER RECORD DELETED! <return> :":ERV:
END ELSE
CRT @(0,22):CL:RV:" INVALID PASSWORD!!! ":ERV:
INPUT ANY,3
RETURN
END
RETURN TO 5000
*
33700 *
OPEN 'LRTES' TO LRTES ELSE ABORT 201, 'LRTES'
READ SREC FROM LRTES,USER.CODE ELSE SREC='0'
OUT.SAL=(SREC<1>*1)
33701 *
CRT @(0,22):CL:RV:" CURRENT SALARY IS ":OUT.SAL'R26,$':"...'U'pdate, else <return> :":ERV:
INPUT SAL.ANS,4
IF SAL.ANS='U' THEN
CRT @(0,22):CL:RV:" CURRENT = ":OUT.SAL'R26,':".... NEW = ":ERV:
INPUT NEW.SAL,20
IF NEW.SAL='' OR NEW.SAL='/' THEN
CRT @(0,22):CL:RV:" SALARY HAS NOT BEEN UPDATED! <return> :":ERV:
INPUT ANY,4
RETURN
END
NEW.SAL=ICONV(NEW.SAL,'MR2')'R%10'
SREC<1>=NEW.SAL
WRITE SREC ON LRTES,USER.CODE
CRT @(0,22):CL:RV:" SALARY HAS BEEN CHANGED TO ":(NEW.SAL*1)'R26,$':" <return> :":ERV:
INPUT ANY,4
END
RETURN
*
39000 *---- display date personal accrual begins ----------------*
IF USER.REC<UR$PERSONAL.BEGIN> > 1 THEN
CRT @(0,22):CL:RV:" Personal time first accrual date is ":OCONV(USER.REC<UR$PERSONAL.BEGIN>,'D2/'):" <return> :":ERV:
END ELSE
CRT @(0,22):CL:RV:" There is no beginning accrual date on file! <return> :":ERV:
END
INPUT ANY,4
RETURN
*
41000 *
IREC='' ; PORT='' ; ADD.OPER='' ; ADD.FNAME='' ; ADD.LNAME=''
PORT=FIELD(OCONV(0, "U50BB")," ",1)
READ PT.REC FROM PT.FILE,PORT THEN
ADD.OPER=PT.REC<1>
ADD.FNAME=PT.REC<2>
ADD.LNAME=PT.REC<3>
END ELSE
ADD.OPER='UNKNOWN'
ADD.LNAME=''
END
TIMER=TIMEDATE()
IREC<1>=ADD.OPER
IREC<2>=OTITLE
IREC<3>=ADD.FNAME:" ":ADD.LNAME
IREC<4>=TIMER
READ NEXX FROM CLOCK.GEN.KEYS,"NEXT.LOG" THEN
NEXX=NEXX+1
* WRITE NEXX ON CLOCK.GEN.KEYS,"NEXT.LOG"
* WRITE IREC ON INFO.LOG,NEXX
END
RETURN