+
    i!!                    h   ^ RI HtHtHtHtHtHtHt ^ RIH	t	 ^ RI
t
^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RIt^ RIHt ^ RIHtHt ^ R	IHt ^ R
IHt ^ RIHtHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(Ht ]
PR                  ! R4      t*R t+R t,R t-R R lt.R R lt/R R lt0R R lt1R R lt2R t3R t4R# )    )apprender_templaterequestsessionjsonifyredirecturl_for)wrapsNdatetime)ListDict)Path)IS_PRODUCTION)verificar_configuracion upload_document_to_existing_docs)upload_document)
CRMManager)buscar_oportunidad_crminsert_CRM_CONTACTverificar_oportunidad_existentecrear_actualizar_oportunidadobtener_quotation_type_idcrear_formulario_headcrear_formulario_detailsobtener_seller_user_idobtener_nombre_usuariocrear_tarea_cotizaciondebe_crear_tareaactualizar_formulario_con_docsget_FormID_by_TaskIDr   cotizaciones_especialesc                N  a  S P                   ! R4      V 3R l4       p S P                   ! R4      R 4       pS P                   ! RR.R7      R 4       pS P                   ! RR.R7      V 3R	 l4       pS P                   ! R
R.R7      R 4       pS P                   ! RR.R7      R 4       pR# )u   
Función principal que registra todas las rutas del módulo de cotizaciones especiales

Args:
    app: Instancia de Flask
    mail: Instancia del sistema de mail
z)/Ventas/Cotiz/EspecialSolicitud/GetConfigc                 h  <  \        RRRSP                  P                  R4      RSP                  P                  R4      RSP                  P                  R4      /4      #   \         dF   p \        P                  R\        T 4       24       \        RRR	\        T 4      /4      R
3u Rp ? # Rp ? ii ; i)uR   
Endpoint para que el frontend consulte el modo de operación (Prototipo o Real).
successTPROTOTIPO_MODE	PROTOTIPOPROTOTIPO_INTERFAZEMAIL_PROTOTYPE_MODEu$   ❌ Error al obtener configuracion: Ferror  N)r   configget	Exceptionloggerr*   str)er   s    hC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Ventas_Module\Cotiz\CotizEspSolicitud.pyget_cotiz_config-cotiz_esp_solicitud.<locals>.get_cotiz_config3   s    

	E4 #**.."=$szz~~6J'K&

7M(N	    	ELL?AxHIIugs1v>?DD	Es   AA! !B1,:B,&B1,B1c            	      p    ^ RI Hp   \        R\        V P                  P                  RR4      4      /4      # )r   current_app	prototipor'   F)flaskr7   r   boolr,   r-   r6   s    r2   is_prototipo)cotiz_esp_solicitud.<locals>.is_prototipo   s;    %	 k0044[%HI
  	    z-/Ventas/Cotiz/EspecialSolicitud/InsertContactPOST)methodsc            	     (   \         P                  ! RR7      p V '       g   \        RRRR/4      R3# V P                  R4      pV P                  R	4      pV P                  R
4      pV'       d   V'       d	   V'       g   \        RRRR/4      R3#  \	        VVV4      pVf   \        RRRR/4      R3# \        RRRV/4      ^3#   \
         dF   p\        P                  R\        T4       24       \        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)zH
Inserta un contacto en Q_CRM y devuelve el OpportunityNumber generado.
T)silentr%   Fr*   u   Se esperaba JSON válido.  contactNamecontactNumbercontactEmailzFaltan campos obligatorios.Nz No se pudo crear la oportunidad.r+   opportunityNumberzError en InsertContact: )	r   get_jsonr   r-   r   r.   r/   r*   r0   )datarC   rD   rE   new_opportunityr1   s         r2   insert_contact_endpoint4cotiz_esp_solicitud.<locals>.insert_contact_endpoint   s]    t,54   
 hh}-1xx/ -|56   
	0O &u?     4#_   
  	LL3CF8<=5Q   	s$   !C 0C D:DDDz1/Ventas/Cotiz/EspecialSolicitud/BuscarOportunidadc                 n  <  \         P                  ! 4       p V R,          pSP                  P                  R4      '       de   \        P                  RV 24       \        V4      p\        V4      pV'       d   \        RRRVRR/4      ^3# \        RR	R
RRV R2RRRR//4      R3# \        P                  RV 24       \        P                  R4       \        P                  RSP                  P                  R4       24       \        P                  RSP                  P                  R4       24       \        P                  RSP                  P                  R4       24       \        P                  R4       \        P                  R4       \        SP                  R7      p\        P                  R4       VP                  V4      pRVP                  R4      RVP                  R 4      R!VP                  R"4      R#VP                  R$4      R%VP                  R&4      R'VP                  R(4      R)VP                  R*4      R+VP                  R,4      R-VP                  R.4      R/R0R1VP                  R24      R3VP                  R44      R5R6R7R6/p\        P                  R8V R924       \        RRRVRR:/4      ^3#   \         dL   p\        P                  R;\        T4       24       \        RR	R
R\        T4      RR<RR//4      R3u R=p?# R=p?i\         d`   p\        P                  R>\        T4       24       \        RR	R
RR?RR@RRARBRC\        T4      P!                  RDR64      ///4      RE3u R=p?# R=p?i\"         dC   p\        P                  RF\        T4       24       \        RR	R
RRGRRHRR
//4      RI3u R=p?# R=p?i\$         dh   p\        P                  RJ\        T4       2RRK7       \        RR	R
RRLRRMRR
RN\&        P(                  ! 4       P+                  4       //4      RI3u R=p?# R=p?ii ; i)Ozf
Busca una oportunidad. Usa la BD local si PROTOTIPO=True.
Se conecta al CRM real si PROTOTIPO=False.
opportunity_numberr'   u7   ⚠️ MODO PROTOTIPO: Buscando oportunidad local SQL: r%   TrH   messagez/Oportunidad (prototipo) encontrada en BD local.Fr*   zLa oportunidad z" no existe en la BD de prototipos.codePROTOTYPE_NOT_FOUND
alert_typeinfoi  u,   ✅ MODO REAL: Buscando oportunidad en CRM: zB--- DEBUG: Verificando app.config ANTES de llamar a CRMManager ---zDEBUG: Valor de PROTOTIPO: zDEBUG: Valor de BC_TENANT_ID: BC_TENANT_IDzDEBUG: Valor de BC_ENV_NAME: BC_ENV_NAMEu&   --- DEBUG: Fin de la verificación ---zIntentando crear CRMManager...)r,   zCRMManager creado exitosamente.CRM_OpportunityNumberNoCRM_ContactNameContactNameCRM_ContactTypeContactTypeCRM_AssignedSalespersonSalespersonNameCRM_ContactEmailContactEMailCRM_ContactAdressAddressCRM_ContactColoniaColonyCRM_ContactCityCityCRM_ContactStateCountyCRM_ContactCountryMXCRM_ContactZipPostCodeCRM_ContactNumberPhoneCRM_ContactID CRM_ContactLegalIdentifierzOportunidad z  encontrada y mapeada desde CRM.z-Oportunidad encontrada exitosamente en el CRMz"Oportunidad no encontrada en CRM: CRM_OPPORTUNITY_NOT_FOUNDNu    Campo faltante en la petición: u!   Datos incompletos en la peticiónMISSING_FIELDwarningdetailsmissing_field'rB   u0   Error de conexión en búsqueda de oportunidad: uM   Error de conexión con la base de datos. Intente nuevamente en unos momentos.DATABASE_CONNECTION_ERRORr+   u.   Error inesperado en búsqueda de oportunidad: exc_infoOError interno del servidor. Si el problema persiste, contacte al administrador.INTERNAL_SERVER_ERROR	timestamp)r   rG   r,   r-   r/   rR   floatr   r   r   get_opportunity_context
ValueErrorrr   r0   KeyErrorr*   replaceConnectionErrorr.   r   now	isoformat)	rH   opportunity_number_rawnumero_oportunidad_floatoportunidadcrm_managercontexto_crmoportunidad_mapeadar1   r   s	           r2   buscar_oportunidad/cotiz_esp_solicitud.<locals>.buscar_oportunidad   s   I	##%D%)*>%?" zz~~k** UVlUmno ,11G+H(45MN"!4!#T$  	  #!5%9O8PPr's"$9(&"$    JKaJbcd `a 9#**..:U9VWX <SZZ^^N=[<\]^ ;CJJNN=<Y;Z[\DE <=(

