Como calcular Adicional Noturno no Clipper?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

labaroazul
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 26 Fev 2008 14:52
Localização: São Paulo - SP
Contato:

Como calcular Adicional Noturno no Clipper?

Mensagem por labaroazul »

Tenho uma rotina para cálculo de ponto eletrônico em menu sistema. Mas, quanto ao adicional noturno, empaquei.

A hora para cálculo do adicional noturno equivale a 52 minutos e 30 segundos (52,50 em decimal). Meu sistema calcula a hora como se ela tivesse 60 minutos. Alguém tem alguma função para calcular adicional noturno ou para converter horas base 60 para base 52,5?
Windows XP Professional + Clipper 5.2e + Exospace + Dbase III Plus + SIX3 + NoDosImp + LXPic
"O trabalho afasta três males: o vício, a pobreza e o tédio." (Voltaire)
Site: http://www.labaroazul.xpg.com.br
Repositório: http://www.4shared.com/dir/31334106/e79 ... aring.html
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Como calcular Adicional Noturno no Clipper?

Mensagem por Toledo »

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder