#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.utils.timezone import utc
from django.shortcuts import render, redirect, render_to_response
from django.template import RequestContext
from django.http import HttpResponse
from django.db import IntegrityError
from models import *
from django.core.exceptions import ObjectDoesNotExist
from datetime import datetime, timedelta, tzinfo
# Obtenção das informações do arquivo do Henry
def puxar_informacoes_henry(lista_funcionarios):
# Arquivo com as saídas do Henry;
arquivo = open("/mnt/henry/MeusArquivosSaida/Registros.txt.txt", 'r')
# Ler todas as linhas do arquivo e fecha-o em seguida;
conteudo_arquivo = arquivo.readlines()
arquivo.close()
formato = "%d/%m/%Y %H:%M:%S"
for linha in conteudo_arquivo:
# Matrícula com oito dígitos.
matricula = linha.split(" ")[-1].rstrip()[12:20]
# Compara matrícula do funcionário com a do arquivo.
for funcionario in lista_funcionarios:
if funcionario.matricula in matricula:
# Data no formato 'DD/MM/AAAA'.
data = linha.split(" ")[-3]
# Hora no formato '00:00:00'.
hora = linha.split(" ")[-2]
data_hora = datetime.strptime("%s %s" %(data, hora), formato)
batida_ponto = BatidaPonto()
batida_ponto.funcionario = funcionario
batida_ponto.momento_batidaponto = data_hora
try:
batida_ponto.save()
except IntegrityError:
pass
# Sincroniza informações do Henry com o banco de dados
def sincronizar():
lista_funcionarios = Funcionario.objects.all()
if lista_funcionarios:
puxar_informacoes_henry(lista_funcionarios)
nova_sincronizacao = Sincronizacao()
agora = datetime.now()
nova_sincronizacao.data_hora = agora
nova_sincronizacao.save()
return True
else:
return False
# Gera resumos diários para todos os funcionários
def gerar_resumos_diarios():
lista_funcionarios = []
try:
lista_funcionarios = Funcionario.objects.all()
except ObjectDoesNotExist:
pass
if lista_funcionarios:
for funcionario in lista_funcionarios:
primeira_batidaponto = None
# Obtém a batida de ponto mais antiga.
try:
primeira_batidaponto = BatidaPonto.objects.filter(funcionario=funcionario).earliest('momento_batidaponto')
except ObjectDoesNotExist:
pass
if primeira_batidaponto:
primeira_data = primeira_batidaponto.momento_batidaponto
# Compara a primeira data com o dia atual.
data_atual = datetime.now()
diferenca_datas = data_atual - primeira_data
quantidade_dias = diferenca_datas.days
formato = "%d/%m/%Y"
# Percorre todos os dias entre a primeira batida de ponto e o dia atual.
for i in range(1,quantidade_dias+1):
# Data que vai iterando até o dia de hoje
data_registro = primeira_data + timedelta(days=i)
data_texto = data_registro.strftime(formato)
# Obtem-se as horas trabalhadas do dia em questão.
horas_trabalhadas = funcionario.get_horas_trabalhadas_dia(data_texto)
# Gera um objeto ResumoDiario.
resumo_diario = ResumoDiario()
resumo_diario.funcionario = funcionario
resumo_diario.data = data_registro
resumo_diario.horas_trabalhadas_float = horas_trabalhadas.days * 86400 + horas_trabalhadas.seconds
# Salva apenas se a data ainda não existir.
try:
resumo_diario.save()
except IntegrityError:
pass
else:
return False
else:
return False
return True
def gerar_resumos_semanais():
lista_funcionarios = []
try:
lista_funcionarios = Funcionario.objects.all()
except ObjectDoesNotExist:
pass
if lista_funcionarios:
for funcionario in lista_funcionarios:
primeira_batidaponto = None
# Obtém a batida de ponto mais antiga.
try:
primeira_batidaponto = BatidaPonto.objects.filter(funcionario=funcionario).earliest('momento_batidaponto')
except ObjectDoesNotExist:
pass
if primeira_batidaponto:
primeira_data = primeira_batidaponto.momento_batidaponto
# Dia da semana em número (0 = segunda, 1 = terça ... 6 = domingo).
dia_semana = primeira_data.weekday()
# Caso não seja uma segunda-feira, ele voltará alguns dias até encontrá-la.
while dia_semana != 0:
primeira_data -= timedelta(days=1)
dia_semana = primeira_data.weekday()
data_atual = datetime.now()
data_registro = primeira_data
formato = "%d/%m/%Y"
while data_registro < data_atual:
data_texto = data_registro.strftime(formato)
horas_trabalhadas = funcionario.get_horas_trabalhadas_semana(data_texto)
resumo_semanal = ResumoSemanal()
resumo_semanal.funcionario = funcionario
resumo_semanal.segunda_feira = data_registro
resumo_semanal.horas_trabalhadas_float = horas_trabalhadas.days * 86400 + horas_trabalhadas.seconds
try:
resumo_semanal.save()
except IntegrityError:
pass
data_registro += timedelta(days=7)
else:
return False
else:
return False
return True
# Views do sistema
# Página inicial que redireciona para o Django Admin.
def pagina_inicial(request):
agora = datetime.now()
try:
ultima_sincronizacao = Sincronizacao.objects.latest('data_hora')
data_hora_nova_sincronizacao = ultima_sincronizacao.data_hora + timedelta(hours=1)
if data_hora_nova_sincronizacao <= agora:
sincronizar()
gerar_resumos_diarios()
gerar_resumos_semanais()
except ObjectDoesNotExist:
sincronizar()
ultima_sincronizacao = Sincronizacao()
ultima_sincronizacao.data_hora = agora
ultima_sincronizacao.save()
return redirect('/admin/', permanent=False)
# Página que sincroniza o arquivo de saída do Henry com o banco de dados.
def forcar_sincronizacao(request):
if sincronizar():
return HttpResponse("Os dados foram sincronizados com sucesso.")
else:
return HttpResponse("Não há funcionários cadastrados.")
# Funções que geram os resumos com base nas batidas de ponto.
def forcar_resumos_diarios(request):
if gerar_resumos_diarios():
return HttpResponse("Resumos semanais gerados com sucesso.")
else:
return HttpResponse("Nenhum funcionário e/ou batida de ponto cadastrada.")
def forcar_resumos_semanais(request):
if gerar_resumos_semanais():
return HttpResponse("Resumos semanais gerados com sucesso.")
else:
return HttpResponse("Nenhum funcionário e/ou batida de ponto cadastrada.")
def teste(request):
return render_to_response('my_template.html', locals(), context_instance=RequestContext(request))