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)