U
    1i                     @   s   d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
Z
d dlZd dlmZ d dlmZmZ d dlZd dlZd dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d d	lmZ d dlZe
 d
Z!dd Z"dS )    )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_universalZrecepcion_cotizacionc                    s  d} j | ddgdtddd} j | ddgdd	d
 } j | ddgddd } j | ddgdtddd} j | ddgddd } j | dddgddd } j | ddgddd }	 j ddgddd }
 j ddgdfd d!} j | d"dgd fd#d$} j | d%dgdtd& fd'd(} j | d)dgdtd&d*d+}ttttd, fd-d.d S )/Nz/Ventas/Cotiz/Recepcionz/costing/<int:costing_num>GET)methods)costing_numc              
   S   sv   z:t | }|rt| W S tdd|  didfW S W n6 tk
rp } ztddidf W Y S d}~X Y nX dS )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   Zget_unified_data_by_costing_numr   to_dict	Exception)r   Zdata_dtoe r$   eC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Ventas_Module\Cotiz\RecepcionCotiz.py get_reception_costing_controller,   s    
zNregistrar_rutas_recepcion_cotizacion.<locals>.get_reception_costing_controllerz/taxesc               
   S   sN   zt  } t| W S  tk
rH } ztddidf W Y S d}~X Y nX dS )zj
        Controlador para obtener la lista de impuestos.
        Ruta final: /api/reception/taxes
        r   r   r    N)r   Z	get_taxesr   r"   )Ztaxesr#   r$   r$   r%   get_taxes_controllerB   s
    
zBregistrar_rutas_recepcion_cotizacion.<locals>.get_taxes_controllerz/currenciesc               
   S   s\   zt  } t| W S  tk
rV } z&td|  tddidf W Y S d}~X Y nX dS )zm
        Controlador para obtener la lista de monedas.
        Ruta final: /api/reception/currencies
        z4Error en el controlador quote_reception/currencies: r   r   r    N)r   Zget_currenciesr   r"   print)
currenciesr#   r$   r$   r%   get_currencies_controllerQ   s    
zGregistrar_rutas_recepcion_cotizacion.<locals>.get_currencies_controllerz"/costing-details/<int:costing_num>c              
   S   s^   zt | }t|W S  tk
rX } z&td|  tddidf W Y S d}~X Y nX dS )u   
        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   Zget_costing_detailsr   r"   r(   )r   detailsr#   r$   r$   r%   get_costing_details_controllera   s    

zLregistrar_rutas_recepcion_cotizacion.<locals>.get_costing_details_controllerz/create-quotationPOSTc               
   S   s   z<t  } t| }|dr,t|dfW S t|dfW S W nF tk
r } z(td|  tddddf W Y S d	}~X Y nX d	S )
us   
        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   Zcreate_quotationgetr   r"   r(   )dataresultr#   r$   r$   r%   create_quotation_controllerq   s    

zIregistrar_rutas_recepcion_cotizacion.<locals>.create_quotation_controllerz/preview-quotationOPTIONSc               
   S   s  t jdkrHtddi} | jdd | jdd | jdd	 | d
fS z6t  }|rft|dkrtd d}|r|dpt jd}nt jd}|rddl	}ddl
}ddlm} |j|jdddd}|j|d| d}td|  |j|rt|ddd}||}W 5 Q R X td tdt|   z|| td W n2 tk
r }	 ztd|	  W 5 d}	~	X Y nX n0td |  d!| d"| d#}
|
d$d%d&ifW S nd'}
|
d$d%d&ifW S |sd(}
|
d$d%d&ifW S |dpt jd}td) td*|  td+t|   t|}|rjtd,t| d- |d
d%d&ifW S d.}
|
d/d%d&ifW S W nn tk
r }	 zNtd0|	  ddl}|  d1t|	 d2|  d3}
|
d/d%d&if W Y S d}	~	X Y nX dS )4u   
        Controlador para generar vista previa de la cotización antes de crearla.
        Ruta final: /api/reception/preview-quotation
        r7   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   )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>
                        r0   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addr2   lenr(   r3   osjsonflaskr   pathjoin	root_pathexistsopenloadlistkeysremover"   r   Zgenerate_quotation_preview	traceback	print_excstr
format_exc)responser4   r=   rL   rM   r   
output_dirtemp_data_filefr#   Z
error_htmlZpreview_htmlrX   r$   r$   r%   preview_quotation_controller   s~    

