* MSD.INFO.ACCRUAL
*
* AUTHOR:      SCOTT REDMOND
* PURPOSE:     UTILITY TO MAINTAIN VACATION/SICK ACCRUAL FOR EMPLOYEES
* DATE:        03/28/95
*
*-------------------------------------------------------------------*
*
$INCLUDE GEN.COMMON
$INCLUDE USER
*
*-------------------------------------------------------------------*
*
OPEN 'USER.BACKUP'    TO USER.BACKUP    ELSE ABORT 201, 'USER.BACKUP'
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.HIST'      TO INFO.HIST      ELSE ABORT 201, 'INFO.HIST'
OPEN 'INFO.LOG'       TO INFO.LOG       ELSE ABORT 201, 'INFO.LOG'
*
*-------------------------------------------------------------------*
*
USER.ADD='' ; USER.REC='' ; TODAY=DATE()  
*
*-------------------------------------------------------------------*
5 *
*
10 *
CRT CS
HDG='MICAHTEK & IDM TIME CLOCK ACCRUAL UTILITY'
HDL=(80 - LEN(HDG)) / 2
CRT @(0,0):CL:RV:STR(' ',80):ERV
CRT @(HDL,0):RV:HDG:ERV:
*
100 *------ opening menu ------------------------------------------*
CRT @(20,5):CL:RV:" 1 - QUICK VIEW ACCRUAL TOTALS       ":ERV
CRT @(20,7):CL:RV:" 2 - RUN CURRENT PAY PERIOD PROCESS  ":ERV
CRT @(20,9):CL:RV:" 3 - ACCRUAL REPORT BY DEPARTMENT    ":ERV
CRT @(20,11):CL:RV:" 4 - UPDATE MANAGERS/USERS RECORDS   ":ERV
CRT @(20,13):CL:RV:" 5 - PRINT DETAIL ACCRUAL REPORT     ":ERV
CRT @(20,15):CL:RV:" 6 - BILLABLE CLIENT HOURS REPORT    ":ERV
CRT @(20,17):CL:RV:" 7 - CALCULATE FUTURE VACATION HOURS ":ERV
CRT @(20,19):CL:RV:" 8 - RESTORE FILES (PREVIOUS PERIOD) ":ERV
PASSWORD=CHAR(73):CHAR(88):CHAR(79):CHAR(89):CHAR(69)
*
101 *
CRT @(0,22):CL:RV:" ENTER SELECTION :":ERV:
INPUT SELECTION,15
OTITLE='  ':SELECTION
BEGIN CASE
  CASE SELECTION=1 ; OTITLE='  QUICK VIEW'
  CASE SELECTION=2 ; OTITLE='* RUN PAY PERIOD'
  CASE SELECTION=3 ; OTITLE='  ACCRUAL DEPT REPORT'
  CASE SELECTION=4 ; OTITLE='* USER/MGR MAINT'
  CASE SELECTION=5 ; OTITLE='* DETAIL REPORT'
  CASE SELECTION=6 ; OTITLE='  BILLABLE REPORT'
  CASE SELECTION=7 ; OTITLE='  FUTURE VAC CALC'
  CASE SELECTION=8 ; OTITLE='* RESTORE FILES'  
* CASE SELECTION='LOG' ; OTITLE='  LOG'
END CASE
GOSUB 21000
IF SELECTION=2 OR SELECTION=5 THEN
  CRT @(0,22):CL:RV:" ENTER PASSWORD :":ERV:
  HUSH ON
  INPUT PASS,15
  HUSH OFF
  IF PASS # PASSWORD THEN GO 101
END
BEGIN CASE
  CASE SELECTION=PF3 OR SELECTION=''
    STOP
  CASE SELECTION='1' 
    GOSUB 1000
  CASE SELECTION='2'
    GOSUB 15000 ;* backup current user file 
    CALL MSD.TIME.ACCRUAL
  CASE SELECTION='3'
    GOSUB 3000
  CASE SELECTION='4'
    CALL MSD.USER.MAINT
  CASE SELECTION='5'
    CALL MSD.ACCRUAL.RPT2
  CASE SELECTION='6'
    CALL MSD.BILLING.INFO
  CASE SELECTION='7'
    GOSUB 2000
  CASE SELECTION='8'
    ENTER CLOCK.BACKUP.ONE
