
    iw                     \    S SK J r   S SKJrJrJrJr  S SKJr   " S S5      r " S S5      r	g)	    datetime)OptionalListDictUnionget_connectionc            9           \ rS rSrSr        S$S\S\S\S\S\S	\S
\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\48S  jjrS!\	4S" jr
S#rg)%OpportunityAndCostingDTO   uI   DTO para la información unificada de Oportunidad y Encabezado de Costeo.N
costing_idcrm_opportunity_numbercrm_contact_namecrm_contact_typecrm_assigned_salespersoncrm_contact_adresscrm_contact_coloniacrm_contact_citycrm_contact_numbercrm_contact_countrycrm_contact_legal_identifiercrm_contact_zipcrm_contact_statecrm_contact_email	case_costsale_price_listsale_price_mindiscount_max_percentrun_time_numberrun_time_typetechnical_terms_and_conditionsFinancePercentTaxCodeCurrencyCodeQ_TaxRate_FrontESQ_TaxRate_FrontENQ_Currency_FrontESQ_Currency_FrontENc                 z   Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        Xl
        Xl        Xl        Xl        Xl        UU l        UU l        UU l        UU l        UU l        U4U l        UU l        U4U l        U4U l        U4U l        U4U l        U4U l        UU l        g )N)	CostingIDCRM_OpportunityNumberCRM_ContactNameCRM_ContactTypeCRM_AssignedSalespersonCRM_ContactAdressCRM_ContactColoniaCRM_ContactCityCRM_ContactNumberCRM_ContactCountryCRM_ContactLegalIdentifierCRM_ContactZipCRM_ContactStateCRM_ContactEmailCaseCostSalePriceListSalePriceMinDiscountMaxPercentRunTimeNumberRunTimeTypeTechnicalTermsAndConditionsr#   r$   r%   r&   r'   r(   r)   )selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   s                                hC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\api\services\quote_reception_services.py__init__!OpportunityAndCostingDTO.__init__   s     $%;"//'?$!3"5/!3"5*F'- 1 1!,*"6,(+I+J(,x(M!2!3!2!3"4"5"4    returnc                 B   0 SU R                   _SU R                  _SU R                  _SU R                  _SU R                  _SU R
                  _SU R                  _SU R                  _S	U R                  _S
