+
    1i                         ^ 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t^ RIt^ RIHt ^ RIHtHtHtHtHtHtHtHt ^ RIHt ^ R	IHt ^ RIt]
P@                  ! R
4      t!R t"R# )    )current_apprender_templaterequestsessionjsonifyredirecturl_for)wrapsNdatetime)DictList)
CRMManager)buscar_cotizacion_completaactualizar_lineas_cotizacionactualizar_calculo_financieroactualizar_tiempo_y_condicionesfinalizar_cotizacion_y_enviarget_Quote_JSON_BussinessCentraljson_serializerget_TermsType_JSON)RecepcionCotizSQLenviar_correo_universalrecepcion_cotizacionc                   a a R p  S P                  V R2R.R7      R R l4       p S P                  V R2R.R7      R 4       p S P                  V R2R.R7      R	 4       p S P                  V R
2R.R7      R R l4       p S P                  V R2R.R7      R 4       p S P                  V R2RR.R7      R 4       p S P                  V R2R.R7      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                  V R2R.R7      V 3R l4       pS P                  V R2R.R7      R V 3R ll4       pS P                  V R2R.R7      R R  l4       pR! V 3R" lloR## )$z/Ventas/Cotiz/Recepcionz/costing/<int:costing_num>GET)methodsc                $    V ^8  d   QhR\         /#    costing_numint)formats   "eC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Ventas_Module\Cotiz\RecepcionCotiz.py__annotate__:registrar_rutas_recepcion_cotizacion.<locals>.__annotate__-   s     W Wc W    c                     \         P                  ! V 4      pV'       d   \        VP                  4       4      # \        RRV  R2/4      R3#   \         d   p\        RR/4      R3u Rp?# Rp?ii ; i)u   
Controlador para obtener datos unificados de la cotización (Costeo y CRM).
Ruta final: /api/reception/costing/<int:costing_num>
erroru   Cotización con número z no encontrada  (   Ocurrió un error interno en el servidor  N)r   get_unified_data_by_costing_numr   to_dict	Exception)r"   data_dtoes   &  r&    get_reception_costing_controllerNregistrar_rutas_recepcion_cotizacion.<locals>.get_reception_costing_controller,   s{    	W(HHUHx//122 +CK=P^)_`acfff 	WG%OPQSVVV	Ws'   A A A A0A+%A0+A0z/taxesc                      \         P                  ! 4       p \        V 4      #   \         d   p\        RR/4      R3u Rp?# Rp?ii ; i)zR
Controlador para obtener la lista de impuestos.
Ruta final: /api/reception/taxes
r+   r-   r.   N)r   	get_taxesr   r1   )taxesr3   s     r&   get_taxes_controllerBregistrar_rutas_recepcion_cotizacion.<locals>.get_taxes_controllerB   sI    	W%//1E5>! 	WG%OPQSVVV	Ws   " AAAAz/currenciesc                      \         P                  ! 4       p \        V 4      #   \         d(   p\	        RT 24       \        RR/4      R3u Rp?# Rp?ii ; i)zU
Controlador para obtener la lista de monedas.
Ruta final: /api/reception/currencies
z4Error en el controlador quote_reception/currencies: r+   r-   r.   N)r   get_currenciesr   r1   print)
currenciesr3   s     r&   get_currencies_controllerGregistrar_rutas_recepcion_cotizacion.<locals>.get_currencies_controllerQ   sZ    	W*99;J:&& 	WHLMG%OPQSVVV	Ws   " AA	AAz"/costing-details/<int:costing_num>c                $    V ^8  d   QhR\         /# r    r#   )r%   s   "r&   r'   r(   b   s     
W 
WC 
Wr)   c                     \         P                  ! V 4      p\        V4      #   \         d(   p\	        RT 24       \        RR/4      R3u Rp?# Rp?ii ; i)un   
Controlador para obtener las líneas de costeo.
Ruta final: /api/reception/costing-details/<int:costing_num>
z9Error en el controlador quote_reception/costing-details: r+   r-   r.   N)r   get_costing_detailsr   r1   r=   )r"   detailsr3   s   &  r&   get_costing_details_controllerLregistrar_rutas_recepcion_cotizacion.<locals>.get_costing_details_controllera   s\    	W';;KHG7## 	WMaSQRG%OPQSVVV	Ws    # AA
AAz/create-quotationPOSTc                 *    \         P                  ! 4       p \        P                  ! V 4      pVP	                  R4      '       d   \        V4      ^3# \        V4      R3#   \         d*   p\        RT 24       \        RRRR/4      R3u Rp?# Rp?ii ; i)	u[   
Controlador para crear una nueva cotización.
Ruta final: /api/reception/create-quotation
success  z*Error en el controlador create-quotation: Fr+   r-   r.   N)r   get_jsonr   create_quotationgetr   r1   r=   )dataresultr3   s      r&   create_quotation_controllerIregistrar_rutas_recepcion_cotizacion.<locals>.create_quotation_controllerq   s    	i##%D&77=Fzz)$$v++v++ 	i>qcBCIug7abcehhh	is*   AA A A B)BBBz/preview-quotationOPTIONSc                 j   \         P                  R8X  df   \        RR/4      p V P                  P	                  RR4       V P                  P	                  RR4       V P                  P	                  RR	4       V ^3#  \         P
                  ! 4       pV'       d   \        V4      ^8:  Ed   \        R
4       RpV'       d:   VP                  R4      ;'       g     \         P                  P                  R4      pM\         P                  P                  R4      pV'       Ed$   ^ RI	p^ RI
p^ RIHp VP                  P                  VP                  RRRR4      pVP                  P                  VRV R24      p\        RV 24       VP                  P!                  V4      '       d   \#        VRRR7      ;_uu_ 4       pVP$                  ! V4      pRRR4       \        R4       \        R\'        VP)                  4       4       24        VP+                  V4       \        R4       M'\        RV 24       RV RV R 2p
V
R!R"R#/3# R$p
V
R!R"R#/3# V'       g
   R%p
