Mostrando postagens com marcador read. Mostrar todas as postagens
Mostrando postagens com marcador read. Mostrar todas as postagens

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.

sábado, 3 de setembro de 2011

Horas trabalhadas armazenadas no MySQL

  Esta publicação tem o propósito de armazenar as suas horas trabalhadas. Nada do (argh!) excel. Este script armazena as informações e executa os cálculos.
  É preciso um certo conhecimento do banco de dados MySQL. Qualquer dúvida, consulte Introdução ao banco de dados MySQL.
  Primeiro passo é criar a database:

create database industria;

  Em seguida, cria-se a tabela com as colunas:

create table horarios (id int AUTO_INCREMENT, in1 time, out1 time, in2 time, out2 time, tempo tempo, saldo tempo, dia int(20), mes int(2), ano int(2), comment TEXT, PRIMARY KEY (id));

  Explicando cada coluna:

Coluna Tipo Explicação
id PRIMARY KEY número distinto
in1 time entrada de manhã
out1 time saída de manhã
in2 time entrada à tarde
out2 time saída à tarde
tempo time horas trabalhadas no dia somando manhã e tarde
saldo time saldo de horas
dia int(20) dia trabalhado
mes int(2) mês trabalhado
ano int(2) ano trabalhado
comment TEXT espaço para anotações do tipo "consulta médica" etc

  O banco de dados está pronto.
  Justificando por separar dia, mês e ano. Uma situação comum é fazer o levamento das horas trabalhadas de um determinado mês. Um select do tipo:

select * from horarios where mes=9 and ano=2011;

devolve todas as informações sobre o mês de setembro de 2011.
  A seguir disponibilizo o script que lê as informações introduzidas pelo usuário, executa somas e subtrações de horários e armazena no banco de dados.

#!/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`
else
  read -p "dia " dia
  read -p "mes " mes
  read -p "ano " ano
fi

read -p "Comentário? " comment

# 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`

# saldo de horas trabalhadas
saldo_horas=`echo $tempo_add | awk '{printf "%s\n",$2}'`

# insere no banco de dados os valores armazenados nas variaveis
cmd=`/usr/bin/mysql -uroot -psenha << SQL
  use industria
  insert into horarios (in1, out1, in2, out2, tempo, saldo, dia, mes, ano, comment) values
    ("$in1", "$out1", "$in2", "$out2", "$tempo", "$saldo_horas", "$dia", "$mes", "$ano", "$comment");
  quit
  SQL`