* CASE SELECTION='LOG'
*   EXECUTE"EX USER.LOG"
  CASE 1
    GO 101
END CASE
GO 10
*
9999 *
STOP
*
1000 *--- quick view accrual records ------------------------*
EXECUTE "EX CLOCK.INFO"
CRT @(0,22):CL:RV:" PROCESS COMPLETE <return> :":ERV:
INPUT ANY,2
RETURN
*
2000 *--- calculate future accrual hours by user ------------*
NOPE=''
CRT @(0,0):CL:RV:STR(' ',80):ERV
CRT @(HDL,0):RV:HDG:ERV:
CRT @(0,1):CR:
CRT @(19,3):CL:RV:" CALCULATE FUTURE ACCRUAL HOURS FOR USER ":ERV:
CRT @(0,22):CL:RV:" ENTER USER CODE ":ERV:
CRT @(8,5):CL:RV:" USER CODE :":ERV:
INPUT REQUEST,10
IF REQUEST=PF3 OR REQUEST='' THEN RETURN
IF NUM(REQUEST) THEN
  READ USER.REC FROM USER.FILE,REQUEST THEN
    CRT @(29,5):CL:USER.REC<UR$FNAME>:" ":USER.REC<UR$LNAME>
    IF USER.REC<UR$TYPE.CODE>='P' THEN NOPE=1
    IF USER.REC<UR$STATUS>#'A' THEN NOPE=1
    IF NOPE THEN 
      CRT @(0,22):CL:BEEP:RV:" USER IS INACTIVE OR PART-TIME! <return> :":ERV:
      INPUT ANY,4 ; RETURN
    END
    CRT @(8,7):CL:RV:" LAST PAY PERIOD DATE  :":ERV:" ":OCONV(USER.REC<UR$LAST.PAY.DATE>,'D2/')
    CRT @(8,9):CL:RV:" VACATION AVAILABLE    :":ERV:" ":OCONV(USER.REC<UR$VACATION.AVAIL>,'MR2')'L#7'
    2009 *
    CRT @(0,22):CL:RV:" ENTER THE FUTURE VACATION DATE ":ERV:
    CRT @(8,13):CL:RV:" FUTURE VACATION DATE  :":ERV:" ":
    INPUT FUTURE.DATE,10
    IF FUTURE.DATE='' OR FUTURE.DATE=PF3 THEN RETURN
    FUTURE.DATE=ICONV(FUTURE.DATE,'D')
    IF FUTURE.DATE < USER.REC<UR$LAST.PAY.DATE> THEN GO 2009
    CRT @(8,13):CL:RV:" FUTURE VACATION DATE  :":ERV:" ":OCONV(FUTURE.DATE,'D2/')
    ACCRUAL.DAYS=0 
    FOR YYZ = USER.REC<UR$LAST.PAY.DATE> TO FUTURE.DATE 
      IF OCONV(YYZ,'DW') < 6 THEN    ;* figure days M-F
        ACCRUAL.DAYS=ACCRUAL.DAYS+1
      END
    NEXT YYZ
    ACCRUAL.HOURS=ACCRUAL.DAYS*8
    CALC.FACTOR=USER.REC<UR$INTERNAL.CALC>
    VAC.ACCRUAL=ACCRUAL.HOURS*CALC.FACTOR
    VAC.ONE=OCONV(VAC.ACCRUAL,'G0.1')
    VAC.TWO=OCONV(VAC.ACCRUAL,'G1.1')'L%2'
    FUTURE.VAC=VAC.ONE:VAC.TWO[1,2]
    TOTAL.VAC=(USER.REC<UR$VACATION.AVAIL>+FUTURE.VAC)'R26'
    NO.DAYS=TOTAL.VAC/8
    NO.DAY1=INT(NO.DAYS)
    NO.DAY2=OCONV(NO.DAYS,'G1.1')[1,1]
    NO.DAYS=NO.DAY1:".":NO.DAY2
    CRT @(8,15):CL:RV:" NUMBER WORKING DAYS   :":ERV:" ":ACCRUAL.DAYS
    CRT @(8,17):CL:RV:" FUTURE VACATION AVAIL.:":ERV:" ":OCONV(USER.REC<UR$VACATION.AVAIL>,'MR2'):" + ":FUTURE.VAC'R26':" = ":TOTAL.VAC:"   (":NO.DAYS:" days)"
    CRT @(0,22):CL:RV:" CALCULATE ANOTHER (Y/N) :":ERV:
    INPUT ANOTHER,3
    IF ANOTHER='Y' THEN GO 2000
  END ELSE
    CRT @(0,22):CL:BEEP:RV:" USER NOT ON FILE <return> :":ERV:
    INPUT ANY,4
    GO 2000   ;* return to prompt
  END 
