def genera_correlativo(self, unidad_operativa_pk): codigo = genera_codigo(unidad_operativa_pk, CORRELATIVO_INCIDENTE) return codigo
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