+
    :maij                        R t ^ RIHtHtHt ^ RIHtHt ^ RIt^ RIt]P                  P                  ]P                  P                  ]P                  P                  ]P                  P                  ]P                  P                  ]P                  P                  ]4      4      4      4      4      4       ^ RIHt  ! R R4      tR tR# )u  
Módulo de Score de Producción.

Este módulo gestiona todo el flujo de visualización y análisis de órdenes:
1. Obtención de órdenes con filtros opcionales
2. Consulta de detalles individuales
3. Estadísticas y métricas generales
4. Exportación de datos

ARQUITECTURA:
=============
Este módulo sigue el patrón MVC:
- Model: ScoreProduccionSQL (consultas a BD - CM_Score)
- View: ScoreProduccion.html (template Jinja2)
- Controller: ScoreProduccionController (lógica de negocio)
)jsonifyrender_templaterequest)datetimedateN)ScoreProduccionSQLc                   ^   a  ] tR t^"t o RtR tRR ltR tR tV 3R lR lt	R	 t
R
 tRtV tR# )ScoreProduccionControlleru   
Controlador principal para el módulo de Score de Producción.

Esta clase maneja toda la lógica de negocio para visualizar y analizar
órdenes de producción desde la tabla CM_Score.
c                $    \        4       V n        R# )zInicializa el controlador.N)r   sql)selfs   &Zc:\Users\victor.cervantes\Desktop\Elep\src\App\Operaciones_Module\Lerma\ScoreProduccion.py__init__"ScoreProduccionController.__init__*   s    %'    Nc           
     @    \        R"4       \        R4       \        R!4       \        R4       V P                  V4      pV'       d'   \        R\        VP                  4       4       24       M\        R4       \        R4       V P                  P                  V4      pVR,          '       g%   \        RVR,           24       RR	R
RRVR,          /# VR,          p\        R\        V4       24       \        R4       V P                  V4      p\        R4       \        R4       V P                  V4      p\        R4       \        R"4       \        R4       \        R\        V4       24       \        RVP                  R^ 4      R R24       \        RVP                  R^ 4      R R24       \        R#4       RRRVR\        V4      RVRV/#   \         dG   p\        R\        T4       24       ^ RIpTP                  4        RR	R
R R\        T4      /u Rp?# Rp?ii ; i)$uY  
🎯 FUNCIÓN ORQUESTADORA PRINCIPAL

Esta función coordina todo el flujo de obtención de órdenes de producción.

FLUJO DE EJECUCIÓN:
1. Validar y procesar filtros (si existen)
2. Ejecutar consulta SQL con filtros
3. Procesar y enriquecer datos
4. Calcular estadísticas adicionales
5. Retornar respuesta estructurada

Args:
    filtros_json (dict, optional): Diccionario con filtros opcionales
        - departamento (str): Filtrar por departamento
        - vendedor (str): Filtrar por vendedor
        - proyecto (str): Filtrar por proyecto ID
        - fechaDesde (str): Fecha desde (ISO format)
        - fechaHasta (str): Fecha hasta (ISO format)
        - partNum (str): Filtrar por número de parte
        - orderNum (int): Filtrar por número de orden

Returns:
    dict: Respuesta estructurada con success, ordenes, estadísticas o errores
u4   🎯 INICIANDO OBTENCIÓN DE ÓRDENES DE PRODUCCIÓNu#   
🔍 PASO 1: Procesando filtros...u   ✅ Filtros activos: u   ℹ️  Sin filtros aplicadosu*   
💾 PASO 2: Consultando base de datos...successu   ❌ Error al obtener órdenes: errorFmensajeu(   Error al obtener órdenes de producciónordenesu   ✅ Órdenes obtenidas: u$   
🔧 PASO 3: Enriqueciendo datos...u   ✅ Datos enriquecidosu)   
📊 PASO 4: Calculando estadísticas...u   ✅ Estadísticas calculadasu$   🎉 ÓRDENES OBTENIDAS EXITOSAMENTEu   📊 Total de registros: u"   📈 Promedio avance producción: promedioAvanceProduccionz.2f%u"   📦 Promedio avance surtimiento: promedioAvanceSurtimientoTtotalestadisticasfiltros_aplicadosu   
❌ ERROR CRÍTICO: NError al procesar la solicitudP================================================================================Q
================================================================================zQ================================================================================
)print_procesar_filtroslistkeysr   obtener_todas_ordeneslen_enriquecer_ordenes_calcular_estadisticasget	Exceptionstr	traceback	print_exc)	r   filtros_jsonfiltros_procesadosresultado_ordenesr   ordenes_enriquecidasr   er*   s	   &&       r   obtener_ordenes_produccion4ScoreProduccionController.obtener_ordenes_produccion2   s5   4J	- HI&M
 89!%!7!7!E!-d3E3J3J3L.M-NOP56
 ?@ $ > >?Q R$Y//78I'8R7STUuI.w7  (	2G,S\N;<
 9:#'#;#;G#D *+
 >?667KLL01
 - 89-c2F.G-HIJ6|7G7GHbde7fgj6kklmn6|7G7GHcef7ghk6llmno-  4/12#%7   		*3q6(34! 5;Q 		s%   CG C:G H;HHHc           	         \        RV 24       V P                  P                  V4      pVR,          '       dN   VR,          '       d?   VR,          p\        RVP                  R4       RVP                  R4       24       RR	RV/# \        R