END
RETURN
*
3000 *--- print accrual report ------------------------------*
CRT @(0,0):CL:RV:STR(' ',80):ERV
CRT @(HDL,0):RV:HDG:ERV:
DEPT='ALL'
READ LAND  FROM HP.CONTROL,'LANDSCAPE' ELSE LAND=''
READ SMALL FROM HP.CONTROL,'16.PITCH'  ELSE SMALL=''
CRT @(0,1):CR:
CRT @(17,3):CL:RV:" CREATE / PRINT ACCRUAL REPORTS BY DEPARTMENT ":ERV:
CRT @(27,5):CL:RV:" 1  - SPECIAL ACCOUNTS  ":ERV:
CRT @(27,7):CL:RV:" 2  - PERSONNEL         ":ERV:
CRT @(27,9):CL:RV:" 3  - PROGRAMMING       ":ERV:
CRT @(27,11):CL:RV:" 4  - PHONE CENTER      ":ERV:
CRT @(27,13):CL:RV:" 5  - WOF PROCESSING    ":ERV:
CRT @(27,15):CL:RV:" 6  - FULFILLMENT CENTER":ERV:
CRT @(27,17):CL:RV:" 7  - ALL DEPARTMENTS   ":ERV:
CRT @(0,22):CL:RV:" ENTER DEPARTMENT  : ":ERV:
INPUT DEPT,9
IF DEPT='' OR DEPT=PF3 THEN RETURN
IF NUM(DEPT) ELSE GO 3000
CRT @(0,22):CL:RV:" SEND REPORT TO PRINTER (Y/N) :":ERV:
INPUT PRINTER.ANS,3
IF PRINTER.ANS[1,1]='Y' THEN
  CRT @(0,18):CR:
  EXECUTE "EX PRINTER"
  CRT @(0,18):CR:
END
CMD=''
CMD='SORT USER '
CMD=CMD:' FNAME LNAME BREAK.ON DEPT STATUS TOTAL VAC TOTAL PERSONAL.AVAIL '
CMD=CMD:'BY DEPT BY LNAME BY FNAME'
CMD=CMD:' WITH DEPT '
BEGIN CASE
  CASE DEPT='1'
    CMD=CMD:' \511\ '
  CASE DEPT='2'
    CMD=CMD:' \517\ '
  CASE DEPT='3'
    CMD=CMD:' \504\\512\ '
  CASE DEPT='4'
    CMD=CMD:' \800\ '
  CASE DEPT='5'
    CMD=CMD:' \500\\501\\502\\503\\505\\509\\514\\525\ '
  CASE DEPT='6'
    CMD=CMD:' \506\\507\ '
  CASE DEPT='7'
  CASE DEPT='8'
END CASE
IF PRINTER.ANS='Y' THEN 
  CMD=CMD:\ HEADING "PAGE 'P'         ACCRUAL REPORT BY DEPARTMENT    'D' 'L' 'L'" (P \
END ELSE
  CMD=CMD:\ HEADING "PAGE 'P'         ACCRUAL REPORT BY DEPARTMENT    'D' 'L' 'L'" \
END
*HUSH ON
EXECUTE CMD
*HUSH OFF
CRT @(0,22):CL:RV:" REPORT COMPLETE <return> :":ERV:
INPUT ANY,2
GO 3000
RETURN
*
*
15000 *--- back up current user file to user.backup -----------*
CRT @(0,22):CL:RV:" PLEASE WAIT.... ":ERV:
CLEARFILE USER.BACKUP
EOF=0 ; T=0 ; WT=0
SELECT USER.FILE
LOOP
  READNEXT ID ELSE EOF=1
UNTIL EOF DO
  T=T+1
  READ BAK.REC FROM USER.FILE,ID THEN
    WRITE BAK.REC ON USER.BACKUP,ID
    WT=WT+1
  END
REPEAT
RETURN
*
21000 *
*
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
IF OTITLE='' THEN RETURN
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