def test_dia_feriado(self): f = Feriado.objects.create(feriado=date(2008, 10, 8)) # @UnusedVariable f = Feriado.objects.create(feriado=date(2008, 5, 18)) # @UnusedVariable f = Feriado.objects.create(feriado=date(2008, 2, 22)) # @UnusedVariable self.assertEquals(Feriado.dia_de_feriado(date(2008, 2, 22)), True) self.assertEquals(Feriado.dia_de_feriado(date(2008, 10, 8)), True) self.assertEquals(Feriado.dia_de_feriado(date(2008, 5, 18)), True)
def total_horas_uteis(self, data_ini, data_fim): soma_dias_de_trabalho = 0 d = data_ini while d < data_fim: # é final de semana? is_final_de_semana = d.weekday() >= 5 # é feriado? is_feriado = False diaFeriado = Feriado.get_dia_de_feriado(d) # verifica se o feriado é facultativo, ou seja, com desconto de banco de horas. if diaFeriado is not None and not diaFeriado.tipo.subtrai_banco_hrs: is_feriado = True # soma os dias de trabalho if not is_final_de_semana and not is_feriado: soma_dias_de_trabalho += 1 d += timedelta(days=1) # as horas totais do período são as horas do total de dias do mes menos os finais de semana, ferias e dispensas total_horas_periodo = (soma_dias_de_trabalho * self.membro.carga_horaria * 60 * 60) return total_horas_periodo
def handle(self, *args, **options): today = datetime.date.today() one_day = datetime.timedelta(days=1) next_day = today + one_day while Feriado.dia_de_feriado(next_day) or next_day.weekday() > 4: next_day += one_day prots = [ p for p in Protocolo.objects.filter( data_vencimento__range=(today, next_day + 2 * one_day)).exclude( estado__nome='Pago') ] if len(prots) > 0: if len(prots) == 1: subject = u"Protocolo a vencer nos próximos 3 dias" txt = u"O protocolo %s deve ser pago nos próximos 3 dias." else: subject = u"Protocolos a vencer nos próximos 3 dias" txt = u"Os protocolos %s devem ser pagos nos próximos 3 dias." msg = ', '.join([ 'http://%s%s' % (Site.objects.get_current().domain, reverse('admin:protocolo_protocolo_change', args=(p.id, ))) for p in prots ]) send_mail(subject, txt % msg, "*****@*****.**", settings.PROTO_MAILS)
def test_erro_para_feriado_unico(self): f = Feriado.objects.create(feriado=date(2008, 10, 8)) # @UnusedVariable f = Feriado(feriado=date(2008, 10, 8)) # deve disparar erro para feriado com data igual self.assertRaises(IntegrityError, f.save)
def handle(self, *args, **options): today = datetime.date.today() one_day = datetime.timedelta(days=1) next_day = today + one_day while Feriado.dia_de_feriado(next_day) or next_day.weekday() > 4: next_day += one_day prots = [p for p in Protocolo.objects.filter(data_vencimento__range=(today, next_day + 2*one_day)) .exclude(estado__nome='Pago')] if len(prots) > 0: if len(prots) == 1: subject = u"Protocolo a vencer nos próximos 3 dias" txt = u"O protocolo %s deve ser pago nos próximos 3 dias." else: subject = u"Protocolos a vencer nos próximos 3 dias" txt = u"Os protocolos %s devem ser pagos nos próximos 3 dias." msg = ', '.join(['http://%s%s' % (Site.objects.get_current().domain, reverse('admin:protocolo_protocolo_change', args=(p.id,))) for p in prots]) send_mail(subject, txt % msg, "*****@*****.**", settings.PROTO_MAILS)
def total_analitico_horas(self, ano, mes): controles = Controle.objects.filter(membro=self.membro_id).order_by('entrada') primeiroDiaFiltro = None if ano and ano.isdigit() and int(ano) > 0: controles = controles.filter(entrada__year=ano) primeiroControle = controles[:1].get() if mes and mes.isdigit() and int(mes) > 0: controles = controles.filter(entrada__month=mes) primeiroDiaFiltro = datetime(primeiroControle.entrada.year, int(mes), 01) else: primeiroDiaFiltro = datetime(primeiroControle.entrada.year, primeiroControle.entrada.month, 01) meses = [] if controles.exists(): ultimoControle = controles.order_by('-entrada')[:1].get() ultimoDiaFiltro = datetime(ultimoControle.entrada.year, ultimoControle.entrada.month, calendar.monthrange(ultimoControle.entrada.year, ultimoControle.entrada.month)[1], 23, 59, 59) controles = controles.order_by('-entrada') mes_anterior = date(1979, 01, 01) if controles.count() > 0: for dt in rrule(DAILY, dtstart=primeiroDiaFiltro, until=ultimoDiaFiltro): if dt.month != mes_anterior.month or dt.year != mes_anterior.year: dias = [] meses.insert(0, ({'mes': dt.month, 'ano': dt.year, 'dias': dias, 'total': 0})) mes_anterior = dt itemControle = ItemControle() itemControle.dia = date(dt.year, dt.month, dt.day) itemControle.controles = controles.filter(entrada__year=dt.year, entrada__month=dt.month, entrada__day=dt.day) # dias.append(itemControle) dias.insert(0, itemControle) total_banco_horas = 0 ferias = ControleFerias.objects.filter(ferias__membro=self.membro_id) dispensas = DispensaLegal.objects.filter(membro=self.membro_id) for m in meses: total_segundos_trabalhos_mes = 0 # total de horas de dispensas total_horas_dispensa = 0 # total de horas de ferias total_horas_ferias = 0 # ferias_ini < mes_ini < ferias_fim OR mes_ini < ferias_ini < mes_fim mes_corrente_ini = date(m['ano'], m['mes'], 01) mes_corrente_fim = mes_corrente_ini + timedelta(calendar.monthrange(m['ano'], m['mes'], )[1]) for d in m['dias']: # total de horas trabalhadas total_segundos_trabalhos_mes = total_segundos_trabalhos_mes + sum([c.segundos for c in d.controles]) # verifica se tem algum período de férias com dias úteis tirados de fato # não deve entrar na conta se forem período de férias com venda de dias, ou somente marcação de # vencimento de férias for data_ferias in ferias: d.is_ferias = data_ferias.dia_ferias(d.dia) if d.is_ferias: d.obs = u'%s Férias' % d.obs break # é final de semana? d.is_final_de_semana = d.dia.weekday() >= 5 if d.is_final_de_semana: if d.dia.weekday() == 5: d.obs = u'%s Sábado' % d.obs elif d.dia.weekday() == 6: d.obs = u'%s Domingo' % d.obs # é feriado? diaFeriado = Feriado.get_dia_de_feriado(d.dia) if diaFeriado is not None: d.obs = u'%s %s' % (d.obs, diaFeriado.tipo.nome) # este feriado é facultativo ou não? if not diaFeriado.tipo.subtrai_banco_hrs: d.is_feriado = True # é dispensa? d.is_dispensa = False horas_dispensa = 0 for dispensa in dispensas: dia_dispensa = dispensa.dia_dispensa(d.dia) if dia_dispensa['is_dispensa']: d.is_dispensa = dia_dispensa['is_dispensa'] horas_dispensa = dia_dispensa['horas'] d.obs = u'%s Dispensa %s' % (d.obs, dispensa.tipo.nome) break # soma os dias de trabalho if not d.is_final_de_semana and not d.is_feriado: # conta as horas de dispensas if d.is_dispensa: total_horas_dispensa += horas_dispensa * 3600 # conta as horas de ferias if d.is_ferias: # soma horas do dia (8h periodo completo ou 4h meio periodo) total_horas_ferias += self.membro.carga_horaria * 60 * 60 m.update({'total': total_segundos_trabalhos_mes}) if self.membro.data_inicio > mes_corrente_ini: # Leva em conta a data de admissão do membro para a contagem das horas úteis do período total_horas_periodo = self.total_horas_uteis(self.membro.data_inicio, mes_corrente_fim) else: # as horas totais do período são as horas do total de dias do mes menos os finais de semana, # ferias e dispensas total_horas_periodo = self.total_horas_uteis(mes_corrente_ini, mes_corrente_fim) m.update({'total_horas_periodo': total_horas_periodo}) total_horas_restante = total_horas_periodo - total_horas_dispensa - total_horas_ferias - \ total_segundos_trabalhos_mes m.update({'total_horas_restante': total_horas_restante}) m.update({'total_horas_dispensa': total_horas_dispensa}) m.update({'total_horas_ferias': total_horas_ferias}) # soma horas extras somente dos meses que não forem o mês em andamento total_banco_horas = 0 if datetime.now().year != c.entrada.year or datetime.now().month != c.entrada.month: total_banco_horas = -total_horas_restante m.update({'total_banco_horas': total_banco_horas}) return meses
def test_dia_normal(self): f = Feriado.objects.create(feriado=date(2008, 2, 22)) # @UnusedVariable self.assertEquals(Feriado.dia_de_feriado(date(2007, 2, 22)), False) self.assertEquals(Feriado.dia_de_feriado(date(2007, 10, 8)), False)