+
    i.z                         ^ RI t ^ RIHt ^ RIHtHt ^ RIHtHtHt ]'       d   ]t	M]t	]t
 ! R R4      tR R ltR	 R
 ltR R ltR R ltR R ltR# )    N)datetime)
ProductivoENVIRONMENT)get_connectionbdproductivoget_connectionget_connectionERPc                     a  ] tR t^t o R tV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltR tV 3R lR ltV 3R lR ltRtV tR# )BOMExploderc                    R V n         R # )N
process_id)selfs   &ڇC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\SupYCtrol\GerenteSyC\UtilityMaterials\GSYCManufacBOMIngSQL.py__init__BOMExploder.__init__   s	        c                ,   < V ^8  d   QhRS[ RS[ RS[/#    part_numrevisionreturnstrdict)format__classdict__s   "r   __annotate__BOMExploder.__annotate__   s"     " "C "3 "4 "r   c                    \        \        P                  ! 4       4      V n        \        P
                  ! 4       p V P                  W4       V P                  4       pV P                  WAV^ ^4       \        P
                  ! 4       V,
          P                  4       R,          pV P                  V4       RRRV P                  RR/#   \         d@   pT P                  \        T4      4       RRR\        T4      RT P                  /u R	p?# R	p?ii ; i)
u?   
Explota una BOM multinivel y retorna información del proceso
i  successTr   messagezBOM explodida exitosamenteFerrorN)r   uuiduuid4r   r   now_init_process_control_get_pricingMO_explode_recursivetotal_seconds_update_process_stats	Exception_mark_process_error)r   r   r   
start_time	PricingMOprocessing_timees   &&&    r   explode_bomBOMExploder.explode_bom   s     djjl+\\^
	&&x: ++-I ##I1aH  (||~
:IIKdRO&&7 4doo7   	$$SV,5Qdoo 	s   BC D4DDDc                2   < V ^8  d   QhRS[ RS[ RS[RS[/# )r   r   r   levelorder_start)r   int)r   r   s   "r   r   r   >   s*     2 23 2# 2c 2X[ 2r   c                R   TpV P                  W4      pV F:  pV P                  \        V4      pV P                  WqW#WX\        4       V^,          pK<  	  V P	                  W4      p	V	 F  p
V
R,          R8X  d   V P                  V
4      pMRRRRRRRRRRR	RR
RR^ RRRRRR/p\        RV4       V P                  WW#W[4       V^,          pV
R,          R8X  g   Ks  V P                  V
R,          4      pV'       g   K  V P                  \        V
R,          VV^,           V4      pK  	  V# )u5   Explota un nivel específico de la BOM recursivamenteTypePTranNumNTranDateMtlUnitCostLbrUnitCostBurUnitCostSubUnitCostMtlBurUnitCostExtCostPOLineStatus	CALCULADOz$$$$MPartNum)
_get_operations_get_totalcost_operationr/   _insert_operation_get_materials_get_pricingMaterialsprint_insert_material_get_latest_revisionr)   )r   r   r   r5   r6   current_order
operationsopCost	materialsmaterialCostMatchild_revisions   &&&&&        r   r)   BOMExploder._explode_recursive>   sS   # ))(=
B00B?D ""2-W`aQM  '';	!H3&44X> t!4!4!4!4$dq$Dk &'" !!(h}^QM 3&!%!:!:8I;N!O!>$($;$;! +&	%%M7 "F r   c                ,   < V ^8  d   QhRS[ RS[ RS[/# r   r   list)r   r   s   "r   r   r   r   s"     1 1s 1c 1d 1r   c           	        Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  W1V34       VP                   Uu. uF  qf^ ,          NK  	  ppVP                  4        Uu. uF  p\        \        Wx4      4      NK  	  upVP                  4        # u upi u upi   TP                  4        i ; i)-Obtiene materiales de la BOM desde Epicor ERPa  
        SELECT 
            Erp.PartMtl.MtlSeq AS Seq,
            Erp.Part.TypeCode AS [Type],
            CASE Erp.Part.TypeCode 
                WHEN 'M' THEN 'Fabricado'
                WHEN 'P' THEN 'Material' 
                ELSE Erp.Part.TypeCode 
            END AS TipoDesc,
            Erp.PartMtl.MtlPartNum AS PartNum,
            
            (
                SELECT TOP 1 Erp.PartRev.RevisionNum 
                FROM Erp.PartRev 
                WHERE Erp.PartRev.Company = Erp.PartMtl.Company 
                    AND Erp.PartRev.PartNum = Erp.PartMtl.MtlPartNum 
                ORDER BY Erp.PartRev.EffectiveDate DESC 
            ) AS Rev,

            Erp.Part.PartDescription,
            LEFT(Erp.Part.PartDescription, 35) AS ShortDescription,
            Erp.PartMtl.QtyPer,
            Erp.PartMtl.UOMCode

        FROM 
            Erp.PartMtl 
        LEFT JOIN 
            Erp.Part ON Erp.PartMtl.Company = Erp.Part.Company 
            AND Erp.PartMtl.MtlPartNum = Erp.Part.PartNum 
        WHERE 
            Erp.PartMtl.Company = 'IGSA' 
            AND Erp.PartMtl.PartNum = ?
            AND Erp.PartMtl.RevisionNum = ?
        ORDER BY 
            Erp.PartMtl.MtlSeq
           Error de conexión a ERP	ConexionBD_ERPr,   cursorexecutedescriptionfetchallr   zipclose	r   r   r   query
connectionrb   columncolumnsrows	   &&&      r   rL   BOMExploder._get_materialsr   s    #J $%
677	&&(FNN5X"67/5/A/AB/AVayy/AGB7=7HI7HDW*+7HI CI)   1B1 B'#B1 7B,B1 '
B1 1Cc                ,   < V ^8  d   QhRS[ RS[ RS[/# r   r[   )r   r   s   "r   r   r      s"     # # #s #t #r   c           	        Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  W1V34       VP                   Uu. uF  qf^ ,          NK  	  ppVP                  4        Uu. uF  p\        \        Wx4      4      NK  	  upVP                  4        # u upi u upi   TP                  4        i ; i)z.Obtiene operaciones de la BOM desde Epicor ERPa-  
        SELECT 
            Erp.PartOpr.OprSeq AS Seq,
            Erp.PartOpr.SubContract AS [Type],
            CASE Erp.PartOpr.SubContract 
                WHEN 0 THEN 'Mano de Obra' 
                WHEN 1 THEN 'Subcontrato' 
            END AS TipoDesc,
            Erp.PartOpr.OpCode,
            Erp.OpMaster.OpDesc,
            LEFT(Erp.OpMaster.OpDesc, 35) AS ShortDescription,
            Erp.PartOpr.EstProdHours,
            '' AS UOMCode                         

        FROM Erp.PartOpr 
        LEFT JOIN Erp.OpMaster ON Erp.PartOpr.Company = Erp.OpMaster.Company 
            AND Erp.PartOpr.OpCode = Erp.OpMaster.OpCode 
        WHERE Erp.PartOpr.Company = 'IGSA' 
            AND Erp.PartOpr.PartNum = ?
            AND Erp.PartOpr.RevisionNum = ?
        ORDER BY Erp.PartOpr.OprSeq
        r_   r`   rh   s	   &&&      r   rI   BOMExploder._get_operations   s    . $%
677	&&(FNN5X"67/5/A/AB/AVayy/AGB7=7HI7HDW*+7HI CIro   c                &   < V ^8  d   QhRS[ RS[ /# )r   r   r   r   )r   r   s   "r   r   r      s      S S r   c                   Rp\        4       pV'       g   R#  VP                  4       pVP                  W!34       VP                  4       pV'       d
   V^ ,          MR VP	                  4        #   TP	                  4        i ; i)u/   Obtiene la revisión más reciente de una partez
        SELECT TOP 1 RevisionNum 
        FROM Erp.PartRev 
        WHERE Company = 'IGSA' AND PartNum = ?
        ORDER BY EffectiveDate DESC
        N)ra   rb   rc   fetchonerg   )r   r   ri   rj   rb   results   &&    r   rP    BOMExploder._get_latest_revision   sm     $%
	&&(FNN5+.__&F &6!9D0Js   AA. .B c                &   < V ^8  d   QhRS[ RS[ /# )r   r   r   rt   )r   r   s   "r   r   r      s      c S r   c                
   Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  W0P                  W34       VP                  4        VP                  4        R#   TP                  4        i ; i)z4Inicializa el registro de control del proceso en VPSz
        INSERT INTO BOM_Process_Control 
        (ProcessID, PartNumFather, RevisionNumFather, Status, ProcessDate)
        VALUES (?, ?, ?, 'Processing', GETDATE())
           Error de conexión a VPSN)ConexionBD_VPSr,   rb   rc   r   commitrg   )r   r   r   ri   rj   rb   s   &&&   r   r'   !BOMExploder._init_process_control   so     $%
677	&&(FNN5??H"GHJs   =A0 0Bc          
      8   < V ^8  d   QhRS[ RS[RS[RS[RS[/# )r   rV   part_father
rev_fatherr5   orderr   r   r7   )r   r   s   "r   r   r      s2       C S Y\ eh r   c                   Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  VV P                  W#WTVR,          VR,          VR,          VR,          VR,          VR,          VR	,          VR
,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          \
        R,          34       VP                  4        VP                  4        R#   TP                  4        i ; i)z3Inserta un material en la tabla BOM_Materials (VPS)a  
        INSERT INTO BOM_Materials 
        (ProcessID, PartNumFather, RevisionNumFather, [Order], [Level], Seq, [Type], 
        PartNum, Rev, PartDescription, ShortDescription, QtyPer, UOMCode)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r{   Seqr9   rH   RevPartDescriptionShortDescriptionQtyPerUOMCoder;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   N)r|   r,   rb   rc   r   rW   r}   rg   )	r   rV   r   r   r5   r   ri   rj   rb   s	   &&&&&&   r   rO   BOMExploder._insert_material   s    $%
677	&&(FNN5%&!18I3F*;!<+,hx.@(9BU	"GJ$79O&(>@V()79+=wv0A	# 	  Js   DD6 6Ec          
      8   < V ^8  d   QhRS[ RS[RS[RS[RS[/# )r   	operationr   r   r5   r   r   )r   r   s   "r   r   r     s2      4 c s [^ gj r   c                   Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  VV P                  W#WTVR,          VR,          VR,          RVR,          VR,          VR	,          VR
,          \
        R,          \
        R,          \        34       VP                  4        VP                  4        R#   TP                  4        i ; i)u7   Inserta una operación en la tabla BOM_Operations (VPS)a,  
        INSERT INTO BOM_Operations 
        (ProcessID, PartNumFather, RevisionNumFather, [Order], [Level], Seq, [Type], 
        OpCode, Rev, OpDesc, ShortDescription, EstProdHours, UOMCode, LbrUnitCost, BurUnitCost, ExtCost)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r{   r   r9   OpCodeNOpDescr   EstProdHoursr   r>   r?   )	r|   r,   rb   rc   r   r/   rT   r}   rg   )	r   r   r   r   r5   r   ri   rj   rb   s	   &&&&&&   r   rK   BOMExploder._insert_operation  s     $%
677	&&(FNN5%% )F"3Yx5Hi)95G+H.)9Y+?-(-(#  Js   BC Cc                    < V ^8  d   QhRS[ /# )r   processing_time_ms)float)r   r   s   "r   r   r   ,  s       r   c           	     N   Rp\        4       pV'       g   R#  VP                  4       pVP                  VV P                  V P                  V P                  \	        V4      V P                  34       VP                  4        VP                  4        R#   TP                  4        i ; i)u#   Actualiza estadísticas del procesoa  
        UPDATE BOM_Process_Control 
        SET Status = 'Completed',
            TotalMaterials = (SELECT COUNT(*) FROM BOM_Materials WHERE ProcessID = ?),
            TotalOperations = (SELECT COUNT(*) FROM BOM_Operations WHERE ProcessID = ?),
            MaxLevel = (SELECT ISNULL(MAX([Level]), 0) FROM BOM_Materials WHERE ProcessID = ?),
            ProcessingTime_MS = ?
        WHERE ProcessID = ?
        N)r|   rb   rc   r   r7   r}   rg   )r   r   ri   rj   rb   s   &&   r   r+   !BOMExploder._update_process_stats,  s     $%
	&&(FNN5$//&'#  Js   A(B B$c                    < V ^8  d   QhRS[ /# )r   error_messagert   )r   r   s   "r   r   r   F  s       r   c                    Rp\        4       pV'       g   R#  VP                  4       pVP                  W!V P                  34       VP	                  4        VP                  4        R#   TP                  4        i ; i)u   Marca el proceso como erróneozx
        UPDATE BOM_Process_Control 
        SET Status = 'Error', ErrorMessage = ?
        WHERE ProcessID = ?
        N)r|   rb   rc   r   r}   rg   )r   r   ri   rj   rb   s   &&   r   r-   BOMExploder._mark_process_errorF  sf     $%
	&&(FNN5$//"BCJs   =A' 'A9c                   Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  V4       VP	                  4       pV'       dF   VP
                   Uu. uF  qU^ ,          NK  	  pp\        \        Wd4      4      VP                  4        # \        R4      hu upi   TP                  4        i ; i)zObtiene desde VPS z`
        SELECT 
            LbrUnitCost, 
            BurUnitCost
        FROM CostLbr
        r{   z"No se encontraron datos de CostLbr)	r|   r,   rb   rc   rv   rd   r   rf   rg   )r   ri   rj   rb   rm   rk   rl   s   &      r   r(   BOMExploder._get_pricingMO[  s     $%
677
	&&(FNN5!//#C393E3EF3E!993EFC-.    DEE G
 s#   8B/ B/ (B*9B/ B/ /Cc                &   < V ^8  d   QhRS[ RS[ /# )r   	pricingMOr   r   )r   r   s   "r   r   r   u  s      $ 4 r   c                   \        VP                  R 4      ;'       g    ^ 4      p\        VP                  R4      ;'       g    ^ 4      p\        VP                  R4      ;'       g    ^ 4      pW4,          W5,          ,           pV# )r   r>   r?   )r   get)r   r   r   	est_hourslbr_unit_costbur_unit_cost
total_costs   &&&    r   rJ   $BOMExploder._get_totalcost_operationu  si    )--7<<1=	immM:??a@immM:??a@/I4MN
r   c                    < V ^8  d   QhRS[ /# )r   rV   r   )r   r   s   "r   r   r     s     1 1d 1r   c           
        Rp\        4       pV'       g   \        R4      h VP                  4       pVP                  W!R,          VR,          VR,          VR,          VR,          VR,          34       VP	                  4       pV'       dF   VP
                   Uu. uF  qf^ ,          NK  	  pp\        \        Wu4      4      VP                  4        # \        R4      hu upi   TP                  4        i ; i)r^   uj  
        SELECT
            TranNum,
            TranDate,
            MtlUnitCost,
            LbrUnitCost,
            BurUnitCost,
            SubUnitCost,
            MtlBurUnitCost,
            PONum AS PO,
            POLine AS Line,
            ([MtlUnitCost] * ? + [LbrUnitCost] * ? + [BurUnitCost] * ? + [SubUnitCost] * ? + [MtlBurUnitCost] * ?) AS ExtCost,
            CASE            
                -- Si está en los últimos 90 días 
                WHEN TranDate >= DATEADD(day, -90, GETDATE()) THEN 'COSTEADOS'
                
                -- Si está entre 90 y 180 días 
                WHEN TranDate >= DATEADD(day, -180, GETDATE())
                    AND TranDate < DATEADD(day, -90, GETDATE()) THEN 'REVISION' 

                -- Si no cumple las condiciones anteriores (sin TranNum/TranDate o más de 180 días)
                ELSE 'INSERTAR'
            END AS Status                
                    
        FROM 
            Erp.PartTran 
        WHERE 
            Erp.PartTran.Company = 'IGSA' 
            AND Erp.PartTran.PartNum = ?
        ORDER BY Erp.PartTran.TranDate DESC 
        r_   r   rH   z#No se encontraron datos de PartTran)	ra   r,   rb   rc   rv   rd   r   rf   rg   )r   rV   ri   rj   rb   rm   rk   rl   s   &&      r   rM   !BOMExploder._get_pricingMaterials  s    @ $%
677	&&(FNN5H#5x7I8T\K]_ghp_qs{  }E  tF  HP  QZ  H[  #\  ]//#C393E3EF3E!993EFC-.
    EFF	 G s   A7C C)C C C1r   N)__name__
__module____qualname____firstlineno__r   r2   r)   rL   rI   rP   r'   rO   rK   r+   r-   r(   rJ   rM   __static_attributes____classdictcell__)r   s   @r   r
   r
      s     " "H2 2h1 1f# #J * & @ 4 4 *4 1 1r   r
   c                <    V ^8  d   QhR\         R\        R\        /# )r   new_ext_costr   r   )r   r   )r   s   "r   r   r     s!     4 4E 4s 4c 4r   c                x   Rp \        4       pV'       g    RRRR/V'       d   VP                  4        # # VP                  4       pRpVP                  WPW34       VP                  pVP                  4        V^ 8X  d&   RRRRV RV 2/V'       d   VP                  4        # # RR	R
RRV/V'       d   VP                  4        # #   \         dN   pT'       d   TP                  4        RRRR\        T4       2/u Rp?T'       d   TP                  4        # # Rp?ii ; i  T'       d   TP                  4        i i ; i)zDActualiza el ExtCost y cambia el Status a MANUAL en la base de datosNr!   Fr#   %   Error de conexión a la base de datosz
        UPDATE BOM_Materials
        SET ExtCost = ?,
            Status = 'MANUAL'
        WHERE ProcessID = ?
          AND PartNum = ?
        u(   No se encontró el registro. ProcessID: z, PartNum: Tr"   zCosto actualizado exitosamenteupdated_rowszError en la base de datos: )	r|   rg   rb   rc   rowcountr}   r,   rollbackr   )r   r   r   rj   rb   update_query	row_countr1   s   &&&     r   get_status_manualr     sY    J0#%
5@X  O ""$ 	|J%IJ OO	>5CJ<{[cZde&   t7I
    
!u23q6(;
 	

  
  s;   C AC "C D)D7D8D DD D9c                0    V ^8  d   QhR\         R\        /# r   r   r   r   )r   s   "r   r   r     s     ~( ~(c ~(d ~(r   c                    R pRpRpRp\        4       pV'       g   RRRR/#  VP                  4       pVP                  WV 34       / p. pVP                  4        F  p	V	^ ,          p
R\	        V	^,          4      R	\        V	^,          4      R
\	        V	^,          4      R\        V	^,          4      R\	        V	^,          4      /Wz&   VP                  RV
R\	        V	^,          4      R\        V	^,          4      R\	        V	^,          4      R\        V	^,          4      R\	        V	^,          4      /4       K  	  V'       g    RRRR/V'       d   VP                  4        # # VP                  W@34       . pRpVP                  4        F~  p	V	^ ,          p
VP                  RV
RVP                  V
/ 4      P                  R^ 4      R\	        V	^,          4      R\        V	^,          4      /4       V\	        V	^,          4      ,          pK  	  VP                  W034       VP                  4       p. pV F  w  rpVP                  V
/ 4      P                  R^ 4      pVP                  VVW
34       TP                  RT
RV'       d   \	        V4      M^ RVRRRVP                  V
/ 4      P                  R	^ 4      RVP                  V
/ 4      P                  R^ 4      /4       K  	  VP                  4        \        \        R VP                  4        4       4      ^4      p\        \        R VP                  4        4       4      ^4      pRRRVRVR \        V^4      R!VR"VR#VR$V /V'       d   VP                  4        # #   \         dE   pTP                  4        RRR\        T4      R$T /u R%p?T'       d   TP                  4        # # R%p?ii ; i  T'       d   TP                  4        i i ; i)&u  
    -- Materiales comprados agrupados por padre con precisión decimal
    WITH MaterialCosts AS (
        SELECT 
            PartNumFather AS PartNum,
            CAST(SUM(COALESCE(CAST(ExtCost AS DECIMAL(18,8)), 0)) AS DECIMAL(18,8)) AS MaterialCost,
            COUNT(*) AS MaterialComponents
        FROM BOM_Materials
        WHERE ProcessID = ? 
          AND Type = 'P'
        GROUP BY PartNumFather
    ),
    
    -- Costos de operaciones agrupados por padre con precisión decimal
    OperationCosts AS (
        SELECT 
            PartNumFather AS PartNum,
            CAST(SUM(COALESCE(CAST(ExtCost AS DECIMAL(18,8)), 0)) AS DECIMAL(18,8)) AS OperationCost,
            COUNT(*) AS OperationComponents
        FROM BOM_Operations
        WHERE ProcessID = ?
        GROUP BY PartNumFather
    ),
    
    -- Costos combinados con verificación de NULLs
    CombinedCosts AS (
        SELECT
            m.PartNum,
            CAST(COALESCE(m.MaterialCost, 0) AS DECIMAL(18,8)) AS MaterialCost,
            m.MaterialComponents,
            CAST(COALESCE(o.OperationCost, 0) AS DECIMAL(18,8)) AS OperationCost,
            o.OperationComponents,
            CAST(COALESCE(m.MaterialCost, 0) + COALESCE(o.OperationCost, 0) AS DECIMAL(18,8)) AS TotalCost
        FROM MaterialCosts m
        LEFT JOIN OperationCosts o ON m.PartNum = o.PartNum
        
        UNION
        
        SELECT
            o.PartNum,
            CAST(0 AS DECIMAL(18,8)) AS MaterialCost,
            0 AS MaterialComponents,
            CAST(o.OperationCost AS DECIMAL(18,8)) AS OperationCost,
            o.OperationComponents,
            CAST(o.OperationCost AS DECIMAL(18,8)) AS TotalCost
        FROM OperationCosts o
        WHERE NOT EXISTS (SELECT 1 FROM MaterialCosts m WHERE m.PartNum = o.PartNum)
    )
    
    SELECT 
        PartNum,
        MaterialCost,
        MaterialComponents,
        OperationCost,
        OperationComponents,
        TotalCost
    FROM CombinedCosts
    WHERE PartNum IS NOT NULL
    ORDER BY PartNum
    z
    UPDATE BOM_Materials
    SET ExtCost = CAST(? AS DECIMAL(18,8)),
        Status = 'CALCULADO'
    WHERE ProcessID = ?
      AND PartNum = ?
      AND Type = 'M'  -- FABRICADO
    z
    SELECT PartNum, 
           CAST(ExtCost AS DECIMAL(18,8)) AS ExtCost, 
           Status
    FROM BOM_Materials
    WHERE ProcessID = ? 
      AND Type = 'M'  -- FABRICADO
    z
    SELECT 
        PartNumFather, 
        SUM(COALESCE(CAST(ExtCost AS DECIMAL(18,8)), 0)) AS TotalMaterialCost,
        COUNT(*) AS Components
    FROM BOM_Materials 
    WHERE ProcessID = ? 
      AND Type = 'P'
    GROUP BY PartNumFather
    r!   Fr#   r   material_costmaterial_componentsoperation_costoperation_componentsr   partNummaterialCostmaterialComponentsoperationCostoperationComponents	totalCostz+No se encontraron componentes para calcular        calculatedCost
componentspreviousCostnewCoststatusChangerF   c              3   2   "   T F  qR ,          x  K  	  R# 5i)r   N .0vs   & r   	<genexpr>(calculate_total_costs.<locals>.<genexpr>  s     )VCUaL//CU   c              3   2   "   T F  qR ,          x  K  	  R# 5i)r   Nr   r   s   & r   r   r     s     (YFX+;)<)<FXr   TupdatedMaterialstotalCalculatedCosttotalMaterialCosttotalOperationCostverificationDatacostBreakdown	processIdN)r|   rb   rc   re   r   r7   appendrg   r   r}   roundsumvaluesr,   r   r   )r   calculate_costs_queryupdate_fabricated_materialsget_fabricated_materialsverification_querydatabase_connectiondatabase_cursor	cost_datacost_breakdownrm   r   verification_datatotal_material_costfabricated_materialsupdated_materialscurrent_costcurrent_statusnew_costtotal_calculated_costtotal_operation_costr#   s   &                    r   calculate_total_costsr     s   ;z# 	 )*5'+RSS](-446 	 5J7OP 	"++-C1vHs1v%s3q6{ %A-&CFeCFm#I !!8c!f$c#a&ks1v%s3q6{U3q6]#  .$ ug/\]@ %%' { 	 2MB!"++-C1vH$$8 )--""="A"A,PQ"Rc!fc#a&k	&   5Q=0 . 	 8-H.779 6J2HN }}Xr266|QGH##+:0
 $$8|l 38$immHb&A&E&EF[]^&_%y}}Xr'B'F'FG]_`'a&  7K" 	""$ !&c)V9CSCSCU)V&VXY Z$S(YiFVFVFX(Y%Y[\] t 1!#8':A!> "6 1^	
& %%'   
$$&uSZ
 	
 %%' 
 %%' sC   DM2 <M2 G=M2 M2 2O= N<OO <OO Oc                H    V ^8  d   QhR\         R\         R\         R\        /# )r   r   r   r   r   r   )r   s   "r   r   r     s)     3 3# 3 3 3PT 3r   c           	        Rp \        4       pV'       g   \        R4      hVP                  4       pVP                  W1W WV 34       VP	                  4       pV'       g    RRRR/V'       d   VP                  4        # # V^ ,          ^ ,          e   \        V^ ,          ^ ,          4      MRp\        V4      ^8  d,   V^,          ^ ,          e   \        V^,          ^ ,          4      MRpRR	R
Wx,           RVRV/V'       d   VP                  4        # #   \         d6   p	RRRR\        T	4       2/u Rp	?	X'       d   TP                  4        # # Rp	?	ii ; i  X'       d   TP                  4        i i ; i)u-   Función con mejor manejo de errores para SQLa  
    SELECT
        SUM(COALESCE(BOM_Materials.ExtCost, 0)) AS TotalCostMaterial
    FROM
        BOM_Materials
    WHERE
        BOM_Materials.PartNumFather = ?
        AND BOM_Materials.RevisionNumFather = ?
        AND BOM_Materials.ProcessID = ?

    UNION ALL

    SELECT
        SUM(COALESCE(BOM_Operations.ExtCost, 0)) AS TotalCostOperation
    FROM 
        BOM_Operations
    WHERE
        BOM_Operations.PartNumFather = ?
        AND BOM_Operations.RevisionNumFather = ?
        AND BOM_Operations.ProcessID = ?
    z&No se pudo conectar a la base de datosr!   Fr#   zNo se encontraron registrosNr   Tr   r   r   zError en base de datos: )	r|   r,   rb   rc   re   rg   r   lenr   )
r   r   r   ri   rj   rb   resultsr   r   r1   s
   &&&       r   get_total_cost_for_parentr     sZ   E,#%
DEE""$uxS]^_//#ug/LM   18
10Igajm,s14W1AgajQRmF_wqz!}-eh t7M^	
    P5'-Ec!fX+NOO P  s7   AD =A9D EE,E-E EE E.c                0    V ^8  d   QhR\         R\        /# r   r   )r   s   "r   r   r     s     : :S :T :r   c           	     :   RpRpRp\        4       pV'       g   RR/#  VP                  4       pVP                  W34       VP                   Uu. uF  qf^ ,          NK  	  ppVP	                  4        Uu. uF  p\        \        Wx4      4      NK  	  p	pVP                  W 34       VP                   Uu. uF  qf^ ,          NK  	  p
pVP	                  4        Uu. uF  p\        \        W4      4      NK  	  ppVP                  W034       VP                   Uu. uF  qf^ ,          NK  	  ppVP                  4       pV'       d   \        \        W4      4      MRpRV	RVR	V/VP                  4        # u upi u upi u upi u upi u upi   TP                  4        i ; i)
z,Obtiene datos completos de una BOM explodidaaJ  
    SELECT 
        [Level], [Order], Seq, [Type], PartNum, Rev, 
        PartDescription, ShortDescription, QtyPer, UOMCode, TranNum,
        TranDate, MtlUnitCost, LbrUnitCost, BurUnitCost, 
        SubUnitCost, MtlBurUnitCost, ExtCost, PO, Line, Status
    FROM BOM_Materials 
    WHERE ProcessID = ?
    ORDER BY [Order]
    a:  
    SELECT 
        [Level], [Order], Seq, [Type], OpCode, 
        OpDesc, ShortDescription, EstProdHours, UOMCode, TranNum,
        TranDate, MtlUnitCost, LbrUnitCost, BurUnitCost, 
        SubUnitCost, MtlBurUnitCost, ExtCost, PO, Line
    FROM BOM_Operations 
    WHERE ProcessID = ?
    ORDER BY [Order]
    z?
    SELECT * FROM BOM_Process_Control WHERE ProcessID = ?
    r#   r{   NrU   rR   control)	r|   rb   rc   rd   re   r   rf   rv   rg   )r   query_materialsquery_operationsquery_controlrj   rb   rk   materials_columnsrm   rU   operations_columnsrR   control_columnscontrol_datar   s   &              r   get_bom_datar    s   	O	M  !J344""$ 	65;5G5GH5G6AYY5GHBH//BSTBS3T#/56BS	T 	'76<6H6HI6HFQii6HIDJOODUVDUSd3178DU
V 	}m4393E3EF3E!993EF(>J$s?9:PT *w
 	+ IT JV G 	sM   0F E/F 3E4"F 2E9F E>4"F F'7F /F Fc                0    V ^8  d   QhR\         R\        /# )r   ri   r   r[   )r   s   "r   r   r   -  s        r   c           	        Rp\        4       pV'       g   . #  VP                  4       pRV  R2pVP                  WV34       VP                   Uu. uF  qU^ ,          NK  	  ppVP	                  4        Uu. uF  p\        \        Wg4      4      NK  	  upVP                  4        # u upi u upi   TP                  4        i ; i)u+   Busca partes en el ERP por nombre o códigoa  
    SELECT TOP 10 
        p.PartNum, 
        p.PartDescription,
        pr.RevisionNum,
        p.TypeCode
    FROM Erp.Part p
    LEFT JOIN Erp.PartRev pr ON p.Company = pr.Company AND p.PartNum = pr.PartNum
    WHERE p.Company = 'IGSA' 
        AND p.TypeCode = 'M'  -- Solo manufacturados
        AND (p.PartNum LIKE ? OR p.PartDescription LIKE ?)
    ORDER BY p.PartNum, pr.EffectiveDate DESC
    %)ra   rb   rc   rd   re   r   rf   rg   )ri   search_queryrj   rb   search_termrk   rl   rm   s   &       r   search_partsr	  -  s    L  !J		""$%l|;%?@+1+=+=>+=!99+=>39??3DE3DCS&'3DE 		 ?E 	s)   7B. B$ B. 4B)B. $
B. .C )r$   r   configr   r   Consultas_SQL.conexionr   r   r   r|   ra   r
   r   r   r   r  r	  r   r   r   <module>r     sU   
   * ` ` /N#N"
] ]F4n~(B3B:xr   