Пример #1
0
def get_balanco_mes(vinculo, mes, ano, detalhado=False):
    calendario = FeriadosRioGrandeDoNorte()
    num_dias_mes = calendar.monthrange(ano, mes)[1]

    data_inicio = datetime.date(ano, mes, 1)
    data_fim = datetime.date(ano, mes, num_dias_mes)

    num_dias_uteis_mes = calendario.count_working_days(data_inicio, data_fim)
    horas_trabalhar = num_dias_uteis_mes * (vinculo.carga_horaria_diaria or 0)
    horas_trabalhar = timedelta(hours=horas_trabalhar)

    frequencias = get_registros_bolsista(vinculo, data_inicio, data_fim)
    ausencias = get_ausencias_bolsista(vinculo, data_inicio, data_fim)

    horas_registradas, horas_contabilizadas = get_total_horas_registradas_contabilizadas(
        frequencias)
    horas_abonadas_periodo = get_horas_abonadas_periodo(
        ausencias, calendario, data_inicio, data_fim)

    saldo_mes = horas_trabalhar - horas_contabilizadas - horas_abonadas_periodo

    if detalhado:
        return {
            'saldo_mes': saldo_mes,
            'horas_trabalhar': horas_trabalhar,
            'horas_registradas': horas_registradas,
            'horas_contabilizadas': horas_contabilizadas,
            'horas_abonadas_periodo': horas_abonadas_periodo,
        }

    return saldo_mes
Пример #2
0
def get_relatorio_mes(vinculo, mes, ano):

    registros = []
    horas_trabalhadas_periodo = timedelta()

    calendario = FeriadosRioGrandeDoNorte()
    feriados = calendario.holidays(ano)

    numero_dias = calendar.monthrange(ano, mes)[1]
    data_inicio = datetime.date(ano, mes, 1)
    data_fim = datetime.date(ano, mes, numero_dias)

    frequencias = get_registros_bolsista(vinculo, data_inicio, data_fim)
    ausencias = get_ausencias_bolsista(vinculo, data_inicio, data_fim)

    if not frequencias and not ausencias:
        return None

    for dia in range(1, numero_dias + 1):
        dia = datetime.date(ano, mes, dia)
        relatorio_dia = {'dia': dia}

        feriado = [feriado for feriado in feriados if feriado[0] == dia]

        relatorio_dia['feriado'] = feriado[0] if feriado else False

        ausencia = ausencias.filter(inicio__lte=dia, termino__gte=dia)
        relatorio_dia['ausencia'] = ausencia if ausencia.exists() else False

        registros_dia = frequencias.filter(created_at__date=dia)
        relatorio_dia['registros'] = registros_dia
        horas_trabalhadas = get_total_horas_trabalhadas(registros_dia)
        relatorio_dia['horas_trabalhadas'] = horas_trabalhadas
        horas_trabalhadas_periodo += horas_trabalhadas

        relatorio_dia['is_util'] = not relatorio_dia['feriado'] \
                 and not relatorio_dia['ausencia'] \
                 and super(FeriadosRioGrandeDoNorte, calendario).is_working_day(dia)

        registros.append(relatorio_dia)

    dias_uteis = calendario.count_working_days(data_inicio, data_fim)

    return {
        'registros':
        registros,
        'dias_uteis':
        dias_uteis,
        'total_horas_trabalhar':
        timedelta(hours=vinculo.carga_horaria_diaria) * dias_uteis,
        'horas_trabalhadas_periodo':
        horas_trabalhadas_periodo,
        'horas_abonadas_periodo':
        get_horas_abonadas_periodo(ausencias, calendario, data_inicio,
                                   data_fim),
        'saldo_mes_anterior':
        get_balanco_mes_anterior(vinculo, mes, ano),
    }
Пример #3
0
    def horas_sugeridas(self):
        calendario = FeriadosRioGrandeDoNorte()
        numero_dias_uteis = calendario.count_working_days(
            self.inicio, self.termino)
        horas_sugeridas = self.vinculo.carga_horaria_diaria * numero_dias_uteis

        if not horas_sugeridas:
            return timedelta()

        horas_sugeridas = timedelta(hours=horas_sugeridas)
        from frequencia.relatorios.calculos import get_total_horas_registradas_contabilizadas
        registros = self.vinculo.registros.filter(
            created_at__date__gte=self.inicio,
            created_at__date__lte=self.termino)
        horas_registradas, horas_contabilizadas = get_total_horas_registradas_contabilizadas(
            registros)

        horas_sugeridas = horas_sugeridas - horas_registradas
        return horas_sugeridas if horas_sugeridas.days >= 0 else timedelta()