"

	 %zJregistrar_rutas_recepcion_cotizacion.<locals>.preview_quotation_controllerz/generate-pdf/<quote_id>c           W      S   s  z|ddl }ddl}ddl}ddl}ddl}ddl}ddlm}m} ddl	m
}	 ddlm}
 ddlm} ddlm} ddlm} td	 td
 td	 | }td t|j|ddd d}ztd}td}|r^ddlm} | R}| >}|d| | }|r|d s2|d| | }W 5 Q R X W 5 Q R X |r^|d r^|d }|sn|rn|}td|pzd  W n2 tk
r } ztd|  W 5 d}~X Y nX t| }|jd}| d}t| }|jd}| d}|j}|j !|dddd}|j"|dd ddl}|j !|d| d}t#|d d!d"}|j$||ddd# W 5 Q R X td$|  |d%| %d&d }td'|  zf| H}| 4}|d(| | }|d sd)n
|d d) }W 5 Q R X W 5 Q R X td*|  W n: tk
r@ } ztd+t|  d)}W 5 d}~X Y nX | d&| } td,|   t|}!| }"td-|!  td.|"  d/| d0| d1| d2}#|j !||#}$td3| d0| d2 |j !|d4ddd5}%td6|  td7|%  td8|j &|%  |j &|%sBd9|% }&td:|&  t'd|&d;d<fW S td=|%  td> |(d?}'|'std@ dAdB|j )dCg}(|(D ],})|j &|)r|)}'tdD|)   qq|'r|j &|'sdE}&td:|&  t'd|&d;d<fW S tdF|'  tdG|  tdH|$  tdI|  tdJ |j*|'|%||$|g|j+|j+dd!dK|j ,|%dL}*z|*j-dMdN\}+},|*j.}-|+rtdO|+  |,rtdP|,  |-dkr|,r|,ndQ}&tdR|-  t'ddS|& d;d<fW W S |j &|$stdT|$  t'ddUd;d<fW W S tdV|$  tdW|j /|$ dX W n< |j0k
rt   |*1  tdY t'ddZd;d<f Y W S X td[ td\|! d|" d |2d]}.|2d^}/|2d_}0d`dda|!|"g}1tdbdc!|1  z|3|.}2|24|/|0 tdd de}3|25|3 tdf|3  d}4|1D ]H}5z,|25|5 tdg|5  |5dkrHd}4W q |j6k
r`   |4sdh|5 di|27  d|5 }&tdj|&  |28  t'd|&|5dkd<f Y   W W S tdl|5  z&|29|5 |25|5 tdm|5  W np tk
rZ } zPdn|5 dot| }&tdj|&  |28  t'd|&d;d<f W Y  Y   W W S d}~X Y nX Y nX q|27 }6tdp tdq|6  |28  W nX tk
r } z8drt| }&td:|&  t'd|&d;d<f W Y W S d}~X Y nX tds dt|! d|" d}7du|! d|" d}8t#|$dv}|	|d/| d1| d2dwdx}9d/| d0| }:|
|9|:|7|8};|;dy 
s tdz|;d{   td| d}}<d~}=t#|$dvj}>|	|>d/| d1| d2dwdx}?|
|?|:|<|=};|;dy 	st'd|;d{ d;dfW  5 Q R  W  5 Q R  W S W 5 Q R X |;d }@td|@  W 5 Q R X td z8t:|dd}At:|dd}Bt:|dd}Ct:|dd}D|A|B }E|C|B }Fi }Gz| x}| d}|d|d | }H|H
r|Hd |Hd) t:|Hd d d}Gn|dd|dddd}GW 5 Q R X W 5 Q R X W nN tk
rV } z.td|  |dd|dddd}GW 5 d}~X Y nX td |dd}I|I}Jzj| F}| 2}|d|I | }K|Kr|Kd r|Kd }JW 5 Q R X W 5 Q R X td|I dc|J  W n2 tk
r } ztd|  W 5 d}~X Y nX t;<|d%}L|Ld}M|Ld}N|Ld}Otd|N  td|M  td|O  | ||d%|dd|dd|dd|dd|dd|dd|dd|dd|dd|Ld|A|B|C|D|E|F|Gd |Gd |Gd |J|I|dd)t=|dg |@|> ?dd}Pd|$d| d0| d2ddg}Qdg}R|rf|R@| td|  ntd |Mr|M|Rkr|R@|M td|M  n|Mrtd|M  ntd td|R  |dd| d| d|dd d|P|Q|Rdgdd}S|Sd |Sd{ |Sd d d}T|Sd rNtd td|Sd d   td|  ntd|Sd{   W n\ tk
r } z<tdt|  ddlA}U|UB  ddt| dd}TW 5 d}~X Y nX ddlC}V|VDd) z|j &|$rBtd|$  td|j &|$  tdtE|F|$jGdd   |H|$ td|$  ntd|$  W n~ tIk
r } ztd|  td˃ W 5 d}~X Y nF tk
r } z&tdt|  ddlA}U|UB  W 5 d}~X Y nX z@|j !|d| d}|j &|r|H| td|  W n6 tk
rH } ztdt|  W 5 d}~X Y nX td	 tdσ td	 t'd|@|8|ddќ|TdfW S  tk
r } z<td|  ddlA}U|UB  t'dt|d;d<f W Y S d}~X Y nX dS )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_requestr   r
   )get_connectionzP================================================================================u+   🚀 INICIANDO GENERACIÓN DE PDF CON EMAILu$   🧠 Datos recibidos para genera PDF   F)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-quotationr>   r?   r@   rA   T)exist_okrB   rC   wrE   rF   )rf   re   u!   💾 Datos temporales guardados: Z	CostingID-u/   
📊 Obteniendo versión de cotización para: zu
                            SELECT MAX(Version) FROM Q_QuotationHead WHERE QuotationNum = ?
                        r<   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_Z_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   ❌ r1   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textrG   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fileZ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   Z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/rbZ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/r0   url_webu   ✅ PDF subido exitosamente: u#   
📧 Preparando envío de email...Z	SalePriceZAmountZTotalAmountZDiscountPercentz
                                SELECT TaxCode, FrontES, TaxAmount 
                                FROM Q_TaxRate 
                                WHERE TaxCode = ?
                            ZTaxCoded   )codigonombre
porcentajezN/Au+   ⚠️ Error al obtener info del impuesto: u-   
👤 Obteniendo información del vendedor...CurrencyCodeZUSDzs
                                SELECT FrontES FROM Q_Currency WHERE CurrencyCode = ?
                            u   💱 Moneda para email: u,   ⚠️ No se pudo obtener nombre de moneda: r   Ztelefonou   ✅ Vendedor encontrado: u   ✅ Email vendedor: u   ✅ Teléfono vendedor: ZCaseCostCRM_ContactNameClienteCRM_ContactTypeCRM_OpportunityNumberCRM_ContactEmailCRM_ContactNumberCRM_ContactCityCRM_ContactStateCRM_ContactCountryr   r   ZOvercostFactorZQuotationLinesz%d/%m/%Y %H:%M)Zquotation_idversionZ
costing_idZcaso_costeocliente_nombreZtipo_contactoZoportunidad_crmcliente_emailZcliente_telefonoZcliente_ciudadZcliente_estadoZcliente_paisvendedor_asignadoprecio_listaprecio_ofertaprecio_totaldescuento_porcentajemonto_descuentomonto_impuestoZimpuesto_codigoZimpuesto_nombreZimpuesto_porcentajeZmonedamoneda_codigoZfactor_sobrecostoZtotal_lineaspdf_urlZfecha_generacionlocalZ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)TOZCC)template_pathasuntomail_list_idtemplate_dataarchivos_adjuntosdestinatarios_adicionalesr.   destinatariostotal_destinatarios)Zemail_enviadoZemail_mensajeZ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   Zpdf_ruta_ftpr   messager;   u   
❌ ERROR CRÍTICO: )JrL   
subprocessuuidshutilftplibrM   rN   r   r   Zwerkzeug.datastructuresra   App.Subir_Archivorb   #App.Utilities_module.MailManagementr   r   Consultas_SQL.conexionrc   r(   r2   dumpsr   r3   cursorexecutefetchoner"   rZ   uuid4host_urlrstriprQ   rO   rP   makedirsrS   dumpsplitrR   r   which
expanduserPopenPIPEdirnamecommunicate
returncodegetsizeTimeoutExpiredkillgetenvFTPloginrv   
error_permpwdquitmkdfloatr   get_seller_inforK   nowstrftimeappendrX   rY   timesleepoctstatst_moderW   PermissionError)Wquote_idrL   r   r   r   r   rM   r   r   ra   rb   r   r   rc   r4   
user_emailrg   Zsession_emailconnr   rowr#   r=   base_urlZpreview_urlbase_dirr]   r^   r_   r   Zversion_resultr   Zquote_id_correctoZcosting_num_baseZquote_id_folderZoutput_filenameoutput_pathscript_path	error_msgZ	node_pathZpossible_pathsrO   processrr   rs   return_codehost_ftpusuario_ftp   contraseña_ftpZcarpetas_estructuraftpcurrent_pathZpuede_crearcarpetaZruta_final_ftpZruta_ftp_completaZcarpeta_relativaZpdf_fileitemZresultado_ftpZruta_ftp_simpleZcarpeta_simplef2Z	pdf_file2r   r   r   r   r   r   r   Zimpuesto_infoZtax_rowr   Zmoneda_nombreZmoneda_resultZvendedor_infoZvendedor_emailZvendedor_nombreZvendedor_telefonor   r   Zdestinatarios_toZresultado_emailZ
email_inforX   r   r$   r$   r%   !generate_quotation_pdf_controller)  s$   


 


.    

















>*

:





 












&	




"

$	zOregistrar_rutas_recepcion_cotizacion.<locals>.generate_quotation_pdf_controllerz(/Ventas/Cotiz/Recepcion/BuscarCotizacionc               
   S   sr  zt  } | rd| kr2tddddddfW S | d  }td|  t|}|r|d	d
dkrtd| d td|dddfW S |r|d	d
}td| d|  tdd| dddddfW S td| d tdd| ddddddfW S W nZ t	k
rl } z:tj
dt| dd tdd d!d"d#dd$f W Y S d%}~X Y nX d%S )&uO   Busca y recupera todos los datos de una cotización finalizada por ingeniería.cotizacion_idFu#   ID de cotización no proporcionado.INVALID_REQUESTr   coder1   r0   u!   Buscando cotización completada: ZStatusIngenieria	PENDIENTE)Z
COMPLETADOZ
FINALIZADA   Cotización u#    encontrada y lista para revisión.Tu'   Cotización lista para revisión final.)r.   r4   r   r;   u    no está lista. Estatus: uJ   La cotización aún no ha sido finalizada por Ingeniería. Estado actual: infoZCOTIZACION_PENDIENTE)r   
alert_typer   i  z no encontrada en el sistema.u   El ID de cotización 'u   ' no existe o no está activo.warningZCOTIZACION_NOT_FOUNDr   u#   Error en búsqueda de cotización: exc_infou+   Error interno del servidor en la búsqueda.INTERNAL_ERRORr   r   r   r   r    N)r   r2   r   striploggerr   r   r3   r   r"   r   rZ   )r4   r   Zcotizacion_completar8   r#   r$   r$   r%   buscar_cotizaciono  sR    	

	z?registrar_rutas_recepcion_cotizacion.<locals>.buscar_cotizacionz(/Ventas/Cotiz/Recepcion/EnviarCotizacionc               
      s$  t d} | s&tddddddfS zt }|r>d|krXtdd	d
dddfW S |d }|d }|d }|d }td|  t||| }|d stdd|d  ddddfW S t||| }|d stdd|d  ddddfW S t	||| }|d s2tdd|d  ddddfW S t
|| |}	|	d sltdd|	d  ddddfW S |	dr ||| |	d  td| d tdd| d||	dd d!d"fW S  tk
r }
 z:tjd#t|
 dd$ tdd%d&dd'ddf W Y S d(}
~
X Y nX d(S ))uL   Procesa la cotización final, actualiza el estado y notifica al cliente/CRM.rg   FzUsuario no autenticadoNOT_AUTHENTICATEDr   r1   i  r   u!   Datos de cotización incompletos.r   r0   financieroslineastiempo_condicionesu5   Iniciando proceso de finalización para Cotización: r.   u   Error al actualizar líneas: r   r   )r   r   r    z'Error al actualizar datos financieros: z*Error al actualizar tiempo y condiciones: u    Error al finalizar cotización: r   r   r   z# finalizada y enviada exitosamente.T   La cotización z4 ha sido enviada al cliente y actualizada en el CRM.)r   r   )r.   r   r4   r;   u%   Error inesperado en el envío final: r   u.   Error interno del servidor en el envío final.r   r   N)r   r3   r   r   r2   r   r   r   r   r   r   r"   r   rZ   )rg   r4   r   r   r  r  Zresultado_lineasZresultado_financieroZresultado_tiemporesultado_finalr#   )enviar_correo_cliente_v2r$   r%   enviar_cotizacion  sJ    
$$
$
$
z?registrar_rutas_recepcion_cotizacion.<locals>.enviar_cotizacionz	/getTermsc               
      s   t d z`t } | s2t d tddidfW S tj| td} j|ddd	}t d
