示例#1
0
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
示例#2
0
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()
示例#3
0
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
示例#4
0
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