;=>  +BBCYZ ,\-=-=d-C%|'7'7'F%|'7'7'F-|/?/?@Q/R&(8(8(H')9)9))D(,*:*:8*D%|'7'7'?&(8(8(B($$l&6&6z&B')9)9')B#R0"'#$ l+A*BBbcdt/N   	   		NN?AxHI5s1v7 &     	LL;CF8DE5BO )'QR)@ 	
 
 
 
  		LLKCPQF8TU5n7 '     	LLI#a&R]aLb5p3 '!9!9!;	   	s|   >J; AJ; J; &HJ; ;P4A LP4P4P4AM4.P44P4P47N?9P4?P4P4AP/)P4/P4z&/Ventas/Cotiz/EspecialSolicitud/Enviarc                     \         P                  '       d&   R\         P                  9   d   \        \         4      p M\         P                  ! 4       p V '       g-   \        P                  R4       \        RRRRRRR	R
R//4      R3# \        P                  ! R4      pV'       g-   \        P                  R4       \        RRRRRRRR
R//4      R3# \        P                  RV 24       \        V 4      pVR,          '       g   \        RRRRVR,          RRR
R//4      R3# \        W4      pVR,          '       d   \        P                  RV 24       RpVP                  R^ 4      ^ 8  d    VP                  R^ 4      pVRV R2,          p\        RRRVRRVR,          RVR,          RVR,          RVP                  R. 4      RVP                  R^ 4      //4      ^3# \        RRRRVR,          RVR,          R
VR
,          //4      VR ,          3#   \         dh   p\        P                  R!\        T4       2RR"7       \        RRRRR#RR$R
RR%\        P                   ! 4       P#                  4       //4      R&3u R'p?# R'p?ii ; i)(u   
Procesa el envío de solicitud de cotización especial
ACTUALIZADO: Manejo mejorado de FormData con archivos

Returns:
    JSON con resultado del procesamiento
zmultipart/form-datau*   Petición sin datos en envío de solicitudr%   Fr*   rN   u,   Petición inválida - no se recibieron datosrO   INVALID_REQUESTrQ   rr   rB   user_idz2Usuario no autenticado intentando enviar solicitudzUsuario no autenticadoNOT_AUTHENTICATEDi  u:   Procesando solicitud de cotización especial para UserID: validVALIDATION_ERRORz.Solicitud procesada exitosamente para UserID: u-   Solicitud de cotización enviada exitosamentearchivos_subidos con z documento(s)TrH   opportunity_idforms_createdtasks_generateddocs_idsstatus_codeu)   Error inesperado en envío de solicitud: rw   ry   rz   r{   r+   N)r   content_type"procesar_form_data_con_archivos_v3rG   r/   rr   r   r   r-   rR   validar_estructura_solicitudprocesar_solicitud_cotizacionr.   r*   r0   r   r   r   )rH   r   validation_resultresultado_procesamientorN   archivos_countr1   s          r2   enviar_solicitud-cotiz_esp_solicitud.<locals>.enviar_solicitud  s	   [	###(=AUAU(U9'B '')KLu!#Q 1$i     kk),GSTu!#; 3$i     KKTU\T]^_ !=T B$W--u!#4Y#? 2$i     'DD&R#&y11LWIVW J*../A1EI%<%@%@ASUV%WN~&6mDDGtw(*ABR*S')@)Q)+BCT+U"$;$?$?
B$O*,C,G,GHZ\],^
  
 
 
 u!#:9#E 7 ?$&=l&K   ,M:; ;  
	LLDSVHMX\L]5p3 '!9!9!;	   
	sJ   H AH +H H $+H AH  B;H 2H JAI<6J<Jz3/Ventas/Cotiz/EspecialSolicitud/DiagnosticoArchivosGETc            	     &    \        4       p \        RRRV R\        P                  ! 4       P	                  4       /4      ^3#   \
         dF   p\        P                  R\        T4       24       \        RRR\        T4      /4      R3u R	p?# R	p?ii ; i)
u`   
Endpoint para verificar la configuración del sistema de archivos
Solo para desarrollo/testing
r%   Tdiagnosticor{   u   Error en diagnóstico: Fr*   r+   N)	r   r   r   r   r   r.   r/   r*   r0   )config_resultr1   s     r2   diagnostico_archivos1cotiz_esp_solicitud.<locals>.diagnostico_archivos  s    	35M4}X\\^557  	   	LL23q6(;<5Q   	s   =A   B:BBBN)route)r   mailr3   r;   rJ   r   r   r   s   f&      r2   cotiz_esp_solicitudr   *   s     	YY:;E <E"hT 	YY:; < 	YY>Q2 R2j 	YYBVHUN VN` 	YY7&Jc KcL 	YYDugV Wr=   c                    RV 9  d   RRRR/# RV 9  d   RRRR/# RV 9  d   RRRR	/# V R,          p. ROpV F5  pVP                  VR
4      P                  4       '       d   K+  RRRRV R2/u # 	  V R,          '       d   \        V R,          4      ^ 8X  d   RRRR/# RRRR/#   \         d2   p\        P                  R\        T4       24       RRRR/u Rp?# Rp?ii ; i)u   
Valida la estructura de los datos recibidos

Args:
    data (dict): Datos de la solicitud

Returns:
    dict: Resultado de validación
r   r   FrN   zFaltan datos de la oportunidadformularioGeneralz#Faltan datos del formulario generalformulariosEspecificosu(   Faltan datos de formularios específicosrn   z	El campo z es obligatoriou@   Debe seleccionar al menos un tipo de formulario para cotizaciónTu   Validación exitosau$   Error en validación de estructura: u%   Error interno en validación de datosN)rU   rW   r]   )r-   striplenr.   r/   r*   r0   )rH   r   campos_obligatorioscampor1   s   &    r2   r   r      s   T$UI/OPPd*UI/TUU#4/UI/YZZ =)^(E??5"-3355	Yug_3UVV )
 ,--T:R5S1TXY1YUI/qrry*?@@ T;CF8DE	+RSSTsD   B# B# B# 5B# #B# /B#  B# B# #C.&CCCc                .    V R,          R,          p \        V4      pT'       d4   TR,          ^,           pT RT 2p\
        P                  RT RT 24       M$^pT RT 2p\
        P                  RT RT 24       \        T R,          TT4      p	T	R,          '       g   T	# . p
. p\        T R,          TT4      pTR,          '       d1   T
P                  TR,          4       TP                  TR ,          4       \
        P                  R!T 24       T R",           FQ  p\        TTT4      pTR,          '       g   K!  T
P                  TR,          4       TP                  TR ,          4       KS  	  ^ p. pR#T 9   d   T R#,          '       d   \        T R#,          4      ^ 8  dv   \        T R#,          TT
T4      pTR,          '       d0   TR$,          pTR%,          p\
        P                  R&T R'T R(24       M"\
        P                  R)T R'TR	,           24        \        T TTTT
TTTR*7      pTR,          '       g$   \
        P                  R+T R'TR,,           24       M#\
        P                  R-T R'TR,,           24        \
        P                  R/T R0\        T
4       R1\        T4       R2T 24       RR3R4TR5T
R6TR7TR%T/#   \         d   p\        T4      pTP                  R4      '       dE   TP	                  R4      ^,          p\
        P                  RT RT 24       RRR	R
RRRRRR/u Rp?# TP                  R4      '       dE   TP	                  R4      ^,          p\
        P                  RT RT 24       RRR	RRRRRRR/u Rp?# ThRp?ii ; i  \          d0   p\
        P#                  R.T R'\        T4       24        Rp?ELLRp?ii ; i  \          d8   p\
        P#                  R8\        T4       24       RRR	R9RR:RR;RR</u Rp?# Rp?ii ; i)=u  
Procesa la solicitud siguiendo el flujo del diagrama
ACTUALIZADO: Gestión de documentos DESPUÉS de crear formularios + ENVÍO DE CORREO

Args:
    data (dict): Datos de la solicitud
    user_id (int): ID del usuario

Returns:
    dict: Resultado del procesamiento
r   rU   zOPPORTUNITY_CLOSED::z(Intento de procesar oportunidad cerrada z con status r%   FrN   ul   El número de oportunidad ingresado ya terminó su proceso, por favor ingresar un no. de oportunidad válidorO   OPPORTUNITY_CLOSEDrQ   rr   r   rB   NzOPPORTUNITY_IN_PROCESS:z+Intento de procesar oportunidad en proceso u   Hay una solicitud previa de ingeniería por lo que no se puede generar una nueva. Comuníquese con ingeniería para que cancelen las tareas y puedan volver a asignar nuevas tareasOPPORTUNITY_IN_PROCESSrR   i  Version-u   Creando nueva versión z para oportunidad zCreando nueva oportunidad u
    versión r   form_idtasksz*Tareas generadas tras formulario general: r   archivostotal_archivos_subidosr   zDocumentos procesados para : 	 archivosz!Error procesando documentos para )rH   r   rM   nueva_versionr   r   r   r   u,   Error enviando correo de notificación para mensajeu2   Correo de notificación enviado exitosamente para z&Error inesperado enviando correo para z"Solicitud procesada exitosamente: z	, Forms: z	, Tasks: z, Archivos: Tr   r   r   r   z%Error en procesamiento de solicitud: z&Error interno al procesar la solicitudPROCESSING_ERRORr*   r+   )r   r~   r0   
startswithsplitr/   rr   rR   r   procesar_formulario_generalappendextendprocesar_formulario_especificor   "procesar_documentos_con_formids_v2*enviar_notificacion_cotizacion_especial_v2r.   r*   )rH   r   rM   oportunidad_existenter1   	error_msgstatusr   r   resultado_oportunidadr   r   resultado_general
formularioresultado_formr   docs_ids_generadosresultado_docsresultado_correos   &&                 r2   r   r   '  s   T
!-01HI	$CDV$W!< !1)<q@M 231]ODNKK1-@RSeRfghM 231]ODNKK45G4H
S`Rabc !=!
 %Y//((  8$%
 Y''  !29!=>""#4W#=> 	@@QRS 788J;N i(($$^I%>?&&~g'>? 9 "#$z"2"2s4
;K7Lq7P?Z 	N i(()78P)Q&%3J%?"9.9ILbKcclmn!B>BRRTUcdmUnTopq	^I-#5++ /'=	  $I..!MnM]]_`pqz`{_|}~PQ_P``bcst}c~b  A  B 	88H	RUVcRdQeenor  tC  pD  oE  EQ  Rh  Qi  j  	k tn] 6*
 	
{  	AI##$9::"-a0!IJ\I]]ijpiqrsu   N0 )!3  %%&?@@"-a0!LM_L``lmsltuvu   U4 &!3  7	h  	^LLA.AQQSTWXYTZS[\]]	^$  
<SVHEFu?&'3
 	

s   O J? O A;O "BO ;AO 	BO AN O "N =AO ?N
A N*N+O 0N>NNO NNO O $O
O 
OO P,P	PPc                H    V ^8  d   QhR\         R\        R\        R\         /#    formulario_datar   r   returndictr0   int)formats   "r2   __annotate__r     s0     D
 D
 D
s D
UX D
]a D
r=   c           	     x    \        R4      p\        WV4      pVR,          '       g   V# VR,          pRV 9   d3   V R,          '       d$   \        WPR,          4      pVR,          '       g   V# \        V4      p. pV'       dY   \	        V4      p	\        V4      p
\        V	VVV
4      pVR,          '       g   V# VR,          .p\        P                  RV 24       M\        P                  RV 24       RRRVR	V/#   \         d6   p\        P                  R
\        T4       24       RRRRRRRR/u Rp?# Rp?ii ; i)z
Procesa el formulario general (siempre presente)

Args:
    formulario_data (Dict): Datos del formulario general
    opportunity_id (str): ID de la oportunidad
    user_id (int): ID del usuario

Returns:
    Dict: Resultado del procesamiento
Generalr%   r   	preguntastask_idz(Formulario general procesado con tarea: z(Formulario general procesado SIN tarea: Tr   z&Error al procesar formulario general: FrN   z$Error al procesar formulario generalrO   r   rQ   r*   N)r   r   r   r   r   r   r   r/   rR   r.   r*   r0   )r   r   r   quotation_type_idresultado_headr   resultado_details
debe_crearr   seller_user_id	user_nameresultado_taskr1   s   &&&          r2   r   r     s^   8
5i@ /~RYZi((!! + /)ok.J.J 8R]B^ _$Y//(( &&78
3G<N.w7I3	N "),,%%#I./EKKB7)LMKKB7)LM twU
 	
  
=c!fXFGu=&'	
 	

s6   'C9 C9 	"C9 ,A	C9 6AC9 9D9*D4.D94D9c                H    V ^8  d   QhR\         R\        R\        R\         /# r   r   )r   s   "r2   r   r     s0     E
 E
D E
# E
X[ E
`d E
r=   c           	         V P                  RR4      p\        V4      p\        WV4      pVR,          '       g   V# VR,          pRV 9   d3   V R,          '       d$   \        W`R,          4      pVR,          '       g   V# \	        V4      p. p	V'       d]   \        V4      p
\        V4      p\        V
VVV4      pVR,          '       g   V# VR,          .p	\        P                  RV RV R	24       M\        P                  R
V RV R	24       RRRVRV	/#   \         dI   p\        P                  R\        T4       24       RRRRT P                  RR4       2RRRR/u Rp?# Rp?ii ; i)u   
Procesa un formulario específico (plantas, UPS, etc.)

Args:
    formulario_data (Dict): Datos del formulario específico
    opportunity_id (str): ID de la oportunidad
    user_id (int): ID del usuario

Returns:
    Dict: Resultado del procesamiento
tipor   r%   r   r   r   u,   Formulario específico procesado con tarea: z (tipo: )u,   Formulario específico procesado SIN tarea: Tr   u*   Error al procesar formulario específico: FrN   zError al procesar formulario nombreu   específicorO   r   rQ   r*   N)r-   r   r   r   r   r   r   r   r/   rR   r.   r*   r0   )r   r   r   tipo_formularior   r   r   r   r   r   r   r   r   r1   s   &&&           r2   r   r     s   9
)--fi@5oF /~RYZi((!! + /)ok.J.J 8R]B^ _$Y//(( &&78
3G<N.w7I3	N "),,%%#I./EKKFwixXgWhhijkKKFwixXgWhhijk twU
 	
  
A#a&JKu67J7J8Ub7c6de&'	
 	

s6   9D D "D >A	D A
D E&=E!E&!E&c          
          V ^8  d   QhR\         \        ,          R\        R\         \        ,          R\        R\        /# )r   archivos_formulariosr   r   r   r   )r   r   r0   r   )r   s   "r2   r   r   V  sB     o
 o
T$Z o
Y\ o
379o
GJo
OSo
r=   c                    \        V4      pR^ R^ R^ R^ R^ R^ R^ R\        P                  ! 4       R	. R
. R/ /p. p. p. pRRRRRRRRRRRRRRRRRRRRR R!/p	\        P	                  R"\        V 4       R#24       \        P	                  R$V 24       V  EF  p
VR;;,          ^,          uu&    V
P                  R%R&4      pV
P                  R'R&4      pV
P                  R(. 4      pV
P                  R)^ 4      p\        P	                  R*V R+\        V4       R,24       V'       d   \        V4      ^ 8X  d   \        P	                  R-V R.24       K  VR;;,          \        V4      ,          uu&   R/pV	P                  W4      pVe&   V F  pVP                  V4      '       g   K  Tp M	  M\        P                  R0V R124       V'       go   R2V R3V R42p\        P                  R5V 24       VP                  R6VR7VR8R9/4       VR;;,          ^,          uu&   VR;;,          \        V4      ,          uu&   EK  \        P	                  R:V 24       \        VVVVVR;7      pVR<,          '       Ed   \        VR=,          4      p\        VR>,          4      pVR?,          pVR;;,          V,          uu&   VR;;,          V,          uu&   VR;;,          VR@,          R,          ,          uu&   V'       d_   \        VV4      pVR<,          '       d)   \        P	                  RAV RBV 24       VVR,          V&   M\        P                  RCV RDV 24       V'       d1   VV9  d*   VP                  V4       VR
,          P                  V4       VP                  REVRFVR?VRGVR>VRHVP                  RH. 4      R@VP                  R@/ 4      /4       VR;;,          ^,          uu&   \        P	                  RIV RJV RKV 24       V^ 8  d'   VP                  R6VR7V RL2R8RMR>VR>,          /4       EK  EK  RNV RJVRO,           2p\        P                  R5V 24       VP                  R6VR7VR8RPRQV/4       VR;;,          ^,          uu&   VR;;,          \        V4      ,          uu&   EK  	  \        P                  ! 4       VRW&   VRW,          VR,          ,
          P                  4       VRX&   WuR	&   VR,          ^ 8X  d*   \        V4      ^ 8  d   R<RYRORZ\        V4       R[2R\R]R@VR^V/# R_VR,           R`2pVR,          ^ 8  d   VRaVR,           R#2,          p\        V4      ^ 8  d   VRb\        V4       Rc2,          p\        P	                  Rd4       \        P	                  ReVR,           24       \        P	                  RfVR,           24       \        P	                  RgVR,           24       \        P	                  RhVR,           24       \        P	                  RiVR,           24       \        P	                  RjVR,           24       \        P	                  RkVR,          Rl Rm24       \        P	                  RnVRX,          Rl Ro24       \        P	                  RpV 24       R<RTROVRqVR,          RrVR^VRVR@V/#   \         d   pRRT
