Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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
Example #8
0
    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)
Example #9
0
    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)