Here's the program in test mode:
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)
DO CASE
CASE iEarlyOrLateMinutes > 15
cEffectiveStartHour=cActualStartHour
cEffectiveStartMinute=cActualStartMinute
CASE iEarlyOrLateMinutes < 0
cEffectiveStartHour=cActualStartHour
cEffectiveStartMinute=cActualStartMinute
OTHERWISE
cEffectiveStartHour=cScheduledStartHour
cEffectiveStartMinute=cScheduledStartMinute
ENDCASE
cEffectiveStartHour=ALLTRIM(cEffectiveStartHour)
cEffectiveStartMinute=ALLTRIM(cEffectiveStartMinute)
cEffectiveStartTime=PADL(ALLTRIM(cEffectiveStartHour),2,"0")+':'+PADL(ALLTRIM(cEffectiveStartMinute),2,"0")
iActualEndMinutes=(60 * VAL(cActualEndHour)) + VAL(cActualEndMinute)
iEffectiveStartMinutes = (60 * VAL(cEffectiveStartHour)) + VAL(cEffectiveStartMinute)
iTotalEffectiveMinutes=(iActualEndMinutes - iEffectiveStartMinutes)
iActualShiftHours=(iTotalEffectiveMinutes/60)
iTotalActualShiftHours=INT(iActualShiftHours)
cScheduledEndHour=STR(VAL(cEffectiveStartHour) + iTotalActualShiftHours)
cScheduledEndMinute=cScheduledStartMinute
cScheduledEndHour=;
IIF(VAL(cScheduledEndHour)>23,STR(VAL(cScheduledEndHour)-24),cScheduledEndHour)
iScheduledEndMinutes=(60 * VAL(cScheduledEndHour)) + VAL(cScheduledEndMinute)
iEarlyOrLateMinutes=(iScheduledEndMinutes - iActualEndMinutes)
DO CASE
CASE iEarlyOrLateMinutes > 0
cEffectiveEndHour=STR(VAL(cActualEndHour) - iAdjustEndHours)
cEffectiveEndMinute=cActualEndMinute
CASE iEarlyOrLateMinutes < -15
cEffectiveEndHour=STR(VAL(cActualEndHour) - iAdjustEndHours)
cEffectiveEndMinute=cActualEndMinute
OTHERWISE
cEffectiveEndHour=cScheduledEndHour
cEffectiveEndMinute=cScheduledEndMinute
ENDCASE
cEffectiveEndHour=ALLTRIM(cEffectiveEndHour)
cEffectiveEndMinute=ALLTRIM(cEffectiveEndMinute)
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.