def get_trabajadores_activos_list(fecha_inicio, fecha_termino): suspensiones = Stopping.objects.all() subsidios = Subsidy.objects.all() lista_trabajadores_no_activos = [] for suspension in suspensiones: if not suspension.trabajador in lista_trabajadores_no_activos: time_aux = time(00, 00, 00) suspension_fecha_baja = datetime.combine(suspension.fecha_baja, time_aux) if suspension.fecha_alta: if get_minutos_en_intervalos(fecha_inicio, fecha_termino, suspension.fecha_baja, suspension.fecha_alta) >= 0: lista_trabajadores_no_activos.append( suspension.trabajador.pk) elif fecha_inicio >= suspension_fecha_baja: lista_trabajadores_no_activos.append(suspension.trabajador.pk) for subsidio in subsidios: if not subsidio.trabajador in lista_trabajadores_no_activos: if get_minutos_en_intervalos(fecha_inicio, fecha_termino, subsidio.fecha_baja, subsidio.fecha_alta) >= 0: lista_trabajadores_no_activos.append(subsidio.trabajador.pk) lista_trabajadores_no_activos = Employee.objects.exclude( pk__in=lista_trabajadores_no_activos) return lista_trabajadores_no_activos
def get_lista_intervalos_agrupados(lista_fechas_trabajadores): lista_intervalos_agrupados = {} correlativo = 0 for trabajador_fecha in lista_fechas_trabajadores: intersection = False for intervalo in lista_intervalos_agrupados.values(): if get_minutos_en_intervalos(intervalo.inicio, intervalo.termino, trabajador_fecha.inicio) > 0: nuevo_intervalo = get_unir_intervalos(intervalo.inicio, intervalo.termino, trabajador_fecha.inicio) intervalo.start = nuevo_intervalo.start intervalo.end = nuevo_intervalo.end intervalo.description += "/" + trabajador_fecha.codigo_nombrada intersection = True break if not intersection: nuevo_intervalo = Intervalo() nuevo_intervalo.start = trabajador_fecha.inicio nuevo_intervalo.end = trabajador_fecha.termino nuevo_intervalo.description = trabajador_fecha.codigo_nombrada correlativo += 1 lista_intervalos_agrupados[correlativo] = nuevo_intervalo return lista_intervalos_agrupados.values()
def get_tiempos_trabajadores_dict(params): tiempos_trabajadores_dict = {} for trabajador_id, lista_fechas_trabajadores in params.fechas_trabajadores_dict.items(): trabajador_tiempo = TrabajadorTiempo() for trabajador_fecha in lista_fechas_trabajadores: #ini = trabajador_fecha[0] #fin = trabajador_fecha[1] # Si no pertenece al año vamos al siguiente if not trabajador_fecha.inicio.year == params.inicio_nombrada.year: continue # Si no pertenece al mes vamos al siguiente if not trabajador_fecha.inicio.month == params.inicio_nombrada.month: continue turnos_formato_fecha = get_turnos_formato_fecha(params.inicio, params.termino, params.turnos) for turno_formato_fecha in turnos_formato_fecha: # si no existe interseccion se va al siguiente turno if get_minutos_en_intervalos(turno_formato_fecha.inicio, turno_formato_fecha.termino, trabajador_fecha.inicio, trabajador_fecha.termino) <= 0: continue # Acumulando la cantidad de turnos, minutos y minutos de almuerzo por mes trabajador_tiempo.cantidad_turnos_mes += 1 trabajador_tiempo.minutos_mes += turno_formato_fecha.minutos trabajador_tiempo.minutos_almuerzo_mes += turno_formato_fecha.minutos_almuerzo # Si es de la misma semana de la solicitud de nombrada, se acumula por esa semana if (params.inicio.isocalendar()[1] == turno_formato_fecha.inicio.isocalendar()[1]): trabajador_tiempo.cantidad_turnos_semana += 1 trabajador_tiempo.minutos_semana += turno_formato_fecha.minutos trabajador_tiempo.minutos_almuerzo_semana += turno_formato_fecha.minutos_almuerzo # se asume que el almuerzo siempre esta en el horario del turno # se quita la cantidad de minutos que corresponden a los almuerzos trabajador_tiempo.minutos_mes -= trabajador_tiempo.minutos_almuerzo_mes trabajador_tiempo.minutos_semana -= trabajador_tiempo.minutos_almuerzo_semana tiempos_trabajadores_dict[trabajador_id] = trabajador_tiempo return tiempos_trabajadores_dict
def get_trabajadores_excluidos_dict(params): trabajadores_excluidos = {} MAXIMO_TURNOS_MES = 26 MAXIMO_TURNOS_NOMBRADA = 2 # Calculando la cantidad de turnos que tiene la nombrada solicitada cantidad_turnos_nombrada_solicitada = get_cantidad_turnos(params.inicio_nombrada, params.termino_normbrada, params.turnos) for trabajador_id, lista_fechas_trabajadores in params.fechas_trabajadores_dict.items(): for trabajador_fecha in lista_fechas_trabajadores: if get_minutos_en_intervalos(trabajador_fecha.inicio, trabajador_fecha.termino, params.inicio, params.termino) > 0: trabajador_exluido = TrabajadorExcluido() trabajador_exluido.causa = 'Se encuentra asignado en nombrada : ' + trabajador_fecha.codigo_nombrada trabajadores_excluidos[trabajador_id] = trabajador_exluido break for trabajador_id, trabajador_tiempo in params.tiempos_trabajadores_dict.items(): if trabajador_tiempo.cantidad_turnos_mes + cantidad_turnos_nombrada_solicitada > MAXIMO_TURNOS_MES: elapsed = abs( MAXIMO_TURNOS_MES - ( trabajador_tiempo.cantidad_turnos_mes + cantidad_turnos_nombrada_solicitada)) trabajador_exluido = TrabajadorExcluido() trabajador_exluido.causa = 'Superaría en (' + str( elapsed) + ') al máximo de turnos permitidos(26)' trabajadores_excluidos[trabajador_id] = trabajador_exluido for trabajador_id, lista_fechas_trabajadores in params.fechas_trabajadores_dict.items(): if trabajador_id in trabajadores_excluidos.keys(): continue # Se agrega la nombrada solicitada a la lista de fechas del trabajados lista_fechas_trabajadores.append( (params.inicio, params.termino, 'Nueva nombrada')) intervalos_agrupados = get_lista_intervalos_agrupados( lista_fechas_trabajadores) for grupo in intervalos_agrupados: cantidad_turnos_grupo = get_cantidad_turnos(grupo.inicio, grupo.termino, params.turnos) if cantidad_turnos_grupo > MAXIMO_TURNOS_NOMBRADA: trabajador_exluido = TrabajadorExcluido() trabajador_exluido.causa = 'Generaria turnos consecutivos en : ' + grupo.descripcion trabajadores_excluidos[trabajador_id] = trabajador_exluido break return trabajadores_excluidos