
    ܥ j                     
   d dl Z d dlmZ d dlZd dlmZ d dlZd dlmZ d dl	m
Z
 d dlmZm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mZmZmZ d dlmZ d dlm Z  d dl!m"Z"  e       Z#e#jI                           ejJ                  e&      Z'de(fdZ)ddZ*de+ddfdZ,de+ddfdZ-de.e+   fdZ/edefd       Z0 ee#jb                  de0      Z2e2jg                  e
e#jh                  ddgdg       e2jk                  e       y)    N)asynccontextmanager)Path)FastAPI)CORSMiddleware)inspecttext)router"run_safety_stock_notification_scan)get_settings)prepare_database)order_batch
order_itemproductseasonal_goalshared_notesupplier_catalogsuspended_order)
OrderBatch)	OrderItem)Productreturnc                  6    t        dt        j                        S )Ni,  )maxsettings&safety_stock_notification_poll_seconds     apps/ordini/backend/app/main.py#_safety_stock_poll_interval_secondsr      s    sHCCDDr   c                  `  K   t        j                  t        dt                            d {    	 	 t        j                  t
        t                      d {    t        j                  t                      d {    Q7 V7 ,# t        $ r t        j                  d       Y Jw xY w7 -w)N<   z%Safety stock notification scan failed)
asynciosleepminr   	to_threadr
   _tenant_database_urls	Exceptionlogger	exceptionr   r   r   $_safety_stock_notification_poll_loopr*      s     
--B C EF
GGG
	F##$FH]H_``` mm?ABBB  H a 	FDE	FBsP   +B.BB.%B BB  B.>B,?B.B B)&B.(B))B.database_urlc                    t        |       }t        |      j                  t        j                        D ch c]  }|d   	 }}dddddddddd	}|j                         5 }|j                         D ];  \  }}||v r|j                  t        dt        j                   d| d|              = 	 d d d        y c c}w # 1 sw Y   y xY w)	NnamezVARCHAR(120)FLOATTEXT)	product_codefinal_price_vatvat_rate	weight_kgunit_price_per_kgcategorynotesunits_per_packliters_per_unitALTER TABLE  ADD COLUMN  )	r   r   get_columnsr   __tablename__beginitemsexecuter   )r+   enginecolumnexisting_columnscolumn_specs
connectioncolumn_namecolumn_types           r   _upgrade_product_schemarH   '   s    l+F5<V_5P5PQXQfQf5gh6vhh&"$"!"
L 
 t:(4(:(:(< 	t$K..tl73H3H2IVaUbbcdocp$qrs	tt t it ts   B9 AB>>Cc                    t        |       }t        |      j                  t        j                        D ch c]  }|d   	 }}t        |      j                  t
        j                        D ch c]  }|d   	 }}dddddd}ddd}|j                         5 }|j                         D ];  \  }}	||v r|j                  t        dt        j                   d	| d
|	              = |j                         D ];  \  }}	||v r|j                  t        dt
        j                   d	| d
|	              = 	 d d d        y c c}w c c}w # 1 sw Y   y xY w)Nr-   r.   zVARCHAR(80)zVARCHAR(240)zVARCHAR(40))total_estimated_amountfiscal_document_idfiscal_document_namefiscal_document_typefiscal_document_matched_at)final_price_vat_snapshotestimated_line_totalr9   r:   r;   )
r   r   r<   r   r=   r   r>   r?   r@   r   )
r+   rA   rB   batch_columnsitem_columnsbatch_column_specsitem_column_specsrE   rF   rG   s
             r   _upgrade_order_schemarU   =   s|   l+F29&/2M2MjNfNf2ghVF^hMh181L1LYMdMd1efvF6NfLf #*+ . -&3 %, '
 
 v:(:(@(@(B 	w$Km+tl:3K3K2LLYdXeefgrfs$tuv	w ):(?(?(A 	v$Kl*tl93J3J2K<XcWddefqer$stu	vv v ifv vs   E .EBE

Ec                     t        t               j                        } | j                         sg S t	        j
                  |       }	 |j                  d      j                         }|j                          g }t               }|D ]<  \  }|sdt        |       }||v r|j                  |       |j                  |       > |S # |j                          w xY w)Nz!SELECT database_path FROM tenantsz
sqlite:///)r   r   tenancy_registry_databaseexistssqlite3connectr@   fetchallclosesetaddappend)registry_pathrE   rowsurlsseendatabase_pathtargets          r   r&   r&   Y   s    AABM!	/J!!"EFOOQDUD  d=123T>F K 	s   C C_c                  K   t               }t        |j                         t        |j                         t	               D ]  }t        |       t        |        t        j                  t                     }	 d  |j                          	 | d {    y 7 # t
        j                  $ r Y y w xY w# |j                          	 | d {  7   w # t
        j                  $ r Y w w xY wxY ww)N)
r   rH   r+   rU   r&   r"   create_taskr*   cancelCancelledError)rf   r   r+   safety_stock_tasks       r   lifespanrl   q   s     ~HH112(//0-/ ,-l+,  ++,P,RS  "	###%% 		 	  "	###%% 		s   A7C0:B6 ?C0B BB C0B B30C02B33C06C-CCCC-C*'C-)C**C--C0z0.1.0)titleversionrl   T*)allow_originsallow_credentialsallow_methodsallow_headers)r   N)6r"   
contextlibr   loggingpathlibr   rY   fastapir   fastapi.middleware.corsr   
sqlalchemyr   r   app.api.routesr	   r
   app.core.configr   app.core.databaser   
app.modelsr   r   r   r   r   r   r   app.models.order_batchr   app.models.order_itemr   app.models.productr   r   validate_runtime	getLogger__name__r(   intr   r*   strrH   rU   listr&   rl   app_nameappadd_middlewarecors_origins_listinclude_routerr   r   r   <module>r      s    *     2 $ E ( . v v v - + & >    			8	$ES ECt# t$ t,v v v8tCy 0 g  " H%%wJ   ,,%%     6 r   