U
    iI.                     @   sb   d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	 e  G dd dZ
G dd dZdS )	    N)get_connectionERPget_connection)load_dotenv)OptionalUnionc                   @   st   e Zd ZdZeeee eee eee	j
e	j	f  ee eee	j
e	j	f  dddZedddZeddd	Zd
S )PartDTOuT   
    Data Transfer Object para la información de las partes obtenidas del ERP.
    OriginPartNumPartDescription
IsServicesLastCostCostDate	LastPrice	PriceDatec	           	      C   sh   || _ || _|pd| _t|| _|d k	r6tt|dnd | _|| _|d k	rXtt|dnd | _	|| _
d S )N    )r	   r
   r   boolr   roundfloatr   r   r   r   )	selfr	   r
   r   r   r   r   r   r    r   aC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\api\services\quotation_Service.py__init__   s    

zPartDTO.__init__)returnc                 C   s^   | j | j| j| j| jt| jtjtjfr2| j	 nd| j
t| jtjtjfrV| j	 nddS )z3Convierte el objeto en un diccionario serializable.Nr   )r	   r
   r   r   r   
isinstancer   datetimedate	isoformatr   r   r   r   r   r   to_dict%   s      zPartDTO.to_dictc                 C   sF   d| j  d| j d| j d| j d| j d| j d| j d| j d	S )
u;   Representación en string del objeto, útil para debugging.zPartDTO(Origin='z', PartNum='z', PartDescription='z', IsServices=z, LastCost=z, CostDate=z, LastPrice=z, PriceDate=)r   r   r   r   r   __repr__6   s    DzPartDTO.__repr__N)__name__
__module____qualname____doc__strr   r   r   r   r   r   r   dictr    r"   r   r   r   r   r      s   r   c                   @   s:   e Zd ZdZedd Zedd ZeedddZd	S )
Quotation_Serviceub   
    Clase de servicio para manejar la lógica de negocio relacionada con las partes (parts).
    c            
      C   s   t j jddd} | d}td|  d| d}zt }| }|| |	 }g }|D ]J}t
|d |d |d t|d	 |d
 |d |d |d d}|| qf|W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W n8 tk
r }	 ztd|	  W Y dS d}	~	X Y nX dS )   
        Obtiene las partes desde la base de datos de Epicor que empiezan con el string de búsqueda.
        La fecha de la consulta se actualiza dinámicamente al primer día del año en curso.
           monthday%Y%m%d   Primer día del año actual: a  
                    --DECLARE @FechaDesde DATE = '20250101'; -- Ejemplo de fecha fija para pruebas
            
                    WITH UltimaTransaccion AS (
                        SELECT 
                            Erp.PartTran.Company,
                            Erp.PartTran.PartNum,
                            (Erp.PartTran.MtlUnitCost 
                            + Erp.PartTran.LbrUnitCost 
                            + Erp.PartTran.BurUnitCost 
                            + Erp.PartTran.SubUnitCost 
                            + Erp.PartTran.MtlBurdenUnitCost) AS Costo,
                            Erp.PartTran.TranDate,
                            ROW_NUMBER() OVER (
                                PARTITION BY Erp.PartTran.Company, Erp.PartTran.PartNum 
                                ORDER BY Erp.PartTran.TranDate DESC
                            ) AS rn
                        FROM Erp.PartTran
                        WHERE Erp.PartTran.TranType LIKE '%STk'
                        -- AND Erp.PartTran.TranDate >= @FechaDesde -- Solo se prueba cuando esta en sql nativo
                        AND Erp.PartTran.TranDate >= 'uQ  ' -- Fecha dinámica
                    )
                    SELECT 
                        'Epicor' AS Origin,
                        Erp.Part.PartNum,
                        Erp.Part.PartDescription,
                        Erp.Part.IsServices,
                        UltimaTransaccion.Costo AS LastCost,
                        UltimaTransaccion.TranDate AS CostDate,
                        NULL AS LastPrice,
                        NULL AS PriceDate
                    FROM Erp.Part
                    LEFT JOIN UltimaTransaccion 
                        ON Erp.Part.Company = UltimaTransaccion.Company
                        AND Erp.Part.PartNum = UltimaTransaccion.PartNum
                        AND UltimaTransaccion.rn = 1
                    WHERE Erp.Part.Company = 'IGSA'
                    AND Erp.Part.InActive = 0
        r   r                  r   Error en getParts_From_Epicor: FN)r   r   todayreplacestrftimeprintr   cursorexecutefetchallr   r   append	Exception)
