
    koiَ                     `   U d dl Zd dlZ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
 d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ 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)m*Z* d d
l+m,Z,m-Z- d dl.m/Z/  ej`                  e1      Z2g dg dg dg dddgdZ3ee4ee4   f   e5d<   dgdgdgdgdgdZ6ee4ee4   f   e5d<   de4dee4   fdZ7dejp                  de4dee4   fdZ9de	d ed!e:de4dee4ef   f
d"Z;de	d!e:d#ejp                  de:fd$Z<de	d!e:d#ejp                  de:fd%Z=de	d!e:d#ejp                  de:fd&Z>de	d!e:d#ejp                  de:fd'Z?de	d!e:d#ejp                  de:fd(Z@de	d!e:d#ejp                  de:fd)ZAde	d!e:d#ejp                  de:fd*ZB	 	 	 	 d/de	d!e:d+e:d,e:de4d-e4deCfd.ZDy)0    N)
UploadFileHTTPException)Session)datetime)DictAnyListSet)PurchaseOrderPurchaseOrderLinePurchaseOrderReceiveLinePurchaseOrderStatusPurchaseReceiveOrderPurchaseReturnOrderPurchaseOrderReturnLine
SalesOrderSalesOrderLineSalesReturnOrderSalesReturnOrderLineInventoryBatchInventoryMovementMovementType)CategoryCompanyLocationProductProductLocationProductVendorVendor)CSVUploadLog)!trigger_tasks_for_affected_tables)trigger_csv_processing_tasksave_uploaded_file)desc)purchase_order_receivepurchase_order_receive_linesinventory_batchesinventory_movements)sales_orderssales_order_linesr'   r(   )sales_return_orderssales_return_order_linesr'   r(   )purchase_order_returnpurchase_order_return_linesr'   r(   r(   r'   )purchase_receivesales_ordersales_returnpurchase_returnstock_transferCSV_TYPE_TO_AFFECTED_TABLESreceive_order_date
order_datereturn_datetransfer_dateCSV_DATE_COLUMNScsv_typereturnc                 .    t         j                  | g       S )a,  
    Get list of affected database tables for a CSV upload type.
    
    Args:
        csv_type: One of: product, purchase_order, purchase_receive, 
                  sales_order, sales_return, purchase_return, stock_transfer
                  
    Returns:
        List of affected table names
    )r4   get)r:   s    N/var/www/html/hubwallet-dev/src/smart_inventory/apps/data_import/controller.py get_affected_tables_for_csv_typer?   5   s     '**8R88    dfupload_typec                    t         j                  |g       }t               }|D ]  }|| j                  v s	 t	        j
                  | |   d      j                         }|j                  j                  j                         D ]"  }|j                  |j                  d             $  t        t!        |            S # t        $ r%}t        j                  d| d|        Y d}~d}~ww xY w)z
    Extract unique dates from CSV data based on upload type.
    
    Args:
        df: DataFrame containing CSV data
        upload_type: Type of CSV upload
        
    Returns:
        List of unique date strings in YYYY-MM-DD format
    coerce)errorsz%Y-%m-%dz"Could not parse dates from column z: N)r9   r=   setcolumnspdto_datetimedropnadtdateuniqueaddstrftime	Exceptionloggerwarningsortedlist)rA   rB   date_columnsunique_datescoldatesdes           r>   extract_unique_dates_from_csvr[   C   s     $''R8L UL P"**Pr#wx@GGI--/ =A $$QZZ
%;<=P $|$%%  P!CC51#NOOPs   A1B==	C+C&&C+dbfile
company_idc           	        K   |j                   j                  d      st        dd      | j                  t              j                  t        j                  |k(        j                         }|st        dd      h d}||vrt        ddd	j                  |             |j                  j                         }	 t        j                  t        j                  |            }|j                  rt        dd
      	 |dk(  rPh d}	|	j%                  t'        |j(                              s(|	t'        |j(                        z
  }
