Jump to content
Fórum Script Brasil
  • 0

Cacular hora extra


Felipee

Question

Amigos,

estou com uma pipinosa..

estou desenvolvimento um controle de ponto. a duvida é com hora extra.

vamos dizer o cara faz horario de 12:00 as 20:00.

se ele chegar as 11:00, 1 hora de hora extra.

se sair as 20:30, 30 minutos de hora extra. show!

mas ele pode entrar as 8:00 da manha, sair as 11:00 e voltar para trabalhar as 12:00, ou seja, 3 horas de hora extra.

como jogar estas consideracoes num select que retorne quem fez hora extra?

conteudo da tabela controledeponto:

codcontroleponto

codfunc

codescala

hentrada

hsdaida

htotal

uso d7 e firebird.

obrigado a qualquer ajuda.

felipee.

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0
Amigos,

estou com uma pipinosa..

estou desenvolvimento um controle de ponto. a duvida é com hora extra.

vamos dizer o cara faz horario de 12:00 as 20:00.

se ele chegar as 11:00, 1 hora de hora extra.

se sair as 20:30, 30 minutos de hora extra. show!

mas ele pode entrar as 8:00 da manha, sair as 11:00 e voltar para trabalhar as 12:00, ou seja, 3 horas de hora extra.

como jogar estas consideracoes num select que retorne quem fez hora extra?

conteudo da tabela controledeponto:

codcontroleponto

codfunc

codescala

hentrada

hsdaida

htotal

uso d7 e firebird.

obrigado a qualquer ajuda.

felipee.

Fala felipe,

você não acharia melhor adicionar a sua tabela mais campos, hentradaprimeiroperiodo, hsaidaprimeiroperiodo, e para tarde a mesma coisa so que segundo periodo. Pois desta forma você teria um melhor controle sobre a entrada e saida. Poderia se pensar em dois totais por periodos. Dai você poderia dentro do select trabalhar so com os totais de periodos e poder calcular as horas extras.

Entenda esta não é a solução do seu problema, porem é uma forma de comecarmos a descascar este pepino.

Link to comment
Share on other sites

  • 0
vamos dizer o cara faz horario de 12:00 as 20:00.

se ele chegar as 11:00, 1 hora de hora extra.

se sair as 20:30, 30 minutos de hora extra. show!

mas ele pode entrar as 8:00 da manha, sair as 11:00 e voltar para trabalhar as 12:00, ou seja, 3 horas de hora extra.

como jogar estas consideracoes num select que retorne quem fez hora extra?

Felipee, a grosso modo, pelo seu exemplo e supondo que sua única dúvida seja levantar quem fez hora-extra, daria para dizer que:

- quem registrou o ponto antes do horário inicial da sua escala, fez hora-extra;

- quem registrou o ponto depois do horário final da sua escala, fez hora-extra.

mas, se por acaso há horário flexível e, o cara tem que cumprir as 08:00h, ele poderia entrar às 11:00h e sair ás 19:00h, cumprindo sua jornada, mas não fazendo hora-extra.

Também, pode ocorrer de que o sujeito registre seu ponto uns 20 minutos antes ou depois do horário sem que isso represente hora-extra. Provavelmente há algum critério neste sentido e deverá ser levado em conta.

Aqui onde trabalho, é padrão eu ter 20minutos de hora-extra, contudo eu devo ter este excedente registrado, caso contrário é validado apenas o disponível. Qualquer outra hora-extra que faça, deverá ser justificada e autorizada para que seja computada e eu a receba.

Conforme a complexidade do caso, acho pouco provável que seja possível resolver este problema com um simples SELECT. Muito provavelmente envolverá adição de campos na tabela (como sugeriu o colega Recife) ou o processamento em batch, seja em código no programa ou em uma procedure no banco (preferível).

Abraços

Link to comment
Share on other sites

  • 0

oh galera!

muito obrigado mesmo pela ajuda.

//registra os dias da semana e respectivos horarios e cargas de acordo com dia.

//o cara pode entrar as 22:00 e sair as 6:00 da manha.

//entrar as 8:00 num dia e entrar as 10:00 no outro

CREATE TABLE ITMHORARIODETRABALHO (

CODITMHORTRAB INTEGER NOT NULL,

CODHORTRAB INTEGER,

CODDIASEM INTEGER,

HORARIOENTRADA TIME,

HORARIOSAIDA TIME,

CARGAHORARIA TIME,

INTERVALOALMOCO TIME,

HORARIOALMOCO TIME,

CONSIDERARINTERVALOALMOCO VARCHAR(3)

);

//cabecalho do itmhorariodetrabalho e respectivos totais

//tipo DESCRICAO = "horario de 8:00 as 18:00"