t	|  d |W S  t
k
r } z(t d|  tddidf W Y S d}~X Y nX dS )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   defaultr;   application/jsonr\   r8   r   u   ✅ z# registros devueltos correctamente.u+   ❌ Error inesperado al obtener términos: u,   Ocurrió un error inesperado en el servidor.r    N)r   r   r   r   r   rM   r   r   response_classrK   r"   r   )resultado_dictjson_responser\   r#   appr$   r%   get_TermsType_JSON_controller  s"    

zKregistrar_rutas_recepcion_cotizacion.<locals>.get_TermsType_JSON_controllerz/<string:cotizacion_id>)r   c              
      s   t d|   zbt| }|s@t d|   tddidfW S tj|td} j|ddd	}t d
|   |W S  t	k
r } z.t 
d|  d|  tddidf W Y S d}~X Y nX dS )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   r  r;   r	  r
  u'   Respuesta exitosa para la cotización: u*   Error inesperado al procesar cotización 'r}   u+   Ocurrió un error inesperado en el servidorr    N)r   r   r   r   r   rM   r   r   r  r"   r   )r   r  r  r\   r#   r  r$   r%   *get_Quote_JSON_BussinessCentral_controller  s"    zXregistrar_rutas_recepcion_cotizacion.<locals>.get_Quote_JSON_BussinessCentral_controllerz/<string:cotizacion_id>/sendc              
   S   s  t d|   zt| }|sTt d|   tdd| dd  ddd	fW S ttj}t	 }|j
}d
dd}|j
dkrt d|  d ||}nt d|  d t d|  d td
d| dd  d|ddfW S  tjjk
rT } zHt d| dd  d|jj  tdd|jjd|jjf W Y S d}~X Y n tjjk
r } z*t d|  tddddf W Y S d}~X Y n^ tk
r } z>t jd| dd  d| d d! tdd"dd#f W Y S d}~X Y nX dS )$u   
        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  r   r  rl   r   z' no fue encontrada en la base de datos.)r8   r   r   r.   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.r   z enviada exitosamente al CRM.)r8   r   crm_responser;   zError HTTP al enviar 'r}   u   El CRM rechazó la solicitud.)r8   r   r+   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    )r   r   r   r   r   r   r   r   configConfig	PROTOTIPO