P                  R%RS4       RJ\        T4       2p\        P                  TRTRU7       TP                  R6T
P                  R%RS4      R7TR8RV/4       TR;;,          ^,          uu&   TR;;,          \        T
P                  R(. 4      4      ,          uu&    R/p?EK  R/p?ii ; i  \         dW   pRs\        T4       2p\        P                  TRTRU7       R<RYRORtR\RuRvTR@RwTR^ R^ RT '       d   \        T 4      M^ //u R/p?# R/p?ii ; i)xu}  
Versión mejorada para procesar documentos asociándolos con FormIDs específicos

Args:
    archivos_formularios (List[Dict]): Lista de formularios con sus archivos
    opportunity_id (str): ID de la oportunidad
    forms_created (list[str]): Lista de FormIDs creados
    user_id (int): ID del usuario

Returns:
    dict: Resultado del procesamiento con estadísticas detalladas
formularios_procesadosformularios_exitososformularios_fallidostotal_archivos_intentadostotal_archivos_exitosostotal_archivos_fallidos   tamaño_total_mbtiempo_inicioerrores_por_formularior   mapeo_formid_docsSolicVisFormSolicVis
PTTransNacFormPTTransNac	PTTransULFormPTTransULAireFormAireSistCritUPSFormSistCritUPSr   FormGralBessFormBessSolar	FormSolarEnergyCogeneration
FormEneCogImess	FormImess	ProyecEspFormProyecEspu    🚀 Procesando documentos para z formulario(s)u   📋 FormIDs disponibles: formularioTiporn   formularioNombrer   	totalSizeu   📝 Procesando formulario:  (z
 archivos)u   ⏭️ z: sin archivos, omitiendoNz'El sufijo esperado para el formulario 'z
' es None.u!   No se encontró FormID para tipo z (sufijo esperado: r   u   ❌ r   r*   
tipo_errorform_id_no_encontradou   🎯 FormID encontrado: )r   r   filesr   
created_byr%   r   archivos_fallidosdocs_idestadisticasu   🔗 FormID z vinculado con DocsID u"   ⚠️ No se pudo vincular FormID z con DocsID r   r   archivos_exitososdownload_urlsu   ✅ r   z archivos subidos, DocsID: z archivos fallaronarchivos_parciales_fallidoszError subiendo archivos para rN   upload_completo_fallidodetalleszError procesando formulario desconocidoTrw   excepcion_procesamiento
tiempo_finduracion_total_segundosF"   No se pudo subir ningún archivo. z errores en formulariosrO   UPLOAD_FAILEDerroreszProcesados r    en r   z advertencia(s)u,   📊 === RESUMEN GLOBAL DE PROCESAMIENTO ===u       📋 Formularios procesados: u      ✅ Formularios exitosos: u      ❌ Formularios fallidos: u      📄 Archivos intentados: u      ✅ Archivos exitosos: u      ❌ Archivos fallidos:       📏 Tamaño total: .2f MBu      ⏱️ Duración total: 	 segundosu      🆔 DocsIDs generados: r   r   z%Error general procesando documentos: z#Error interno procesando documentosr   technical_errorerror_general)r   r   r   r/   rR   r   r-   endswithrr   r*   r   upload_form_files_v2r    r.   r0   total_seconds)r   r   r   r   r  estadisticas_globalesr   errores_procesamientor   mapeo_formulariosr   r   nombre_modulor   
total_sizeform_id_buscadosufijo_esperador   r   resultado_uploadr  r  r  actualizar_resultador1   success_messages   &&&&                      r2   r   r   V  s   a
+G4
 %a"A"A'%q%qX\\^$b "!
   "!# *J,zJ[ ,[
 	6s;O7P6QQ_`a0@A3O!":;q@;um"1"5"56F"K / 3 34F K*..z2>,00a@
:?:K2cRZm_\fgh3x=A#5KK'/)::S TU%&ABc(mSB #'"3"7"7"W".#0"++O<<.5O! $1
 NN%L_L]]g#hi&"COCTTghwgxxy zILL4	{!34)00$o$&=2 
 **@AQFA)*CDHUD66GHI $8+#1"#)$  $I..(+,<=O,P(Q%(+,<=P,Q(R%.y9G)*CDHYYD)*CDHYYD)*<=AQR`AabtAuu= /Mo_f/g,/	::"KK,6GG]^e]f(ghZa12EFW"NN-OP_O``lmtlu+vw 72D#D*11':-.BCJJ7S +11!?)?!7+->+->')9)=)=or)R&(8(<(<^R(P3  **@AQFAKK$&7r:K9LLghogp qr )1,-44(/#(9'::L%M(*G/1ABU1V	6  - #@?PPRScdmSnRo pILL4	{!34)00$o$&?"$4	2  **@AQFA)*CDHUD[  4v /7llnl+!,/2G2XX