U R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _S[        U R                   5      _S[        U R"                  5      _[        U R$                  5      U R&                  U R(                  U R*                  S   U R,                  b  [        U R,                  5      OSU R.                  S   U R0                  S   U R2                  S   U R4                  S   U R6                  S   U R8                  S.E$ )z2Convierte el objeto a un diccionario serializable.r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r   N)r<   r=   r>   r?   r#   r$   r%   r&   r'   r(   r)   )r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   floatr:   r;   r<   r=   r>   r?   r#   r$   r%   r&   r'   r(   r)   )r@   s    rA   to_dict OpportunityAndCostingDTO.to_dict8   s   

#T%?%?
 t33
 t33	

 &t'C'C
  !7!7
 !$"9"9
 t33
  !7!7
 !$"9"9
 )$*I*I
 d11
  5 5
  5 5
 
  U4#5#56!
" E$"3"34#
$ #((?(?"@!//+++/+K+KA+N<@<O<O<[eD$7$78aeQ --a0!%!7!7!:!%!7!7!:"&"9"9!"<"&"9"99
 	
rD   )r/   r0   r2   r1   r4   r8   r5   r-   r3   r7   r.   r6   r,   r9   r+   r%   r<   r#   r)   r(   r'   r&   r=   r>   r:   r;   r$   r?   )
NNNNNNNNNN)__name__
__module____qualname____firstlineno____doc__strrG   intrB   dictrH   __static_attributes__ rD   rA   r   r      sB   S pt)- $%)*.*.+/+/*53 *5 *5WZ *5#&*5BE*5[^*5&)*5=@*5VY*5 '**5 JM*5 #&	*5 ;>	*5 SV	*5
  *5
 38*5
 JO*5
 gl*5 #&*5 >A*5 jm*5 "'*5 *5  #*5 %(*5 %(*5 &)*5 &)*5Z
 
rD   r   c                   
   \ rS rSrSr\S\S\\   4S j5       r	\S\
\\\\\4   4      4S j5       r\S\
\\\4      4S j5       r\S\S\
\   4S j5       r\S	\S\4S
 j5       r\S	\S\4S j5       r\S\S\4S j5       rSrg)Quote_Reception_Service\   uY   Clase de servicio para manejar la lógica de recepción de datos de costeo y oportunidad.costing_numrE   c                    Sn [        5        nUR                  5        nUR                  X5        UR                  5       nSSS5        W(       a  [	        S<0 SUS   _SUS   _SUS   _S	US
   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS    _S!US"   _S#US$   _S%US&   _S'US(   _S)US*   _S+US,   _S-US.   _S/US0   _S1US2   _S3US4   _S5US6   _S7US8   _S9US:   _6sSSS5        $  SSS5        g! , (       d  f       N= f! , (       d  f       g= f! [
         a  n[        S;U 35         SnAgSnAff = f)=zc
Consulta unificada que obtiene los datos de Q_CostingHead y Q_OpportunityCRM
en una sola llamada.
aO  
            SELECT TOP 1
                Q_CostingHead.CostingID,
                Q_OpportunityCRM.CRM_OpportunityNumber,
                Q_OpportunityCRM.CRM_ContactName,
                Q_OpportunityCRM.CRM_ContactType,
                Q_OpportunityCRM.CRM_AssignedSalesperson,
                Q_OpportunityCRM.CRM_ContactAdress,
                Q_OpportunityCRM.CRM_ContactColonia,
                Q_OpportunityCRM.CRM_ContactCity,
                Q_OpportunityCRM.CRM_ContactNumber,
                Q_OpportunityCRM.CRM_ContactCountry,
                Q_OpportunityCRM.CRM_ContactLegalIdentifier,
                Q_OpportunityCRM.CRM_ContactZip,
                Q_OpportunityCRM.CRM_ContactState,
                Q_OpportunityCRM.CRM_ContactEmail,
                Q_CostingHead.CaseCost,
                Q_CostingHead.SalePriceList,
                Q_CostingHead.SalePriceMin,
                Q_CostingHead.DiscountMaxPercent,
                Q_CostingHead.RunTimeNumber,
                Q_CostingHead.RunTimeType,
                Q_CostingHead.TechnicalTermsAndConditions,
                Q_CostingHead.FinancePercent,
                Q_CostingHead.TaxCode,
                Q_CostingHead.CurrencyCode,
                Q_TaxRate.FrontES as Q_TaxRate_FrontES,
                Q_TaxRate.FrontEN as Q_TaxRate_FrontEN,
                Q_Currency.FrontES as Q_Currency_FrontES,
                Q_Currency.FrontEN as Q_Currency_FrontEN
            FROM
                Q_CostingHead
            INNER JOIN
                Q_OpportunityCRM ON Q_CostingHead.CRM_OpportunityID = Q_OpportunityCRM.CRM_OpportunityID
            LEFT JOIN
                Q_TaxRate ON Q_TaxRate.TaxCode = Q_CostingHead.TaxCode 
                        AND Q_TaxRate.CurrencyCode = Q_CostingHead.CurrencyCode 
                        AND Q_TaxRate.Active >= 1
            LEFT JOIN
                Q_Currency ON Q_Currency.CurrencyCode = Q_CostingHead.CurrencyCode
                        AND Q_Currency.Active >= 1
            WHERE
                Q_CostingHead.CostingNum = ?
            ORDER BY
                Q_CostingHead.Version DESC;
        Nr   r   r      r      r      r      r      r      r      r   r   r   	   r   
   r      r      r      r      r      r      r      r       r!      r"      r#      r$      r%      r&      r'      r(      r)      z#Error al obtener datos unificados: rS   )r
   cursorexecutefetchoner   	Exceptionprint)rW   queryconnrs   rowes         rA   get_unified_data_by_costing_num7Quote_Reception_Service.get_unified_data_by_costing_num_   s2   -\	!T[[]fNN56 //+C # 3 #&q6BEa&[^_`[a),QJMa&ehijek -0F FIV adde`f -0F	 RUUWQX	
 ),B
 DGr7
 _bbd^e #&b' <?r7 TWWYSZ ruuwqx ),B @C2w hkkmgn (+2w !$B &)W -0G -0G .1W .1W "!, - "!"] "!.  	7s;<	sX   
D6 D%"DB?D% 	D6 
D%D6 
D"	D%%
D3/D6 3D6 6
E EEc                     Sn / n [        5        nUR                  5        nUR                  U 5        UR                  5       nU H.  nUR	                  US   US   [        US   5      US   S.5        M0     SSS5        SSS5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f! [         a  n[        SU 35        / s SnA$ SnAff = f)	uY   
Consulta la tabla Q_TaxRate para obtener el código y la descripción de los impuestos.
zTSELECT TaxCode, FrontES, TaxAmount, CurrencyCode    FROM Q_TaxRate WHERE Active = 1;r   rY   rZ   r[   )r$   FrontES	TaxAmountr%   Nz Error al obtener los impuestos: r
   rs   rt   fetchallappendrG   rv   rw   )rx   taxesry   rs   rowsrz   r{   s          rA   	get_taxes!Quote_Reception_Service.get_taxes   s    
 g	!T[[]fNN5)!??,D#QCFY^FZ$58V&= >  $ # " L #] "! L 	4QC89I	sR   
B, BAB	7B?	B, 	
B	B
B)$B, )B, ,
C6CCCc            	         Sn / n [        5        nUR                  5        nUR                  U 5        UR                  5       nU H!  nUR	                  US   US   US   S.5        M#     SSS5        SSS5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f! [
         a  n[        SU 35        / s SnA$ SnAff = f)ug   
Consulta la tabla Q_Currency para obtener el código, el nombre y el símbolo de las monedas activas.
zJSELECT CurrencyCode, FrontES, CurrSymbol FROM Q_Currency WHERE Active = 1;r   rY   rZ   )r%   r   
CurrSymbolNzError al obtener las monedas: )r
   rs   rt   r   r   rv   rw   )rx   
currenciesry   rs   r   rz   r{   s          rA   get_currencies&Quote_Reception_Service.get_currencies   s    
 ]
	!T[[]fNN5)!??,D#"))-0VAVYZ[V\]_  $ # "  #] "!  	21#67I	sR   
B BA	A<*B2	B <
B
	B
BB B 
C)B>8C>Cc                    Sn/ n [        5        nUR                  5        nUR                  X5        UR                  5       nU HL  nUR	                  US   US   US   [        US   5      US   [        US   5      [        US   5      S	.5        MN     S
S
S
5        S
S
S
5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f! [         a  n[        SU 35        / s S
nA$ S
nAff = f)u>   
Consulta Q_CostingDetail para obtener las líneas de costeo.
a  
            SELECT 
                CostingLine,
                PartNum,
                PartDescription,
                Qty,
                UOMCode,
                UnitPrice,
                Amount
            FROM Q_CostingDetail
            WHERE CostingID = (
                SELECT TOP 1 CostingID 
                FROM Q_CostingHead 
                WHERE CostingNum = ? 
                ORDER BY Version DESC
            )
            ORDER BY CostingLine ASC;
        r   rY   rZ   r[   r\   r]   r^   )CostingLinePartNumPartDescriptionQtyUOMCode	UnitPriceAmountNz%Error al obtener detalles de costeo: r   )rW   rx   detailsry   rs   r   rz   r{   s           rA   get_costing_details+Quote_Reception_Service.get_costing_details   s    
$ 	!T[[]fNN56!??,D#+.q6'*1v/21v#(Q='*1v).s1v&+CFm(   $ # " N #] "! N 	9!=>I	sR   
C
 B8A4B'B8	C
 '
B5	1B88
CC
 C
 

C.C)#C.)C.datac                 
    SSK Jn  SSKJn  U R                  S5      nSn[	        5        nUR                  5        nUR                  XC5        UR                  5       nUS   nSn	UR                  X45        UR                  5       n
U
(       a  U
S   OSnU(       d   [        SU 35         S	S	S	5        S	S	S	5        g	US   nUS
   (       a  US
   OSnUR                  SU5        UR                  5       nUS   (       d  S
OUS   S
-   nU R                  S5      nUnU(       a8  UR                  SU5        UR                  5       nU(       a  US   (       a  US   n[        SU SU 35        [        SUS    S35        [        SUS    S35        [        SUS    S35        US   (       a  US   R                  5       OS	nUS   (       a  US   R                  5       OS	nUS   (       a  US   R                  5       OS	n0 SU_SU_SU_SU R                  S5      _SU R                  S5      _SU R                  S5      _SU R                  S5      _SUS    _S!US"   _S#US$   _S%US&   _S'US(   _S)US*   _S+US,   _S-US.   _S/US0   _S1U=(       d    S2_0 S3U=(       d    S4_S5U=(       d    S6_S7U R                  S8S5      _S9U R                  S:S5      _S;U R                  S<S5      _S=U_S>U_S?U R                  S@S5      _SAU_SBU_SCU R                  SDS
5      _SEU R                  SF/ 5      _SG[        U R                  SF/ 5      5      _SHUR                  " 5       R                  SI5      _SJUR                  " 5       R                  SK5      _SLUR                  " 5       R                  _SMSN_E0 SOSP_SQU R                  SQSR5      _SSU R                  SSST5      _SUU R                  SU5      _SVU R                  SV5      _SWU R                  SW5      _SXU R                  SX5      _SYU R                  SY5      _SZU R                  SZ5      _S[U R                  S[5      _S\U R                  S\5      _S]U R                  S]5      _S^U R                  S^5      _S_U R                  S_5      _S`U R                  S`5      _SaU R                  Sa5      _SbU R                  Sb5      _En[        ScUS1    35        U" Se0 UD6nUsS	S	S	5        sS	S	S	5        $ ! , (       d  f       O= f S	S	S	5        g	! , (       d  f       g	= f! [         a,  n[        SdU 35        SS	KnUR!                  5          S	nAg	S	nAff = f)fu_   
Genera HTML de vista previa de la cotización SIN guardar en BD.
Retorna el HTML renderizado.
r   )render_templater   r+   u  
                SELECT TOP 1
                    Q_CostingHead.CostingNum,
                    Q_CostingHead.Version,
                    
                    -- Cliente
                    Q_OpportunityCRM.CRM_ContactName,
                    Q_OpportunityCRM.CRM_ContactType,
                    Q_OpportunityCRM.CRM_OpportunityNumber,
                    Q_OpportunityCRM.CRM_ContactEmail,
                    Q_OpportunityCRM.CRM_ContactNumber,
                    Q_OpportunityCRM.CRM_ContactCity,
                    Q_OpportunityCRM.CRM_ContactState,
                    Q_OpportunityCRM.CRM_ContactCountry,
                    Q_OpportunityCRM.CRM_ContactAdress,
                    
                    -- ✅ El vendedor es el UserID de la oportunidad
                    TRIM(CONCAT(
                        ISNULL(Seller.FirstName, ''), ' ',
                        ISNULL(Seller.MiddleName, ''), ' ', 
                        ISNULL(Seller.LastName, ''), ' ',
                        ISNULL(Seller.SecondLastName, '')
                    )) AS VendedorNombre,
                    ISNULL(Seller.Email, '') AS VendedorEmail,
                    ISNULL(Seller.ContactPhone, '') AS VendedorTelefono,
                    Q_CostingHead.TaxCode

                    
                FROM Q_CostingHead
                
                INNER JOIN Q_OpportunityCRM 
                    ON Q_CostingHead.CRM_OpportunityID = Q_OpportunityCRM.CRM_OpportunityID
                
                -- ✅ JOIN directo: El vendedor es Q_OpportunityCRM.UserID
                LEFT JOIN Profiles AS Seller
                    ON Q_OpportunityCRM.UserID = Seller.UserID
                
                WHERE Q_CostingHead.CostingID = ?
            re   z
                        select TaxPercent
                        from Q_TaxRate
                        where TaxCode = ?
                    u   ❌ No se encontró CostingID: NrY   m
                        SELECT MAX(Version) FROM Q_QuotationHead WHERE QuotationNum = ?
                    r%   zk
                            SELECT FrontES FROM Q_Currency WHERE CurrencyCode = ?
                        u   💱 Moneda: z -> u   🔍 DEBUG - VendedorNombre: 'rb   'u   🔍 DEBUG - VendedorEmail: 'rc   u    🔍 DEBUG - VendedorTelefono: 'rd   quotation_numversionr   caso_costeor9   r=   r>   r?   cliente_nombrerZ   tipo_contactor[   oportunidad_crmr\   cliente_emailr]   cliente_telefonor^   cliente_ciudadr_   cliente_estador   cliente_paisr`   cliente_direccionra   vendedor_asignadozNo asignadovendedor_emailzventas@igsa.comvendedor_telefonozN/Aprecio_lista	SalePricedescuento_porcentajeDiscountPercentprecio_ofertar   impuesto_codigoimpuedesto_porcentajeprecio_totalTotalAmountmonedamoneda_codigofactor_sobrecostoOvercostFactorlineasQuotationLinestotal_lineasfecha_actualz%d/%m/%Yhora_actualz%H:%Mu   año_actualempresaIGSAempresa_completaz"Integradora de Servicios Avanzadosproyecto_nombrezPor definirproyecto_requerimientosNingunocaseSelectedcase1AnticipoPercentcase1FiniquitoPercentcase2AnticipoPercentcase2FrequencyTypecase2Periodicidadcase2Cantidadcase2CantidadPeriodicidadcase3FrequencyTypecase3Periodicidadcase3Cantidadcase3CantidadPeriodicidadcase4DiasFinanciamientocase5PlazoCreditoFlagu    ✅ Vendedor final en template: u#   ❌ Error al generar vista previa: )z*Emails/Ventas/Cotiz/PreviewCotizacion.html)flaskr   r   getr
   rs   rt   ru   rw   striplennowstrftimeyearrv   	traceback	print_exc)r   r   r   r   rx   ry   rs   rz   taxCodequery2tax_rowtax_percentr   current_versionversion_resultnext_versioncurrency_codecurrency_namecurrency_resultvendedor_nombrer   r   template_datahtmlr{   r   s                             rA   generate_quotation_preview2Quote_Reception_Service.generate_quotation_preview  s   I	-)+.J&EV  !T[[]fNN55 //+C!"gGF
 NN6:6$oo/G07'!*QK ?
|LM## # "!( %(FM03Ac!fAO NN $&( &,__%6N,:1,=1>RSCTWXCXL %)HH^$<M$1M$ (*, +1//*;*q/A,;A,>MM-]OLM :3r7)1EF9#b'!DE<SWIQGH :=Rc"gmmodO8;BSW]]_TN;>r7B%R%'R% "<R% %j	R%
 &txx
';R% (/)BR% &txx'>R% 6txx@]7^R% )#a&R% (QR% *3q6R%  (Q!R%" +CF#R%$ )#a&%R%& )#a&'R%( 'A)R%* ,SW+R%0 ,_-M1R%2 ).*M<M3R%4 ,->-G%5R%: 'a(@;R%< /9JA0N=R%> ((A)>?R%@ *7AR%B 0CR%D '(BER%H !-IR%J (KR%P ,TXX6F-JQR%V !$((+;R"@WR%X 'DHH5Er,J(KYR%^ '(?(?
(K_R%` &x||~'>'>w'GaR%b &x||~':':cR%d "6eR%f +,PgR%l *4884E}+UmR%n 2488<UW`3aoR%r '(@sR%x /9O0PyR%z 0:Q1R{R%@ /9O0PAR%B -dhh7K.LCR%D ,TXX6I-JER%F (/)BGR%H 4TXX>Y5ZIR%N -dhh7K.LOR%P ,TXX6I-JQR%R (/)BSR%T 4TXX>Y5ZUR%Z 2488<U3V[R%` 0:Q1RaR%Mh <]K^=_<`ab*i[hiDa #] "!"]] "!!f  	7s;<!		se   )T( TA/S<+T3T( <P-S<)	T2	T( <
T
	TT( 
T%!T( %T( (
U2"UUc                     [        5        nUR                  5        nU R                  S5      nUR                  SU5        UR	                  5       nU(       d  SSS.sSSS5        sSSS5        $ US   nUR                  SU5        UR	                  5       nUS   (       d  S	OUS   S	-   nU S
U 3n[        SU 35        Sn	UR                  U	UUU R                  S5      U R                  S5      U R                  SS5      U R                  SS	5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S 5      U R                  S!5      U R                  S"5      45        U R                  S#/ 5      n
S$nU
 H  nUR                  UUUR                  S%5      UR                  S&5      UR                  S'5      UR                  S(5      UR                  S)5      UR                  S*5      UR                  S+5      UR                  S5      4	5        M     UR                  5         [        S,U S-35        SSS5        S.S/WWS0.sSSS5        $ ! , (       d  f       N= f! , (       d  f       g= f! [         a&  n[        S1U 35        S[        U5      S.s SnA$ SnAff = f)2u   
Crea una nueva cotización en Q_QuotationHead y Q_QuotationDetail.
Envía notificación por correo al departamento de ingeniería.
r+   zf
                        SELECT CostingNum FROM Q_CostingHead WHERE CostingID = ?
                    FzCostingID no encontrado)successerrorNr   r   rY   -u   Creando cotización: a  
                        INSERT INTO Q_QuotationHead (
                            QuotationNum,
                            Version,
                            CaseCost,
                            SalePrice,
                            DiscountPercent,
                            OvercostFactor,
                            Amount,
                            TaxCode,
                            TotalAmount,
                            CurrencyCode,
                            Active,
                            caseSelected,
                            case1AnticipoPercent,
                            case1FiniquitoPercent,
                            case2AnticipoPercent,
                            case2FrequencyType,
                            case2Periodicidad,
                            case2Cantidad,
                            case2CantidadPeriodicidad,
                            case3FrequencyType,
                            case3Periodicidad,
                            case3Cantidad,
                            case3CantidadPeriodicidad,
                            case4DiasFinanciamiento,
                            case5PlazoCreditoFlag
                        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                    r9   r   r   r   r   r$   r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   a  
                        INSERT INTO Q_QuotationDetail (
                            QuotationID,
                            QuotationLine,
                            CostingLineID,
                            PartNum,
                            PartDescription,
                            Qty,
                            UOMCode,
                            UnitPrice,
                            Amount
                        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
                    QuotationLineCostingLineIDr   r   r   r   r   u   Cotización z creada exitosamente en BDTu   Cotización creada exitosamente)r   messageQuotationIDVersionu   Error al crear cotización: )	r
   rs   r   rt   ru   rw   commitrv   rO   )r   ry   rs   r   costing_resultr   r   r   quotation_idinsert_head_queryquotation_linesinsert_detail_queryliner{   s                 rA   create_quotation(Quote_Reception_Service.create_quotation  s,   @	7!T[[]f!%+!6J NN $#% &,__%6N)+0;TU #] "! %31$5M NN $&( &,__%6N'5a'8anQ>ORS>SG&3_AgY#?L1,@A)%< NN#4%,-!2A6!115*+/00!78!89!78!56!451!<=!56!451!<=!:;!8937 : '+hh/?&DO+' !0':( HH_5 HH_5 HHY/ HH%67 HHUO HHY/ HH[1 HHX.
= 
 !0 KKML6PQRg #l  $@#/&	m "!"] "!z  	7045$s1v66	7sd   
M  L/?L	L/%	M  /JLL/	M  
L,	(L//
L=9M  =M   
M0
M+%M0+M0r   c                 .    SSK Jn  U" 5        nUR                  5        nUR                  SU 5        UR	                  5       nU(       ao  US   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSS.sSSS5        sSSS5        $  SSS5        SSS5        SSSS.$ ! , (       d  f       N= f! , (       d  f       N%= f! [         a  n[        SU 35         SnANESnAff = f)	u!   Obtiene información del vendedorr   r	   a  
                        SELECT TOP 1
                            TRIM(CONCAT(
                                ISNULL(Seller.FirstName, ''), ' ',
                                ISNULL(Seller.MiddleName, ''), ' ', 
                                ISNULL(Seller.LastName, ''), ' ',
                                ISNULL(Seller.SecondLastName, '')
                            )) AS VendedorNombre,
                            ISNULL(Seller.Email, '') AS VendedorEmail,
                            ISNULL(Seller.ContactPhone, '') AS VendedorTelefono
                            
                        FROM Q_CostingHead
                        INNER JOIN Q_OpportunityCRM 
                            ON Q_CostingHead.CRM_OpportunityID = Q_OpportunityCRM.CRM_OpportunityID
                        LEFT JOIN Profiles AS Seller
                            ON Q_OpportunityCRM.UserID = Seller.UserID
                        WHERE Q_CostingHead.CostingID = ?
                    NrY   rZ   )nombreemailtelefonou+   ⚠️ Error al obtener info del vendedor: )Consultas_SQL.conexionr
   rs   rt   ru   r   rv   rw   )r   r
   ry   rs   rz   r{   s         rA   get_seller_info'Quote_Reception_Service.get_seller_infoa  s     	E=!T[[]fNN $" $#%& !//+C8;Ac!fllnD7:1vSV\\^4:=a&Ad - #] "!, + # "> 4@@= #] "!8  	E?sCDD	EsX   C2 C!BC&	C!/	C2 :C!C2 
C	C!!
C/+C2 /C2 2
D<DDrS   N)rJ   rK   rL   rM   rN   staticmethodrP   r   r   r|   r   r   rO   r   rG   r   r   r   rQ   r   r   r  rR   rS   rD   rA   rU   rU   \   s&   cMS MXF^=_ M M^ tDeCJ&7!789  & Dc3h0  & ) )d ) )Z N N# N Nd E7t E7 E7 E7P $AC $AD $A $ArD   rU   N)
r   typingr   r   r   r   r   r
   r   rU   rS   rD   rA   <module>r     s,     . . 1
O
 O
hjA jArD   