
    H;i0O                     l   d dl mZmZmZ d dlmZmZmZ d dlmZm	Z	m
Z
mZ ddlmZmZmZ  ed      Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d e      Z G d! d"e      Z G d# d$e      Z G d% d&e      Z  G d' d(e       Z! G d) d*e       Z" G d+ d,e      Z# G d- d.e#      Z$ G d/ d0e#      Z% G d1 d2e      Z& G d3 d4e&      Z' G d5 d6e&      Z( G d7 d8e      Z) G d9 d:e)      Z* G d; d<e)      Z+ G d= d>e      Z, G d? d@e      Z- G dA dBe      Z. G dC dDe      Z/ G dE dFe      Z0 G dG dHe      Z1 G dI dJe1      Z2 G dK dLe1      Z3 G dM dNe      Z4 G dO dPe      Z5 G dQ dRe      Z6 G dS dTe6      Z7 G dU dVe6      Z8 G dW dXe      Z9 G dY dZe      Z: G d[ d\e      Z; G d] d^e      Z< G d_ d`e      Z= G da dbe      Z> G dc dde      Z? G de dfe      Z@ G dg dhe      ZA G di dje      ZB G dk dle      ZC G dm dne      ZD G do dpe      ZE G dq dre      ZF G ds dte      ZG G du dve      ZH G dw dxe      ZI G dy dze      ZJ G d{ d|e      ZK G d} d~e      ZL G d de      ZM G d de      ZN G d de      ZO G d de      ZP G d de      ZQ G d de      ZR G d de      ZS G d de      ZT G d de      ZU G d de      ZVy)    )	BaseModelfield_validatormodel_validator)datetimedate	timedelta)OptionalListGenericTypeVar   )PurchaseOrderStatusInventoryBatchStatusMovementTypeTc                   @    e Zd ZU eed<   dZee   ed<   dZee	   ed<   y)ResponseModelsuccessNdatamessage)
__name__
__module____qualname__bool__annotations__r   r	   dictr   str     I/var/www/html/hubwallet-dev/src/smart_inventory/apps/inventory/schemas.pyr   r      s#    MD(4.!GXc]!r   r   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)PaginationInfopageper_pagetotal_itemstotal_pagesNr   r   r   intr   r   r   r    r"   r"      s    
IMr   r"   c                   b    e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee
   ed<   dZee
   ed<   y)ErrorResponseFr   r   N