-/ 	78 ;P67 !!:;q@SI^E_bcEc5?DY@Z?[[rs 50  ((=>W(X'YYbc !781<&;<R&S%TTbccO$%)s+@'A&B/RRO 	BD67LMe7f6ghi34IJ`4a3bcd34IJ`4a3bcd34IJe4f3ghi01FG`1a0bcd01FG`1a0bcd-.CDV.WX[-\\_`a12GHa2bcf1ggpqr12D1EFG t$&;<U&V*,$&<1
 	
c  	m:?;N;NO_an;o:pprsvwxsyrz{	Y6%,, /"5"56F"VY ";. 
 &&<=B=%&?@CH[H[\fhjHkDll@@	mv  
;CF8D	Y.u<&y(!)1)H\3/C+Dbc	
 	

s   B)]+ ,BZ/
]+ AZ/'Z/A+Z/2]+ 5DZ/CZ/!]+ 'A3Z/A?]+ F]+ /](:B"]#]+ #]((]+ +_6A___c                $    V ^8  d   QhR\         /# )r   r   )r   )r   s   "r2   r   r   G  s     Y Y4 Yr=   c                J    V P                   P                  R4      pV'       d   \        P                  ! V4      pM/ p. pRRRRRRRR	R
RRRRRRRRRRR/
p\        P                  R4       VP                  4        EFN  w  rVRV R2pV P                  P                  V4      p\        P                  RV 24       \        P                  R\        V4       24       . p	. p
\        V4       EF  w  rV'       gB   \        P                  RV^,            RV R24       V
P                  RV^,            R24       KO  VP                  '       d    VP                  P                  4       R 8X  dB   \        P                  RV^,            RV R!24       V
P                  RV^,            R"24       K  VP!                  ^ \"        P$                  4       VP'                  4       pVP!                  ^ 4       V^ 8X  dH   \        P                  RVP                   RV R#24       V
P                  VP                   R#24       EKP  VRI8  dY   VRJ,          p\        P                  RVP                   RV R%VR& R'24       V
P                  VP                   R%VR& R'24       EK  \)        VP                  4      P*                  P-                  4       p0 RKmpVV9  dN   \        P                  RVP                   RV R(V R)24       V
P                  VP                   R(V R)24       EK4   VP!                  ^ 4       VP/                  R$4      pVP!                  ^ 4       \        V4      ^ 8X  dH   \        P                  RVP                   RV R*24       V
P                  VP                   R*24       EK   T	P                  T4       \        P                  R/TP                   R0TR$,          R1 R224       EK  	  V
'       dG   \        P                  R3V R,\        V
4       R424       V
 F  p\        P                  R5V 24       K  	  V	'       g   EK  \7        R6 V	 4       4      pV	 F  pVP!                  ^ 4       K  	  VP                  R7VR8VR9V	R:\        V	4      R;VR<V
/4       \        P                  R=V R,\        V	4       R>VR$,          R1 R?24       EKQ  	  V'       dV   W2R9&   \7        R@ V 4       4      p\7        RA V 4       4      p\        P                  RBV R>VR$,          R$,          R& RC24       V# \        P                  RD4       V#   \0         dY   p\        P3                  R+TP                   R,\5        T4       24       T
P                  TP                   R-24        R.p?EK  R.p?ii ; i  \        P8                   d.   p\        P3                  RE\5        T4       24       / u R.p?# R.p?i\0         d0   p\        P3                  RF\5        T4       2RGRH7       / u R.p?# R.p?ii ; i)Lu   
Versión mejorada para procesar FormData con mejor manejo de archivos

Args:
    request: Objeto request de Flask

Returns:
    Dict: Datos estructurados incluyendo archivos organizados por formulario
rH   r   r   r   r   r   r   r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  u'   🔍 Procesando archivos de FormData...files_z[]u!   🔍 Buscando archivos en campo: u   🔍 Archivos encontrados: u   ❌ Archivo r'  u   : objeto archivo vacíoArchivo u   : objeto vacíorn   z: sin nombre de archivoz: sin nombreu   : archivo vacío   z: muy grande (r)  zMB)u   : extensión no permitida (r   u   : contenido vacíou   ❌ Error leyendo archivo r   z: error de lecturaNu   ✅ Archivo válido: r  .1f KB)   ⚠️ u    archivos inválidos:z   - c              3      "   T F\  pVP                  ^ 4      e   K  VP                  ^ \        P                  4      ;'       g    VP                  4       ;'       g    ^ x  K^  	  R# 5i)r   N)seekosSEEK_ENDtell).0archivos   & r2   	<genexpr>5procesar_form_data_con_archivos_v3.<locals>.<genexpr>  sM      !#3||A HGLLBKK0GGGLLNGGaG#3s   A&&A&A&A&r  r  r   cantidadr  archivosInvalidosu   📎 u    archivos válidos (z
 KB total)c              3   2   "   T F  qR ,          x  K  	  R# 5i)rL  N rH  forms   & r2   rJ  rK    s      S>Rdj!1!1>R   c              3   2   "   T F  qR ,          x  K  	  R# 5i)r  NrO  rP  s   & r2   rJ  rK    s     P;O4+..;OrR  u   📁 Total procesado: z MB)u7   📄 No se encontraron archivos válidos en el FormDatau+   ❌ Error decodificando JSON del FormData: u,   ❌ Error procesando FormData con archivos: Trw   i       >   .doc.jpg.pdf.png.xls.docx.jpeg.xlsx)rQ  r-   jsonloadsr/   rR   itemsr  getlistdebugr   	enumeraterr   r   filenamer   rD  rE  rF  rG  r   suffixlowerreadr.   r*   r0   sumJSONDecodeError)r   	json_datarH   r   form_modules	tipo_formmodulo
field_namearchivos_tipoarchivos_validosarchivos_invalidosirI  	file_sizesize_mb	extensionextensiones_permitidasheaderr1   r*   r5  total_archivoss   &                     r2   r   r   G  s   OLL$$V,	::i(DD  " *J,J[ ,[
 	=>!-!3!3!5I!)B/J#MM11*=MLL<ZLIJLL6s=7I6JKL  "!#'6
NN\!A#d9+E\#]^&--1_.MN'''7+;+;+A+A+Cr+INN\!A#d9+E\#]^&--1\.JK Q,#LLN	Q>NN\'2B2B1C4	{Rb#cd&--1A1A0BBR.ST.';7GNN\'2B2B1C4	{R`ahil`mmp#qr&--1A1A0B.QXY\P]]`.ab !!1!1299??A	)l&$::NN\'2B2B1C4	{Rmnwmxxy#z{&--1A1A0BB]^g]hhi.jkLLO$\\$/FLLO 6{a'g6F6F5GtI;Vh'ij*11W5E5E4FFX2YZ  ( !''03G4D4D3ER	RVWZG[[_`as 7x "2c:L6M5NNcde/ENNU5'?3 0    !#3! 
  0GLLO  0 %++$i& 0$4 5');-  eI;b5E1F0GG[\fgk\klo[ppz{|C "6H  3  S>R SSNP;OPPJKK00@@TU_`dUdeiUijmTnnrst  KKQR_ ! LL#=g>N>N=OrRUVWRXQY!Z[&--1A1A0BBT.UVb  B3q6(KL	 CCF8LW[\	s   "V( D%V( GV( BU&AV( 6AV( BV( AV( +V( V%AV V(  V%%V( (X"="W%X"%X"2X"3$XX"X"c                `    V ^8  d   QhR\         R\         R\        R\        R\         R\        /# )r   r   r   r  r   r  r   )r0   listr   r   )r   s   "r2   r   r     sA     M
 M
# M
s M
4 M
!$M
25M
:>M
r=   c                0    V'       d   \        V4      ^ 8X  d   RRRRR. R. RRR	R
^ R^ R^ R^ //# \        P                  R\        V4       RV  24       RV RV  2pRp^ RIHp V! W6V4      pVR,          '       g   RRRRVR,           2RR/# VR,          p	\        P                  RV	 RV  24       R
\        V4      R^ R^ R^ R\
        P                  ! 4       R/ R/ /p
. p. p\        V^4       EF  w  r V'       d   VP                  '       ge   RV R2p\        P                  RV 24       VP                  R R!V 2R"VR#R$/4       V
R,          P                  R$^ 4      ^,           V
R,          R$&   K  VP                  ^ \        P                  4       VP                  4       pVP                  ^ 4       \!        VP                  4      P"                  P%                  4       pV
R,          P                  V^ 4      ^,           V
R,          V&   \        P                  R%V R\        V4       R&VP                   R'VR(,          R) R*2	4       R+V  R,V 2p\'        VV	VP                  VVR-7      pVR,          '       d   VP                  R VP                  R.VR/,          R.,          R0VR/,          R0,          RV	R1VR/,          R1,          R2VR3VR4V/4       V
R;;,          ^,          uu&   V
R;;,          V,          uu&   \        P                  R5V R6VP                   R7VR/,          R0,           24       EKC  VP                  RR84      pVP                  R VP                  R"VR#R9R2V/4       V
R,          P                  R9^ 4      ^,           V
R,          R9&   \        P)                  R:V R&V 24       EK  	  \        V4      V
R&   \
        P                  ! 4       V
R?&   V
R?,          V
R,          ,
          P1                  4       V
R@&   V
R,          R^,          V
RA&   V
R,          ^ 8  pV
R,          ^ 8X  d   RBV
R,           RC2pM4V
R,          ^ 8X  d   RDV
R,           RE2pRpMV
R,           RFV
R,           RG2p\        P                  RHV  RI24       \        P                  RJV
R,           24       \        P                  RKV
R,           24       \        P                  RLV
RA,          RM RN24       \        P                  ROV
R@,          RM RP24       V
R,          '       dS   \        P                  RQ4       V
R,          P3                  4        F"  w  pp\        P                  RRV R&V RS24       K$  	  V
R,          '       dS   \        P                  RT4       V
R,          P3                  4        F"  w  pp\        P                  RRV R&V RU24       K$  	  RTRTRTRTRVV
R
,          RWTRT	RXV Uu. uF  pVR0,          NK  	  upR	V
/	#   \*         d   pR;T R&\-        T4       2p\        P)                  TRR<7       TP                  R \/        TR=R!T 24      R"TR#R>R>\-        T4      /4       T
R,          P                  R>^ 4      ^,           T
R,          R>&    Rp?EK  Rp?ii ; iu upi   \*         dp   pRY\-        T4       2p\        P)                  TRR<7       RRRRZRR[R\TR. R. RRR	R
T'       d   \        T4      M^ R^ RT'       d   \        T4      M^ R]T//u Rp?# Rp?ii ; i)_uf  
Versión mejorada para subir múltiples archivos de un formulario

Args:
    form_id (str): ID del formulario
    opportunity_id (str): ID de la oportunidad
    files (list): Lista de archivos FileStorage
    user_id (int): ID del usuario
    created_by (str): Nombre del usuario

Returns:
    dict: Resultado del procesamiento con estadísticas detalladas
r%   TrN   zNo hay archivos para procesarr   r  r  Nr  total_intentadostotal_exitosostotal_fallidosu   tamaño_totalu   🚀 Iniciando upload de z archivos para FormID zVentas/Formularios//Q_SpQ_FormsHead)crear_docs_headFz#Error creando grupo de documentos: rO   DOCS_HEAD_ERRORu   📋 DocsHead z creado para FormID r   archivos_por_tipoerrores_por_tipor>  u    está vacío o sin nombrerB  archivo_originalarchivo_r*   r  archivo_vaciou   📄 Procesando archivo r   r  r?  r@  rA  zArchivo de z - Oportunidad )file_objr  titledescriptionruta_completadoc_line_idrH   download_urlremote_pathrr  	file_typeupload_orderu   ✅ Archivo z	 subido: z -> zError desconocido en uploadupload_failedu   ❌ Error subiendo archivo zError procesando archivo rw   rc  	excepcionr"  duracion_segundosr   zTodos los archivos (z) fueron subidos exitosamenter$  z erroresz archivos subidos, z	 fallaronu#   📊 Resumen de upload para FormID r   u      ✅ Exitosos: u      ❌ Fallidos: r(  r)  r*  u      ⏱️ Duración: r+  u      📁 Tipos de archivo:z      z archivo(s)u      ⚠️ Tipos de error:z
 error(es)total_procesadosr  r  z'Error general en upload_form_files_v2: z1Error interno al procesar archivos del formularioFORM_FILES_ERRORr,  r-  rT  )r   r/   rR   )Consultas_SQL.Utilities.DocsManagementSQLr  r   r   rb  rc  rr   r   r-   rD  rE  rF  rG  r   rd  re  r   r*   r.   r0   getattrr0  r_  )r   r   r  r   r  r  origenr  docs_head_resultr  r  r   r  indexr  r   rr  rt  r  	resultador1   r%   rN   extcount
error_typerI  s   &&&&&                      r2   r/  r/    s   ~
E
a4:"B#R4&$a$a#Q	!  	/E
|;QRYQZ[\ .n-=QwiH" 	N*7JG	**5@AQR[A\@]^)  #9-nWI-A'KL E
aaQX\\^
 (2OEJyx'8'8'8"*5'1K LINNWYK#89%,,*hug,>$o. 
 IUUgHhHlHlm|~  IA  DE  IEL!34_E a-$MMO	a  !2!23::@@B	?KL_?`?d?denpq?ruv?v01)<6ugQs5zl"XM^M^L__abklpbpqtauuyz{ !,G9ONCST =%#"++ +"/	 Y''$++*H,=,=%y'8'G&	&(9.(I!7%y'8'G#Y#Y&	- 	 !!12a72 1Y>1KK,ugYx?P?P>QQUV_`fVghvVwUx yz )i9V WI%,,*H,=,=$o#Y	.  IUUgHhHlHlm|~  IA  DE  IEL!34_ELL#>ugR	{!ST}  3\ *-->)?%&%-\\^\"-9,-G,WfJg-g,v,v,x()+7+HK+X'( /014()Q.,\:J-K,LLijG*+q0:<HX;Y:ZZbcGG%&6788KLYiLjKkktuG 	9'!DE'5E(F'GHI'5E(F'GHI-l;M.Ns-SSVWX+L9L,Mc+RR[\]+,,KK35*+>?EEG
UfSEE7+>? H *++KK35%12D%E%K%K%M!
EfZL5'DE &N ww 0!2-? @]wEUVEU'gn55EUVL

 
	
_  y7wbQI	Y6!((&*QVPWFX(YY +Q	*  AMM_@`@d@deprs@twx@x/0==yn W  
=c!fXF	Y.uJ&yt"%CJQ ! #e*1	
 	

s   Z %Z AZ A&Z 5W:A"W:1Z 3F;W:.Z 1A:W:+E)Z A Z 6A,Z "Z"4Z :ZBZZ ZZ \&A\:\
\\c                    V P                  R. 4      pRRRRRRRRRR/pV F  pVP                  R	R4      P                  4       pVP                  R
R4      pRV9   d    RV9   d   VP                  4       R9   VR&   K[  RV9   d   WRR&   Kh  RV9   d   WRR&   Ku  RV9   g   RV9   d   WRR&   K  RV9   g   K  RV9   g   K  WRR&   K  	  V#   \         d8   p\        P	                  R\        T4       24       RRRRRRRRRR/u Rp?# Rp?ii ; i)u   
Extrae datos específicos del formulario general para el correo

Args:
    formulario_general (dict): Datos del formulario general

Returns:
    dict: Datos extraídos y formateados
r   requiere_visitaFestadorn   ciudad	direcciondescripcion_proyectopregunta	respuestavisitaespecialistau
   direcciónu   informaciónproyectoz/Error extrayendo datos del formulario general: N)u   sísiyes)r-   re  r.   r/   rr   r0   )formulario_generalr   datos_extraidosr  pregunta_textor  r1   s   &      r2    extraer_datos_formulario_generalr    s9   %
&**;;	 ubb"B
 "H%\\*b9??AN ["5I>)n.N5>__5FJ^5^ 12^+,5)^+,5)/;.3P/8,>1jN6R:C 67 "  
HQQRubb"B
 	

s*   B-C 4C =	C D	,D>D	D	c           	     J    ^ RI Hp ^ RIHp	 ^ RIHp
 \        V4      p. pV EF  pRV9   d   VP                  R4       K  RV9   d   VP                  R4       K8  RV9   d   VP                  R	4       KR  R
V9   d   VP                  R4       Kl  RV9   d   VP                  R4       K  RV9   d   VP                  R4       K  RV9   d   VP                  R4       K  RV9   d   VP                  R4       K  RV9   d   VP                  R4       K  RV9   g   K  VP                  R4       EK  	  \        V P                  R/ 4      4      p/ RVbRV R,          P                  RR4      bRV R,          P                  RR 4      bR!VbR"V	P                  ! 4       P                  R#4      bR$V	P                  ! 4       P                  R%4      bR&VbR'\        V4      bR(\        V4      bR)VbR*VbR+VR,,          bR-VR.,          bR/VR0,          bR1VR2,          bR3VR3,          bR4R5bR6R7V 2/CpR8V 2pV^8  d   VR9V R:2,          pVR3,          '       d   R;V R<2pR=R>R?R@RARB^ //pV F  p\        V4      VRC&   RDp\        \        V4      4      p\        RE8X  d   RFpMcRV9   d   RGpMYRV9   d   RHpMORV9   d   RIpMER
V9   d   RJpM;RV9   d   RJpM1RV9   d   RKpM'RV9   d   RKpMRV9   d   RLpMRV9   d   RKpM	RV9   d   RMpV
P                  P                  RN4      '       d   V
P                  P                  RO4      pV! RPVRQV./RRVRS7      pK  	  VP                  R=RE4      '       d@   VP                  RA/ 4      P                  RB^ 4      p\         P#                  RTV RUV 24       V# \         P%                  RVV RWVP                  R?RX4       24       V#   \&         dL   p\         P%                  RY\)        T4       2R>RZ7       R=RER?R[\)        T4       2R\\)        T4      ./u R]p?# R]p?ii ; i)^u   
Versión mejorada del envío de correo de notificación.
Corregida para:
1. Evitar KeyError si no hay tareas.
2. Usar current_app para acceder a la configuración (evita AttributeError).
)enviar_correo_universalr   r6   r   u   Solicitud de Visita Técnicar   z.Plantas, Tableros y Transformadores Nacionalesr   z&Plantas, Tableros y Transformadores ULr  zAires Acondicionadosr  u   Sistemas Críticos (UPS)r  BESSr	  zSistemas Solaresr  u   Energía y Cogeneraciónr  iMessr  zProyectos Especialesr   numero_oportunidadcliente_nombrer   rW   zNo especificadovendedor_asignador[   zNo asignadosolicitante_nombrefecha_solicitudz%d/%m/%Yhora_solicitudz%H:%Mformularios_solicitadostotal_formulariostotal_tareasform_idsversionproyecto_estador  proyecto_ciudadr  proyecto_direccionr  proyecto_descripcionr  r  url_sistemazhttps://sycelephant.comurl_oportunidadz+https://sycelephant.com/ventas/oportunidad/u;   🔔 Nueva Solicitud de Cotización Especial - Oportunidad u    (Versión r   u   🚨 URGENTE - u    - REQUIERE VISITA TÉCNICAr%   Tr   u9   No se generaron tareas para envío de correo específico.destinatariostotal_destinatariosTaskIdrn   Fzvictor.barrera@igsa.com.mxzmarco.escobar@igsa.com.mxzcarlos.huitron@igsa.com.mxzjose.lopez@igsa.com.mxzrogelio.robles@igsa.com.mxzcarlos.anguiano@igsa.com.mxzdiego.rivas@igsa.com.mxzarturo.martinez@igsa.com.mxr)   EMAIL_PROTOTYPE_TOADRESSz.Emails/Ventas/Cotiz/CotizEspSolicitudMail.htmlTOi  )template_pathasuntodestinatarios_adicionalesmail_list_idtemplate_datau&   ✅ Proceso de correo finalizado para z. Enviados: u   ❌ Error enviando correo para r   zError desconocidoz5Error en enviar_notificacion_cotizacion_especial_v2: rw   u'   Error interno al enviar notificación: r&  N)#App.Utilities_module.MailManagementr  r   r9   r7   r   r   r  r-   r   strftimer   r   r!   r   r,   r/   rR   r*   r.   r0   )rH   r   rM   r   r   r   r   r   r  r   r7   r   formularios_nombresr   datos_proyector  r  r  taskIDdestinatarioformID_taskr  r1   s   &&&&&&&&               r2   r   r     s   L
O%% +73	 !$G(#**+IJ!W,#**+[\ G+#**+STw&#**+AB"g-#**+EFw&#**62'#**+=>(#**+EF'#**73 G+#**+AB) %. :$((CVXZ:[\
 "4
 d=1556GIZ[
  m!4!8!89RTa!b	
 !)
 x||~66zB
 hlln55g>
 &':
  ]!3
 C0
 
  }!
& ~h7'
( ~h7)
* !."=+
, #N3I$J-
. ~.?@/
4 45
6 !L^L\]7
> OOaNbc1M?!44F +,,&vh.IJF tR3Q7
	 &F&)&kM(#L.s6{;K%;![0#>L%4#?L$3#;L;.#?L&+5#?L;.#@L K/#@L![0#<L K/#@L$3#@L !!%%&<==*11556PQ/N<.+ "+IC &X ==E**"+--"D"H"HI^`a"bKK@@PP\]p\qrs  LL:>:J"Y]][dfyMzL{|} 
LSQRVHU`deu@QIAx
 	

s@   DO D3O C
O AO  >O ,O P"A PP"P")5r9   r   r   r   r   r   r   r	   	functoolsr
   loggingr]  r   typingr   r   pathlibr   rE  r,   r   #App.Utilities_module.DocsManagementr   r   r   "App.Utilities_module.CRMManagementr   /Consultas_SQL.Ventas.Cotiz.CotizEspSolicitudSQLr   r   r   r   r   r   r   r   r   r   r   r    r!   	getLoggerr/   r   r   r   r   r   r   r   r/  r  r   rO  r=   r2   <module>r     s    U T T      	   i ? 9   ( 
		4	5Sl%TN`
DD
LE
No
bYvM
^/
bT
r=   