
    koi                     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 ddlmZmZ d dlZd dlZ	 d dlmZ  ej.                  e      Z e       Zej7                  d	       ed
       ed
       ed
       ee      fdeded   dedefd       Zej=                  ddg       ed
d       eddd       edddd       edd       edd       ee      fdededed ed!edefd"       Z ej=                  d#dg       ee      fd$edefd%       Z!y# e$ r	 d dlmZ Y w xY w)&    )	APIRouterDependsForm
UploadFileFileQueryHTTPException)FileResponse)Session)Literal   )
controllerschemasN)get_dbz/upload-csv.
company_idupload_type)productpurchase_orderpurchase_receivesales_ordersales_returnpurchase_returnstock_transferfiledbc                 R   K   t        j                  ||| |       d{   }|S 7 w)a  
    Upload CSV file and queue for async background processing.
    
    The CSV file is saved to disk and a Celery task is created to process it.
    Processing happens asynchronously - the response is returned immediately.
    
    CSV types are processed in dependency order:
    - product: No dependencies, processed first
    - purchase_order: Depends on product
    - purchase_receive: Depends on product, purchase_order
    - sales_order: Depends on product, purchase_order, purchase_receive
    - sales_return: Depends on product, purchase_order, purchase_receive, sales_order
    - purchase_return: Depends on product, purchase_order, purchase_receive
    - stock_transfer: Depends on all other types
    
    Returns:
        - task_id: Celery task ID for tracking
        - task_name: Unique task name
        - status: "pending" (processing) or "hold" (waiting for dependencies)
        - file_path: Path to saved CSV file
        - message: Status message
    N)r   process_csv_file)r   r   r   r   results        J/var/www/html/hubwallet-dev/src/smart_inventory/apps/data_import/router.py
upload_csvr       s,     : ..r4[QQFM Rs   '%'z/csv-upload-logszSmart Inventory - Frontend)tagszCompany ID (required))descriptionzPage number)ger"   
   d   zNumber of items per page)r#   ler"   zzFilter by CSV type (product, purchase_order, purchase_receive, sales_order, sales_return, purchase_return, stock_transfer)zDFilter by processing status (succeeded, failed, partially_succeeded)pageperpagecsv_typeprocessing_statusc                 P   	 t        j                  || ||||      }t        j                  |d   |d   |d   |d   |d   |d         S # t        $ rR}t
        j                  d	t        |              t        j                  d
g ||dd	t        |             cY d}~S d}~ww xY w)z
    Get CSV upload logs with pagination and optional filtering.
    Returns logs ordered by upload_date descending (latest first).
    All dates are returned in UTC timezone.
    )r   r   r'   r(   r)   r*   successdatar'   r(   totalmessage)r,   r-   r'   r(   r.   r/   z Error fetching CSV upload logs: Fr   N)r   get_csv_upload_logsr   CSVUploadLogResponse	Exceptionloggererrorstr)r   r'   r(   r)   r*   r   r   es           r   r0   r0   5   s    
//!/
 ++9%9%/9%
 	
  	
7Ax@A++6s1vh?
 	
	
s   AA
 
	B%AB B% B%z/download-csv/{log_id}log_idc                 "   	 ddl m} |j                  |      j                  |j                  | k(        j                         }|st        dd      |j                  }t        j                  j                  |      st        dd      t        j                  j                  |      }t        ||ddd	| i
      S # t        $ r  t        $ r?}t        j                  dt!        |              t        ddt!        |             d}~ww xY w)z
    Download a CSV file by log ID.
    
    Security: Validates that the log entry exists and the file is available.
    
    Args:
        log_id: CSV upload log ID
    
    Returns:
        FileResponse with the CSV file for download
    r   )CSVUploadLogi  zCSV upload log not found)status_codedetailzFile not found on serverztext/csvzContent-Dispositionzattachment; filename=)pathfilename
media_typeheaderszError downloading CSV file: i  zError downloading file: N)+src.smart_inventory.apps.data_import.modelsr9   queryfilteridfirstr	   	file_pathosr<   existsbasenamer
   r2   r3   r4   r5   )r7   r   r9   	log_entryrE   r=   r6   s          r   download_csv_filerJ   b   s    +
L HH\*11OOv%

%' 	 1  ''	 ww~~i(1  77##I. !*.CH:,NO	
 	
   
3CF8<=-c!fX6
 	

s   B:B= =D:D		D)"fastapir   r   r   r   r   r   r	   fastapi.responsesr
   sqlalchemy.ormr   typingr    r   r   loggingrF   src.utils.dbr   ImportErrorutils.db	getLogger__name__r3   routerpostintr    getr5   r0   rJ        r   <module>r\      s   T T T * "  !  	 #
 
		8	$	 ]3i QU  VY  QZCy&/	  M  N  		 @ &B%CDC-DEaA=9c7QR$  -i  j"45{|&/)
)

)
 )
 	)

 )
 	)
 E)
X $,H+IJ &/:
:
:
 K:
q    s   D D*)D*