Exemplo n.º 1
0
 def genera_correlativo(self, unidad_operativa_pk):
     codigo = genera_codigo(unidad_operativa_pk, CORRELATIVO_INCIDENTE)
     return codigo
Exemplo n.º 2
0
def get_generar_nombrada(inicio, termino, anuncio, area, solicitados_sin, requerimientos, unidad_operativa_pk):
    ''' Generamos un nuevo registro de nombrada si la información es válida '''
    resultado = {"estado": 'error'}

    if not requerimientos:
        resultado['msg'] = 'Debe ingresar los requerimientos solicitados'
        return JsonResponse(resultado)
    unidad_operativa = OperatingUnit.objects.get(pk=unidad_operativa_pk)

    #se busca todos los trabajdores aptos para esa nombrada
    #luego se tiene que comparar con lo solicitado
    trabajadores_lista = get_lista_trabajadores(inicio, termino, unidad_operativa)
    trabajadores = {str(t.id): t for t in trabajadores_lista}
    for s in solicitados_sin:
        if s not in trabajadores.keys():
            resultado['msg'] = 'Trabajador no se encuentra en la lista de trabajadores para hacer nombrada'
            return resultado
        if not trabajadores[s].sin_rotacion:
            resultado['msg'] = 'Trabajador '+trabajadores[s].nombre+' no se encuentra en la lista de trabajadores sin rotacion para hacer nombrada'
            return resultado
        if not trabajadores[s].seleccionable:
            resultado['msg'] = 'Trabajador '+trabajadores[s].nombre+' no se encuentra apto para hacer nombrada'
            return resultado
    _requerimientos = json.loads(requerimientos)
    trabajadores_nombrada_con = {}
    trabajadores_aptops_con = [x for x in trabajadores_lista if x.seleccionable and x.id not in solicitados_sin]
    trabajadores_nombrada_sin = [x for x in trabajadores_lista if x.seleccionable and x.id in solicitados_sin]
    for requerimiento in _requerimientos:
        _especialidad = requerimiento.get(ESPECIALIDAD, '')
        _cantidad = requerimiento.get(CANTIDAD, '')
        cuadrilla = requerimiento.get(CUADRILLA_STR, '')
        asignacion = requerimiento.get(ASIGNACION, '')
        try:
            especialidad = int(_especialidad)
        except ValueError:
            continue

        try:
            cantidad = int(_cantidad)
        except ValueError:
            continue
        # si no tiene especialidad o la cuadrilla, continua con el siguiente requerimiento
        if not especialidad or not cantidad or not cuadrilla:
            continue

        contador = 0
        for n in range(cantidad):

            coincide = False
            for item in trabajadores_aptops_con:

                if item.id in trabajadores_nombrada_con:
                    continue

                # si el trabajdor cumple
                if (item.especialidad1 == especialidad):
                    coincide = True
                elif item.especialidad2:
                    if (item.especialidad2 == especialidad):
                        coincide = True

                if coincide:
                    break
            if coincide:
                trabajadores_nombrada_con[item.id] = (especialidad, cuadrilla, asignacion)
                contador += 1
        # si lo contado es diferente a lo solicitado
        # se muestra el error
        if contador < cantidad:
            especialidad_item = Specialty.objects.get(pk=especialidad)
            resultado['msg'] = "Faltan " + str(cantidad - contador) + " colaboradores para cubrir la necesidad de la especialidad : " + especialidad_item.nombre
            return resultado

    area_item = Area.objects.get(pk=area)
    # creando nueva nombrada
    nombrada = Appoint()

    # correlativo
    nombrada.codigo = genera_codigo(unidad_operativa_pk, CORRELATIVO_NOMBRADA)

    nombrada.tipo = NOMBRADA_AREA
    nombrada.unidad_operativa = unidad_operativa
    nombrada.area = area_item
    nombrada.fecha_inicio = inicio.date()
    nombrada.hora_inicio = inicio.time()
    nombrada.fecha_termino = termino.date()
    nombrada.hora_termino = termino.time()
    nombrada.estado = NOMBRADA_ESTADO_SOLICITADO

    if anuncio:
        nombrada.tipo = NOMBRADA_ESCALA
        anuncio_item = Advertisement.objects.get(pk=43)
        nombrada.anuncio = anuncio_item

    try:

        nombrada.save()
    except:
        resultado['msg'] = u'Sucedió un error al guardar la nombrada.'
        return resultado
    # guardando los que son sin rotacion
    for item in trabajadores_nombrada_sin:
        detalle = AppointDetail()
        detalle.nombrada = nombrada
        detalle.tipo = NOMBRADA_PERSONAL_SIN
        detalle.trabajador_id = item.id
        detalle.especialidad_id = item.especialidad1_id

        try:
            detalle.save()
        except:
            resultado['msg'] = u'Error al guardar el deatalle de la nombrada (sin rotación)'
            return resultado

    ESPECIALIDAD_INDICE = 0
    CUADRILLA_INDICE = 1
    ASIGNACION_INDICE = 2

    # para la especialidad
    especialidades_con = Specialty.objects.filter(sin_rotacion=False)

    for trabajador_id in trabajadores_nombrada_con.keys():
        detalle = AppointDetail()

        detalle.nombrada = nombrada
        detalle.tipo = NOMBRADA_PERSONAL_CON

        tupla = trabajadores_nombrada_con[trabajador_id]

        trabajador = Employee.objects.get(pk=trabajador_id)
        especialidad = especialidades_con.get(pk=tupla[ESPECIALIDAD_INDICE])
        detalle.trabajador = trabajador
        detalle.especialidad = especialidad
        detalle.cuadrilla = tupla[CUADRILLA_INDICE]
        detalle.asignacion = tupla[ASIGNACION_INDICE]

        try:
            detalle.save()
        except:
            resultado['msg'] = u'Error al guardar el detalle de la nombrada (con rotación)'
            return resultado
    resultado["nombrada"] = nombrada.id
    resultado["estado"] = 'ok'

    return resultado