V
R!R"R#/3# VP                  R4      ;'       g     \         P                  P                  R4      p\        R&4       \        R'V 24       \        R(\'        VP)                  4       4       24       \.        P0                  ! V4      pV'       d    \        R)\        V4       R*24       V^R"R#/3# R+p
V
R,R"R#/3#   + '       g   i     ELS; i  \,         d   p	\        RT	 24        Rp	?	EL Rp	?	ii ; i  \,         dT   p	\        R-T	 24       ^ RIpTP5                  4        R.\7        T	4       R/TP9                  4        R02p
T
R,R"R#/3u Rp	?	# Rp	?	ii ; i)1ux   
Controlador para generar vista previa de la cotización antes de crearla.
Ruta final: /api/reception/preview-quotation
rR   statusokzAccess-Control-Allow-Origin*zAccess-Control-Allow-HeaderszContent-Type,X-Auth-TokenzAccess-Control-Allow-MethodsrG   uO   ⚠️ Datos incompletos recibidos, intentando cargar desde archivo temporal...NtokenzX-Auth-Token)r   staticpdfVentasCotiz
temp_data_.jsonu   🔍 Buscando archivo: rutf-8encodingu)   ✅ Datos cargados desde archivo temporalu   📦 Datos cargados: u"   🗑️ Archivo temporal eliminadou-   ⚠️ No se pudo eliminar archivo temporal: u$   ❌ Archivo temporal no encontrado: u   
                        <!DOCTYPE html>
                        <html>
                        <body>
                            <h1>❌ Error: No se encontraron datos de cotización</h1>
                            <p>Token: z5</p>
                            <p>Archivo buscado: z]</p>
                        </body>
                        </html>
                        rJ   zContent-Typeztext/html; charset=utf-8u   
                    <!DOCTYPE html>
                    <html>
                    <body>
                        <h1>❌ Error: No se recibió token</h1>
                    </body>
                    </html>
                    u   
                <!DOCTYPE html>
                <html>
                <body>
                    <h1>❌ Error: No se pudieron cargar los datos</h1>
                </body>
                </html>
                u,   📋 Generando vista previa para cotizaciónu   🎫 Token recibido: u   📦 Datos recibidos: u   ✅ HTML generado: z caracteresu  
                <!DOCTYPE html>
                <html>
                <body>
                    <h1>❌ No se pudo generar la vista previa</h1>
                    <p>El servicio no retornó contenido HTML</p>
                </body>
                </html>
                r.   u    ❌ Error en preview-quotation: uQ  
            <!DOCTYPE html>
            <html>
            <head>
                <title>Error</title>
                <style>
                    body {
                        font-family: Arial, sans-serif;
                        padding: 40px;
                        background-color: #f5f5f5;
                    }
                    .error {
                        background-color: #fee;
                        border: 2px solid #f00;
                        padding: 20px;
                        border-radius: 8px;
                        max-width: 800px;
                        margin: 0 auto;
                    }
                    pre {
                        background-color: #333;
                        color: #fff;
                        padding: 15px;
                        overflow-x: auto;
                        border-radius: 4px;
                    }
                </style>
            </head>
            <body>
                <div class="error">
                    <h1>❌ Error al generar vista previa</h1>
                    <p><strong>Mensaje:</strong> z</p>
                    <pre>zR</pre>
                </div>
            </body>
            </html>
            )r   methodr   headersaddrK   lenr=   rM   osjsonflaskr   pathjoin	root_pathexistsopenloadlistkeysremover1   r   generate_quotation_preview	traceback	print_excstr
