* Program to test the Post_Time_Clock. * Cecil *dClockedOut=CTOD(LEFT(employee.outtime ,10)) *dClockedIn =CTOD(LEFT(employee.intime,10)) dClockedOut={^2008/06/10} dClockedIn ={^2008/06/10} cActualStartTime="06:14" cShiftStartTime="06:30" cScheduledShiftStartMinute=SUBSTR(cShiftStartTime, 4, 2) cActualEndTime="14:30" cActualEndHour=LEFT(cActualEndTime, 2) cActualEndMinute=SUBSTR(cActualEndTime, 4, 2) cActualStartHour=LEFT(cActualStartTime, 2) cActualStartMinute=SUBSTR(cActualStartTime, 4, 2) set step on IF EMPTY(cShiftStartTime) cScheduledStartMinute="00" IF cActualStartMinute > "15" cScheduledStartHour=STR(VAL(cActualStartHour)+1) ELSE cScheduledStartHour=cActualStartHour ENDIF ELSE cScheduledStartHour=LEFT(cShiftStartTime,2) cScheduledStartMinute=SUBSTR(cShiftStartTime,4,2) ENDIF cScheduledStartHour=ALLTRIM(cScheduledStartHour) cScheduledStartMinute=ALLTRIM(cScheduledStartMinute) iScheduledStartMinutes=; (60 * VAL(cScheduledStartHour)) + VAL(cScheduledStartMinute) iActualStartMinutes=; (60 * VAL(cActualStartHour)) + VAL(cActualStartMinute) iEarlyOrLateMinutes =; (iScheduledStartMinutes - iActualStartMinutes) * The cEffectiveStartHour and cEffectiveStartMinute are used for calculations. DO CASE * Employee Clocked In over 15 minutes EARLY. Ex: 05:44. CASE iEarlyOrLateMinutes > 15 cEffectiveStartHour=cActualStartHour cEffectiveStartMinute=cActualStartMinute * Employee Clocked In LATE. Ex: 06:01. CASE iEarlyOrLateMinutes < 0 *cEffectiveStartHour=STR(VAL(cActualStartHour) - iAdjustStartHours) cEffectiveStartHour=cActualStartHour cEffectiveStartMinute=cActualStartMinute OTHERWISE && Employee Clocked In on time. Scheduled Shift Start. cEffectiveStartHour=cScheduledStartHour cEffectiveStartMinute=cScheduledStartMinute ENDCASE cEffectiveStartHour=ALLTRIM(cEffectiveStartHour) cEffectiveStartMinute=ALLTRIM(cEffectiveStartMinute) cEffectiveStartTime=PADL(ALLTRIM(cEffectiveStartHour),2,"0")+':'+PADL(ALLTRIM(cEffectiveStartMinute),2,"0") * Do some calculating to determine the Scheduled End Hour. * Convert the END HOUR and END MINUTE into END MINUTES. iActualEndMinutes=(60 * VAL(cActualEndHour)) + VAL(cActualEndMinute) *iTotalActualMinutes=(iActualEndMinutes - iActualStartMinutes) * Convert the Effective START HOUR and Effective START MINUTE into Effective Start Minutes. iEffectiveStartMinutes = (60 * VAL(cEffectiveStartHour)) + VAL(cEffectiveStartMinute) iTotalEffectiveMinutes=(iActualEndMinutes - iEffectiveStartMinutes) iActualShiftHours=(iTotalEffectiveMinutes/60) *!*iShiftMinutesRemainder=MOD(iTotalEffectiveMinutes, 60) *IF iShiftMinutesRemainder >= 45 && If the remaining minutes are > 45 Minutes,... * iTotalActualShiftHours=INT(ROUND(iActualShiftHours,0)) && Rounds up to next hour. *ELSE *iActualShiftHours=(iActualShiftHours + nPartialHour) iTotalActualShiftHours=INT(iActualShiftHours) && No rounding. Integer only. *ENDIF *cScheduledEndHour=STR(VAL(cScheduledStartHour) + iTotalActualShiftHours - iAdjustStartHours) cScheduledEndHour=STR(VAL(cEffectiveStartHour) + iTotalActualShiftHours) cScheduledEndMinute=cScheduledStartMinute * Check the 24 hour time and correct it, if necessary. cScheduledEndHour=; IIF(VAL(cScheduledEndHour)>23,STR(VAL(cScheduledEndHour)-24),cScheduledEndHour) iScheduledEndMinutes=(60 * VAL(cScheduledEndHour)) + VAL(cScheduledEndMinute) iEarlyOrLateMinutes=(iScheduledEndMinutes - iActualEndMinutes) ********************************************* *** (9F) CLOCK-OUT - EARLY OR LATE TESTS. *** ********************************************* DO CASE CASE iEarlyOrLateMinutes > 0 && Employee clocked out EARLY. Ex: 13:59. cEffectiveEndHour=STR(VAL(cActualEndHour) - iAdjustEndHours) *cEffectiveEndHour=STR(VAL(cScheduledEndHour) - iAdjustEndHours) cEffectiveEndMinute=cActualEndMinute *cEffectiveEndMinute=STR(iActualEndMinutes + iEarlyOrLateMinutes - (60 * VAL(cActualEndHour))) CASE iEarlyOrLateMinutes < -15 && Employee clocked out over 15 minutes LATE. Ex: 14:16. cEffectiveEndHour=STR(VAL(cActualEndHour) - iAdjustEndHours) *cEffectiveEndMinute=STR(iActualEndMinutes - iEarlyOrLateMinutes - (60 * VAL(cActualEndHour))) cEffectiveEndMinute=cActualEndMinute OTHERWISE && Normal Shift End. cEffectiveEndHour=cScheduledEndHour cEffectiveEndMinute=cScheduledEndMinute ENDCASE cEffectiveEndHour=ALLTRIM(cEffectiveEndHour) cEffectiveEndMinute=ALLTRIM(cEffectiveEndMinute) ************************************************************ * (9G) Put together complete END Time from the above code. *************************************************************************** cEffectiveEndTime=; PADL(ALLTRIM(cEffectiveEndHour),2,"0")-':'-PADL(ALLTRIM(cEffectiveEndMinute),2,"0") nPayHours=; (1440 * (dClockedOut - dClockedIn)) + ; 60*VAL(SUBSTR(cEffectiveEndTime,1,2))+VAL(SUBSTR(cEffectiveEndTime,4,2))- ; 60*VAL(SUBSTR(cEffectiveStartTime,1,2))-VAL(SUBSTR(cEffectiveStartTime,4,2)) nPayHours = IIF(nPayHours < 0, 1440 + nPayHours, nPayHours)/60 nPayHours = ROUND(nPayHours, 2) set step on ASSERT = .F.