VR,           24       RRRRRVR,          /#   \         d3   p\        R\        T4       24       RRRRR\        T4      /u Rp?# Rp?ii ; i)u   
Obtiene el detalle completo de una orden específica.

Args:
    order_line_id (int): ID de OrderNum&Line (clave primaria)

Returns:
    dict: Respuesta con los datos de la orden o error
u&   
🔍 Obteniendo detalle de Orden ID: r   existeordenu   ✅ Orden obtenida: OrderNumz - PartNumTu   ❌ Orden no encontrada: r   Fr   zOrden no encontrada   ❌ ERROR: $Error al obtener detalle de la ordenN)r   r   obtener_orden_por_idr'   r(   r)   )r   order_line_id	resultadoorden_enriquecidar0   s   &&   r   obtener_detalle_orden/ScoreProduccionController.obtener_detalle_orden   s   	;M?KL55mDI##	((;(;$-g$6!,->-B-B:-N,OsSdShShirSsRtuv t. 
 1)G2D1EFGu4Yw/   	KAx()5AQ 	s*   AB+ 	=B+ #B+ +C(6'C#C(#C(c                6   V'       g   R# / pRRRRRRRRRRR	R
RR/pVP                  4        F  w  rEWA9   g   K  W,          '       g   K  W,          pRVP                  4       9   dL   \        V\        4      '       d6    \        P
                  ! VP                  RR4      4      P                  4       pVR8X  d#   \        V\        4      '       d    \        V4      pWbV&   K  	  V'       d   V# R#    \        RT 24        K  ; i   \        RT 24        K  ; i)z
Procesa y valida los filtros recibidos del frontend.

Convierte de camelCase (frontend) a snake_case (SQL).

Args:
    filtros_json (dict): Filtros en formato camelCase

Returns:
    dict: Filtros procesados en formato snake_case
NdepartamentovendedorproyectopartNumpart_numorderNum	order_num
fechaDesdefecha_desde
fechaHastafecha_hastafechaZ u$   ⚠️  No se pudo convertir fecha: u/   ⚠️  No se pudo convertir número de orden: )
itemslower
isinstancer)   r   fromisoformatreplacer   r   int)r   r,   r-   mapeo_filtros	key_camel	key_snakevalors   &&     r   r    +ScoreProduccionController._procesar_filtros   s"     N

z--
 %2$7$7$9 I(\-D-D$/ ioo//Juc4J4J! ( 6 6u}}S"7M N S S U +
5#0F0F! #E

 169-) %:, &8!ATA! DUGLM ! OPUwWX s   >4C/D/DDc                &   < V ^8  d   QhRS[ RS[ /# )   r5   return)dict)format__classdict__s   "r   __annotate__&ScoreProduccionController.__annotate__   s      D T r   c                    / R ^ bR^ bR^ bRRbRRbR^ bRRbRRbR	^ bR
^ bR^ bRRbRRbR^ bRRbRRbpVP                  4        F  w  r4VP                  V4      e   K  WAV&   K   	  V# )IssuedQty_MPreasignado_MDemandado_M	PartNum_MNAlternativa_MEn_PO_MPO_MNoPO_MIssuedQty_GPreasignado_GDemandado_G	PartNum_GAlternativa_GEn_PO_GPO_GNoPO_G)rO   r'   )r   r5   defaultskvs   &&   r   _normalizar_mg(ScoreProduccionController._normalizar_mg   s    

1

-q

2?

 

  /

 q	

 !$	

 )1$	

 1

 .q

 3@

 

  /

 q

 !$

 )1$

 NN$DAyy|#a % r   c                   . pV EF;  pVP                  4       pV P                  V4      pVP                  R4      '       dY    \        P                  ! VR,          P                  RR4      4      p\        P                  ! 4       V,
          P                  pWdR&   VP                  R4      '       d    \        P                  ! VR,          P                  RR4      4      pV\        P                  ! 4       ,
          P                  pWR&   V^ 8  d   RVR	&   R