format_exc)responserN   rW   rf   rg   r   
output_dirtemp_data_filefr3   
error_htmlpreview_htmlrs   s                r&   preview_quotation_controllerJregistrar_rutas_recepcion_cotizacion.<locals>.preview_quotation_controller   s    >>Y&$/0H  !>D  !?A\]  !?HS= O	Q##%D 3t9>gh HHW-TT1D1D^1TE#OO//?E51!#k.C.CXuV^`g!hJ%'WW\\*
5'QV>W%XN3N3CDEww~~n55!.#HHA#'99Q<D I IK 5d499;6G5HIJWIIn5!$FH  D^DTUV*'
 (-g .11?0@ A	&
  *3A[0\\\"J &s^=W,XXX 
 "39S(TTT HHW%LL)<)<^)LE@B)%12*4		+<*=>? -GGML+C,=+>kJK#S>;U*VVV
 "39S(TTTS IHH  ) W!$QRSQT"UVVWD  *	Q4QC89!2> 36a& :#..01 2A$JJ s^5O$PPPU*	Qs   <M =M AM  BM <L8M L- $M M M M M 5BM M L*	$	M -M8MM MM N2AN-'N2-N2z/generate-pdf/<quote_id>c                
)    ^ RI p^ RIp^ RIp^ RIp^ RIp^ RIp^ RIHpHp ^ RI	H
p	 ^ RIHp
 ^ RIHp ^ RIHp ^ RIHp \%        R4       \%        R4       \%        R4       VP&                  ! 4       p\%        R	4       \%        VP(                  ! V^R
R7      4       Rp \*        P,                  ! R4      p\*        P,                  ! R4      pV'       d   ^ RIHp V! 4       ;_uu_ 4       pVP/                  4       ;_uu_ 4       pVP1                  RV4       VP3                  4       pV'       d   V^ ,          '       g#   VP1                  RV4       VP3                  4       pRRR4       RRR4       X'       d   V^ ,          '       d
   V^ ,          pV'       g   V'       d   Tp\%        RT;'       g    R 24       \7        VP9                  4       4      pVP:                  P=                  R4      pV R2p\7        VP9                  4       4      pVP:                  P=                  R4      pV R2pVP>                  pVP@                  PC                  VRRRR4      pVPE                  VRR7       ^ RIpVP@                  PC                  VRV R24      p\G        VRRR7      ;_uu_ 4       pVPH                  ! VVR
^R 7       RRR4       \%        R!V 24       VP-                  R"V 4      PK                  R#4      ^ ,          p\%        R$V 24        V! 4       ;_uu_ 4       pVP/                  4       ;_uu_ 4       pVP1                  R%V4       VP3                  4       pV^ ,          '       g   ^MV^ ,          ^,           pRRR4       RRR4       \%        R&X 24       V R#V 2p \%        R(V  24       \7        V4      p!T p"\%        R)V! 24       \%        R*V" 24       R+V R,V R-V R.2p#VP@                  PC                  VV#4      p$\%        R/V R,V R.24       VP@                  PC                  VR0RRR14      p%\%        R2V 24       \%        R3V% 24       \%        R4VP@                  PM                  V%4       24       VP@                  PM                  V%4      '       g%   R5V% 2p&\%        R6V& 24       \O        R7R
R8V&/4      R93# \%        R:V% 24       \%        R;4       VPQ                  R<4      p'V''       gf   \%        R=4       R>R?VP@                  PS                  R@4      .p(V( F6  p)VP@                  PM                  V)4      '       g   K&  T)p'\%        RAV) 24        M	  V''       d"   VP@                  PM                  V'4      '       g"   RBp&\%        R6V& 24       \O        R7R
R8V&/4      R93# \%        RCV' 24       \%        RDV 24       \%        REV$ 24       \%        RFV 24       \%        RG4       VPU                  V'V%VV$V.VPV                  VPV                  RRRHVP@                  PY                  V%4      RI7      p* V*P[                  ^ZRJ7      w  p+p,V*P\                  p-V+'       d   \%        RKV+ 24       V,'       d   \%        RLV, 24       V-^ 8w  d/   V,'       d   T,MRMp&\%        RNV- 24       \O        R7R
R8ROV& 2/4      R93# VP@                  PM                  V$4      '       g    \%        RPV$ 24       \O        R7R
R8RQ/4      R93# \%        RRV$ 24       \%        RSVP@                  P_                  V$4       RT24       \%        RW4       \%        RXT! RT" R24       TPe                  RY4      p.TPe                  RZ4      p/TPe                  R[4      p0R\RR]T!T".p1\%        R^R_PC                  T14       24        TPg                  T.4      p2T2Pi                  T/T04       \%        R`4       Rap3T2Pk                  T34       \%        RbT3 24       R
p4T1 F.  p5 T2Pk                  T54       \%        RcT5 24       T5R8X  d   Rp4K.  K0  	  T2Po                  4       p6\%        Rl4       \%        RmT6 24       T2Pq                  4        \%        Ro4       RpT! RT" R2p7RqT! RT" R2p8\G        T$Rr4      ;_uu_ 4       pT	! TR+T R-T R.2RsRt7      p9R+T R,T 2p:T
! T9T:T7T84      p;T;Ru,          '       g   \%        RvT;Rw,           24       \%        Rx4       Ryp<Rzp=\G        T$Rr4      ;_uu_ 4       p>T	! T>R+T R-T R.2RsRt7      p?T
! T?T:T<T=4      p;T;Ru,          '       g-   \O        R7R
R8T;Rw,          /4      R{3uuRRR4       uuRRR4       #  RRR4       T;R|,          p@\%        R}T@ 24       RRR4       \%        R~4        \u        TP-                  R^ 4      4      pA\u        TP-                  R^ 4      4      pB\u        TP-                  R^ 4      4      pC\u        TP-                  R^ 4      4      pDTATB,
          pETCTB,
          pF/ pG T! 4       ;_uu_ 4       pTP/                  4       ;_uu_ 4       pTP1                  RTP-                  R4      4       TP3                  4       pHTH'       d/   RXH^ ,          RTH^,          R\u        TH^,          4      ^d,          /pGM(RTP-                  RR4      RTP-                  RR4      R^ /pGRRR4       RRR4       \%        R4       TP-                  RR4      pITIpJ T! 4       ;_uu_ 4       pTP/                  4       ;_uu_ 4       pTP1                  RTI4       TP3                  4       pKTK'       d   XK^ ,          '       d
   XK^ ,          pJRRR4       RRR4       \%        RXI R_XJ 24       \v        Px                  ! TP-                  R"4      4      pLTLP-                  R4      pMTLP-                  R4      pNTLP-                  R4      pO\%        RTN 24       \%        RTM 24       \%        RTO 24       / RT bRTbRTP-                  R"4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTP-                  RR4      bRTLP-                  R4      bRXAbRXBbRXCbRXDbRXERXFRXGR,          RTGR,          RTGR,          RXJRXIRTP-                  R^4      R\{        TP-                  R. 4      4      RX@RTP|                  ! 4       P                  R4      /CpPRRRT$RRT R,T R.2RR/.pQR.pRT'       d!   XRP                  T4       \%        RT 24       M\%        R4       XM'       d(   XMXR9  d!   XRP                  XM4       \%        RTM 24       M"XM'       d   \%        RXM 24       M\%        R4       \%        RXR 24       T! RRT RT RTP-                  RR4       2RXPXQRTRRR./R7      pSRTSR7,          RTSRw,          RTSR,          R,          /pTTSR7,          '       d7   \%        R4       \%        RXSR,          R,           24       \%        RT 24       M\%        RXSRw,           24        ^ RICpVTVP                  ^4        TP@                  PM                  T$4      '       d   \%        RT$ 24       \%        RTP@                  PM                  T$4       24       \%        R\        TP                  T$4      P                  4      RR  24       TP                  T$4       \%        RT$ 24       M\%        RT$ 24         TP@                  PC                  TRT R24      pTP@                  PM                  T4      '       d    TP                  T4       \%        RT 24       \%        R4       \%        R4       \%        R4       \O        R7RRX@RT8RTRR/XTC4      ^3#   + '       g   i     EL; i  + '       g   i     EL; i  \4         d   p\%        RT 24        Rp?ELRp?ii ; i  + '       g   i     EL; i  + '       g   i     EL; i  + '       g   i     EL; i  \4         d%   p\%        R'\7        T4       24       ^p Rp?EL"Rp?ii ; i  TP`                   d0    T*Pc                  4        \%        RU4       \O        R7R
R8RV/4      R93u # i ; i  TPl                   d    T4'       gO   RdT5 ReT2Po                  4        RT5 2p&\%        RfT& 24       T2Pq                  4        \O        R7R
R8T&RgT5/4      R93u u # \%        RhT5 24        T2Ps                  T54       T2Pk                  T54       \%        RiT5 24        E	K    \4         dO   pRjT5 Rk\7        T4       2p&\%        RfT& 24       T2Pq                  4        \O        R7R
R8T&/4      R93u Rp?u u # Rp?ii ; ii ; i  \4         d8   pRn\7        T4       2p&\%        R6T& 24       \O        R7R
R8T&/4      R93u Rp?# Rp?ii ; i  + '       g   i     E	L; i  + '       g   i     E	L	; i  + '       g   i     EL; i  + '       g   i     EL; i  \4         dB   p\%        RT 24       RTP-                  RR4      RTP-                  RR4      R^ /pG Rp?EL&Rp?ii ; i  + '       g   i     EL; i  + '       g   i     EL; i  \4         d   p\%        RT 24        Rp?ELRp?ii ; i  \4         dK   p\%        R\7        T4       24       ^ RIApUTUP                  4        RR
RR\7        T4       2R^ /pT Rp?ELRp?ii ; i  \         d%   p\%        RT 24       \%        R4        Rp?ELZRp?i\4         d7   p\%        R\7        T4       24       ^ RIApUTUP                  4         Rp?ELRp?ii ; i  \4         d#   p\%        R\7        T4       24        Rp?ELhRp?ii ; i  \4         dG   p\%        RT 24       ^ RIApUTUP                  4        \O        R7R
R8\7        T4      /4      R93u Rp?# Rp?ii ; i)u   
Genera el PDF de la cotización, lo sube a FTP en estructura de carpetas y envía por email
Ruta final: /api/reception/generate-pdf/<quote_id>
N)r   r   )FileStorage)subir_archivo_ftp_desde_requestr   r   )get_connectionu+   🚀 INICIANDO GENERACIÓN DE PDF CON EMAILu$   🧠 Datos recibidos para genera PDFF)indentensure_asciiuser_idemailz+SELECT Email FROM Profiles WHERE UserID = ?a  
                                    SELECT P.Email
                                    FROM Users U
                                    JOIN Profiles P ON P.ProfileID = U.ProfileID
                                    WHERE U.UserID = ?
                                u"   📧 Email del creador detectado: zNo disponibleu1   ⚠️ No se pudo resolver el email del creador: /z)/ventas/cotiz/reception/preview-quotationrX   rY   rZ   r[   T)exist_okr\   r]   wr_   r`   )r   r   u!   💾 Datos temporales guardados: 	CostingID-u/   
📊 Obteniendo versión de cotización para: zu
                            SELECT MAX(Version) FROM Q_QuotationHead WHERE QuotationNum = ?
                        u"   📊 Versión calculada desde BD: u5   ⚠️ Error al obtener versión, usando versión 1: u   ✅ QuoteID construido: u   📁 Carpeta base: u   📁 Carpeta versión: cotizacion__V_z.pdfu    📄 Nombre del PDF: cotizacion_puppeteer_pdfzPreviewCotizacion.jsu   📂 Base dir: u   📄 Script path: u   📄 Script exists: z&Script de Puppeteer no encontrado en: u   ❌ rI   r+   r.   u   ✅ Script encontrado: u   
🔍 Buscando Node.js...nodeuF   ⚠️ Node.js no encontrado con shutil.which, buscando manualmente...z C:\Program Files\nodejs\node.exez&C:\Program Files (x86)\nodejs\node.exez~\AppData\Roaming\npm\node.exeu     ✅ Encontrado: z?Node.js no encontrado. Instala Node.js desde https://nodejs.orgu   
✅ Usando Node.js desde: u   
🌐 URL de vista previa: u   💾 Ruta de salida: u   🎫 Token: u   
🚀 Ejecutando Puppeteer...ignore)stdoutstderrtextra   errorscwd)timeoutu   
📋 Puppeteer stdout:
u   
⚠️ Puppeteer stderr:
z Error desconocido al generar PDFu"   
❌ Puppeteer falló con código zError al generar PDF: u   ❌ PDF no generado en: z$El PDF no fue generado correctamenteu   ✅ PDF generado exitosamente: u   📦 Tamaño del archivo: z bytesu1   ❌ Timeout: Puppeteer tardó más de 90 segundosu0   Timeout: La generación del PDF tardó demasiadou=   
🗂️ Verificando/Creando estructura de carpetas en FTP...u1   📊 Estructura a crear: /Cotizaciones_Generales/FTP_HOSTFTP_USERFTP_PASSfileCotizaciones_Generalesu!   📁 Carpetas a crear/verificar: z -> u   ✅ Conectado a FTPz$/domains/sycelephant.com/public_htmlu   📂 Ruta inicial: u     ✅ Carpeta existente: zError: La carpeta requerida 'z&' no existe en el servidor FTP. Ruta: u     ❌ carpeta_faltanteu     📁 Creando carpeta: u     ✅ Carpeta creada: zError al crear carpeta '': u=   ✅ Estructura de carpetas FTP verificada/creada exitosamenteu   📂 Ruta final en FTP: zError al trabajar con FTP: u   
📤 Subiendo PDF a FTP...zH/domains/sycelephant.com/public_html/file/Ventas/Cotizaciones_Generales/z/Ventas/Cotizaciones_Generales/rbQuotationPDF)streamfilenamenameexitou   ❌ Error al subir a FTP: mensajeuC   ⚠️ Intentando método alternativo sin estructura de carpetas...z1/domains/sycelephant.com/public_html/file/Ventas/z/Ventas/rJ   url_webu   ✅ PDF subido exitosamente: u#   
📧 Preparando envío de email...	SalePriceAmountTotalAmountDiscountPercentz
                                SELECT TaxCode, FrontES, TaxAmount 
                                FROM Q_TaxRate 
                                WHERE TaxCode = ?
                            TaxCodecodigonombre