first_day_of_yeardate_strqueryconnr;   rows
parts_listrowpart_objer   r   r   getParts_From_EpicorD   s8    
(



2z&Quotation_Service.getParts_From_Epicorc                  C   s   d} zt  }| }||  | }g }|D ]J}t|d |d |d t|d |d |d |d |d	 d
}|| q2|W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W n6 tk
r } ztd|  W Y dS d}~X Y nX dS )u   
        Método placeholder para obtener partes desde la base de datos Elephant.
        Actualmente no implementado.
        a  
        SELECT 
            'Elephant' AS Origin,      -- valor fijo con alias
            PartNum,
            PartDescription,
            IsServices,
            LastPrice,
            DateQuote,
            NULL AS UltimoCosto,       -- columna fija en NULL
            NULL AS UltimaFecha,       -- otra columna fija en NULL
            Unit
        FROM 
            Part_Quotes;
        r   r+   r   r1   r2   r3   r4   r5   r   r6   FN)	r   r;   r<   r=   r   r   r>   r?   r:   )rB   rC   r;   rD   rE   rF   rG   rH   r   r   r   getPartes_From_Elephant   s.    



2z)Quotation_Service.getPartes_From_Elephant)matching_stringc                 C   s  t j jddd}|d}td|  d| d| d}zt }| |}|  d}||| |	 }g }|D ]4}	t
|	d	 |	d |	d
 |	d |	d d}
||
 qx|W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W n8 tk
r } ztd|  W Y dS d}~X Y nX dS )r*   r+   r,   r/   r0   a  
        WITH PartsWithCost AS (
            SELECT  top 5
                erp.Part.PartNum,
                erp.Part.PartDescription,
                erp.Part.IsServices,
                (
                    select top 1 (Erp.PartTran.MtlUnitCost + Erp.PartTran.LbrUnitCost + Erp.PartTran.BurUnitCost + Erp.PartTran.SubUnitCost + Erp.PartTran.MtlBurdenUnitCost) as suma
                    from Erp.PartTran
                    where Erp.PartTran.company = erp.Part.Company
                    and Erp.PartTran.PartNum = erp.Part.PartNum
                    and Erp.PartTran.TranType like '%STk'
                    and Erp.PartTran.TranDate >= 'u  ' -- Fecha dinámica
                    order by suma Desc
                ) as ultimoCosto,
                (
                    select top 1 Erp.PartTran.TranDate
                    from Erp.PartTran
                    where Erp.PartTran.company = erp.Part.Company
                    and Erp.PartTran.PartNum = erp.Part.PartNum
                    and Erp.PartTran.TranType like '%STk'
                    and Erp.PartTran.TranDate >= 'uF  ' -- Fecha dinámica
                    order by (Erp.PartTran.MtlUnitCost + Erp.PartTran.LbrUnitCost + Erp.PartTran.BurUnitCost + Erp.PartTran.SubUnitCost + Erp.PartTran.MtlBurdenUnitCost) Desc
                ) as ultimaFecha
            from 
                erp.Part
            where 
                erp.Part.Company = 'IGSA'
                and erp.Part.InActive = 0
                and erp.Part.PartNum LIKE ? -- Parámetro de búsqueda
        )
        SELECT 
            * 
        FROM 
            PartsWithCost
        ORDER BY 
            ultimoCosto Desc
        %r   r   r1   r2   )part_numdescriptionZis_servicesZ	last_costZ	last_dater6   FN)r   r   r7   r8   r9   r:   r   r;   r<   r=   r   r>   r?   )rK   r@   rA   rB   rC   r;   Zsearch_patternrD   rE   rF   rG   rH   r   r   r   getParts_From_EpicorBy_NoParte   s8    
'

2z0Quotation_Service.getParts_From_EpicorBy_NoParteN)	r#   r$   r%   r&   staticmethodrI   rJ   r'   rO   r   r   r   r   r)   @   s   
T
3r)   )jsonr   Consultas_SQL.conexionr   r   dotenvr   typingr   r   r   r)   r   r   r   r   <module>   s   4