VR&   M/V^8:  d   RVR	&   RVR&   MV^8:  d   RVR	&   RVR&   MRVR	&   RVR&    VP                  R4      p	V	f   Rp	V	^d8  d   RVR&   RVR&   M@V	^K8  d   RVR&   RVR&   M.V	^28  d   RVR&   RVR&   MV	^ 8  d   RVR&   RVR&   M
RVR&   RVR&   VP                  R4      p
VP                  R4      pV
f   ^ p
Vf   ^ pV
^ 8  d?   W,          ^d,          p\        V^4      VR &   V^28  d   R!VR"&   MV^P8  d   RVR"&   MR#VR"&   M
^ VR &   R$VR"&   VP                  V4       EK>  	  V#    RTR&    EL; i   RTR&   RTR	&   RTR&    EL; i)%u   
Enriquece los datos de órdenes con información calculada adicional.

Args:
    ordenes (list): Lista de órdenes originales

Returns:
    list: Lista de órdenes enriquecidas
	OrderDaterM   rN   DiasDesdOrdenN
NeedByDateDiasHastaRequeridaAtrasadaUrgenciadangerColorUrgenciaUrgentewarningu   PróximainfoNormalr   Desconocida	secondary   AvanceProducción        
CompletadoEstadoProduccionColorEstadoAvanzadoprimaryz
En ProcesoIniciado	PendienteInsumosDemandadosInsumosEmitidosPorcentajeEmisionu   CríticoAlertaMaterialOKzN/A)
copyrv   r'   r   rR   rS   nowdaysroundappend)r   r   r/   r5   r=   fecha_ordendias_desde_ordenfecha_requeridadias_hasta_requeridaavance_produccioninsumos_demandadosinsumos_emitidosporcentaje_emisions   &&           r   r%   -ScoreProduccionController._enriquecer_ordenes  s     "E %

 $ 3 34E F yy%%>"*"8"8{9K9S9STWY[9\"]K(0(D'J'J$9Io6
 yy&&E&.&<&<U<=P=X=XY\^`=a&bO,;hlln,L+R+R(>R&:; ,a/8B)*5=E)/:-28A)*5=F)/:-38B)*5=C)/:8@)*5=F)/: !&		*= > !($'! !C'8D!"453<!-0"b(8B!"453<!-0"b(8D!"4539!-0"Q&8B!"453<!-08C!"453>!-0
 "'+>!?$yy):; ")%&"'#$ !A%&6&Ks%R"9>?QST9U!"56%*:D%&67'",:E%&67:>%&679:!"566;!"23 ''(9:y | $#e>9=%o6,E>B%&:;4A%j19D%o6s,   AI1A(II,I>
III(c                H   V'       d   \        V4      ^ 8X  d   RRRRR^ R^ R/ R/ R/ /# ^ p^ p^ p^ pV FQ  pVP                  R	4      pVe   W',          pV^,          pVP                  R
4      pVf   K@  W8,          pV^,          pKS  	  V^ 8  d	   W$,          M^ p	V^ 8  d	   W5,          M^ p
\        \        R V 4       4      4      p/ pV F9  pVP                  R4      ;'       g    RpVP                  V^ 4      ^,           W&   K;  	  / pV F0  pVP                  RR4      pVP                  V^ 4      ^,           W&   K2  	  / pV F1  pVP                  RR4      pVP                  V^ 4      ^,           VV&   K3  	  R\        V	^4      R\        V
^4      R\        V4      RVRVRVRV/# )u   
Calcula estadísticas generales de las órdenes.

Args:
    ordenes (list): Lista de órdenes

Returns:
    dict: Diccionario con estadísticas calculadas
r   r   r   totalOrdenesordenesUnicasdistribucionDepartamentodistribucionUrgenciadistribucionEstadoProduccionr   AvanceDeSurtimientoc              3   t   "   T F.  qP                  R 4      '       g   K  VP                  R 4      x  K0  	  R# 5i)r6   N)r'   ).0r5   s   & r   	<genexpr>CScoreProduccionController._calcular_estadisticas.<locals>.<genexpr>  s)      eG5yyYcOd!6:!6!6Gs   88DepartamentozSin Departamentor~   r   r   Desconocido)r$   r'   setr   )r   r   suma_avance_produccionsuma_avance_surtimientocount_avance_produccioncount_avance_surtimientor5   avance_prodavance_surtpromedio_avance_produccionpromedio_avance_surtimientoordenes_unicasdistribucion_departamentodeptdistribucion_urgenciaurgenciadistribucion_estadoestados   &&                r   r&   0ScoreProduccionController._calcular_estadisticas  s    #g,!+*C+S*B&.  "#"#"##$ E))$78K&&5&'1,'  ))$9:K&'6'(A-(  (?'B '=&VHI 	# ,Da+G (?'YMN 	$ S eG eef %'!E99^,BB0BD.G.K.KDRS.TWX.X%+ 
 !#Eyy];H.C.G.GRS.TWX.X!+ 
 !EYY1=AF*=*A*A&!*Lq*P' 
 '.H!(L'/JA)NCL^&(A"$9*,?
 	
r   )r   )N)__name__
__module____qualname____firstlineno____doc__r   r1   r>   r    rv   r%   r&   __static_attributes____classdictcell__)r_   s   @r   r	   r	   "   s@     (dT&X2Bl ,j$XM
 M
r   r	   c                  a	 \        4       o	V P                  RR.R7      R 4       pV P                  RR.R7      R 4       pV P                  RRR.R7      V	3R	 l4       pV P                  R
R.R7      V	3R l4       pV P                  RR.R7      V	3R l4       pV P                  RR.R7      V	3R l4       pV P                  RR.R7      V	3R l4       p\        R4       R# )u   
Registra las rutas de Flask para el módulo de Score de Producción.

Args:
    app: Instancia de Flask
    mail: Instancia de Flask-Mail (no se usa en este módulo)
z"/Operaciones/Lerma/ScoreProduccionGET)methodsc                     \        R4      # )u_   
Renderiza la página HTML del módulo de Score de Producción.

Returns:
    HTML renderizado
z6Operaciones/Lerma/ScoreProduccion/ScoreProduccion.html)r    r   r   score_produccion_page8ejecutar_score_produccion.<locals>.score_produccion_page  s     WXXr   z'/Operaciones/Lerma/ScoreProduccion/testc                 t    \        RRRRR\        P                  ! 4       P                  R4      RRR	R
RR/4      # )uo   
Ruta de prueba para verificar que el backend funciona correctamente.

Returns:
    JSON con mensaje de éxito
r   Tr   u<   ¡Backend de Score de Producción funcionando correctamente!	timestampz%Y-%m-%d %H:%M:%Smodulou#   Score de Producción - Planta Lermaversionz1.0axios_ready)r   r   r   strftimer   r   r   test_score_produccion8ejecutar_score_produccion.<locals>.test_score_produccion  sH     tU001DE;u4
  	r   z2/Operaciones/Lerma/ScoreProduccion/obtener-ordenesPOSTc                 4  <  \        R4       \        R4       \        R4       Rp \        P                  R8X  d$   \        P                  ! 4       p \        RV 4       EM&\        P                  R8X  Ed   R\        P                  P                  R4      R\        P                  P                  R4      R\        P                  P                  R4      R	\        P                  P                  R	4      R
\        P                  P                  R
4      R\        P                  P                  R4      R\        P                  P                  R4      /p V P                  4        UUu/ uF  w  rVf   K  WbK  	  p pp\        RV 4       SP                  V 4      pVR,          '       d   ^MRp\        V4      V3# u uppi   \         dR   p\        R\        T4       24       ^ RIpTP                  4        \        RRRRR\        T4      /4      R3u Rp?# Rp?ii ; i)u   
Endpoint para obtener todas las órdenes de producción.

Acepta filtros opcionales vía query params (GET) o JSON (POST).

Returns:
    JSON con lista de órdenes y estadísticas
u*   📥 RECIBIENDO PETICIÓN /obtener-ordenesNr   u   📊 Filtros recibidos (POST):r   rA   rB   rC   rD   rF   rH   rJ   u   📊 Filtros recibidos (GET):r   i  u   
❌ ERROR EN ENDPOINT: Fr   r   r     r   r   )r   r   methodget_jsonargsr'   rO   r1   r   r(   r)   r*   r+   )filtrosrt   ru   r<   status_coder0   r*   
controllers          r   obtener_ordenes_endpoint;ejecutar_score_produccion.<locals>.obtener_ordenes_endpoint  s   +	- >?&M G~~'!**,6@5( #GLL$4$4^$D 0 0 < 0 0 <w||//	: 0 0 < ',,"2"2<"@ ',,"2"2<"@ -4MMOMODAq414OM5w? #==gFI "+9!5!5#3K9%{22 N  		-c!fX67!5;Q  	 		s=   EF; "F5/F55.F; $F; 5F; ;HAHHHz>/Operaciones/Lerma/ScoreProduccion/detalle/<int:order_line_id>c                  <  \        RV  24       SP                  V 4      pVR,          '       d   ^MRp\        V4      V3#   \         d>   p\        R\	        T4       24       \        RRRRR\	        T4      /4      R	3u R
p?# R
p?ii ; i)u   
Endpoint para obtener el detalle de una orden específica.

Args:
    order_line_id (int): ID de OrderNum&Line

Returns:
    JSON con datos de la orden
u   
📥 GET /detalle/r   i  r8   Fr   r9   r   r   N)r   r>   r   r(   r)   )r;   r<   r   r0   r   s   &   r   obtener_detalle_orden_endpointAejecutar_score_produccion.<locals>.obtener_detalle_orden_endpointB  s    	(89"88GI!*9!5!5#3K9%{22 	KAx()5AQ  	 	s"   -A A B
2B?B
B
z0/Operaciones/Lerma/ScoreProduccion/departamentosc                    <  SP                   P                  4       p \        V 4      ^3#   \         d'   p\        RRRRR\	        T4      /4      R3u Rp?# Rp?ii ; i)zj
Endpoint para obtener todos los departamentos disponibles.

Returns:
    JSON con lista de departamentos
r   Fr   zError al obtener departamentosr   r   N)r   !obtener_departamentos_disponiblesr   r(   r)   r<   r0   r   s     r   obtener_departamentos_endpointAejecutar_score_produccion.<locals>.obtener_departamentos_endpointb  sj    
	"HHJI9%s** 	5;Q  	 	   &* AAAAz-/Operaciones/Lerma/ScoreProduccion/vendedoresc                    <  SP                   P                  4       p \        V 4      ^3#   \         d'   p\        RRRRR\	        T4      /4      R3u Rp?# Rp?ii ; i)zd
Endpoint para obtener todos los vendedores disponibles.

Returns:
    JSON con lista de vendedores
r   Fr   zError al obtener vendedoresr   r   N)r   obtener_vendedores_disponiblesr   r(   r)   r   s     r   obtener_vendedores_endpoint>ejecutar_score_produccion.<locals>.obtener_vendedores_endpointz  sj    
	"EEGI9%s** 	58Q  	 	r   z//Operaciones/Lerma/ScoreProduccion/estadisticasc                    <  SP                   P                  4       p \        V 4      ^3#   \         d'   p\        RRRRR\	        T4      /4      R3u Rp?# Rp?ii ; i)ua   
Endpoint para obtener estadísticas generales del sistema.

Returns:
    JSON con estadísticas
r   Fr   u   Error al obtener estadísticasr   r   N)r   obtener_estadisticas_generalesr   r(   r)   r   s     r   obtener_estadisticas_endpoint@ejecutar_score_produccion.<locals>.obtener_estadisticas_endpoint  sj    
	"EEGI9%s** 	5;Q  	 	r   u;   ✅ Rutas de Score de Producción registradas correctamenteN)r	   router   )
appmailr   r   r   r   r   r   r   r   s
   &&       @r   ejecutar_score_produccionr     s#    +,J 	YY3eWYEY FY 	YY85'YJ K( 	YYCeU[_Y]4 ^4t 	YYOZ_Y`Ya b> 	YYAE7YS T. 	YY>YP Q. 	YY@5'YR S& 

GHr   )r   flaskr   r   r   r   r   sysospathr   dirnameabspath__file__2Consultas_SQL.Operaciones.Lerma.ScoreProduccionSQLr   r	   r   r   r   r   <module>r      s   " 4 3 # 
 	 PRPWPWP_P_`hPi@j0k lm n Qk
 k
dRIr   