porcentajezN/Au+   ⚠️ Error al obtener info del impuesto: u-   
👤 Obteniendo información del vendedor...CurrencyCodeUSDzs
                                SELECT FrontES FROM Q_Currency WHERE CurrencyCode = ?
                            u   💱 Moneda para email: u,   ⚠️ No se pudo obtener nombre de moneda: telefonou   ✅ Vendedor encontrado: u   ✅ Email vendedor: u   ✅ Teléfono vendedor: quotation_idversion
costing_idcaso_costeoCaseCostcliente_nombreCRM_ContactNameClientetipo_contactoCRM_ContactTypeoportunidad_crmCRM_OpportunityNumbercliente_emailCRM_ContactEmailcliente_telefonoCRM_ContactNumbercliente_ciudadCRM_ContactCitycliente_estadoCRM_ContactStatecliente_paisCRM_ContactCountryvendedor_asignadoprecio_listaprecio_ofertaprecio_totaldescuento_porcentajemonto_descuentomonto_impuestoimpuesto_codigoimpuesto_nombreimpuesto_porcentajemonedamoneda_codigofactor_sobrecostoOvercostFactortotal_lineasQuotationLinespdf_urlfecha_generacionz%d/%m/%Y %H:%MtipolocalrutaCotizacion_mimetypezapplication/pdfzjesuscadena27@hotmail.comu0   ✅ Email del creador agregado a destinatarios: u6   ⚠️ No se agregó email del creador (no disponible)u1   ✅ Email del vendedor agregado a destinatarios: u0   ℹ️ Email del vendedor ya está en la lista: u7   ⚠️ No se agregó email del vendedor (no disponible)u   📧 Destinatarios TO finales: z0Emails/Ventas/Cotiz/RecepcionCotizacionMail.htmlu   📋 Nueva Cotización z - Vz - i  TOCCzjescad27@gmail.com)template_pathasuntomail_list_idtemplate_dataarchivos_adjuntosdestinatarios_adicionalesemail_enviadoemail_mensajeemail_destinatariosdestinatariostotal_destinatariosu   ✅ Email enviado correctamentez   Destinatarios: u.   ⚠️ Advertencia: No se pudo enviar email - u   ❌ Error al enviar email: zError al enviar email: u   🔍 Intentando eliminar: u   🔍 Archivo existe: u   🔍 Permisos: u    ✅ Archivo temporal eliminado: u   ⚠️ Archivo no existe: u#   ❌ Error de permisos al eliminar: u;   💡 El archivo podría estar siendo usado por otro procesou(   ❌ Error al eliminar archivo temporal: u)   🗑️ Archivo temporal JSON eliminado: u2   ⚠️ No se pudo eliminar archivo temporal JSON: u#   ✅ PROCESO COMPLETADO EXITOSAMENTEpdf_ruta_ftpmessagez5PDF generado, subido y enviado por email exitosamenteu   
❌ ERROR CRÍTICO: zP================================================================================)Jrf   
subprocessuuidshutilftplibrg   rh   r   r   werkzeug.datastructuresr   App.Subir_Archivor   #App.Utilities_module.MailManagementr   r   Consultas_SQL.conexionr   r=   rK   dumpsr   rM   cursorexecutefetchoner1   ru   uuid4host_urlrstriprk   ri   rj   makedirsrm   dumpsplitrl   r   which
expanduserPopenPIPEdirnamecommunicate
returncodegetsizeTimeoutExpiredkillgetenvFTPloginr   
error_permpwdquitmkdfloatr   get_seller_infore   nowstrftimeappendrs   rt   timesleepoctstatst_moderq   PermissionError)Wquote_idrf   r   r   r   r   rg   r   r   r   r   r   r   r   rN   
user_emailr   session_emailconnr   rowr3   rW   base_urlpreview_urlbase_dirrx   ry   rz   r"   version_resultr   quote_id_correctocosting_num_basequote_id_folderoutput_filenameoutput_pathscript_path	error_msg	node_pathpossible_pathsri   processr   r   return_codehost_ftpusuario_ftp   contraseña_ftpcarpetas_estructuraftpcurrent_pathpuede_crearcarpetaruta_final_ftpruta_ftp_completacarpeta_relativapdf_fileitemresultado_ftpruta_ftp_simplecarpeta_simplef2	pdf_file2r   r   r   r   r   r   r   impuesto_infotax_rowr   moneda_nombremoneda_resultvendedor_infovendedor_emailvendedor_nombrevendedor_telefonor   r   destinatarios_toresultado_email
email_infors   r  sW   &                                                                                      r&   !generate_quotation_pdf_controllerOregistrar_rutas_recepcion_cotizacion.<locals>.generate_quotation_pdf_controller)  s   z	E2;IS)=(O?@(O ##%D 89$**T!%@A J O!++i0 'G 4E'))T![[]]f"NN+XZab"(//"3C#&c!ff & 0$
 &-!. '-oo&7 + *  s1vv%(V
 "m!.J::;X;X:YZ[ 

%E ''..s3H%J&OPK 

%E ''..s3H%J&OPK #,,Hh%7SJKK
TK2 WW\\*
5'6OPNncG<<		$a@ =5n5EFG
 ((;9??DQGK D[MRS#%%& ((* *0):+9!+<+<!.QRBSVWBW ' & :7)DE $/-q	 :,->,?@A  #;//O'(8'9:;+O+<=> !,K=7)1UG4PO'',,z?CK4[MG9DQR '',,/8W>TK OH:./&{m45()D(EFG77>>+..D[MR	YK()	5'9EFKK+K=9: ./V,I^_7=GG&&'HI" +Dww~~d++$(	 24&9:	 + BGGNN9$=$=]	YK()	5'9EFKK0<=0>?)+78L()23 !&&Kk5I!! GGOOK0 ' Gu!(!4!4R!4!@%006vh?@8AB!#*06XI?}MN"IugAWXaWb?c#degjjjww~~k224[MBC"Iug?e#fgilll7}EF2277??;3O2PPVWX RSEFVEWWXYhXiijklyy,H))J/K ii
3O $*85MO_ap"q5fkkBU6V5WXY:Ljj*		+7+,  F%+L>:; $2G!\( 9'CD #h.*.K /  3H "%UW00@AB
 01 #kk{j||}  N  ~O  OP  !Q!@AQ@RRSTcSddefk4((A&*;-q	F' %[MG9= ?%$	! %W--6}Y7O6PQR_` 'ZO%/Nk400B$/#%'2;-q	%N!/%	 )H% +*	)  -W55#*Iug}U^G_+`#acf#f 101 )(L  6 1" (	25gY?@U )Z 89k$TXXk1%=> %dhhx&; <$TXXmQ%?@',TXX6G-K'L$ #/">!-!= !#'))T![[]]f"NN ,  "&)!4	6
 '-oo&7G&$,gaj$,gaj$0%
2Cc2I1" %-dhhy%.H$,dhhy%.H$0!1" + *: FG !% ? -N'))T![[]]f"NN , !.0 -3OO,=M,q1A1A0=a0@ + * 4]O4WX "3!B!B488KCX!Y!.!2!27!;"/"3"3H"=$1$5$5j$A!1/1BCD,^,<=>01B0CDE"!"H"!w"! !$((;"7"! "488J#>	"!
 %dhh/@)&L"! $TXX.?%G"! &txx0G'O"! $TXX.@%%H"! '1De(L"! %dhh/@%&H"! %dhh/A5&I"! #DHH-A5$I"! ():):8)D"!  #L!"!" $]#"!$ #L%"!& +,@'"!( &$n &}X'>%}X'>)=+Fm#]'2BA)F"C1A2(F$Gw&(?(?@P(QC"!L  K}Bwit"L"$5	%! %@#@  $++J7LZLYZRS "n<L&L$++N;MnM]^_#L^L\]^ST78H7IJK"9"T0T'#dhhWhjsNtMuv!%"/&7.34/
# $_Y%?#_Y%?)??+KLa+b
 #9--;=./OPe/f.ghiLZLYZJ?[dKeJfgh  JJqM&77>>+..6{mDE1"''..2M1NOPOC0D0L0L,Mbc,R+STUIIk*<[MJK6{mDEU!#jJugU:S!T77>>.11IIn-EnEUVW (O78(O47 07R    S +]] *))2  OI!MNNO4 =<< ' &%%  McRSfXVWL ,, uIJ	5';mnoqtttuT ",, \  +*GyPvwzw~w~  xA  wB  BC  DK  CL  )MI!F9+"67HHJ#* )5 ' 2G, $ !$	$$ $ "$<WI"FG\ # 0 # 0 %(>wi&H I I#, \.FwisSVWXSYRZ,[	 %yk&: ; #
'.	5'9/U'VX['[ [ [	\)\@  L9#a&B	YK()	5'9EFKKLH 1001 )((| +]] *))* ! GsKL $((9e"< $((9e"<$a%M" +]] *)) ! NHLMMNL  3CF8<= ##%#U#'>s1vh%G)1
	6 # V;A3?@SUU &@QIJ ##%%&  UJ3q6(STTU$  	E*1#./!Iugs1v>?DD		Es  BAP1 A	A@# 'A@ 9;	:";	A@$A@# 4A@# A@# A@# A@# -	A@# 6C*AP1  AA
7AAP1 AB AA2,AAA	0AA28AB DAP1 -A>AP1 0AP1  AP1 - AP1 BAP1 >AB8 AB8 8%AB8  AB8 ?AB8 6AB8 A4AP1 	AAH  (AC;?AH 1AP1 8A-AI%AAI
	)
AI3
AP1 ?AIAP1 2B AL8 3AJ AJBAI2	+AJ3AJ ;AL8 AL *AK=9AK)	=	AK)	AK=AL 'H(AL8 .AL8 ?B<AL8 ;AP1 <AL8 AP1 ( AN 	BAN AP1 AN AP1 !A AP "AP 9AP1 ;A@@	A@@A@ 	@	A@# @#AA@.AA@<AP1 AAAAAP1 A
AA	A	AP1 AAA/A)	AA2A2AB	A=	AB BAB5BAB0B*AP1 B0AB5B5AP1 B8=AC8C5AP1 C7AC8C8AP1 C;AHDA
AHEAH E"AHE10AF%F!AH F%AG>F0?AG9G/AG>G0AHG5AH G9AG>G>AHHAH HAIH,AIH<AIH=AP1 IAIIAP1 I
AII	AIIAI/	I)	AP1 I2AJI=	AJJAJ	JAJ JAL8 JAJ JAK&J%6AK!KAL8 K!AK&K&AL8 K)AK:K4	AK=K=AL	L	AL LAL5LAL0L*AL8 L0AL5L5AL8 L8ANM?ANNAP1 NANNAP1 NAO>NAN:N4AP1 N:AO>OAO>O+AO9O3AP1 O9AO>O>AP1 PAP.PAP)P#AP1 P)AP.P.AP1 P1ARP<;AQ=Q7ARQ=ARz(/Ventas/Cotiz/Recepcion/BuscarCotizacionc                 *    \         P                  ! 4       p V '       d   RV 9  d   \        RRRRRRR//4      R	3# V R,          P                  4       p\        P                  R
V 24       \        V4      pV'       dD   VP                  RR4      R$9   d-   \        P                  RV R24       \        RRRVRR/4      ^3# V'       dH   VP                  RR4      p\        P                  RV RV 24       \        RRRRRV 2RRRR//4      R3# \        P                  RV R24       \        RRRRRV R2RRRR//4      R3#   \         dE   p\        P                  R\        T4       2RR7       \        RRRRR RR!RR//4      R"3u R#p?# R#p?ii ; i)%uO   Busca y recupera todos los datos de una cotización finalizada por ingeniería.cotizacion_idrI   Fr+   r   u#   ID de cotización no proporcionado.codeINVALID_REQUESTrJ   u!   Buscando cotización completada: StatusIngenieria	PENDIENTE   Cotización u#    encontrada y lista para revisión.TrN   u'   Cotización lista para revisión final.u    no está lista. Estatus: uJ   La cotización aún no ha sido finalizada por Ingeniería. Estado actual: 
alert_typeinfoCOTIZACION_PENDIENTEi  z no encontrada en el sistema.u   El ID de cotización 'u   ' no existe o no está activo.warningCOTIZACION_NOT_FOUNDr,   u#   Error en búsqueda de cotización: exc_infou+   Error interno del servidor en la búsqueda.INTERNAL_ERRORr.   N)
COMPLETADO
FINALIZADA)r   rK   r   striploggerrX  r   rM   rZ  r1   r+   ru   )rN   rQ  cotizacion_completarT   r3   s        r&   buscar_cotizacion?registrar_rutas_recepcion_cotizacion.<locals>.buscar_cotizaciono  s>   +	j##%D?$6	5'IGlnt  wH  <I   J  K  MP  P  P 1779MKK;M?KL #=]"K"':'>'>?QS^'_c'l=/9\]^t/H   	 
 %,001C[Qm_<VW]V^_`u!%opvow#x$f 6     m_<YZ[u!%;M?Jh#i$i 6      	jLL>s1vhGRVLWIug	Cprx  {K  MY  [b  8c  d  e  gj  j  j	js;   E E BE  E AE 3E F9FFFz(/Ventas/Cotiz/Recepcion/EnviarCotizacionc                   < \         P                  ! R4      p V '       g   \        RRRRRRR//4      R	3#  \        P                  ! 4       pV'       d   R
V9  d   \        RRRRRRR//4      R3# VR
,          pVR,          pVR,          pVR,          p\
        P                  RV 24       \        W$V 4      pVR,          '       g    \        RRRRRVR,           2RR//4      R3# \        W#V 4      pVR,          '       g    \        RRRRRVR,           2RR//4      R3# \        W%V 4      pVR,          '       g    \        RRRRRVR,           2RR//4      R3# \        W V4      p	V	R,          '       g    \        RRRRRV	R,           2RR//4      R3# V	P                  R4      '       d   S! W!W	R,          4       \
        P                  RV R24       \        RRRRV R2RR
VRV	P                  R4      //4      ^3#   \         dE   p
\
        P                  R \        T
4       2RR!7       \        RRRRR"RR#RR//4      R3u R$p
?
# R$p
?
ii ; i)%uL   Procesa la cotización final, actualiza el estado y notifica al cliente/CRM.r   rI   Fr+   r   zUsuario no autenticadorR  NOT_AUTHENTICATEDi  rQ  u!   Datos de cotización incompletos.rS  rJ   financieroslineastiempo_condicionesu5   Iniciando proceso de finalización para Cotización: u   Error al actualizar líneas: rW  rZ  r.   z'Error al actualizar datos financieros: z*Error al actualizar tiempo y condiciones: u    Error al finalizar cotización: r   rV  z# finalizada y enviada exitosamente.T   La cotización z4 ha sido enviada al cliente y actualizada en el CRM.rN   u%   Error inesperado en el envío final: r\  u.   Error interno del servidor en el envío final.r^  N)r   rM   r   r   rK   rb  rX  r   r   r   r   r1   r+   ru   )r   rN   rQ  rh  ri  rj  resultado_lineasresultado_financieroresultado_tiemporesultado_finalr3   enviar_correo_cliente_v2s              r&   enviar_cotizacion?registrar_rutas_recepcion_cotizacion.<locals>.enviar_cotizacion  s    ++i(Iug	C[]cex7yz{  ~A  A  A1	m##%D?$6	5'IGjlr  uF  <G   H  I  KN  N  N 1M}-K(^F!%&:!;KKOP]_`
  <MSZ[#I..	5'IIfgw  yB  hC  gD  HE  GS  U^  <_   `  a  cf  f  f $A]d#e '	22	5'IIp  rF  GP  rQ  qR  HS  Ua  cl  <m   n  o  qt  t  t  ?}bij#I..	5'IIs  uE  FO  uP  tQ  HR  T`  bk  <l   m  n  ps  s  s <MTXYO"9--	5'IIijy  {D  kE  jF  HG  IU  W^  <_   `  a  cf  f  f ""9--(gW`GabKK,}o5XYZ4_]O;op-ODWDWXaDbc  	   	mLL@QITXLYIug	Csu{  ~N  P\  ^e  8f  g  h  jm  m  m	msI   G= G= /A5G= %9G= 9G= 9G= G= *AG= =I9IIIz	/getTermsc                   < \         P                  R4        \        4       p V '       g%   \         P                  R4       \	        RR/4      R3# \
        P                  ! V \        R7      pSP                  V^RR7      p\         P                  R	\        V 4       R
24       V#   \         d2   p\         P                  RT 24       \	        RR/4      R3u Rp?# Rp?ii ; i)u   
Endpoint para obtener todos los tipos de términos y condiciones activos
desde la tabla Q_TermsType y devolverlos en formato JSON.
uJ   📥 Solicitud recibida para obtener los tipos de términos y condiciones.u:   ⚠️ No se encontraron registros activos en Q_TermsType.r+   z$No se encontraron registros activos.r,   defaultapplication/jsonrw   rT   r   u   ✅ z# registros devueltos correctamente.u+   ❌ Error inesperado al obtener términos: u,   Ocurrió un error inesperado en el servidor.r.   N)rb  rX  r   rZ  r   rg   r   r   response_classre   r1   r+   )resultado_dictjson_responserw   r3   apps       r&   get_TermsType_JSON_controllerKregistrar_rutas_recepcion_cotizacion.<locals>.get_TermsType_JSON_controller  s     	`a	[/1N "[\)OPQSVVV !JJ~OM ))&+ * H
 KK$s>233VWXO 	[LLFqcJKG%STUWZZZ	[s)   B" #B" AB" "C-&CCCz/<string:cotizacion_id>c                $    V ^8  d   QhR\         /# r!   rQ  ru   )r%   s   "r&   r'   r(     s     #Z #Z# #Zr)   c                  < \         P                  RV  24        \        V 4      pV'       g(   \         P                  RV  24       \	        RR/4      R3# \
        P                  ! V\        R7      pSP                  V^RR7      p\         P                  R	V  24       V#   \         d5   p\         P                  R
T  RT 24       \	        RR/4      R3u Rp?# Rp?ii ; i)u   
Endpoint para obtener los datos de una cotización en formato JSON.
Responde con los datos en caso de éxito, o con un código de error apropiado.
u0   Recibida solicitud para obtener la cotización:    Cotización no encontrada: r+   u   Cotización no encontradar,   rt  rv  rw  u'   Respuesta exitosa para la cotización: u*   Error inesperado al procesar cotización 'r   u+   Ocurrió un error inesperado en el servidorr.   N)rb  rX  r   rZ  r   rg   r   r   rx  r1   r+   )rQ  ry  rz  rw   r3   r{  s   &    r&   *get_Quote_JSON_BussinessCentral_controllerXregistrar_rutas_recepcion_cotizacion.<locals>.get_Quote_JSON_BussinessCentral_controller  s     	F}oVW	Z<]KN "!<]OLM)DEFKK
 !JJ~OM ))&+ * H
 KKA-QRO 	ZLLEm_TWXYWZ[\G%RSTVYYY	Zs)   B &B A	B C*)CCCz/<string:cotizacion_id>/sendc                $    V ^8  d   QhR\         /# r  r  )r%   s   "r&   r'   r(   +  s     9k 9kS 9kr)   c           	     <   \         P                  RV  24        \        V 4      pV'       gD   \         P                  RV  24       \	        RRRRV P                  R4      ^ ,           R2/4      R	3# \        \        P                  4      p\        P                  ! 4       pVP                  pRR