CREATE TABLE HORARIODETRABALHO (

CODHORTRAB INTEGER NOT NULL,

CARGAHORARIASEMANAL VARCHAR(20),

CARGAHORARIAMENSAL VARCHAR(20),

DESCRICAO VARCHAR(30)

);

//registro a abertura e fechamento do ponto

//o cara pode abrir e fechar seu ponto n vezes no dia.

//assim não dá para fixar um horario de entrada e outro de saida as e depois do almoco.

CREATE TABLE CONTROLEPONTO (

CODCONTROLEPONTO INTEGER NOT NULL,

CODFUNC INTEGER,

CODHORTRAB INTEGER,

CODDIASEM INTEGER,

DATAENTRADA DATE,

HORAENTRADA TIME,

DATASAIDA DATE,

HORASAIDA TIME,

TOTALHORA TIME,

JUSTIFICATIVA BLOB SUB_TYPE 0 SEGMENT SIZE 500

);

//registro funcionarios

CREATE TABLE FUNCIONARIO (

CODFUNC INTEGER NOT NULL,

FUNCIONARIO VARCHAR(50)

);

Entendo que preciso fazer:

1-somar as horas_trabalhadas agrupadas por dia;

2-diminuir estas horas_trabalhadas pelas horas que deveria ter trabalhado (carga_horaria_dia);

3-assim horas_trabalhadas-carga_horaria_dia>0 fez hora extra. se = 0 sem hora extra. se <0 deve hora

segundo a empresa o cara que pega 13:00h faz hora extra de 8:00 as 11:00. assim existirão dois registros de abertura e fechamento de ponto no mesmo dia.

a select teria que exibir o nome do funcionario e o calculo acima.

o que fiz:

select

DATA, FUNCIONARIO.FUNCIONARIO,

sum(TOTALHORA - CAST ('0000:00:00' AS TIME))/60/60 AS HORATRABALHADA,

(SELECT FIRST 1 CARGAHORARIA

FROM

ITMHORARIODETRABALHO

WHERE ITMHORARIODETRABALHO.CODHORTRAB=CONTROLEPONTO.CODHORTRAB

AND

ITMHORARIODETRABALHO.CODDIASEM=CONTROLEPONTO.CODDIASEM)

AS CARGAHORARIA,

CARGAHORARIA-HORATRABALHADA AS HORAEXTRA

FROM

CONTROLEPONTO, FUNCIONARIO

WHERE

CONTROLEPONTO.DATA between :CDATA1

AND :CDATA2

AND CONTROLEPONTO.CODFUNC=FUNCIONARIO.CODFUNC

AND HORAEXTRA>0

GROUP BY DATA, FUNCIONARIO

agora o problema é que realmente não estou sabendo fazer esta query.

quando tento diminuir os campos diz que ele não existe por ser um campo calculado...

estou utilizando o d7 e firebird 1.5

agradeço muito a ajuda.

Felipee.

Edited by Felipee
Link to comment
Share on other sites

  • 0

como fazer para ele levar em consideracao campo calculado?

cheguei a:

select CONTROLE.DATA, CONTROLE.CODFUNC, FUNCIONARIO, ITMHORARIODETRABALHO.CARGAHORARIA, DIASSEMANA.DIADASEMANA,

(select ((SUM( SUBSTRING(TOTALHORA from 1 for 3) * 3600 + SUBSTRING(TOTALHORA from 5 for 2) * 60 + SUBSTRING(TOTALHORA from 8 for 2) * 1))/3600) from CONTROLEPONTO WHERE data=CONTROLE.DATA and CODFUNC=CONTROLE.CODFUNC) AS HORASTRABALHADAS

FROM FUNCIONARIO "FUNC", CONTROLEPONTO "CONTROLE", ITMHORARIODETRABALHO, DIASSEMANA WHERE CONTROLE.DATA BETWEEN :CDATA1 AND :CDATA2 AND CONTROLE.CODFUNC=FUNC.CODFUNC and NOT CONTROLE.HORASAIDA IS NULL AND CONTROLE.CODDIASEM=ITMHORARIODETRABALHO.CODDIASEM AND CONTROLE.CODDIASEM=DIASSEMANA.CODDIASEM AND HORASTRABALHADAS>ITMHORARIODETRABALHO.CARGAHORARIA

GROUP BY CONTROLE.DATA, CONTROLE.CODFUNC, FUNCIONARIO, ITMHORARIODETRABALHO.CARGAHORARIA, DIASSEMANA.DIADASEMANA

ORDER BY CONTROLE.DATA

mas está dando erro. ele esta calculando legal agora, mas gostaria que funcionasse quando HORASTRABALHADAS>ITMHORARIODETRABALHO.CARGAHORARIA e ele diz que o campo HORASTRABALHADAS não existe...

claro que ele não existe fisicamente, mas como fazer com que a query leve ele em consideracao no where? to agarrado nisso.

obrigado por sua ajuda.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...