error_codedetailsr   )r   r   r   r   r   r   r   r+   r	   r,   r   r   r   r   r    r*   r*      s;    GTL $J$"GXd^"D(4.r   r*   c                   ,    e Zd ZU eed<   dZee   ed<   y)CompanyInfoidNnamer   r   r   r(   r   r0   r	   r   r   r   r    r.   r.   "       GD(3-r   r.   c                   ,    e Zd ZU eed<   dZee   ed<   y)LocationInfor/   Nr0   r1   r   r   r    r4   r4   '   r2   r   r4   c                   ,    e Zd ZU eed<   dZee   ed<   y)ProductInfor/   Nr0   r1   r   r   r    r6   r6   ,   r2   r   r6   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)SalesOrderBase
company_idlocation_idsold_atchannelN)r   r   r   r(   r   r   r   r   r   r    r8   r8   2   s    OLr   r8   c                       e Zd Zy)SalesOrderCreateNr   r   r   r   r   r    r>   r>   9       r   r>   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)SalesOrderOutr/   
created_at
updated_atc                       e Zd ZdZy)SalesOrderOut.ConfigTNr   r   r   from_attributesr   r   r    ConfigrF   B       r   rI   Nr   r   r   r(   r   r   rI   r   r   r    rB   rB   =       G r   rB   c                   J    e Zd ZU eed<   eed<   eed<   eed<   dZee   ed<   y)SalesOrderLineBasesales_order_id
product_idquantity
unit_priceNpromotion_id)r   r   r   r(   r   floatrS   r	   r   r   r    rN   rN   F   s&    OM"&L(3-&r   rN   c                       e Zd Zy)SalesOrderLineCreateNr?   r   r   r    rV   rV   N   r@   r   rV   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)SalesOrderLineOutr/   rC   rD   c                       e Zd ZdZy)SalesOrderLineOut.ConfigTNrG   r   r   r    rI   rZ   W   rJ   r   rI   NrK   r   r   r    rX   rX   R   rL   r   rX   c                       e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZee	   ed<   e	ed	<   e
j                  Ze
ed
<   y)InventoryBatchBaser9   rP   r:   	batch_refr   quantity_on_handNexpiry_datereceived_datestatus)r   r   r   r(   r   r   r^   r_   r	   r   r   ACTIVEra   r   r   r    r\   r\   [   sH    OONc&*K(#*#7#>#>F >r   r\   c                       e Zd Zy)InventoryBatchCreateNr?   r   r   r    rd   rd   f   r@   r   rd   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)InventoryBatchOutr/   rC   rD   c                       e Zd ZdZy)InventoryBatchOut.ConfigTNrG   r   r   r    rI   rh   o   rJ   r   rI   NrK   r   r   r    rf   rf   j   rL   r   rf   c                   h    e Zd ZU eed<   eed<   eed<   dZee   ed<   eed<   eed<   dZee	   ed<   y)	InventoryMovementBaser9   rP   r:   Nbatch_idmovement_typequantity_delta	reference)
r   r   r   r(   r   rk   r	   r   rn   r   r   r   r    rj   rj   s   s:    OO"Hhsm"#Ix}#r   rj   c                       e Zd Zy)InventoryMovementCreateNr?   r   r   r    rp   rp   }   r@   r   rp   c                   6    e Zd ZU eed<   eed<    G d d      Zy)InventoryMovementOutr/   rC   c                       e Zd ZdZy)InventoryMovementOut.ConfigTNrG   r   r   r    rI   rt      rJ   r   rI   NrK   r   r   r    rr   rr          G r   rr   c                   b    e Zd ZU eed<   eed<   eed<   ej                  Zeed<   dZe	e
   ed<   y)PurchaseOrderBaser9   supplier_idr:   ra   Nexpected_delivery_date)r   r   r   r(   r   r   DRAFTra   ry   r	   r   r   r   r    rw   rw      s4    O"5";";F;15HX.5r   rw   c                       e Zd Zy)PurchaseOrderCreateNr?   r   r   r    r|   r|      r@   r   r|   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)PurchaseOrderOutr/   rC   rD   c                       e Zd ZdZy)PurchaseOrderOut.ConfigTNrG   r   r   r    rI   r      rJ   r   rI   NrK   r   r   r    r~   r~      rL   r   r~   c                   D    e Zd ZU eed<   eed<   eed<   dZeed<   eed<   y)PurchaseOrderLineBasepurchase_order_idrP   ordered_qtyr   received_qty	unit_costN)r   r   r   r(   r   r   rT   r   r   r    r   r      s#    OL#r   r   c                       e Zd Zy)PurchaseOrderLineCreateNr?   r   r   r    r   r      r@   r   r   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)PurchaseOrderLineOutr/   rC   rD   c                       e Zd ZdZy)PurchaseOrderLineOut.ConfigTNrG   r   r   r    rI   r      rJ   r   rI   NrK   r   r   r    r   r      rL   r   r   c                   H    e Zd ZU eed<   eed<   eed<   dZeed<   dZeed<   y)	DailySalesBaserP   r:   	sale_dater   quantity_sold        total_amountN)	r   r   r   r(   r   r   r   r   rT   r   r   r    r   r      s'    OM3L%r   r   c                       e Zd Zy)DailySalesCreateNr?   r   r   r    r   r      r@   r   r   c                   @    e Zd ZU eed<   eed<   eed<    G d d      Zy)DailySalesOutr/   rC   rD   c                       e Zd ZdZy)DailySalesOut.ConfigTNrG   r   r   r    rI   r      rJ   r   rI   NrK   r   r   r    r   r      rL   r   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   d
Zee	   ed<   d
Z
ee	   ed<   d
Zee	   ed<    G d d      Zy
)DailySalesExtendedOutr/   r9   rP   r:   r   r   r   rC   rD   Nproduct_name
brand_namelocation_namec                       e Zd ZdZy)DailySalesExtendedOut.ConfigTNrG   r   r   r    rI   r      rJ   r   rI   r   r   r   r(   r   r   rT   r   r	   r   r   r   rI   r   r   r    r   r      si    GOO"&L(3-& $J$#'M8C=' r   r   c                   <    e Zd ZU ee   ed<   eed<   eed<   eed<   y)PaginatedDailySalesResponser   r#   perpagetotalN)r   r   r   r
   r   r   r(   r   r   r    r   r      s    
$
%%
ILJr   r   c                   D    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   y)MonthlyServiceLevelItemz3Single month data point for service level vs demandmonth
demand_qtyfulfilled_qtylost_sales_qtyservice_levelN)r   r   r   __doc__r   r   r(   rT   r   r   r    r   r      s!    =JOr   r   c                   h    e Zd ZU dZeed<   dZee   ed<   dZee   ed<   e	ed<   e	ed<   e
e   ed<   y)	ServiceLevelVsDemandDataz4Data structure for service level vs demand analyticsr9   Nr:   rP   
month_frommonth_tomonthly_data)r   r   r   r   r(   r   r:   r	   rP   r   r
   r   r   r   r    r   r      s<    >O!%K#% $J$OM.//r   r   c                   0    e Zd ZU dZeed<   eed<   eed<   y)ServiceLevelVsDemandResponsez7Response for service level vs demand analytics endpointr   r   r   N)r   r   r   r   r   r   r   r   r   r   r    r   r      s    AM
""Lr   r   c                   n    e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZeed<   dZ	eed<   d	Z
eed
<   y)ServiceLevelBaser   r9   r:   rP   r   r   r   r   g      ?r   N)r   r   r   r   r   r(   r   rT   r   r   r   r   r   r    r   r      s?    
NOOJM5NEM5r   r   c                       e Zd Zy)ServiceLevelCreateNr?   r   r   r    r   r   	  r@   r   r   c                   6    e Zd ZU eed<   eed<    G d d      Zy)ServiceLevelOutr/   rC   c                       e Zd ZdZy)ServiceLevelOut.ConfigTNrG   r   r   r    rI   r     rJ   r   rI   NrK   r   r   r    r   r     ru   r   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   dZee	   ed<   dZ
ee	   ed<   dZee	   ed<    G d d      Zy)ServiceLevelExtendedOutr/   r   r9   r:   rP   r   r   r   r   rC   Nr   r   r   c                       e Zd ZdZy)ServiceLevelExtendedOut.ConfigTNrG   r   r   r    rI   r   $  rJ   r   rI   r   r   r   r    r   r     sn    G
NOO"&L(3-& $J$#'M8C=' r   r   c                   <    e Zd ZU ee   ed<   eed<   eed<   eed<   y)PaginatedServiceLevelResponser   r#   r   r   N)r   r   r   r
   r   r   r(   r   r   r    r   r   )  s    
