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
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), }
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()
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)
def __init__(self, **kwargs): super(HomeTemplateView, self).__init__(**kwargs) self.calendario = FeriadosRioGrandeDoNorte() self.data_atual = datetime.datetime.now()
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