send_quoterequests
exceptions	HTTPErrorr   r\   rt   status_codeRequestExceptionr"   )r   Zquote_data_to_sendcrm_managerZconfigurationZvalorr  r#   r$   r$   r%   send_quote_controller*  sT    


$&$zCregistrar_rutas_recepcion_cotizacion.<locals>.send_quote_controller)r   r4   rg   r   c           
   
      s  z| di  dd}| di  dd}|| |t dd}|} j dr^ j d	}td
d|  |g|d}|d std| d|d   d|d dW S td|  ddiW S  t	k
r
 }	 z*t
dt|	  dt|	d W Y S d}	~	X Y nX dS )u5   Simula el envío de correo de cotización al cliente.oportunidadr   zcorreo_prueba@igsa.com.mxr   zCliente Estimadoz%d/%m/%Y)r   r   r   Zfecha_envioEMAIL_PROTOTYPE_MODEEMAIL_PROTOTYPE_TOADRESSz-Emails/Ventas/Cotiz/CotizFinalClientMail.htmlu   Cotización Finalizada - ID )r   r   to_listr   r.   z"Error al enviar correo al cliente z: r   F)r.   r   u7   Correo de cotización enviado exitosamente al cliente: Tu4   Error en el proceso de envío de correo al cliente: N)r3   r   r   r   r  r   r   r   r   r"   r   rZ   )
r   r4   rg   r   r   Zcliente_namer   destinatario	resultador#   r  r$   r%   r  k  s2    
zFregistrar_rutas_recepcion_cotizacion.<locals>.enviar_correo_cliente_v2)routeintrZ   r   )r  mailZ_BASE_ROUTEr&   r'   r*   r,   r6   r`   r   r   r  r  r  r  r$   )r  r  r%   $registrar_rutas_recepcion_cotizacion!   s>    




 "
    I
3;"'@r(  )#rN   r   r   r   r   r   r   r   	functoolsr	   loggingrM   r   typingr   r   r  r  "App.Utilities_module.CRMManagementr   Z,Consultas_SQL.Ventas.Cotiz.RecepcionCotizSQLr   r   r   r   r   r   r   r   r   r   r   	getLoggerr   r(  r$   r$   r$   r%   <module>   s   $(
