Jump to content
Fórum Script Brasil
  • 0

Erro no calculo de horas trabalhadas horas extras e horas atraso


Weslley Brum

Question

Boa tarde a todos,

sou iniciante em programação com PHP e estou tentando fazer um calculo porem, meu código calcula e grana no banco de dados a hora errada.
vou deixar meu código abaixo e espero que alguém me ajude .

 

<?php
include('includes/db_config.php');

// Inicializar a variável $result
$result = "";

$data = json_decode(file_get_contents("php://input"), true);
if (isset($data['matricula']) && isset($data['nextField'])) {
    $matricula = $data['matricula'];
    $nextField = $data['nextField'];

    try {
        // Configuração do fuso horário para Brasília
        date_default_timezone_set('America/Sao_Paulo');

        $query = "SELECT * FROM registros_ponto WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
        $statement = $pdo->prepare($query);
        $statement->bindParam(':matricula', $matricula);
        $statement->execute();

        if ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
            $fieldsToUpdate = ['entrada1', 'saida1', 'entrada2', 'saida2'];
            $fieldToUpdate = null;

            foreach ($fieldsToUpdate as $field) {
                if (empty($row[$field])) {
                    $fieldToUpdate = $field;
                    break;
                }
            }

            if ($fieldToUpdate !== null) {
                // Obter a data e hora atual no fuso horário de Brasília
                $now = new DateTime("now", new DateTimeZone("America/Sao_Paulo"));
                $dataHora = $now->format("Y-m-d H:i:s");

                // Atualiza o campo com a hora no fuso horário de Brasília
                $updateQuery = "UPDATE registros_ponto SET $fieldToUpdate = :dataHora WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateStatement = $pdo->prepare($updateQuery);
                $updateStatement->bindParam(':matricula', $matricula);
                $updateStatement->bindParam(':dataHora', $dataHora);
                $updateStatement->execute();

                // Calcular horas trabalhadas
                $entrada1 = strtotime($row['entrada1']);
                $saida1 = strtotime($row['saida1']);
                $entrada2 = strtotime($row['entrada2']);
                $saida2 = strtotime($row['saida2']);

                // Calcular as durações dos períodos
                $duracao1 = $saida1 - $entrada1;
                $duracao2 = $saida2 - $entrada2;

                // Calcular as horas trabalhadas
                $horasTrabalhadasSegundos = $duracao1 + $duracao2;
                $horasTrabalhadas = gmdate("H:i:s", $horasTrabalhadasSegundos);

                // Calcular horas de atraso
                $jornadaTrabalhoSegundos = strtotime("09:00:00");
                $horasAtrasoSegundos = $jornadaTrabalhoSegundos - $horasTrabalhadasSegundos;

                // Verificar se há atraso com base na tolerância
                if ($horasAtrasoSegundos > 0) {
                    $horasAtraso = gmdate("H:i:s", $horasAtrasoSegundos);
                } else {
                    $horasAtraso = ""; // "00:00:00" Não há atraso
                }

                // Calcular horas extras
                $horasExtrasSegundos = max($horasTrabalhadasSegundos - $jornadaTrabalhoSegundos, 0);
                $horasExtras = gmdate("H:i:s", $horasExtrasSegundos);

                // Atualizar o campo horas_trabalhadas
                $updateHorasQuery = "UPDATE registros_ponto SET horas_trabalhadas = :horasTrabalhadas WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateHorasStatement = $pdo->prepare($updateHorasQuery);
                $updateHorasStatement->bindParam(':matricula', $matricula);
                $updateHorasStatement->bindParam(':horasTrabalhadas', $horasTrabalhadas);
                $updateHorasStatement->execute();

                // Atualizar o campo horas_atraso
                $updateAtrasoQuery = "UPDATE registros_ponto SET horas_atraso = :horasAtraso WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateAtrasoStatement = $pdo->prepare($updateAtrasoQuery);
                $updateAtrasoStatement->bindParam(':matricula', $matricula);
                $updateAtrasoStatement->bindParam(':horasAtraso', $horasAtraso);
                $updateAtrasoStatement->execute();

                // Atualizar o campo horas_extras
                $updateExtrasQuery = "UPDATE registros_ponto SET horas_extras = :horasExtras WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateExtrasStatement = $pdo->prepare($updateExtrasQuery);
                $updateExtrasStatement->bindParam(':matricula', $matricula);
                $updateExtrasStatement->bindParam(':horasExtras', $horasExtras);
                $updateExtrasStatement->execute();

                // Exibir informações sobre o atraso e horas extras
                $result = "<p class='sucesso'>Registro atualizado com sucesso!</p>";
            } else {
                $result = "Excedeu o número de registros do dia.";
            }
        }
    } catch (PDOException $e) {
        $result = "Erro ao salvar registro: " . $e->getMessage();
    }
} else {
    $result = "Dados de entrada inválidos.";
}