Пример #4
0
 def horas_sugeridas(self):
     calendario = FeriadosRioGrandeDoNorte()
     numero_dias_uteis = calendario.count_working_days(
         self.inicio, self.termino)
     horas_sugeridas = self.vinculo.carga_horaria_diaria * numero_dias_uteis
     return timedelta(hours=horas_sugeridas)
Пример #5
0
    def __init__(self, **kwargs):
        super(HomeTemplateView, self).__init__(**kwargs)

        self.calendario = FeriadosRioGrandeDoNorte()
        self.data_atual = datetime.datetime.now()
Пример #6
0
class HomeTemplateView(LoginRequiredMixin, TemplateView):
    def __init__(self, **kwargs):
        super(HomeTemplateView, self).__init__(**kwargs)

        self.calendario = FeriadosRioGrandeDoNorte()
        self.data_atual = datetime.datetime.now()

    def dispatch(self, request, *args, **kwargs):
        self.user = self.request.user
        return super(HomeTemplateView, self).dispatch(request, *args, **kwargs)

    def get_bolsistas_por_setor(self):
        setores = get_setores(self.user)

        return Vinculo.objects.filter(
            group__name="Bolsista",
            ativo=True,
            user__is_active=True,
            setor__in=setores).annotate(
                numero_bolsistas=Count('setor')).order_by('setor')

    def get_justificativas_pendentes(self):
        return JustificativaFalta.objects.filter(
            status=0, vinculo__in=self.bolsistas).count()

    def get_ultimos_registros(self):
        return Frequencia.objects.filter(
            bolsista__in=self.bolsistas).order_by('-pk')[:10]

    def get_num_bolsistas_trabalhando(self):
        data_hoje = self.data_atual.date()
        num_bolsistas_dia = Frequencia.objects.filter(
            created_at__date=data_hoje, tipo=0,
            bolsista__in=self.bolsistas).count()
        return num_bolsistas_dia

    def get_bolsas_expirando(self):
        hoje = datetime.datetime.now().date()
        dia_final = hoje + timedelta(days=90)
        return self.bolsistas.filter(group__name='Bolsista',
                                     ativo=True,
                                     user__is_active=True,
                                     termino_vigencia__lte=dia_final)

    def get_context_data(self, **kwargs):
        context = super(HomeTemplateView, self).get_context_data(**kwargs)
        self.bolsistas = get_bolsistas(self.user)

        context['dias_uteis'] = self.calendario.count_working_days_month(
            self.data_atual.month, self.data_atual.year)
        context['ultimos_registros'] = self.get_ultimos_registros()
        context['justificativas'] = self.get_justificativas_pendentes() or None

        if self.user.has_perm('accounts.is_servidor'):
            self.template_name = 'home/home_servidor.html'
            context[
                'num_bolsistas_trabalhando'] = self.get_num_bolsistas_trabalhando(
                )
            context['bolsas_expirando'] = self.get_bolsas_expirando()

            if self.user.has_perm('accounts.is_gestor_coordenador'):
                context['bolsistas_por_setor'] = self.get_bolsistas_por_setor()
            elif self.user.has_perm('accounts.is_chefe'):
                context['bolsistas_setor'] = self.bolsistas

        elif self.user.has_perm('accounts.is_bolsista'):
            self.template_name = 'home/home_bolsista.html'
            bolsista = self.bolsistas.first()
            balanco_mes = get_balanco_mes(bolsista, self.data_atual.month,
                                          self.data_atual.year)
            balanco_mes_anterior = get_balanco_mes_anterior(
                bolsista, self.data_atual.month, self.data_atual.year)

            context['dados_bolsista'] = bolsista
            context['balanco_mes'] = balanco_mes + balanco_mes_anterior
            context['ultimos_registros'] = context['ultimos_registros'][:6]

        else:
            self.template_name = 'home/home_externo.html'

        return context