&
''
ILJr   r   c                   `    e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZeed<   dZ	eed<   y	)
InventorySnapshotBasesnapshot_dater9   r:   rP   r   on_hand_qtyinbound_qtyoutbound_qtyN)
r   r   r   r   r   r(   r   rT   r   r   r   r   r    r   r   1  s6    OOKKL%r   r   c                       e Zd Zy)InventorySnapshotCreateNr?   r   r   r    r   r   ;  r@   r   r   c                   6    e Zd ZU eed<   eed<    G d d      Zy)InventorySnapshotOutr/   rC   c                       e Zd ZdZy)InventorySnapshotOut.ConfigTNrG   r   r   r    rI   r   C  rJ   r   rI   NrK   r   r   r    r   r   ?  ru   r   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   d
Zee	   ed<   d
Z
ee	   ed<   d
Zee	   ed<    G d d      Zy
)InventorySnapshotExtendedOutr/   r   r9   r:   rP   r   r   r   rC   Nr   r   r   c                       e Zd ZdZy)#InventorySnapshotExtendedOut.ConfigTNrG   r   r   r    rI   r   U  rJ   r   rI   r   r   r   r    r   r   G  si    GOO"&L(3-& $J$#'M8C=' r   r   c                   <    e Zd ZU ee   ed<   eed<   eed<   eed<   y)"PaginatedInventorySnapshotResponser   r#   r   r   N)r   r   r   r
   r   r   r(   r   r   r    r   r   Z  s    
+
,,
ILJr   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   e	ed<   e	ed<   e	ed<   e	ed	<   eed
<   e
ed<   dZee   ed<   dZee   ed<   eed<    G d d      Z ed      ed               Zy)SlowMoverDatar/   r   companylocationproductr   total_sold_90dads_90ddoh_90ddays_since_last_saleis_slow_moverNslow_mover_severityslow_mover_reasonrC   c                       e Zd ZdZy)SlowMoverData.ConfigTNrG   r   r   r    rI   r   r  rJ   r   rI   beforemodec                 0   t        |t              rd|v r|d   |d   |d   |j                  d      d|d   |j                  d      d|d   |j                  d	      |j                  d
      d|d   |d   |d   |d   |d   |d   |d   |d   |d   dS |S )1Transform flat data structure to nested structurecompany_namer/   r   r9   r/   r0   r:   r   rP   r   product_skur/   r0   skur   r   r   r   r   r   r   r   rC   )r/   r   r   r   r   r   r   r   r   r   r   r   r   rC   )
isinstancer   getclsr   s     r    transform_flat_dataz!SlowMoverData.transform_flat_datau  s     dD!n&< 4j!%o!6|, HH^4
 }- HH_5
 |, HH^488M2
  $M2"&'7"8	?	?(,-C(D!%o!6'+,A'B%)*=%>"<01 4 r   )r   r   r   r(   r   r   r.   r4   r6   rT   r   r   r	   r   r   rI   r   classmethodr   r   r   r    r   r   b  s    GNN)-#-'+x}+  (#  $r   r   c                   <    e Zd ZU ee   ed<   eed<   eed<   eed<   y)SlowMoverPaginatedDataitemsr#   r   r   N)r   r   r   r
   r   r   r(   r   r   r    r   r     s    
ILJr   r   c                   ,    e Zd ZU eed<   eed<   eed<   y)SlowMoverResponser   r   r   N)r   r   r   r   r   r   r   r   r   r    r   r         M
  Lr   r   c                   \    e Zd ZU eed<   eed<   eed<   eed<   eed<   edee   fd       Zy)	ForecastRequestr9   r:   rP   
start_dateend_datereturnc                     | j                   }g }|| j                  k  r0|j                  |       |t        d      z  }|| j                  k  r0|S )Nr   )days)r   r   appendr   )selfdouts      r    dateszForecastRequest.dates  sK    OO4== JJqM""A 4==  
r   N)	r   r   r   r(   r   r   propertyr
   r  r   r   r    r   r     s:    OONtDz  r   r   c                   "    e Zd ZU eed<   eed<   y)ForecastResponseItemr   forecast_qtyN)r   r   r   r   r   rT   r   r   r    r  r    s    
Jr   r  c                   <    e Zd ZU eed<   eed<   eed<   ee   ed<   y)ForecastResponser9   r:   rP   	forecastsN)r   r   r   r(   r   r
   r  r   r   r    r	  r	    s    OO())r   r	  c                       e Zd ZU eed<   y)TrainDemandForecastRequestr9   Nr'   r   r   r    r  r    s    Or   r  c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)TrainDemandForecastResponsetask_idra   r   r9   Nr   r   r   r   r   r(   r   r   r    r  r    s    LKLOr   r  c                   ,    e Zd ZU eed<   eed<   eed<   y)AnalyticsOverviewDataslow_mover_countover_stock_countunder_stock_countNr'   r   r   r    r  r    s    r   r  c                   ,    e Zd ZU eed<   eed<   eed<   y)AnalyticsOverviewResponser   r   r   N)r   r   r   r   r   r  r   r   r   r    r  r    s    M
Lr   r  c                   v    e Zd ZU dZdZee   ed<   eed<   e	ed<   e	ed<   e	ed<   e	ed<   e	ed	<   dZ
ee   ed
<   y)KPISummaryDataz0KPI summary metrics for frontend dashboard cardsNr   avg_service_levelstockouts_countoverstock_countunderstock_countr  total_products_trackedavg_days_on_hand)r   r   r   r   r   r	   r   r   rT   r(   r  r   r   r    r  r    sF    :$(M8D>((,huo,r   r  c                   ,    e Zd ZU eed<   eed<   eed<   y)KPISummaryResponser   r   r   N)r   r   r   r   r   r  r   r   r   r    r!  r!    s    M
Lr   r!  c                   ,    e Zd ZU eed<   eed<   eed<   y)MonthlyStockVsDemandItemr   avg_daily_demandavailable_stockNr  r   r   r    r#  r#    s    Jr   r#  c                   d    e Zd ZU eed<   dZee   ed<   dZee   ed<   eed<   eed<   e	e
   ed<   y)StockVsDemandDatar9   Nr:   rP   r   r   r   )r   r   r   r(   r   r:   r	   rP   r   r
   r#  r   r   r    r'  r'    s9    O!%K#% $J$OM/00r   r'  c                   ,    e Zd ZU eed<   eed<   eed<   y)StockVsDemandResponser   r   r   N)r   r   r   r   r   r'  r   r   r   r    r)  r)    s    M
Lr   r)  c                      e Zd ZU eed<   eed<   eed<   dZee	   ed<   dZ
ee	   ed<   dZee   ed<   eed<   eed	<   dZee   ed
<   e	ed<   dZee   ed<   dZee   ed<   dZeed<   dZee	   ed<   dZeed<   dZeed<   dZee   ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZee   ed<   dZeed<   dZeed<   dZeed<   dZ eed<   dZ!e"ed<   dZ#eed <   dZ$eed!<   dZ%eed"<   dZ&eed#<   dZ'eed$<   dZ(eed%<   dZ)eed&<   dZ*eed'<   dZ+ee	   ed(<   dZ,ee"   ed)<   dZ-ee   ed*<    G d+ d,      Z. e/d-.      e0d/               Z1y)0InventoryDetailDatar   r   r   Nr   category_nameis_perishablecurrent_stockactive_batches_countearliest_expiryra   snapshot_stockr   Fr   r   r   avg_daily_sales_90ddays_on_hand_90dr   reorder_pointsafety_stockshould_reorderrecommended_order_qtyplanning_snapshot_dater$  sigma_daily_demandlead_time_daysreview_period_daysffffff?service_level_targetforecast_avg_daily_demand_90dforecast_safety_stock_90dforecasted_reorder_point_90dplanning_on_hand_qtyr   r%  
min_target
max_targetstock_statuslatest_service_levelservice_level_datec                       e Zd ZdZy)InventoryDetailData.ConfigTNrG   r   r   r    rI   rH  9  rJ   r   rI   r   r   c           	         t        |t              r_d|v rZi d|d   |j                  d      dd|d   |j                  d      dd|d	   |j                  d
      t        |d	         dd|j                  d      d|j                  d      d|j                  d      dt	        |d         d|d   d|j                  d      d|d   d|j                  d      t	        |d         ndd|j                  d      d|j                  dd      d|j                  d      dt	        |j                  dd            dt	        |j                  dd            d|j                  d      i dt	        |j                  dd            dt	        |j                  dd            d|j                  dd      d t	        |j                  d d            d!|j                  d!      d"t	        |j                  d"d            d#t	        |j                  d#d            d$|j                  d$d      d%|j                  d%d      d&|j                  d&d'      d(t	        |j                  d(d            d)t	        |j                  d)d            d*t	        |j                  d*d            d+t	        |j                  d+d            d,t	        |j                  d,d            d-t	        |j                  d-d            d.t	        |j                  d.d            t	        |j                  d/d            |j                  d0      |j                  d1      |j                  d2      d3S |S )4r   r   r   r9   r   r   r:   r   r   rP   r   r   r   r,  r-  r.  r/  r0  ra   r1  Nr   r   Fr   r2  r   r3  r   r4  r5  r6  r7  r8  r$  r9  r:  r;  r=  r<  r>  r?  r@  rA  r   r%  rB  rC  rD  rE  rF  )rC  rD  rE  rF  )r   r   r   r   r(   r   s     r    r   z'InventoryDetailData.transform_flat_data<  s    dD!n&<2|, HH^42
 }- HH_52 |, HH^4tL122 dhh|42  /!:2   /!:!2"  T/%:!;#2$ '-C(D%2& "488,=#>'2( $x.)2* !JZA[Ag#d+;&<"=mq+2,  /!:-2.  /5!A/20 &txx0E'F122 &s4884I1+M'N324 #C1CQ(G$H526 '1G(H728  TXXoq%A!B92: DHH^Q$? @;2< !$((+;U"C=2> (TXX6Mq-Q)R?2B )$((3K*LC2D #C1CQ(G$HE2F %c$((3G*K&LG2H !$((+;Q"?I2J %dhh/CQ&GK2L '1G(NM2N 0TXX>]_`5a1bO2P ,S:UWX1Y-ZQ2R /DHH=[]^4_0`S2T 'DHH5KQ,O(PU2V s488M1#=>W2X "3txx0A1'E#FY2Z c$((<";<[2\ "$((<";< $ 8(,1G(H&*hh/C&Dc2 2f r   )2r   r   r   r.   r   r4   r6   r   r	   r   r,  r-  r   r(   r0  r   r1  r   r   r   r   r2  r3  r   r4  r5  r6  r7  r8  r$  r9  r:  r;  r=  rT   r>  r?  r@  rA  r   r%  rB  rC  rD  rE  rF  rI   r   r   r   r   r   r    r+  r+    s    $J$#'M8C='$(M8D>( *.OXh'.K %)NHSM($(M8D>(  M4)-#-  c*.(3-. M3L# ND !"3" .2HTN1cNC"&%&)*!3*%&s&() #) !#!KOSJJ"&L(3-& -1(5/0)--  (#7  $7r   r+  c                   <    e Zd ZU ee   ed<   eed<   eed<   eed<   y)InventoryPaginatedDatar   r#   r   r   N)r   r   r   r
   r+  r   r(   r   r   r    rK  rK  x  s    #$$
ILJr   rK  c                   ,    e Zd ZU eed<   eed<   eed<   y)InventoryResponser   r   r   N)r   r   r   r   r   rK  r   r   r   r    rM  rM    r   r   rM  c                   @    e Zd ZU eed<   dZee   ed<   dZee   ed<   y)
VendorInfor/   Nr0   code)	r   r   r   r(   r   r0   r	   r   rP  r   r   r    rO  rO    s#    GD(3-D(3-r   rO  c                   ,    e Zd ZU eed<   dZee   ed<   y)CategoryInfor/   Nr0   r1   r   r   r    rR  rR    r2   r   rR  c                       e Zd ZU eed<   eed<   eed<   dZee	   ed<   dZ
ee   ed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   eed<   y)FastestMovingProductrankr   r   Ncategoryvendorr   total_sold_7dtotal_sold_30dr   ads_7dads_30dr   r   )r   r   r   r(   r   r6   r4   rV  r	   rR  rW  rO  rT   r   r   r   r    rT  rT    s^    
I'+Hh|$+#'FHZ 'MNNr   rT  c                   2    e Zd ZU eed<   ee   ed<   eed<   y)FastestMovingResponser   r   r   N)r   r   r   r   r   r
   rT  r   r   r   r    r]  r]    s    M
#
$$Lr   r]  c                       e Zd ZU eed<   eed<   eed<   dZee	   ed<   dZ
ee   ed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<    eddd	d
dd      ed               Zy)MostStagnantProductrU  r   r   NrV  rW  r   lead_time_demandr   excess_stock_levelr   r   r   r   r   c                 4    ||S t        t        |      d      S )N   roundrT   r   vs     r    round_floatsz MostStagnantProduct.round_floats  s     9HU1Xq!!r   r   r   r   r(   r   r6   r4   rV  r	   rR  rW  rO  rT   r   r   r   rh  r   r   r    r_  r_    s    
I'+Hh|$+#'FHZ 'NN]$6	CWYbiqr"  s"r   r_  c                   2    e Zd ZU eed<   ee   ed<   eed<   y)MostStagnantResponser   r   r   N)r   r   r   r   r   r
   r_  r   r   r   r    rk  rk    s    M
"
##Lr   rk  c                       e Zd ZU eed<   eed<   eed<   dZee	   ed<   dZ
ee   ed<   eed<   eed<   eed	<   eed
<   eed<   eed<    eddd	d
dd      ed               Zy)MostUrgentProductrU  r   r   NrV  rW  r   r   days_of_coverr7  urgency_scorer   r   r   c                 2    |yt        t        |      d      S Nr   rc  rd  rf  s     r    rh  zMostUrgentProduct.round_floats       9U1Xq!!r   ri  r   r   r    rm  rm    s    
I'+Hh|$+#'FHZ '  ]M?D[]ls{|"  }"r   rm  c                   2    e Zd ZU eed<   ee   ed<   eed<   y)MostUrgentResponser   r   r   N)r   r   r   r   r   r
   rm  r   r   r   r    rt  rt    s    M
 
!!Lr   rt  c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   e	ed<    e
d
d      ed               Zy)DemandForecastItemzSingle demand forecast itemr/   r9   r:   r   rP   r   forecast_datetarget_dater  rC   r   r   c                 2    |yt        t        |      d      S rq  rd  rf  s     r    round_forecast_qtyz%DemandForecastItem.round_forecast_qty  rr  r   N)r   r   r   r   r(   r   r   r   rT   r   r   r   rz  r   r   r    rv  rv    s_    %GOO^(3"  4"r   rv  c                   @    e Zd ZU dZee   ed<   eed<   eed<   eed<   y)PaginatedDemandForecastResponsez'Paginated response for demand forecastsr   r#   r   r   N)r   r   r   r   r
   rv  r   r(   r   r   r    r|  r|    s     1
!
""
ILJr   r|  N)Wpydanticr   r   r   r   r   r   typingr	   r
   r   r   modelsr   r   r   r   r   r"   r*   r.   r4   r6   r8   r>   rB   rN   rV   rX   r\   rd   rf   rj   rp   rr   rw   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r!  r#  r'  r)  r+  rK  rM  rO  rR  rT  r]  r_  rk  rm  rt  rv  r|  r   r   r    <module>r     s   @ @ . . 3 3 K K CL"I "Y  I  ) 
9 
) Y 	~ 	N ' '	- 	* ? ?	- 	* $I $	3 	0 6	 6	+ 	( I 	3 	0 Y 	~ 	N I &) i 0y 09 y 	) 	& i (I I 	3 	0 9 & 3I 3lY 	 i "9 
*y * ) I 	 
-Y 
- y 1	 1I p) pfY 	  9 
9  I ") ",9 "	 "* " "*i r   