sábado, 29 de outubro de 2011

Horas trabalhadas usando MySQL

  Na primeira publicação deste assunto com o título Horas trabalhadas armazenadas no MySQL eu abordei sobre um script que registra as horas trabalhadas. Passado um tempo tive que fazer alguma alterações para adequar meu sistema ao modelo usado pela empresa.
  As modificações são:
  • a substituição das colunas dia, mês e ano por data que agrupa as três informações;
  • pergunta se é um dia útil. Se a resposta for negativa, a forma como a variável saldo é calculada muda para diferenciar a quantidade de horas extras.

  A seguir está a descrição da tabela de acordo com o comando do MySQL describe ponto;

id int(11) NO PRI NULL auto_increment
in1 time YES NULL
out1 time YES NULL
in2 time YES NULL
out2 time YES NULL
tempo time YES NULL
saldo time YES NULL
data varchar(11) YES NULL
comment text YES NULL

  O script encontra-se abaixo bem como seus comentários para facilitar o entedimento das instruções.

#!/bin/bash

# Entrada dos horários
read -p "Entrada manhã: " in1
read -p "Saída almoço: " out1
read -p "Entrada tarde: " in2
read -p "Saída tarde: " out2

read -p "Data de hoje? [Y/n] " resp
# Entende que Y, y, S, s ou Enter signifiquem uma resposta a data de hoje
if [ "$resp" = Y -o "$resp" = y -o "$resp" = S -o "$resp" = s -o ! -n "$resp" ]
  then
   dia=`date +%d`
   mes=`date +%m`
   ano=`date +%Y`
   data=$dia/$mes/$ano
else
  read -p "dia " dia
  read -p "mes " mes
  read -p "ano " ano
  data=$dia/$mes/$ano
fi

# Subtrai o horário da manhã
manhaSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out1','$in1');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
manha=`echo $manhaSQL | awk '{printf "%s\n",$2}'`

# Subtrai o horário da tarde
tardeSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out2','$in2');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
tarde=`echo $tardeSQL | awk '{printf "%s\n",$2}'`

# Soma o horário da manhã e da tarde
tempoSQL=`mysql -uroot -psenha << SQL
SELECT ADDTIME('$manha','$tarde');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
# Tempo total do dia (manhã + tarde)
tempo=`echo $tempoSQL | awk '{printf "%s\n",$2}'`

# Horas trabalhadas menos 9h para calcular o saldo de horas
tempo_add=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$tempo','09:00:00');
QUIT
SQL`

read -p "Dia útil? [Y/n] " dia_util
if [ "$dia_util" = Y -o "$resp" = y -o "$resp" = S -o "$resp" = s -o ! -n "$dia_util" ]
  then # saldo de horas trabalhadas para dia útil
   saldo_horas=`echo $tempo_add | awk '{printf "%s\n",$2}'`
  else # saldo de horas trabalhadas para sábados, domingo e feriados
   saldo_horas="$tempo"
fi

read -p "Comentário? " comment

echo "$in1" "$out1" "$in2" "$out2" "$tempo" "$saldo_horas" "$data" "$comment"

cmd=`/usr/bin/mysql -uroot -psenha << SQL
   use imf
   insert into ponto (in1, out1, in2, out2, tempo, saldo, data, comment) values
    ("$in1", "$out1", "$in2", "$out2", "$tempo", "$saldo_horas", "$data", "$comment");
  quit
  SQL`

  Através do comando

select * from ponto where id > numero;

sendo numero o id que corresponde a uma data que procuro, o MySQL devolve a listagem de um determinado intervalo que através da ferramenta txt2tags crio as células que são facilmente portáveis para o Excel com um simples CTRL + C e CTRL + V.