
    RRj^)                         d Z ddl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 ddlmZ ddlmZmZ dd	lmZ dd
lmZ  e ed            ZdZ G d d      Zy)uD   Painel read-only que separa margem operacional de pressão de caixa.    )datetime	timedeltatimezone)func)Session)Ad)	FixedCost)MlAdsItemDaily)MlOrderMlOrderItem)is_debt_service)FinancialService)hours)paidshipped	deliveredc                       e Zd ZdZdefdZddedefdZdefdZ	dedefdZ
ed	edefd
       Zedededefd       Zy)CashflowPanelServiceuD   Monta uma fotografia auditável, sem gravar dados no banco ou no ML.dbc                     || _         y )N)r   )selfr   s     Q/var/www/hypershopcomercio.com.br/hyper-ai/app/services/cashflow_panel_service.py__init__zCashflowPanelService.__init__   s	        daysreturnc                 ~   t        dt        t        |      d            }| j                         }t	        | j
                        j                  |      }| j
                  j                  t              j                  t        j                  dk(        j                         }|D cg c]  }t        |j                        s| }}|D cg c]  }t        |j                        r| }}| j                  ||      }| j                  ||      }	g }
dx}x}}dx}}d}d }|D ]  }|d   }t        d |d   D              }|	j!                  |d      }|j!                  |d      }t#        |d	   xs d
      }t#        |d   xs d
      }||z
  }||z  }||z  }||z  }||z  }||z  }t#        |d   xs d
      }||k  r|}|}|
j%                  |t'        |d      t'        |d      t'        |d      t'        |d      t'        |d      t'        |d      t'        |d      |d   d	        ||z
  |z
  }|d
kD  r||z  nd }t)        |d         }|j%                  d       |s|j%                  d       |d
k  r"|j%                  dt+        |      dd| d       t-        j.                  t0              j3                         ||t'        |d      t'        |d      t'        |d      t'        |d      t'        |d      t'        |d      t'        ||z
  d      t'        |d      |t'        t+        |      d      |t'        |d      nd | j5                  |||      dt'        t        d |D              d      |D cg c]  }| j7                  |       c}t'        t        d |D              d      d|
g d|ddS c c}w c c}w c c}w )N   Z   r   T        datec              3      K   | ]6  }|j                  d       dk(  r t        |j                  d      xs d       8 yw)typepurchasevaluer   N)getfloat).0details     r   	<genexpr>z1CashflowPanelService.get_panel.<locals>.<genexpr>-   s<      ::f%3 fjj).Q/s   <>detailsinflowr   outflowaccumulated   )	r#   r.   operating_fixeddebt_service	purchasesr/   
net_changeaccumulated_changer-   warningsu   O fluxo usa a projeção de recebimento já existente (75% das vendas previstas). Ele mostra variação de caixa; sem saldo bancário inicial não confirma saldo final.u   Nenhuma obrigação de caixa foi classificada como 'Serviço da dívida'. Cadastre ou recategorize as parcelas para medir a cobertura.u'   Há um buraco de caixa projetado de R$ .2fz em uZ   . A cobertura total do período não garante que haverá saldo na data de cada vencimento.)projected_inflowprojected_outflowoperating_fixed_duedebt_service_duepurchase_commitmentscash_before_debtprojected_net_changeminimum_accumulated_changeminimum_accumulated_daterequired_starting_cashdebt_coverage_ratiostatusc              3   N   K   | ]  }t        |j                  xs d         ywr   Nr)   amountr*   costs     r   r,   z1CashflowPanelService.get_panel.<locals>.<genexpr>w   s     1ad%8Hq2I1a   #%c              3   N   K   | ]  }t        |j                  xs d         ywrF   rG   rI   s     r   r,   z1CashflowPanelService.get_panel.<locals>.<genexpr>y   s     4kQUU4;;;K!5L4krK   )monthly_debt_service
debt_itemsoperating_fixed_monthly)uF   ml_orders + ml_order_items: receita e margem de contribuição por SKUu*   ads: margem de contribuição atual do SKUz,ml_ads_item_daily: gasto real de Product Adsu?   financial_costs: vencimentos operacionais e serviço da dívidaz2purchase_orders: compras abertas por data esperada)sourcesr7   )generated_atperiod_daysmargincashobligationstimelineaudit)maxminint_margin_snapshotr   r   get_cash_flow_projectionqueryr	   filteractiveallr   category_scheduled_costssumr(   r)   appendroundlistabsr   nowTZ_BR	isoformat_cash_status_cost_to_dict)r   r   rS   cashflowfixed_costsrJ   
debt_costsoperational_costsdebt_by_dateoperational_by_daterV   total_inflowtotal_outflowr=   total_operating_fixedtotal_debt_serviceminimum_accumulatedrA   itemr#   r4   r2   r3   r.   r/   r5   r0   r>   rC   r7   s                                 r   	get_panelzCashflowPanelService.get_panel   s'   1c#d)R()&&(#DGG,EE4EPggmmI.55i6F6F$6NOSSU'2Utodmm6TdU
U.9`dQUQ^Q^A_T``,,Z>"334EtL>AAA}';588 2!#'   	D<D "9o I
 255dC@O'++D#6L4>.Q/FDO0q1G')JF"LW$M I- !_4!,.] 3 8q9K00&1#+/(OO*#(!#< %lA 6"9a0 !,#J2&+K&;	?
 
- 	D (*??BVV5G!5K11QU 	 z*+e	
 OOO "OO9#>Q:RSV9WW[+, -<< %LL/99;$),$:%*=!%<',-BA'F$)*<a$@(-.BA(F$)*:A$>(-l].JA(N.34G.K,D*/4G0H!*LH[Hgu-@!'Dmq++');=P" ).c1aV`1a.acd(eDNODt11$7O+04kYj4k1kmn+o
 ! %	5$
 $	
E V`n Ps   &N0N0N5&N5/N:c                    t        j                         t        d      z
  }| j                  j	                  t
        j                  t
        j                  t
        j                        j                  t        t        j                  t
        j                  k(        j                  t        j                  |k\  t        j                  j                  t                     j#                         }i }| j                  j	                  t$              j                  t$        j                  j'                  d       t$        j(                  j'                  d             j#                         D ]1  }|j+                  |j                  t-        |j(                               3 dx}x}x}}|D ]m  }	t-        |	j                  xs d      t-        |	j                  xs d      z  }
||
z  }|j/                  |	j                        }|||
z  }^||
z  }||
|z  dz  z  }o t        j0                  t2              j5                         }t-        | j                  j	                  t7        j8                  t:        j<                              j                  t:        j4                  |t        d      z
  k\  t:        j4                  |k        j?                         xs d      }t9        d | j                  j	                  t@              j                  t@        jB                  dk(        j#                         D              }||z
  |z
  }|r||z  dz  nd}g }|s|jE                  d	       |r|jE                  d
|dd       dtG        |d      tG        |d      tG        |d      tG        |d      tG        |d      |rtG        ||z  dz  d      nd tG        |d      tG        |d      tG        |d      |r|sd|dS |rd|dS d|dS )N   r!   r"   r   g      Y@c              3   x   K   | ]2  }t        |j                        st        |j                  xs d        4 ywrF   )r   ra   r)   rH   rI   s     r   r,   z8CashflowPanelService._margin_snapshot.<locals>.<genexpr>   s2      &
"4==1 $++"#&
s   8:Td   uN   Sem vendas elegíveis nos últimos 30 dias para calcular a margem operacional.zR$ r8   uf    de receita não possui margem de contribuição vinculada ao SKU; o resultado operacional é parcial.r1   completepartialunavailable)rR   revenuecontribution	ads_spendr2   operating_profitnet_margin_pctcoverage_pctcovered_revenueuncovered_revenuerD   r7   )$r   utcnowr   r   r]   r   skuquantity
unit_pricejoinr   ml_order_idr^   date_createdrD   in_OPERATING_ORDER_STATUSESr`   r   isnotmargin_percent
setdefaultr)   r(   rh   ri   r#   r   rc   r
   rJ   scalarr	   r_   rd   re   )r   cutofforder_linesmargin_by_skuadr   r   r   r   lineline_revenue