RR/pVP                  R8X  d,   \         P                  RV  R24       VP                  V4      pM\         P                  RV  R24       \         P                  RV  R24       \	        RR
RRV P                  R4      ^ ,           R2RV/4      ^3#   \        P                  P                   d   p\         P                  RT P                  R4      ^ ,           RTP                   P"                   24       \	        RRRRRTP                   P"                  /4      TP                   P$                  3u Rp?# Rp?i\        P                  P&                   d4   p\         P                  RT 24       \	        RRRR/4      R3u Rp?# Rp?i\(         dO   p\         P                  RT P                  R4      ^ ,           RT 2RR 7       \	        RRRR!/4      R"3u Rp?# Rp?ii ; i)#uv   
Endpoint para enviar una cotización desde la BD local al CRM.
Se usa con método POST (por ejemplo, desde Postman).
u4   Recibida solicitud POST para enviar la cotización: r  rT   r+   r   rk  r   z' no fue encontrada en la base de datos.r,   rI   u    MODO PROTOTIPO: Envío simulado.Fu   Enviando cotización 'z' al CRM...u1   MODO PROTOTIPO: Simulando envío de cotización 'z	' al CRM.u   Cotización 'z' enviada exitosamente al CRM.rV  z enviada exitosamente al CRM.crm_responsezError HTTP al enviar 'r   u   El CRM rechazó la solicitud.rD   Nu#   Error de comunicación con el CRM: u"   Error de comunicación con el CRM.i  u+   Error inesperado al enviar la cotización 'Tr\  u'   Error interno al enviar la cotización.r.   )rb  rX  r   rZ  r   r   r   r   configConfig	PROTOTIPO
send_quoterequests
exceptions	HTTPErrorr+   rw   r   status_codeRequestExceptionr1   )rQ  quote_data_to_sendcrm_managerconfigurationvalorr  r3   s   &      r&   send_quote_controllerCregistrar_rutas_recepcion_cotizacion.<locals>.send_quote_controller*  s    	J=/Z[2	k!@!O &!<]OLMg1D1DS1I!1L0MMtu     %[%7%78K"MMOM!++E$i<^_L &&%/4]O;OP*556HIOP]^ghi KK-6TUV)\-*=*=c*B1*E)FFcd  	  "",, 	'LL1-2E2Ec2J12M1NcRSR\R\RaRaQbcd':1::??  

&&	' ' ""33 	fLL>qcBCHgy:^_`beee 	kLLF}GZGZ[^G_`aGbFccfghfijuyLzHgy:cdegjjj	ksW   AE 0CE J*A?G/)J/ JJ(H?9J?JJAJJJc                H    V ^8  d   QhR\         R\        R\        R\         /# )r!   rQ  rN   r   r   )ru   r   r$   )r%   s   "r&   r'   r(   k  s)     '9 '9 '94 '9# '9X[ '9r)   c           
       <  VP                  R/ 4      P                  RR4      pVP                  R/ 4      P                  RR4      pRVRV RVR	\        P                  ! 4       P                  R
4      /pTpS
P                  P                  R4      '       d   S
P                  P                  R4      p\        RRV  2V.VR7      pVR,          '       g0   \        P                  RV RVR,           24       RRRVR,          /# \        P                  RV 24       RR/#   \         d;   p	\        P                  R\        T	4       24       RRR\        T	4      /u Rp	?	# Rp	?	ii ; i)u5   Simula el envío de correo de cotización al cliente.oportunidadr   zcorreo_prueba@igsa.com.mxr   zCliente Estimador   rQ  r   fecha_envioz%d/%m/%YEMAIL_PROTOTYPE_MODEEMAIL_PROTOTYPE_TOADRESSz-Emails/Ventas/Cotiz/CotizFinalClientMail.htmlu   Cotización Finalizada - ID )r   r   to_listr   rI   z"Error al enviar correo al cliente z: r   Fr   u7   Correo de cotización enviado exitosamente al cliente: Tu4   Error en el proceso de envío de correo al cliente: N)rM   r   r  r  r  r   rb  rZ  rX  r1   r+   ru   )rQ  rN   r   r   r   cliente_namer   destinatario	resultador3   r{  s   &&&&      r&   rp  Fregistrar_rutas_recepcion_cotizacion.<locals>.enviar_correo_cliente_v2k  sh   %	9 !HH]B7;;<NPklM88M26::;LN`aL !,7x||~66zB	M  -Lzz~~455#&::>>2L#ML 0M5m_E%+	I Y''!CM?RTU^_hUiTjkl!5)Yy5IJJKKQR_Q`abt$$ 	9LLOPSTUPVxXYuiQ88	9s+   BD A+D D E#)/EE#E#N)route)r{  mail_BASE_ROUTEr4   r9   r?   rE   rP   r}   rN  rd  rq  r|  r  r  rp  s   f&             @r&   $registrar_rutas_recepcion_cotizacionr  !   s\   +K
 	YY+89E7YKW LW$ 	YY+f%wY7	W 8	W 	YY+k*UGY<
W =
W 	YY+@AE7YS
W T
W 	YY+/06(YCi Di$ 	YY+01FI;NYO\Q P\Q| 	YY+67&YJE KEJ 	YY9F8YL-j M-jf 	YY9F8YL7m M7mv 	YY+i(5'Y:[ ;[D 	YY+56YH#Z I#ZN 	YY+:;fXYN9k O9k@'9 '9r)   )#rh   r   r   r   r   r   r   r	   	functoolsr
   loggingrg   r   typingr   r   r  r  "App.Utilities_module.CRMManagementr   ,Consultas_SQL.Ventas.Cotiz.RecepcionCotizSQLr   r   r   r   r   r   r   r   r   r   r   	getLoggerrb  r   r)   r&   <module>r     sZ    ] \ \       :	 	 	 K G 			1	2q9r)   