t        dd|
       	 t+        |||      }	 t-        | |||      }t.        j1                  d|d    d|d    d| d       |d   |d   |d   |d   d|d    dS # t         $ r}t        ddt#        |             d}~ww xY w# t         $ r}t        ddt#        |             d}~ww xY w# t         $ r6}t.        j3                  d|        t        ddt#        |             d}~ww xY ww)a[  
    Process CSV file upload by saving to disk and triggering async Celery task.
    
    All CSV processing is now done asynchronously via Celery tasks.
    This function:
    1. Validates the file and company
    2. Saves the file to /uploaded_files directory
    3. Creates a CeleryTaskTracker entry
    4. Triggers the appropriate Celery task (or sets to HOLD if dependencies not met)
    
    Returns:
        Dict containing:
        - task_id: Celery task ID for tracking
        - task_name: Unique task name
        - status: "pending" or "hold"
        - file_path: Path to saved CSV file
    z.csvi  z/Invalid file type. Only CSV files are accepted.)status_codedetaili  zCompany not found>   productr0   r1   purchase_orderr3   r2   r/   z%Invalid upload type. Must be one of: z, zCSV file is emptyzInvalid CSV file: Nrb   >   sku
brand_name
short_namedescriptionvendor_nameproduct_namecategory_namelocation_namezCSV missing required columns: i  zFailed to save file: )r\   r^   rB   	file_pathzCSV upload queued: 	task_namez
 (status: statusz, file: )task_idrl   z*CSV upload queued for processing. Status: )rp   rm   rn   rl   messagez%Failed to queue CSV processing task: z!Failed to queue processing task: )filenameendswithr   queryr   filteridfirstjoinr]   readrH   read_csvioBytesIOemptyrP   strissubsetrF   rG   r#   r"   rQ   infoerror)r\   r]   r^   rB   companyvalid_typescontentsrA   rZ   expected_columnsmissingrl   task_results                r>   process_csv_filer   ^   sz    . ==!!&)4effhhw&&wzzZ'?@FFHG4GHH HK+%6[\`\e\efq\r[s4tuu yy~~HS[[H-.88C8KLL  i	
  ((RZZ9&RZZ8G7yA V&xjI	
b1!#	
 	!+k":!; <#H-.hykD	
 #9-$[1!(+$[1CKPXDYCZ[
 	
U  S6HQ4QRRS2  V6KCPQF84TUUV2  b<QC@A6WX[\]X^W_4`aabso   B<I	?AF3  AI	G %AH 2I	3	G<GGI		H&G??HI		I1III	datac                 v  K   d}|j                         D ]  \  }}|d   sd }|d   r| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sBt        |d   |      }| j                  |       | j                          | j                  |       | j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|st        ||r|j                  nd |d   |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	d
            }| j                  |       | j                          | j                  |       n|r|j                  n|j                  |_        |j                  d|j                        |_        |j                  d|j                         |_        |j                  d|j"                        |_        |j                  d|j$                        |_        | j                  |       | j                          | j                  |       |d   r|d   j'                  d      }|D ]l  }	| j                  t(              j                  t(        j*                  |	k(  t(        j
                  |k(        j                         }
|
s?t)        |	|      }
| j                  |
       | j                          | j                  |
       | j                  t,              j                  t,        j
                  |k(  t,        j.                  |j                  k(  t,        j0                  |
j                  k(        j                         }|rt-        ||j                  |
j                        }| j                  |       | j                          | j                  |       o |d   r|d   j'                  d      }|D ]l  }| j                  t2              j                  t2        j4                  |k(  t2        j
                  |k(        j                         }|s?t3        ||      }| j                  |       | j                          | j                  |       | j                  t6              j                  t6        j
                  |k(  t6        j.                  |j                  k(  t6        j8                  |j                  k(        j                         }|rt7        ||j                  |j                        }| j                  |       | j                          | j                  |       o |dz  } |S w)Nr   ri   rj   )rj   r^   rf   rg   re   rd   eligible_for_returnF)r^   fk_product_category_idri   rf   rg   re   rd   r   rk   |)rk   r^   )r^   
product_idlocation_idrh   )rh   r^   )r^   r   	vendor_id   )iterrowsrt   r   ru   rj   r^   rw   rN   commitrefreshr   ri   rv   r=   r   rf   rg   re   rd   splitr   rk   r   r   r   r   rh   r   r   )r\   r^   r   inserted_rows_rowcategoryrb   	locationsloc_namelocationproduct_locationvendorsrh   vendorproduct_vendors                   r>   upload_products_csvr      s     M--/ \3>"xx)001G1G3K_1_aiatat  yC  bC  D  J  J  LH#"%o"6) x 		

8$((7#**7+?+?3~CV+VX_XjXjnxXxy  B%6>x{{D 077<0GGM277<0GGEN$'GG,A5$I	G FF7OIIKJJw =EX[['JhJhG*!$w7I7I!JG"%''-9L9L"MG!$w7I7I!JG''%5GKFF7OIIKJJwO,2237I% 188H-44X5K5Kx5WYaYlYlpzYz{  B  B  D'h:VHFF8$IIKJJx(#%88O#<#C#C#..*<#..'**<#//8;;>$ %'	 !
 ('6#-#*::$,KK($
 FF+,IIKJJ/0+1. }-(..s3G& /&)001C1C{1RTZTeTeisTstzz|#
SFFF6NIIKJJv&!#-!8!?!?!,,
:!,,

:!++vyy8" %'	 
 &%2#-#*::"())&N
 FF>*IIKJJ~.)/. 	y\| s   OV9F
V9A!V9c                   K   d}|j                         D ]  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|s#| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }	t        ||d   |r|j                  nd |	r|	j                  nd |d   t        j                        }| j!                  |       | j#                          | j%                  |       | j                  t&              j                  t&        j
                  |k(  t&        j(                  |j                  k(  t&        j*                  |j                  k(        j                         }
|
sit'        ||j                  |j                  |d   |j-                  d	d
            }
| j!                  |
       | j#                          | j%                  |
       |dz  } |S w)Nr   ri   purchase_order_ref_norh   rk   purchase_order_date)r^   
ref_numbersupplier_idr   r6   rn   	order_qty	unit_cost        )r^   purchase_order_idr   ordered_qtyr   r   )r   rt   r   ru   ri   r^   rw   r   r   r   rh   r   rk   rv   r   SENTrN   r   r   r   r   r   r=   )r\   r^   r   r   r   r   rb   rc   r   r   purchase_order_items              r>   process_purchase_orders_csvr   (  s     M--/ &3((7#**7+?+?3~CV+VX_XjXjnxXxy  B-0778P8PTWXoTp8pr  sK  sK  OY  sY  Z  `  `  bXXf%,,V-?-?3}CU-UW]WhWhlvWvw}}Fxx)001G1G3K_1_aiatat  yC  bC  D  J  J  LH*%67)/FIIT+3HKK45*//N FF>"IIKJJ~& hh'89@@((J6//>3D3DD((GJJ6
 %'	 	
 #"3%"0"3"3"::,''+s3# FF&'IIKJJ*+M&P s   K#K%c                 B  K   d}|j                         D ]  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|s| j                  t              j                  t        j
                  |k(  t        j                  |d   k(  t        j                  |d   k(        j                         }| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }	|s| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }
t        ||d   |d   |d   |j                  |
r|
j                  nd |	r|	j                  nd t         j"                        }| j%                  |       | j'                          | j)                  |       | j                  t*              j                  t*        j
                  |k(  t*        j,                  |j                  k(  t*        j.                  |j                  k(        j                         }|sit+        ||j                  |j                  |d	   |j1                  d
d            }| j%                  |       | j'                          | j)                  |       | j                  t2              j                  t2        j4                  |j                  k(  t2        j.                  |j                  k(        j                         }|r(|j6                  |d	   z   |_        | j%                  |       | j                  t2              j                  t2        j4                  |j                  k(        j9                         }t9        d |D              }|r&t         j"                  |_        | j%                  |       | j                  t<              j                  t<        j
                  |k(  t<        j.                  |j                  k(  |	rt<        j>                  |	j                  k(  nd       j                         }|r;|j@                  |d	   z   |_         |d   |_!        tE        jF                         |_$        nXt=        ||j                  |	r|	j                  nd |d   |d	   |d   tE        jF                         tE        jF                               }| j%                  |       tK        ||j                  |	r|	j                  nd |r|j                  nd |d	   tL        jN                  tQ        |j                              }| j%                  |       | j'                          |dz  } |S w)Nr   r   ri   receive_order_ref_nork   rh   r5   )r^   linked_ref_numberr   received_dater   r   r   rn   receive_qtyr   r   )r^   purchase_order_receive_idr   received_qtyr   c              3   N   K   | ]  }|j                   |j                  k\    y w)N)r   r   ).0lines     r>   	<genexpr>z/process_purchase_receive_csv.<locals>.<genexpr>  s!     ZT4,,0@0@@Zs   #%)r^   r   r   	batch_refquantity_on_handr   
created_at
updated_atr^   r   r   batch_idquantity_deltamovement_type	referencer   ))r   rt   r   ru   r   r^   rw   r   ri   r   r   r   rk   r   rh   rv   r   RECEIVEDrN   r   r   r   r   r   r=   r   r   r   allrn   r   r   r   r   r   nowr   r   r   RECEIPTr~   )r\   r^   r   r   r   r   linked_purchase_orderrb   r/   r   r   receive_order_itempo_lineall_po_linesall_receivedcurrentstockinventory_moves                    r>   process_purchase_receive_csvr   Z  sA     M--/ l3 " 7 > >}?W?W[^_v[w?w  zG  zR  zR  V`  z`  !a  !g  !g  !i$((7#**7+?+?3~CV+VX_XjXjnxXxy  B88$89@@ ++z9 22c:Q6RR ++s3I/JJ
 %'	 	 88H%,,X-C-Cs?G[-[]e]p]pt~]~  F  F  HXXf%,,V-?-?3}CU-UW]WhWhlvWvw}}F3%"%&="> !78!"67"7":":)/FIIT+3HKK*33	  FF#$IIKJJ'(XX&>?FF$//:=$>>BRBUBUU$//7::=
 %'	 	
 "!9%*:*=*=":: /''+s3" FF%&IIKJJ)* ((,-44//3H3K3KK((GJJ6
 %' 	 #*#7#7#m:L#LG FF7O xx 1299//3H3K3KK

#% 	 Z\ZZ+>+G+G!(FF() xx/66%%3%%39AN&&(++5t
 %'	 	 ,8,I,ICP]L^,^L)),-A)BL&&.llnL# *%"::+3HKK56!$]!3!"67#<<>#<<>
L 	|*!zz'/T(4\__$}-&..*--.
 	~
		Yl\ s   XXc                 f  K   d}|j                         D ]  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sVt        ||d   |r|j                  nd |d   d      }| j                  |       | j                          | j                  |       | j                  t              j                  t        j
                  |k(  t        j                   |j                  k(  t        j"                  |j                  k(        j                         }	|	sit        ||j                  |j                  |d   |j%                  d	d
            }	| j                  |	       | j                          | j                  |	       | j                  t&              j                  t&        j
                  |k(  t&        j"                  |j                  k(  |rt&        j(                  |j                  k(  nd       j                         }
|
rA|
j*                  |d   z
  |
_        t-        j.                         |
_        | j                  |
       t3        ||j                  |r|j                  nd |
r|
j                  nd |d   dz  t4        j6                  t9        |j                              }| j                  |       | j                          |dz  } |S w)Nr   ri   rk   sales_order_ref_nor6   store)r^   r   r   	sold_datechannelquantity
unit_pricer   )r^   sales_order_idr   r   r   r   r   )r   rt   r   ru   ri   r^   rw   r   rk   r   r   rv   rN   r   r   r   r   r   r=   r   r   r   r   r   r   r   r   SALEr~   )r\   r^   r   r   r   r   rb   r   
salesordersales_order_itemr   r   s               r>   process_sales_orders_csvr     s$     M--/ @3'"))'*>*>#nBU*UW^WiWimwWwx~~  A 88H%,,X-C-Cs?G[-[]e]p]pt~]~  F  F  H XXj)001F1F#NbJc1ceoezez  I  fI  J  P  P  R
#%34+3HKKl+J FF:IIKJJz"88N3::%%3))Z]]:%%3
 %'	 	
  -%)}}"::Z77<5  FF#$IIKJJ'( xx/66%%3%%39AN&&(++5t
 %'	 	 ,8,I,ICPZO,[L)&.llnL#FF< *!zz'/T(4\__$
Ob0&++*--(
 	~
		A@D    N/N1c                 	  K   d}|j                         D ]d  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|s| j                  t              j                  t        j
                  |k(  t        j                  |d   k(  t        j                  |d   k(        j                         }|s| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }	t        ||j                  |d   |d   |	r|	j                  nd|d   d	      }| j                  |       | j                          | j!                  |       nX| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }	| j                  t"              j                  t"        j
                  |k(  t"        j$                  |j                  k(  t"        j&                  |j                  k(        j                         }
|
sXt#        ||j                  |j                  |d
         }
| j                  |
       | j                          | j!                  |
       | j                  t(              j                  t(        j
                  |k(  t(        j&                  |j                  k(  |	rt(        j*                  |	j                  k(  nd      j                         }|rK|j,                  |d
   z   |_        |d   |_        t1        j2                         |_        | j                  |       t7        ||j                  |	r|	j                  nd|r|j                  nd|d
   t8        j:                  t=        |j                              }| j                  |       | j                          |dz  }g |S w)z Process sales return CSV upload.r   r   ri   return_order_ref_nork   Nr7   r   )r^   r   r   r   r   returned_dater   r   )r^   sales_return_order_idr   r   r   r   )r   rt   r   ru   r   r^   rw   r   ri   r   r   r   rk   rv   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   SALE_RETURNr~   )r\   r^   r   r   r   r   linked_sales_orderrb   r1   r   return_order_itemr   r   s                r>   process_sales_return_csvr     s     M--/ Z3XXj188!!S)=%>>!!Z/
 %' 	 "((7#**  C$77*,
 %' 	  xx 0188'':5..#6J2KK''3/D+EE
 %'	 	 xx)00&&#o*>>##z1 eg  ,%14445"%&:";+3HKK!-0L FF< IIKJJ|$xx)00&&#o*>>##z1 eg  HH%9:AA ++z9 66,//I ++wzz9
 %'	 	 ! 4%&2oo"::Z	! FF$%IIKJJ() xx/66%%3%%39AN&&(++5t
 %'	 	 ,8,I,ICPZO,[L)),]);L&&.llnL#FF<  +!zz'/T(4\__$z?&22,//*
 	~
		uZx s   Q=Q?c                 	  K   d}|j                         D ]  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|s| j                  t              j                  t        j
                  |k(  t        j                  |d   k(  t        j                  |d   k(        j                         }|s3| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }	| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }
t        ||j                  |d   |d   |	r|	j                  nd|
r|
j                  nd|d   t         j"                  	      }| j%                  |       | j'                          | j)                  |       nX| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }
| j                  t*              j                  t*        j
                  |k(  t*        j,                  |j                  k(  t*        j.                  |j                  k(        j                         }|sXt+        ||j                  |j                  |d
         }| j%                  |       | j'                          | j)                  |       | j                  t0              j                  t0        j
                  |k(  t0        j.                  |j                  k(  |
rt0        j2                  |
j                  k(  nd      j                         }|rA|j4                  |d
   z
  |_        t7        j8                         |_        | j%                  |       t=        ||j                  |
r|
j                  nd|r|j                  nd|d
   dz  t>        j@                  tC        |j                              }| j%                  |       | j'                          |dz  } |S w)z3Process purchase return (vendor return) CSV upload.r   r   ri   r   rh   rk   Nr7   )r^   purchase_receive_order_idr   r   r   r   r   rn   
return_qty)r^   purchase_order_return_idr   r   r   r   r   )"r   rt   r   ru   r   r^   rw   r   ri   r   r   r   rh   r   rk   rv   r   RETURNEDrN   r   r   r   r   r   r   r   r   r   r   r   r   r   PURCHASE_RETURNr~   )r\   r^   r   r   r   r   linked_receive_orderrb   r2   r   r   r   r   r   s                 r>   process_purchase_return_csvr     s-     M--/ ^3!xx(<=DD ++s3I/JJ ++z9 
 %' 	 $((7#**  C$77*,
 %' 	  ((#67>>**j811S9O5PP**c2G.HH
 %'	 	 XXf%,,""c-&88!!Z/ eg  xx)00&&#o*>>##z1 eg  2%*>*A*A45"%&<"=)/FIIT+3HKK!-0*33	O FF?#IIKJJ'xx)00&&#o*>>##z1 eg  HH%<=DD#..*<#<<@R@RR#..'**<
 %'	 	 ! 7%)8););"::|,	! FF$%IIKJJ() xx/66%%3%%39AN&&(++5t
 %'	 	 ,8,I,ICP\L],]L)&.llnL#FF<  +!zz'/T(4\__$-2&66/,,-
 	~
		}^@ s   S,S.c           
      f  K   d}|j                         D ]  \  }}| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|sb| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }| j                  t              j                  t        j                  |d   k(  t        j
                  |k(        j                         }|d   }	|j                  dd      }
| j                  t              j                  t        j
                  |k(  t        j                  |j                  k(  |rt        j                  |j                  k(  nd      j                         }|r>|j                  |	z
  |_        t        j                          |_        | j%                  |       t'        ||j                  |r|j                  nd|r|j                  nd|	d	z  t(        j*                  |

      }| j%                  |       | j-                          | j                  t              j                  t        j
                  |k(  t        j                  |j                  k(  |rt        j                  |j                  k(  nd      j                         }|rH|j                  |	z   |_        |d   |_        t        j                          |_        | j%                  |       | j-                          t'        ||j                  |r|j                  nd|r|j                  nd|	t(        j0                  |

      }| j%                  |       | j-                          |dz  } |S w)z"Process stock transfer CSV upload.r   ri   from_location_nameto_location_namer   transfer_ref_no Nr   r   r8   r   )r   rt   r   ru   ri   r^   rw   r   rk   r=   r   r   rv   r   r   r   r   r   rN   r   r   TRANSFER_OUTr   r   TRANSFER_IN)r\   r^   r   r   r   r   rb   from_locationto_locationtransfer_qtytransfer_refcurrentstock_fromtransfer_out_movecurrentstock_totransfer_in_moves                  r>   process_stock_transfer_csvr     s&     M--/ I3((7#**  C$77*,
 %' 	 *11""c*>&??:-
 %' 	
 hhx(//""c*<&==:-
 %' 	
 :ww0"5 HH^4;;%%3%%3>KN&&-*:*::QU
 %'	 	 1B1S1SVb1b.+3<<>(FF$% .!zz,9((t->&))D(2-&33"
 	 !
		 ((>299%%3%%3<GN&&+..8T
 %'	 	 />/O/OR^/^O,,/,@O))1O&FF?#
		 -!zz*54+:_'''&22"
 	 
		SIV r   pageperpageprocessing_statusc           
         	 |dz
  |z  }| j                  t              j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }|r"|j                  t        j
                  |k(        }|j                  t        t        j                              }|j                         }|j                  |      j                  |      j                         }	d|	|||ddS # t        $ r@}
t        j                  dt!        |
              dg ||ddt!        |
       dcY d}
~
S d}
~
ww xY w)	a@  
    Fetch CSV upload logs with pagination and optional filtering.
    Returns logs ordered by upload_date descending (latest first).
    
    Args:
        db: Database session
        company_id: Company ID to filter logs
        page: Page number (1-indexed)
        perpage: Number of items per page
        csv_type: Optional filter by CSV type (product, purchase_order, etc.)
        processing_status: Optional filter by status (succeeded, failed, partially_succeeded)
    
    Returns:
        dict with success, data (list of logs), page, perpage, total, message
    r   Tz&CSV upload logs retrieved successfully)successr   r   r   totalrq   z Error fetching CSV upload logs: Fr   N)rt   r    ru   r^   r:   r   order_byr$   upload_datecountoffsetlimitr   rP   rQ   r   r~   )r\   r^   r   r   r:   r   r  rt   r  logsrZ   s              r>   get_csv_upload_logsr	  C  s2   .)
(g% &--##z1

 LL!6!6(!BCELL!?!?CT!TUEtL$<$<=>  ||F#))'2668 ?
 	
  	
7Ax@A9#a&B
 	
	
s   C3C6 6	D??5D:4D?:D?)r   
   NN)EpandasrH   r{   loggingosfastapir   r   sqlalchemy.ormr   r   typingr   r   r	   r
   )src.smart_inventory.apps.inventory.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   (src.smart_inventory.apps.products.modelsr   r   r   r   r   r   r   +src.smart_inventory.apps.data_import.modelsr    +src.smart_inventory.utils.task_orchestratorr!   /src.smart_inventory.utils.csv_task_orchestratorr"   r#   
sqlalchemyr$   	getLogger__name__rQ   r4   r~   __annotations__r9   r?   	DataFramer[   intr   r   r   r   r   r   r   r   dictr	   r@   r>   <module>r     s    	  	 - "  ' '    B  B  B D Y 			8	$ ds{,.AB5 T#tCy.1  .. >"O%&'* $sDI~& 9s 9tCy 9&bll & &c &6_b_b
_b _b 	_b
 
#s(^_bBfff ,,f 		fR/// ,,/ 		/duuu ,,u 		upIII ,,I 		IXccc ,,c 		cLggg ,,g 		gTRRR ,,R 		Rp !@
@
@
 @
 	@

 @
 @
 
@
r@   