margin_pcttoday_brr   rO   r   r   r7   s                     r   r[   z%CashflowPanelService._margin_snapshot   s   "YB%77ggmmOO  ""
 $w++{/F/FF
G  F*NN78I
 #% 	 ''--#**266<<+=r?P?P?V?VW[?\]aac 	GB$$RVVU23D3D-EF	G HKJJ,J3D 	>D !3!4uT__=QPQ7RRL|#G&**4884J!!\1!|+OL:5==L	> <<&++-$''--1D1D(EFMM8iR.@#@@8+
 &( 	 #& &
i077	8H8HD8PQUUW&
 #

 ()36MM:A036sOOlmOO', -6 6 Wa(!,2y!,$%<a@ %&6 :LSe$4w$>$DaHY]!,2$_a8!&'8!!<$+4Ej 
 	
 Y`9 
 	
 fs 
 	
r   c                    t        j                         j                         }|t        |      z   }i }|D ]  }t	        |j
                  xs d      }|}||k  s$|j                  |k(  r?|j                         }	|j                  |	d      t        |j                  xs d      z   ||	<   |t        d      z  }||k  rc |S )Nr!      r"   r   )r   r   r#   r   rZ   day_of_monthdayrj   r(   r)   rH   )
r   costsr   todayend_date	scheduledrJ   r   currentkeys
             r   rb   z%CashflowPanelService._scheduled_costs   s    !&&(9$//	 	-Dd'',1-CGX%;;#%!++-C%.]]3%<uT[[EUTU?V%VIcN9!,,	 X%	- r   rJ   c                     | j                   | j                  t        t        | j                  xs d      d      | j
                  | j                  dS )Nr   r1   )idnamerH   r   ra   )r   r   re   r)   rH   r   ra   )rJ   s    r   rl   z"CashflowPanelService._cost_to_dict   sD     ''IIE$++"23Q7 --
 	
r   r<   rw   c                 ,    |dk  ry|dk  ry| | dk\  ryy)Nr   not_configured
timing_gapr   covered_in_projectionpressure_in_projection )rC   r<   rw   s      r   rk   z!CashflowPanelService._cash_status   s,    q #"*/Ba/G*'r   N)r{   )__name__
__module____qualname____doc__r   r   rZ   dictry   r[   rb   staticmethodr	   rl   r)   strrk   r   r   r   r   r      s    N7 l
c l
4 l
\>
$ >
@C D  
I 
$ 
 
 (E (X] (be ( (r   r   N)r   r   r   r   
sqlalchemyr   sqlalchemy.ormr   app.models.adr   app.models.financialr	   app.models.ml_ads_item_dailyr
   app.models.ml_orderr   r   %app.services.financial_classificationr   app.services.financial_servicer   ri   r   r   r   r   r   <module>r      sI    J 2 2  "  * 7 4 A ; 	$%; U( U(r   