* MSD.CLOCK.PERFECT * * SCOTT REDMOND * 06/27/94 * * PURPOSE: GENERATE PERFECT ATTENDENCE REPORT FOR PAYROLL * *---------------------------------------------------------------------* * OPEN 'CLOCKFILE' TO CLOCKFILE ELSE ABORT 201, 'CLOCKFILE' OPEN 'CM' TO CM ELSE ABORT 201, 'CM' OPEN 'PERFECT.WORK' TO PERFECT.WORK ELSE ABORT 201, 'PERFECT.WORK' OPEN 'USER' TO USER ELSE ABORT 201, 'USER' * * *----------------* * $INCLUDE GEN.COMMON $INCLUDE USER * *----------------* * T=0 PERF=0 WT=0 OLD.WEEK=0 EOF=0 WEEK=0 PERFECT.SW=0 UTABLE='' REPORT=0 * CRT CS HDG='PERFECT ATTENDENCE REPORT' HDL=(80-(LEN(HDG))) / 2 CRT @(0,0):RV:STR(" ",80):ERV CRT @(HDL,0):RV:HDG:ERV CRT @(0,1):'MSD.CLOCK.PERFECT' * THIS.YEAR=OCONV(DATE(),'DY') DAY=OCONV(DATE(),'DJ') IF DAY <= 182 THEN REPORT=1 END ELSE REPORT=2 END * 100 * CRT @(0,22):CL:RV:" ENTER REPORT YEAR ELSE FOR CURRENT YEAR ":ERV CRT @(23,5):CL:RV:" YEAR OF REPORT :":ERV:" ":THIS.YEAR CRT @(40,5): INPUT YEAR,5 IF YEAR=PF3 THEN GOTO 9000 IF NOT(NUM(YEAR)) THEN GOTO 100 IF YEAR='' THEN YEAR = THIS.YEAR IF LEN(YEAR)=2 THEN YEAR=THIS.YEAR[1,2]:YEAR END CRT @(41,5):CL:YEAR * 200 * CRT @(0,22):CL:RV:" ENTER THE REPORT NUMBER ":ERV CRT @(23,8):CL:RV:" #1 01/01/":YEAR[3,2]:" thru 06/30/":YEAR[3,2]:" ":ERV CRT @(23,10):CL:RV:" #2 07/01/":YEAR[3,2]:" thru 12/31/":YEAR[3,2]:" ":ERV CRT @(23,12):CL:RV:" SELECT REPORT # :":ERV:REPORT CRT @(41,12): INPUT IN.REPORT,4 IF IN.REPORT=PF3 THEN GOTO 9000 IF IN.REPORT='' THEN IN.REPORT=REPORT IF IN.REPORT < 1 OR IN.REPORT > 2 THEN CRT @(0,22):CL:RV:" SELECT REPORT #1 OR REPORT #2 :": INPUT DUMMY GOTO 200 END REPORT=IN.REPORT CRT @(0,5):CR CRT @(22,5):CL:RV:" PERFECT ATTENDENCE REPORT FOR ":YEAR:" ":ERV IF REPORT=1 THEN NDG=" 01/01/":YEAR[3,2]:" thru 06/30/":YEAR[3,2]:" " NDL=(80-(LEN(NDG))) / 2 CRT @(0,8):CL CRT @(NDL,8):RV:NDG:ERV REPORT.ONE.DATE='01/01/':YEAR[3,2] REPORT.TWO.DATE='06/30/':YEAR[3,2] REPORT.ONE=ICONV(REPORT.ONE.DATE,'D') REPORT.TWO=ICONV(REPORT.TWO.DATE,'D') END ELSE NDG=" 07/01/":YEAR[3,2]:" thru 12/31/":YEAR[3,2]:" " NDL=(80-(LEN(NDG))) / 2 CRT @(0,8):CL CRT @(NDL,8):RV:NDG:ERV REPORT.ONE.DATE='07/01/':YEAR[3,2] REPORT.TWO.DATE='12/31/':YEAR[3,2] REPORT.ONE=ICONV(REPORT.ONE.DATE,'D') REPORT.TWO=ICONV(REPORT.TWO.DATE,'D') END * CRT @(23,16):CL:"SEND REPORT TO THE PRINTER (Y/N) :": INPUT PRINT.ANS,15 IF PRINT.ANS = 'Y' THEN PRINT.SW=1 EXECUTE "EX PRINTER" END ELSE PRINT.SW = 0 END * CLEARFILE PERFECT.WORK * *----- time table ----------------------------------------------* CRT @(0,11):CR: * <1>=sunday - first day of week * <2>=saturday - last day of week * ATT.ONE=0 ; ATT.TWO=0 ; TIME.TABLE='' FOR GG = REPORT.ONE TO REPORT.TWO IF OCONV(GG,'DWA')='SUNDAY' THEN ATT.ONE=ATT.ONE+1 TIME.TABLE<1,ATT.ONE>=GG END IF OCONV(GG,'DWA')='SATURDAY' THEN ATT.TWO=ATT.TWO+1 TIME.TABLE<2,ATT.TWO>=GG END NEXT GG * SELECT CLOCKFILE LOOP READNEXT CKEY ELSE EOF=1 UNTIL EOF DO T=T+1 IF REM(T,100)=0 THEN GOSUB 5000 ;* refresh totals CDATE=OCONV(CKEY,'G1|1') CUSER=OCONV(CKEY,'G0|1') IF CDATE >= REPORT.ONE AND CDATE <= REPORT.TWO THEN READ USER.REC FROM USER,CUSER ELSE GO 4999 GOSUB 2000 ; * ELIMINATION PROCESS IF ELIM.SW THEN GO 3555 GOSUB 3000 3555 * GOSUB 4000 4999 * REPEAT GOSUB 5000 9000 * STOP * 2000 *--- elimination process -------------------------------* ELIM.SW=0 IF USER.REC # 'C' THEN ELIM.SW=1 IF USER.REC >= REPORT.ONE THEN ELIM.SW=1 RETURN * 3000 *--- calculate clock totals -----------------------------* CU.KEY=CUSER:"*":USER.REC<1>:".":USER.REC<2> READ OUT.REC FROM PERFECT.WORK,CU.KEY ELSE OUT.REC='' LOCATE(CDATE,TIME.TABLE,1;POSITION;"AR") ELSE NULL IF CDATE=TIME.TABLE<1,POSITION> ELSE POSITION=POSITION-1 IF CDATE <= TIME.TABLE<2,POSITION> THEN READ CLOCK.REC FROM CLOCKFILE,CKEY THEN PERIOD=TIME.TABLE<3,POSITION> *----- initialize totals with each user, each day -----* OUT.TIME=0 ; IN.TIME=0 ; DAILY.TIME=0 VAC.TOTAL=0 ; SICK.TOTAL=0 ; HOLIDAY.TOTAL=0 FUNERAL.TOTAL=0 ; JURY.TOTAL=0 ; WORKMANS.TOTAL=0 PERSONAL.TOTAL=0 ; BONUS.TOTAL=0 ; OTHER.TOTAL=0 * TIMCT=DCOUNT(CLOCK.REC<1>,VM) FOR TIM = 1 TO TIMCT ;* calc daily time IF CLOCK.REC<2,TIM>='OFF' THEN OUT.TIME=CLOCK.REC<1,TIM> DAILY.TIME=DAILY.TIME+(OUT.TIME-IN.TIME) END ELSE JOB='' JOB=OCONV(CLOCK.REC<2,TIM>,'G1-1') JOB.TWO=JOB[2,2]'L%3' IF JOB[1,1]='V' THEN ;* compute vacation VAC.TOTAL=VAC.TOTAL+JOB.TWO END IF JOB[1,1]='S' THEN ;* compute sick SICK.TOTAL=SICK.TOTAL+JOB.TWO END IF JOB[1,1]='H' THEN ;* compute holiday HOLIDAY.TOTAL=HOLIDAY.TOTAL+JOB.TWO END IF JOB[1,1]='P' THEN ;* personal PERSONAL.TOTAL=PERSONAL.TOTAL+JOB.TWO END IF JOB[1,1]='F' THEN ;* funeral FUNERAL.TOTAL=FUNERAL.TOTAL+JOB.TWO END IF JOB[1,1]='W' THEN ;* workmans comp. WORKMANS.TOTAL=WORKMANS.TOTAL+JOB.TWO END IF JOB[1,1]='B' THEN ;* bonus day BONUS.TOTAL=BONUS.TOTAL+JOB.TWO END IF JOB[1,1]='J' THEN ;* jury duty JURY.TOTAL=JURY.TOTAL+JOB.TWO END IN.TIME=CLOCK.REC<1,TIM> END NEXT TIM DAILY.TIME =(DAILY.TIME/60)/60 ;* convert seconds to hours DAILY.HOURS=INT(DAILY.TIME) DAILY.DECI =OCONV(DAILY.TIME,'G1.1')[1,3] TWO.DECI =DAILY.DECI[1,2]'L%2' EXTRA.DECI =DAILY.DECI[3,1] IF EXTRA.DECI >= 5 THEN IF TWO.DECI=99 THEN TWO.DECI='00' DAILY.HOURS=DAILY.HOURS+1 END ELSE TWO.DECI=TWO.DECI+1'R%2' END END ELSE IF TWO.DECI=99 THEN TWO.DECI='00' DAILY.HOURS=DAILY.HOURS+1 END END END OTHER.TOTAL =SICK.TOTAL+PERSONAL.TOTAL+WORKMANS.TOTAL OUTPUT.HOURS =DAILY.HOURS:TWO.DECI OUTPUT.HOURS =OUTPUT.HOURS GOOD.HOURS =(OUTPUT.HOURS-OTHER.TOTAL)'R%4' OUT.REC=(OUT.REC+GOOD.HOURS)'R%4' OUT.REC=OCONV(TIME.TABLE<1,POSITION>,'D2/') WRITE OUT.REC ON PERFECT.WORK,CU.KEY WT=WT+1 END END 4000 *--- calculate project totals --------------------------* SELECT CMS.SUPPORT.TRANS.FILE * T=0 TWK=0 * 100 READNEXT SKEY ELSE GO 999 READ SREC FROM CMS.SUPPORT.TRANS.FILE,SKEY ELSE GO 100 IF REM(T,50)=0 THEN CRT @(0,10):CR:"SUPPORT RECORDS READ: ":T CRT @(0,11):"WORK RECORDS WRITTEN: ":TWK END T=T+1 * LOCATE(CDATE,TIME.TABLE,1;POSITION;"AR") ELSE NULL IF CDATE=TIME.TABLE<1,POSITION> ELSE POSITION=POSITION-1 IF CDATE <= TIME.TABLE<2,POSITION> THEN CT=DCOUNT(SREC,VM) FOR X = 1 TO CT IF SREC=30 THEN IF SREC >= REPORT.ONE AND SREC <= REPORT.TWO THEN IF USERS # '' THEN IF USERS # SREC THEN GO 1225 END WKREC='' WKREC<1>=SREC WKREC<2>=SREC WKREC<3>=SREC WKREC<4>=SREC WKREC<5>=SREC WKREC<6>=SREC WKREC<7>=SREC WKREC<8>=SREC IF WKREC<8>='1' THEN WKREC<8>='Bl' ELSE IF WKREC<8>='2' THEN WKREC<8>='SC' ELSE IF WKREC<8>='3' THEN WKREC<8>='Fr' END END WKREC<9>=SREC TASK=WKREC<7> LOCATE(TASK,SREC,SS$TASK.NUMBER;FND) THEN DESC=SREC END ELSE DESC='TASK DESCRIPTION NOT FOUND!' END WKREC<10>=DESC WKREC<11>=SKEY TWK=TWK+1 WRITE WKREC ON WORKFILE,TWK END END 1225 * NEXT X 5000 *--- refresh totals ------------------------------------* CRT @(NDL,14):CL:"ITEMS PROCESSED :":T'L,' CRT @(NDL,15):CL:"ITEMS FOUND :":WT'L,' RETURN