echo $result; // Retorna a mensagem de sucesso ou erro
?>

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

O primeiro problema é a estrutura da tabela, para executar o seu código, eu fiz a tabela registro_pontos assim:

CREATE TABLE `registros_ponto` (
  `id` int NOT NULL AUTO_INCREMENT,
  `matricula` int NOT NULL,
  `data_registro` date DEFAULT NULL,
  `entrada1` time DEFAULT NULL,
  `saida1` time DEFAULT NULL,
  `entrada2` time DEFAULT NULL,
  `saida2` time DEFAULT NULL,
  `horas_trabalhadas` time DEFAULT NULL,
  `horas_atraso` time DEFAULT NULL,
  `horas_extras` time DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

O segundo problema é que você não pode usar a matrícula para atualizar a tabela, você tem que usar a chave primária, no meu caso, eu chamei de id. O id é um número único. Vamos a um exemplo: a empresa tem apenas um funcionário, a matricula dele é 1, mas ele trabalhou no dia 1,2,3...30. Para calcular as horas trabalhadas não podemos usar a matrícula do funcionário, mas a chave primária, ou seja, um número especifico que indica o dia 1, 2, 3, etc.

Eu não sei se o cálculo das horas trabalhadas está certo, mas modifiquei o seu código para trabalhar com apenas um registro:

<?php
// mysql registros_ponto (id int pk ai,matricula int,data_registro date,entrada1 time,
// saida1 time, entrada2 time, saida2 time, horas_trabalhadas time,horas_atraso time,horas_extras time)
// (33,1,'2023-10-21','8:00','12:00','13:00','17:00',null,null,null)
$pdo=new PDO("mysql:hostname=localhost;dbname=laravel","root","");
$query = "SELECT * FROM registros_ponto WHERE matricula = 1";
$stm=$pdo->prepare($query);
$stm->execute();
$rows=$stm->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
  // Calcular horas trabalhadas
  $id=$row['id'];
  $entrada1 = strtotime($row['entrada1']);
  $saida1 = strtotime($row['saida1']);
  $entrada2 = strtotime($row['entrada2']);
  $saida2 = strtotime($row['saida2']);
  // Calcular as durações dos períodos
  $duracao1 = $saida1 - $entrada1;
  $duracao2 = $saida2 - $entrada2;
  // Calcular as horas trabalhadas
  $horasTrabalhadasSegundos = $duracao1 + $duracao2;
  $horasTrabalhadas = gmdate("H:i:s", $horasTrabalhadasSegundos);
  // Calcular horas de atraso
  $jornadaTrabalhoSegundos = strtotime("09:00:00");
  $horasAtrasoSegundos = $jornadaTrabalhoSegundos - $horasTrabalhadasSegundos;
  // Verificar se há atraso com base na tolerância
  if ($horasAtrasoSegundos > 0) {
      $horasAtraso = gmdate("H:i:s", $horasAtrasoSegundos);} else {
      $horasAtraso = ""; } // "00:00:00" Não há atraso
  // Calcular horas extras
  $horasExtrasSegundos = max($horasTrabalhadasSegundos - $jornadaTrabalhoSegundos, 0);
  $horasExtras = gmdate("H:i:s", $horasExtrasSegundos);
  // Atualizar o campo horas_trabalhadas, horas_atraso, horas_extras
  $query = "UPDATE registros_ponto SET horas_trabalhadas = :horasTrabalhadas,
    horas_atraso = :horasAtraso, horas_extras = :horasExtras
    WHERE id = :id";
  $stm = $pdo->prepare($query);
  $stm->bindParam(':id', $id);
  $stm->bindParam(':horasTrabalhadas', $horasTrabalhadas);
  $stm->bindParam(':horasAtraso', $horasAtraso);
  $stm->bindParam(':horasExtras', $horasExtras);
  $stm->execute();} 
?>

Para calcular as horas trabalhadas de todo mundo, basta mudar a primeira consulta para "select * from registros_ponto". Não importa a matrícula, essa consulta vai calcular as horas para todos os registros.

Edited by Frank K Hosaka
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
      152.1k
    • Total Posts
      651.8k
×
×
  • Create New...