#!/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))