Amigo, abaixo segue uma função para fazer este cálculo, mas antes quero explicar como cheguei ao coeficiente que é usado para calcular as horas de adicional noturno:
1 - A hora noturna tem 52 minutos e 30 segundos, que transformadas em segundos dá um total de 3150 segundos.
2 - A hora normal tem 60 segundos, que equivale a 3600 segundos.
Então basta fazer uma regrinha de três, pura matemática:
Código: Selecionar todos
3150 = 1 hora noturna
3600 = X
então
X = 3600 / 3150
X = 1,1428572
Segue agora um exemplo de como você pode fazer:
Código: Selecionar todos
CLEAR
@ 6,24 TO 15,55
@ 7,25 SAY "Entrada Intervalo Saida"
@ 8,25 SAY REPL(CHR(196),30)
@ 10,25 SAY REPL(CHR(196),30)
@ 12,26 SAY "Total de Horas....:"
@ 13,26 SAY "Horas Extras......:"
@ 14,26 SAY "Horas Ad.Noturno..:"
hsdia=8 //numeros de horas de trabalho no dia
DO WHILE .t.
cIntei=SPAC(5)
cIntef=SPAC(5)
cHorai=SPAC(5)
cHoraf=SPAC(5)
n_hsex=0
n_adno=0
@ 9,26 GET cHorai PICT "99:99" VALI !EMPT(cHorai)
@ 9,34 GET cIntei PICT "99:99"
@ 9,41 GET cIntef PICT "99:99" WHEN !EMPT(cIntei)
@ 9,49 GET cHoraf PICT "99:99" VALI !EMPT(cHoraf)
READ
IF LASTKEY()=27
RETU
ENDI
@ 11,26 SAY cHorai PICT "99:99"
@ 11,34 SAY cIntei PICT "99:99"
@ 11,41 SAY cIntef PICT "99:99"
@ 11,49 SAY cHoraf PICT "99:99"
nSegs=TEMPTRA(cHorai,cIntei,cIntef,cHoraf) //calcula total de segundos
n_hsex=(nSegs - (3600 * hsdia))
v_cal=INT(nSegs/3600) //calcula as horas
v_minut=(nSegs - (v_cal * 3600)) //separa minutos
v_hs=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
IF n_hsex>0
v_cal=INT(n_hsex/3600) //calcula as horas
v_minut=(n_hsex - (v_cal * 3600)) //separa minutos
v_hsex=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
ELSE
v_hsex=" 0:00"
ENDIF
v_cal=INT(n_adno/3600) //calcula as horas
v_minut=(n_adno - (v_cal * 3600)) //separa minutos
v_hsan=str(v_cal,2)+SUBS(TSTRING(v_minut),3,3) //calcula minutos e segundos
@ 12,46 SAY TRAN(v_hs,"99:99")
@ 13,46 SAY TRAN(v_hsex,"99:99")
@ 14,46 SAY TRAN(v_hsan,"99:99")
ENDDO
RETU
FUNC TEMPTRA(v_hri,v_ini,v_inf,v_hrf)
LOCAL ret,sega,segb,segc,segd,segp1,segp2,an1,an2
sega=SECS(v_hri) //transforma hora entrada em segundos
segb=SECS(v_hrf) //transforma hora saida em segundos
IF !EMPT(v_ini)
segc=SECS(v_ini)
segd=SECS(v_inf)
IF sega>segc
segp1=((86400 - sega)+segc)
ELSE
segp1=(segc - sega)
ENDIF
an1:=CALAD(sega,segc)
IF segd>segb
segp2=((86400 - segd)+segb)
ELSE
segp2=(segb - segd)
ENDIF
an2:=CALAD(segd,segb)
ret=(segp1 + segp2)
n_adno=an1+an2
ELSE
IF sega>segb
ret=((86400 - sega)+segb)
ELSE
ret=(segb - sega)
ENDIF
n_adno=CALAD(sega,segb)
ENDIF
RETU (ret) //retorna horas de uso em segundos
FUNC _ROUND(nvalor,ndec)
RETURN(ROUND(VAL(STR(nvalor)),ndec))
FUNC CALAD(vSegi,vSegf)
LOCAL vHA:=.t., ret2:=0
IF vSegf<=vSegi
IF vSegi=79200.and.vSegf>=18000
ret2:=28800
ELSEIF vSegi<79200.and.vSegf>=18000
ret2:=28800
ELSEIF vSegi>79200.and.vSegf<=86400.and.vSegf>79200
ret2:=(vSegf-vSegi) * 1.1428572
vHA=.f.
ELSEIF vSegi<=79200.and.vSegf<=86400.and.vSegf>79200
ret2:=(vSegf - 79200) * 1.1428572
vHA=.f.
ELSEIF vSegi>79200.and.vSegf<18000
ret2:=((vSegf + 86400) - vSegi) * 1.1428572
ELSEIF vSegi<=79200.and.vSegf<18000
ret2:=((vSegf + 86400) - 79200) * 1.1428572
ELSEIF vSegi>79200.and.vSegf>=18000
ret2:=(104400 - vSegi) * 1.1428572
ENDIF
ENDIF
IF vSegf>=79200.and.vHA
ret2:=(vSegf - 79200) * 1.1428572
ENDIF
IF vSegi<18000
IF vSegf<18000
ret2:=(vSegf - vSegi) * 1.1428572
ELSEIF vSegf>=18000
ret2:=(18000 - vSegi) * 1.1428572
ENDIF
ENDIF
RETU (ret2)
Abraços,