
    9i(                        S SK JrJrJrJr  SSKJr  SSKJr  S SK	r	\" S\
5      r\R                  SS/S	9S
\4S j5       r\R                  SS/S	9S 5       r\R                  SS/S	9S 5       r\R                  SS/S	9S
\4S j5       r\R                  SS/S	9S 5       r\R                  SSS/S	9S 5       r\R                  SS/S	9S 5       rg)    )	Blueprintjsonifyrequestsession   )quote_reception_services)OpportunityAndCostingDTONquote_receptionz/costing/<int:costing_num>GET)methodscosting_numc                      [         R                  R                  U 5      nU(       a  [        UR	                  5       5      $ [        SSU  S305      S4$ ! [
         a  n[        SS05      S4s SnA$ SnAff = f)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 encontradai  (   Ocurrió un error interno en el servidor  N)r   Quote_Reception_Serviceget_unified_data_by_costing_numr   to_dict	Exception)r   data_dtoes      lc:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\api\controller\quote_reception_controller.py get_reception_costing_controllerr   	   s    S+CCccdop8++-.. G'?}N%[\]_bbb S!KLMsRRSs#   >A A 
A7A2,A72A7z/taxesc                       [         R                  R                  5       n [        U 5      $ ! [         a  n[        SS05      S4s SnA$ SnAff = f)zR
Controlador para obtener la lista de impuestos.
Ruta final: /api/reception/taxes
r   r   r   N)r   r   	get_taxesr   r   )taxesr   s     r   get_taxes_controllerr      sN    S(@@JJLu~ S!KLMsRRSs   (+ 
AA	A	Az/currenciesc                       [         R                  R                  5       n [        U 5      $ ! [         a'  n[        SU 35        [        SS05      S4s SnA$ SnAff = f)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   r   get_currenciesr   r   print)
currenciesr   s     r   get_currencies_controllerr"   *   s_    S-EETTV
z"" SDQCHI!KLMsRRSs   (+ 
AAAAz"/costing-details/<int:costing_num>c                      [         R                  R                  U 5      n[        U5      $ ! [         a'  n[        SU 35        [        SS05      S4s SnA$ SnAff = f)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   r   get_costing_detailsr   r   r    )r   detailsr   s      r   get_costing_details_controllerr&   7   sb    S*BBVVWbcw SI!MN!KLMsRRSs   ), 
AAAAz/create-quotationPOSTc                  6    [         R                  " 5       n [        R                  R	                  U 5      nUR                  S5      (       a  [        U5      S4$ [        U5      S4$ ! [         a(  n[        SU 35        [        SSS.5      S4s S	nA$ S	nAff = f)
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   r   N)	r   get_jsonr   r   create_quotationgetr   r   r    )dataresultr   s      r   create_quotation_controllerr2   D   s    e!)AARRSWX::i  6?C''6?C'' e:1#>?53]^_adddes$   AA& A& &
B0BBBz/preview-quotationOPTIONSc                  J   [         R                  S:X  ae  [        SS05      n U R                  R	                  SS5        U R                  R	                  SS5        U R                  R	                  SS	5        U S
4$  [         R
                  " 5       nU(       a  [        U5      S::  Ga  [        S5        SnU(       a8  UR                  S5      =(       d    [         R                  R                  S5      nO[         R                  R                  S5      nU(       Ga  SSK	nSSK
nSSKJn  UR                  R                  UR                  SSSS5      nUR                  R                  USU S35      n[        SU 35        UR                  R!                  U5      (       at  [#        USSS9 nUR$                  " U5      nSSS5        [        S5        [        S['        UR)                  5       5       35         UR+                  U5        [        S5        O'[        S U 35        S!U S"U S#3n
U
S$S%S&04$ S'n
U
S$S%S&04$ U(       d	  S(n
U
S$S%S&04$ UR                  S5      =(       d    [         R                  R                  S5      n[        S)5        [        S*U 35        [        S+['        UR)                  5       5       35        [.        R0                  R3                  U5      nU(       a  [        S,[        U5       S-35        US
S%S&04$ S.n
U
S/S%S&04$ ! , (       d  f       GNW= f! [,         a  n	[        SU	 35         Sn	A	GNSn	A	ff = f! [,         aS  n	[        S0U	 35        SSKnUR7                  5         S1[9        U	5       S2UR;                  5        S33n
U
S/S%S&04s Sn	A	$ Sn	A	ff = f)4ux   
Controlador para generar vista previa de la cotización antes de crearla.
Ruta final: /api/reception/preview-quotation
r3   statusokzAccess-Control-Allow-Origin*zAccess-Control-Allow-HeaderszContent-Type,X-Auth-TokenzAccess-Control-Allow-Methodsr'         uO   ⚠️ Datos incompletos recibidos, intentando cargar desde archivo temporal...NtokenzX-Auth-Tokenr   )current_app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: z1</p>
                        <p>Archivo buscado: zQ</p>
                    </body>
                    </html>
                    r+   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: u  
        <!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>zB</pre>
            </div>
        </body>
        </html>
        )r   methodr   headersaddr-   lenr    r/   osjsonflaskr;   pathjoin	root_pathexistsopenloadlistkeysremover   r   r   generate_quotation_preview	traceback	print_excstr
format_exc)responser0   r:   rJ   rK   r;   
output_dirtemp_data_filefr   
error_htmlpreview_htmlrW   s                r   preview_quotation_controllerra   Y   s    ~~"Hd+,:C@;=XY;VD}OM! s4yA~cdE)PW__-@-@-P++N;-WW\\+*?*?5RZ\cd
!#jJugU:S!T//?@A77>>.11ncGD#yy| EEG1$tyy{2C1DEFS		.1 BD @@PQR&#
 $)' *--;,< =	"J &s^=W,XXX
 "39S(TTT J s^5O$PPP !HW__%8%8%H<>%eW-.&tDIIK'8&9:; 0GGbbcgh'L(9':+FG~7Q&RRRJ s^5O$PPPS ED % S MaSQRRSD  *M045.> /2!fX 6**,- .	A$
J 31K LLLU*Ms{   ;D/M *L=8M 6L M 1M :M 
B9M M 
LM 
M)L=7M =MM 
N"ANN"N"z/generate-pdf/<quote_id>c                 b&    SSK nSSKnSSKnSSKnSSKnSSKnSSKJnJn  SSK	J
n	  SSKJn
  SSKJn  SSKJn  SSKJn  [%        S	5        [%        S
5        [%        S	5        UR&                  " 5       n[%        S5        [%        UR(                  " USSS95        Sn [*        R,                  " S5      n[*        R,                  " S5      nU(       a  SSKJn  U" 5        nUR/                  5        nUR1                  SU5        UR3                  5       nU(       a
  US   (       d"  UR1                  SU5        UR3                  5       nSSS5        SSS5        W(       a  US   (       a  US   nU(       d	  U(       a  Un[%        SU=(       d    S 35        [7        UR9                  5       5      nUR:                  R=                  S5      nU S3n[7        UR9                  5       5      nUR:                  R=                  S5      nU S3nUR>                  nUR@                  RC                  USSSS5      nURE                  USS9  SSKnUR@                  RC                  USU S35      n[G        US S!S"9 nURH                  " UUSSS#9  SSS5        [%        S$U 35        UR-                  S%U 5      RK                  S&5      S   n[%        S'U 35         U" 5        nUR/                  5        nUR1                  S(U5        UR3                  5       nUS   (       d  S)OUS   S)-   nSSS5        SSS5        [%        S*W 35        U S&U 3n [%        S,U  35        [7        U5      n!U n"[%        S-U! 35        [%        S.U" 35        S/U S0U S1U S23n#UR@                  RC                  UU#5      n$[%        S3U S0U S235        UR@                  RC                  US4SSS55      n%[%        S6U 35        [%        S7U% 35        [%        S8UR@                  RM                  U%5       35        UR@                  RM                  U%5      (       d#  S9U% 3n&[%        S:U& 35        [O        SU&S;.5      S<4$ [%        S=U% 35        [%        S>5        URQ                  S?5      n'U'(       dd  [%        S@5        SASBUR@                  RS                  SC5      /n(U( H5  n)UR@                  RM                  U)5      (       d  M%  U)n'[%        SDU) 35          O   U'(       a   UR@                  RM                  U'5      (       d   SEn&[%        S:U& 35        [O        SU&S;.5      S<4$ [%        SFU' 35        [%        SGU 35        [%        SHU$ 35        [%        SIU 35        [%        SJ5        URU                  U'U%UU$U/URV                  URV                  SS!SKUR@                  RY                  U%5      SL9n* U*R[                  SMSN9u  n+n,U*R\                  n-U+(       a  [%        SOU+ 35        U,(       a  [%        SPU, 35        U-S:w  a,  U,(       a  U,OSQn&[%        SRU- 35        [O        SSSU& 3S;.5      S<4$ UR@                  RM                  U$5      (       d  [%        STU$ 35        [O        SSUS;.5      S<4$ [%        SVU$ 35        [%        SWUR@                  R_                  U$5       SX35        [%        S[5        [%        S\U! SU" S35        URe                  S]5      n.URe                  S^5      n/URe                  S_5      n0S`SSaU!U"/n1[%        SbScRC                  U15       35         URg                  U.5      n2U2Ri                  U/U05        [%        Sd5        Sen3U2Rk                  U35        [%        SfU3 35        Sn4U1 H-  n5 U2Rk                  U55        [%        SgU5 35        U5S:X  a  Sn4M-  M/     U2Ro                  5       n6[%        Sp5        [%        SqU6 35        U2Rq                  5         [%        Ss5        StU! SU" S3n7SuU! SU" S3n8[G        U$Sv5       nU	" US/U S1U S23SwSx9n9S/U S0U 3n:U
" U9U:U7U85      n;U;Sy   (       d  [%        SzU;S{    35        [%        S|5        S}n<S~n=[G        U$Sv5       n>U	" U>S/U S1U S23SwSx9n?U
" U?U:U<U=5      n;U;Sy   (       d%  [O        SU;S{   S;.5      S4sSSS5        sSSS5        $  SSS5        U;S   n@[%        SU@ 35        SSS5        [%        S5         [u        UR-                  SS5      5      nA[u        UR-                  SS5      5      nB[u        UR-                  SS5      5      nC[u        UR-                  SS5      5      nDUAUB-
  nEUCUB-
  nF0 nG U" 5        nUR/                  5        nUR1                  SUR-                  S5      5        UR3                  5       nHUH(       a  WHS   UHS)   [u        UHS   5      S-  S.nGO&UR-                  SS5      UR-                  SS5      SS.nGSSS5        SSS5        [%        S5        UR-                  SS5      nIUInJ U" 5        nUR/                  5        nUR1                  SUI5        UR3                  5       nKUK(       a  WKS   (       a  WKS   nJSSS5        SSS5        [%        SWI ScWJ 35        [v        Rx                  R{                  UR-                  S%5      5      nLULR-                  S5      nMULR-                  S5      nNULR-                  S5      nO[%        SUN 35        [%        SUM 35        [%        SUO 35        0 SU _SU_SUR-                  S%5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SUR-                  SS5      _SULR-                  S5      _SWA_SWB_SWC_SWD_WEWFWGS   UGS   UGS   WJWIUR-                  SS)5      [}        UR-                  S/ 5      5      W@UR                  5       R                  S5      S.EnPSU$SU S0U S23SS./nQS/nRU(       a   WRR                  U5        [%        SU 35        O[%        S5        WM(       a&  WMWR;  a   WRR                  WM5        [%        SUM 35        O!WM(       a  [%        SWM 35        O[%        S5        [%        SWR 35        U" SSU SU SUR-                  SS5       3SWPWQURS/S.S9nSUSS   USS{   USS   S   S.nTUSS   (       a.  [%        S5        [%        SWSS   S    35        [%        SU 35        O[%        SWSS{    35         SSKDnVUVR                  S)5         UR@                  RM                  U$5      (       a  [%        SU$ 35        [%        SUR@                  RM                  U$5       35        [%        S[        UR                  U$5      R                  5      SS  35        UR                  U$5        [%        SU$ 35        O[%        SU$ 35          UR@                  RC                  USU S35      nUR@                  RM                  U5      (       a  UR                  U5        [%        SU 35        [%        S	5        [%        S5        [%        S	5        [O        SW@U8USS.WTE5      S4$ ! , (       d  f       GN= f! , (       d  f       GN= f! [4         a  n[%        SU 35         SnAGNSnAff = f! , (       d  f       GN= f! , (       d  f       GN!= f! , (       d  f       GN+= f! [4         a$  n[%        S+[7        U5       35        S)n SnAGNISnAff = f! UR`                   a.    U*Rc                  5         [%        SY5        [O        SSZS;.5      S<4s $ f = f! URl                   a    U4(       dL  ShU5 SiU2Ro                  5        SU5 3n&[%        SjU& 35        U2Rq                  5         [O        SU&U5Sk.5      S<4s s  $ [%        SlU5 35         U2Rs                  U55        U2Rk                  U55        [%        SmU5 35         GM  ! [4         aM  nSnU5 So[7        U5       3n&[%        SjU& 35        U2Rq                  5         [O        SU&S;.5      S<4s SnAs s  $ SnAff = ff = f! [4         a6  nSr[7        U5       3n&[%        S:U& 35        [O        SU&S;.5      S<4s SnA$ SnAff = f! , (       d  f       GNo= f! , (       d  f       GNf= f! , (       d  f       GNX= f! , (       d  f       GNb= f! [4         a?  n[%        SU 35        UR-                  SS5      UR-                  SS5      SS.nG SnAGNSnAff = f! , (       d  f       GNG= f! , (       d  f       GNQ= f! [4         a  n[%        SU 35         SnAGNaSnAff = f! [4         aH  n[%        S[7        U5       35        SSKBnUUUR                  5         SS[7        U5       3SS.nT SnAGNSnAff = f! [         a$  n[%        SU 35        [%        S5         SnAGN+SnAf[4         a6  n[%        S[7        U5       35        SSKBnUUUR                  5          SnAGNiSnAff = f! [4         a"  n[%        S[7        U5       35         SnAGN8SnAff = f! [4         aE  n[%        SU 35        SSKBnUUUR                  5         [O        S[7        U5      S;.5      S<4s SnA$ SnAff = f)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>
r   N)r;   r   )FileStorage)subir_archivo_ftp_desde_request)enviar_correo_universal)datetime)get_connectionzP================================================================================u+   🚀 INICIANDO GENERACIÓN DE PDF CON EMAILu$   🧠 Datos recibidos para genera PDFr   F)indentensure_asciiuser_idemailz+SELECT Email FROM Profiles WHERE UserID = ?z
                                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 /api/reception/preview-quotationr<   r=   r>   r?   T)exist_okr@   rA   wrC   rD   )ri   rh   u!   💾 Datos temporales guardados: 	CostingID-u/   
📊 Obteniendo versión de cotización para: zm
                        SELECT MAX(Version) FROM Q_QuotationHead WHERE QuotationNum = ?
                    r9   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   ❌ 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textrE   errorscwdZ   )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     ❌ )r)   r   carpeta_faltanteu     📁 Creando carpeta: u     ✅ Carpeta creada: zError al crear carpeta 'z': 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/r+   url_webu   ✅ PDF subido exitosamente: u#   
📧 Preparando envío de email...	SalePriceAmountTotalAmountDiscountPercentz
                            SELECT TaxCode, FrontES, TaxAmount 
                            FROM Q_TaxRate 
                            WHERE TaxCode = ?
                        TaxCoded   )codigonombre
porcentajezN/Au+   ⚠️ Error al obtener info del impuesto: u-   
👤 Obteniendo información del vendedor...CurrencyCodeUSDzk
                            SELECT FrontES FROM Q_Currency WHERE CurrencyCode = ?
                        u   💱 Moneda para email: u,   ⚠️ No se pudo obtener nombre de moneda: r   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_porcentajer   r   OvercostFactorQuotationLinesz%d/%m/%Y %H:%M)monto_descuentomonto_impuestoimpuesto_codigoimpuesto_nombreimpuesto_porcentajemonedamoneda_codigofactor_sobrecostototal_lineaspdf_urlfecha_generacionlocalCotizacion_zapplication/pdf)tiporutar   mimetypez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  zjescad27@gmail.com)TOCC)template_pathasuntomail_list_idtemplate_dataarchivos_adjuntosdestinatarios_adicionalesr)   destinatariostotal_destinatarios)email_enviadoemail_mensajeemail_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 EXITOSAMENTEz5PDF generado, subido y enviado por email exitosamente)r)   r   pdf_ruta_ftpr   messager8   u   
❌ ERROR CRÍTICO: )KrJ   
subprocessuuidshutilftplibrK   rL   r;   r   werkzeug.datastructuresrc   App.Subir_Archivord   #App.Utilities_module.MailManagementre   rf   Consultas_SQL.conexionrg   r    r-   dumpsr   r/   cursorexecutefetchoner   rY   uuid4host_urlrstriprO   rM   rN   makedirsrQ   dumpsplitrP   r   which
expanduserPopenPIPEdirnamecommunicate
returncodegetsizeTimeoutExpiredkillgetenvFTPloginr{   
error_permpwdquitmkdfloatr   r   get_seller_inforI   nowstrftimeappendrW   rX   timesleepoctstatst_moderU   PermissionError)Wquote_idrJ   r   r   r   r   rK   r;   r   rc   rd   re   rf   rg   r0   
user_emailrj   session_emailconnr   rowr   r:   base_urlpreview_urlbase_dirr\   r]   r^   r   version_resultr   quote_id_correctocosting_num_basequote_id_folderoutput_filenameoutput_pathscript_path	error_msg	node_pathpossible_pathsrM   processrw   rx   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_inforW   r   sW                                                                                          r   !generate_quotation_pdf_controllerr4     s   zA.7EO%9h;<h ! 	45djjae<= 
 	Kkk),G#KK0MA#%&'TV]^$oo/"#a&"NN , 
 ")* #)//"3C ' &  3q6!$QJ -*
6z7T_6UVW DJJL! ##**3/!
"BC DJJL! ##**3/!
"BC ((WW\\(HeXwO

J. 	jJugU2KL.#8AIIdAE!< 91.1ABC
 hh{H5;;C@C 	@NO	!T[[]fNN $$& &,__%6N'5a'8anQ>ORS>SG # " 6wi@A  +m1WI6():(;<= {++#$4#567''89: (}BwiqtLggll:?0RyMN ggllox:P
 	z*+";-01$RWW^^K%@$ABCww~~k**@NID$%uyABCGG'}56 	*+LL(	Z[39""#DEN '77>>$'' $I.tf56	 ' y 9 9YID$%uyABCGG,YK89,[M:;%k]34UG$%./ ""[+uE????, # 
	q$000<NFF!,,K26(;<4VH=>a&,F2T	;K=IJ5=ST]S^;_`acfff77>>+..0>?5;abcehhh3K=AB.rww{/K.LFST 	NOABRASSTUdTeefgh99Z(ii
+))J/  &x1IK[]lm1&++>Q2R1STU:	H**X&CIIk?3'( BLGGL!'~67  K.!XGGG$5gY?@ (*&* + /H !WWYNQS,^,<=>HHJ 	,- ggwfxxy  {J  zK  KL  M<=M<NaP_O``ab+t$"&{m1WITB#H !Ry9D;! 	M !)2=3K2LMN[\ #V!++t, +!#.{m1WIT!J+!I %D!'&	%M )1&5=QZC['\]_bb -,1 %$L 2 -" $I.G1';<U %Z 	45k	 +q!9:L!$((8Q"78M -!;<L#(2CQ)G#H  +]:O)M9N M#%& ( "XXi0	2
 #)//"3"*1!**1!*.3GAJ.?#.E-M +/((9e*D*.((9e*D./-M ' &: BC !HH^U;M)MJ#%& (*, )/(9(]1-=,9!,<M ' & 0tM?ST 5LL\\]a]e]efq]rsM*..w7N+//9O - 1 1* =-o->?@((89:,->,?@A""7" dhh{3" txx
E:	"
 !$((+<i"H"  *;U!C" "488,CU#K"  *<e!D" #DHH-@%$H" !$((+<e"D" !$((+=u"E" )=u E" $]%6%6x%@"  !""  #"$ %"& '(<'"( $3"0 $1#:#0#:'4\'B'!.%)XX.>%B #DHH-=r$B C"$,LLN$;$;<L$MC"ML $' +K=7)4H 1	! !<<  ''
3HUVNO .8H"H ''7I.IYZ[HHXYZOP34D3EFG5P,[MgYc$((SdfoJpIqr!+"3*/0+
O "1!;!0!;'6'GH]'^J y)79*??+KLa+b*cdeHUVFW`GaFbcd 	 	

1	"ww~~k**2;-@A-bggnn[.I-JKLBGGK,@,H,H(I"#(N'OPQ		+&8FG2;-@A	QWW\\*
5'6OPNww~~n--		.)A.AQRS 	h34h,N
 
   	S ' &%2  	KEaSIJJ	K4 98 #] "!  	I#a&RSG	L (( 	qLLNEFu7ijkmppp	qT (( X '&CG9Lrsvszszs|r}}~  @G  H  %I	yk23
&',%.07(    	      8	BCXGGG,GGG,!$:7)"DEE( X*B7)3sSTvh(WI!F9+"67HHJ#*uy+Q#RTW#WWW	X)X@  	H5c!fX>ID$%uyABCGG	HH -,1 %$| ' &%*  CA3GH"hhy%8"hhy%8"#!" ' &%  JDQCHIIJL  	/Ax89!!&#:3q6(!C'(J		6  	R7s;<OQQ 	"<SVHEF!!	"  	QFs1vhOPP	Q$  A&qc*+53q6:;S@@	As  BAK A {9 {',A{{'
A{9 CAK +|?AAK } } 7|1}} 5DAK A=AK AAK .B
AK 9A9~ 3=~ 16~ 'A4AK AAC 3'?AC )AK AAD 7AD	AD 	AK &AD AK A8AG, AE AE&A;AD2!AE)AE 1AG, AG AF4)9AF""AF4*AG KAG, AK  AG, 1AK B'AI /AK 0AI >AK  AAJ0 5AK 
{$	{''
{61{9 9
||AK |AK 
|.)AK 1
} 	;}
}} 
~}>8AK >~AK ;AK AK AAC@&AC @*AC@90AA-A)AC A-
ACA7>AB?B5ACB6ACB;AC B?ACCACCAC C
ADC+ADD ADDAK DADDAK D
AD	DAD D 
AD/D*AK D2
AE	D<AEE
AEEAE EAG, EAE E
AFE 4AFFAG, FAFFAG, F"
AF1	F,AF4F4
AGF>AG G
AG)GAG$GAG, G$AG)G)AG, G,
AH>G6=AH9H3AK H9AH>H>AK I
AJ-IAI*I$AK I*AJ-I7+AJ(J"AK J(AJ-J-AK J0
AKJ:AKKAK KAKKAK K
AL.K):AL)L#AL.L)AL.)rL   r   r   r   r   servicesr   !services.quote_reception_servicesr	   rK   __name__routerrouteintr   r   r"   r&   r2   ra   r4       r   <module>r=     sC   6 6 / H  
$h	/*UG<S# S =S& h(	S )	S meW-
S .
S 2UGD
S 
S E
S !F84e 5e( "VY,?@\M A\M| (6(;A <Ar<  