
    N-0j#                        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 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 d dlmZ d dlZd dlmZ d dlmZ d Z ej<                  ddg      d        Z ej<                  ddg      d        Z  ej<                  ddg      d        Z!d Z"d0dZ# ej<                  ddg      d        Z$ ej<                  ddg      d        Z% ej<                  ddg      d         Z& ej<                  d!dg      d"        Z' ej<                  d#d$g      d%        Z( ej<                  d&d$g      d'        Z) ej<                  d(dg      d)        Z* ej<                  d*dg      d+        Z+ ej<                  d*d$g      d,        Z, ej<                  d*dg      d-        Z- ej<                  d.dg      d/        Z.y)1    )jsonifyrequest)descasc)api_bp)SessionLocal)Ad)MlMetricsDaily)PricingEngine)StockEngine)AdQualityService)MarginCalculatorService)SystemConfigN)ProductCostLog)TinyProductc                 d   	 t               }|j                  | j                  | j                  t	        | dd       t	        | dd       t	        | dd      | j
                  d      S # t        $ rC}t        j                  d| j                   d|        dd	dd
gddg ddg dddcY d }~S d }~ww xY w)Nvideo_idshort_descriptionmanual_video_verifiedF)titlepicturesr   r   r   
attributeszHealth Check Failed for : r   Errou   Erro na análise)scoreissues)r   mediar   )r   labelsections)
r   analyzer   r   getattrr   	Exceptionloggingerrorid)adservicees      C/var/www/hypershopcomercio.com.br/hyper-ai/app/api/endpoints/ads.py_calculate_health_safelyr*      s    
"$XXJ5!(-@$!G%,R1H%%P-- 
  	  

0r!=>#$1C0DE#$3()R8
 	


s   A A# #	B/,8B*$B/*B/z%/ads/<string:mlb_id>/variations/auditGET)methodsc                 `
   t               }ddlm} ddlm} 	 |j                  t              j                  t        j                  | k(        j                         }|j                  |      j                  |j                  | k(        j                         } ||      }|j                  s:t        ddd|r|j                  nd t        |      d      d	f|j                          S |j!                  d
d|        }|j"                  dk7  r^t        ddd|j"                   d|j$                   |r|j                  nd t        |      d      |j"                  f|j                          S |j'                         }|j)                  dg       }	|j)                  dd      }
|j)                  d      }|j)                  d      }|r<|r|j                  nd |r|j*                  nd |r|j,                  nd t/        |dd       dnd |D cg c]&  }|j                  |j*                  |j0                  d( c}|j)                  d      |j)                  d      ||
||j)                  d      t        |j)                  dg             t        |	      dg d}|	D ]o  }g }d\  }}}}d }|j)                  dg       D ]  }|j)                  dd      j3                         }t5        |j)                  dd            }|j7                  |j)                  d       d |        d!|v sd"|v r|}nd#|v sd$|v r|}yd%|v sd&|v sd'|v r|}d(|v sd)|v s|} |j)                  dg       D ](  }|j)                  d      d*k(  s|j)                  d      }* |d+   j7                  |j)                  d      | |j)                  d      d,j9                  |      |j)                  d-      |j)                  d.      |j)                  d      |||||d/d0	       r t        |	      dkD  rt        |      dk(  rd1|d2<   d3|d4<   n[t        |	      dkD  rt        |      dkD  rd5|d2<   d6|d4<   n4t        |	      dk(  r&|r|
rd7|d2<   d8|d4<   n|rd9|d2<   d:|d4<   n
d;|d2<   d<|d4<   |s
d=|d2<   d>|d4<   t        d?d@i|      |j                          S c c}w # t:        $ r^}dd l}t?        j@                  dA|jC                                 t        ddBt5        |      dC      d	fcY d }~|j                          S d }~ww xY w# |j                          w xY w)DNr   )MeliApiService)AdVariation)
db_sessionF	API_ERRORu7   Token do Mercado Livre não disponível no banco local.)successverdictreasonlocal_adlocal_variations_count  r+   z/items/   zErro z na API do ML: 
variationscatalog_listingcatalog_product_idparent_item_id)r%   skur   r;   )r%   r=   attribute_combinationr%   r   seller_custom_fieldr   )r%   r   r;   r:   r<   r?   attributes_countvariations_count)r5   local_variationsml_payload_summaryml_variations_details)NNNNattribute_combinationsname 
value_namer   voltagemvoltageu	   potênciapower
capacidadecapacityvolumecorcolorGTINrD   z, available_quantityprice)voltswattslitersrP   )	variation_idparent_mlb_idr?   rE   rR   rS   r;   gtinkey_attributesML_HAS_VARIATIONS_LOCAL_MISSINGr3   zPMercado Livre returned variations, but ad_variations has zero rows for this MLB.r4   LOCAL_HAS_VARIATIONS_OKu5   Mercado Livre tem variações e a base local também.CATALOG_PRODUCT_SEPARATE_ADu~   Sem variações embutidas, mas é produto de catálogo. ML provavelmente exige um MLB separado para cada opção de catálogo.!POSSIBLE_CHILD_OR_CATALOG_LISTINGut   Sem variações embutidas, mas possui parent_item_id, indicando que este anúncio é 'filho' ou opt-in de catálogo.SIMPLE_AD_NO_VARIATIONSu   Anúncio clássico sem array de variações. Opções de compra (se existirem) estão em anúncios separados criados manualmente.LOCAL_AD_NOT_FOUNDu+   O anúncio não existe na tabela ads local.r2   TzError auditing variations: ERROR)r2   r3   r4   )"r   app.services.meli_apir.   app.models.ad_variationr/   queryr	   filterr%   firstad_idallaccess_tokenr   lencloser   status_codetextjsongetr=   r   r!   r>   lowerstrappendjoinr"   	tracebackr#   r$   
format_exc)mlb_iddbr.   r/   r5   rB   melirespml_dataml_variationsis_catalog_listingr;   r<   vdossierv_attrsv_voltsv_wattsv_litersv_colorrY   arF   valr(   rt   s                             r)   audit_ad_variationsr   *   se   	B43|88B<&&ruu7==?88K0778I8IV8STXXZ ,  !'T,4X[[$+./?+@  h 	
Y ||EWVH#56s"!'"4#3#3"4ODII;O,4X[[$+./?+@  !!"T 	
E ))+  L"5$[[):EB$[[)=> %56 	 '/x{{D(0d,4(..$'.x9Mt'T	
 !%
 )	"*  tt*+*A*A# "* {{4(!++g.'9$6#1(/4I(J%(\2)F%G%(%7	$ ')-
2  	AW3I0WgxTee4b9 Ffb)//1155r23155=/C5 9:$&)t*;sW!T)W_g"d*jD.@HPTDTadV^tmw$#F eeL"- FEE$K6)!%%2E4F ,-44!"t"(().C(D+/99W+='(uu-A'B%%.'(uu-A'B%%'%	$6 !	D }!c*:&;q&@!BGI rGH!#,<(=(A!:GI WGH1$!&8%B	" %e!%H	" %[!%>	" %h!!5GI MGHt

  	
g"*\  V3I4H4H4J3KLM5WAOPRUUU

V
 	
s_   B<R1 %A1R1 'BR1  +R,+DR1 >-R1 ,D/R1 ,R1 1	T:AT=T>T TT T-z/adsc                     t               } 	 ddlm} ddlm} | j                  t              }t        j                  j                  d      }|r"|j                  t        j                  |k(        }t        j                  j                  d      }|r2|j                  t        j                  j                  d| d            }t        j                  j                  d      }|dk(  rY|j                  t        j                  d	k  t        j                  d
k  z        }|j                  t        j                  dk(        }n|dk(  rE|j                  t        j                   d	k        }|j                  t        j                  dk(        }n]|dk(  rX|j                  t        j"                  dk(  t        j"                  d k(  z        }|j                  t        j                  dk(        }t        j                  j                  dd      }t        j                  j                  dd      }t%        t        |t        j&                        }	|dk(  r|j)                  t+        |	            }n|j)                  t-        |	            }t/        t        j                  j                  dd            }
t/        t        j                  j                  dd            }|j1                         }|j3                  |      j5                  |
      j7                         }|D cg c]  }|j8                  s|j8                   }}i }|ra| j                  |      j                  |j8                  j;                  |            j7                         }|D ci c]  }|j8                  | }}|D cg c]  }|j<                   }}i }|ra| j                  |      j                  |j>                  j;                  |            j7                         }|D ci c]  }|j>                  | }}g }|D ]  }tA        |jB                  xs d      }|jD                  r3|jD                  dkD  r$|jD                  |k  rtA        |jD                        }|j                  }d }|j<                  |v r<||j<                     }|jF                  rtA        |jF                        }|jH                  }d }|j8                  r|j8                  |v r||j8                     }tK        ||||      }|d   }|d   }|d   } |d   }!|d   }"|d   }#|d   }$|d   }%|jM                  i d|j<                  d|j                  d |jB                  d!|j                  d"|jN                  d|j                  d#|jP                  d$|jR                  d%|j8                  d&|jT                  d'|jV                  d(|jX                  d)|jZ                  d*|j\                  d+|j^                  d,|j`                  d-|jb                  i d|d|d| d|!d|"d|#d.|jd                  d/|j"                  d0|jf                  d1|jh                  d2|d3|d4|jj                  d5|jl                  d6|$d7|%d8|jn                  |j&                  r|j&                  jq                         nd |jr                  t%        |d9d:      |jt                  |jD                  ||jv                  |jx                  |jz                  |j|                  xs dd;
        t        |||
|d<      | j                          S c c}w c c}w c c}w c c}w # | j                          w xY w)=Nr   ProductFinancialMetricProductForecaststatussearch%filter_typestock_critical      active
low_marginno_salessort_by
updated_at
sort_orderr   r   limit2   offsetfixed_cost_sharereturn_risk_coststorage_costinbound_freight_costdaily_storage_feestorage_risk_costnet_margin_percentnet_margin_valuer%   r   rS   rR   sold_quantity	thumbnail	permalinkr=   listing_type_idshipping_modeis_fulltotal_visitstax_costcommission_costshipping_costads_spend_30d
visits_30d	sales_30dvisits_7d_changesales_7d_changedays_of_stockstock_statusstock_incomingcostmargin_percentmargin_valueis_margin_alertr   F)
r   r   r   original_pricepromotion_priceeffective_pricetarget_marginsuggested_pricestrategy_start_pricecurrent_step_number)totaldatar   r   )Ar   app.models.financialr   app.models.product_forecastr   rd   r	   r   argsro   re   r   r   iliker   rR   r   r   r!   r   order_byr   r   intcountr   r   rh   r=   in_r%   rv   floatrS   r   days_of_coverager   _compute_shared_financialsrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	isoformatr   r   r   r   r   r   r   rk   )&rw   r   r   rd   r   r   r   r   r   sort_columnr   r   r   adsr&   ad_skusmetrics_mapmetricsmad_idsforecast_map	forecastsfresultsr   r   r   pfmetricfin_datafixed_share	risk_costr   r   r   r   r   r   s&                                         r)   get_adsr      sT   	B^?? !!(+LLf!45E!!(+LL!F81!>?E ll&&}5** LL""2"2R"7B<Q<QTU<U!VWELLh!67EL(LL!2!2R!78ELLh!67EJ&LL",,!"38L!MNELLh!67E ,,""9l;\\%%lF;
b'2==9NN3{#34ENN4#45E GLL$$Wb12W\\%%h23ll6"((/335 %(2b26626622hh56==>T>X>X>\>\]d>efjjlG-45155!85K5 #&&B"%%&&1889O9O9S9STZ9[\``bI1:;AAHHaK;L; U	B#BHHM2O!!b&8&81&<ASASVeAe"'(:(:"; ,,MLuu$!"%%(&&$)"*=*=$>M! Fvv"&&K/$RVV,1"fm_]H ##56K !34I#N3L#+,B#C  ()< = ()< =!)*>!?'(:;NN 5bee55 5 %b&;&;	5
  !1!15 "))5 R\\5 R\\5 rvv5 "2#5#55  !1!15 2::5 5$ BKK%5& "2#5#5'5(  !1!1)5*  !1!1+5, #K-5. #I/50 152 '(<354 $%6556 $%675< bmm=5> R\\?5@ #B$7$7A5B "2#5#5C5D  E5F G5H !""3"3I5N O5P !"4Q5R  0S5T "2#5#5U5V <>==bmm557dKK)05Le)T"$"3"3#%#5#5#2!#!1!1#%#5#5(*(?(?')'='='Bi5 5AU	n 	
  	
Y 3 6 ' <B 	
sK   L] ]&]4A] ]] ]2A] ]L] ] ],z/ads/<ad_id>c                 	   t               }	 ddlm} |j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j                          S t        |      }t               }|j                  xs ddz  }|j                  t              j                  t        j                  | k(        j                  t        j                   j#                               j%                  d      j'                         }t)        d |D              }g }	|D ]N  }
|	j+                  |
j                   j-                         |
j.                  |
j0                  |
j2                  d	       P |j4                  }d }|j                  |      j                  |j6                  | k(        j                         }|r-|j8                  rt;        |j8                        }|j<                  }t        i d
|j                  d|j>                  d|j@                  d|jB                  d|jD                  d|jF                  d|jH                  d|jJ                  d|jL                  r|jL                  dkD  r|jL                  n|d|jN                  d|jP                  d|	d|jR                  |jT                  |jV                  |dd|jY                  |       |j[                  ||      t]        |      dd|j^                  d|j`                  d|jb                  i d|jd                  d|j                  d|jR                  d |d!|d"|jV                  d#|jT                  d$|jf                  d%|jh                  d&tk        |||'      d(|jl                  d)to        |d)d*      d+to        |d+d       d,|jp                  d-|jr                  d.|jt                  d/|jv                  |jx                  |jz                  xs d|jt                  r]|jt                  dkD  rN|j}                  | t;        |j@                  xs d      t;        |jv                  xs |j@                  d0z              nd d1      |j                          S # t~        $ rF}dd l@}|j                          t        dt        |      i      d2fcY d }~|j                          S d }~ww xY w# |j                          w xY w)3Nr   r   r$   Ad not found  g      >@  c              3   <   K   | ]  }|j                   xs d   yw)r   N)visits).0r   s     r)   	<genexpr>z!get_ad_details.<locals>.<genexpr>f  s      @1Q @s   )dater   salesrevenuer%   r   rS   r   r   rR   r   r   r   r   r=   historyr   )r   r   r   r   intelligence)pricingstockhealthr   r   r   r   r   r   r   r   r   r   r   r   
financials)r   r   r   Fr   r   r   r   r   g?)r   r   strategy_datar7   )Cr   r   r   rd   r	   re   r%   rf   r   rk   r   r   r   r
   item_idr   r   r   r   rh   sumrr   r   r   	sales_qtysales_revenuer   rv   r   r   r   r   rS   r   r   rR   r   r   r   r   r=   r   r   r   calculate_elasticityanalyze_stockr*   r   r   r   r   r   r   _calculate_detailed_financialsr   r!   r   r   r   r   r   r   get_strategy_datar"   rt   	print_excrq   )rg   rw   r   r&   pricing_enginestock_enginevelocityr   fresh_total_visitsr   r   r   r   r   r(   rt   s                   r)   get_ad_detailsr   Q  sA   	Bj?XXb\  %0668G^45s:J 	
E 'r*"} LL%A- ((>*11.2H2HE2QR[[\j\o\o\s\s\uv||  ~A  B  F  F  H ! @ @@ 	ANN((*((?? 	 ((XXo&--o.D.D.MNTTV"" %b&9&9 :??L =
"%%=
RXX=
 RXX=
 bii	=

 =
 !""7"7=
 b//=
 R--=
 r2??UVCVBOO\n=
 =
 266=
 w=
  mm$&$7$7#%#5#5!.	=
, )>>uE%33BA226-=
: BGG;=
< b//==
> BOO?=
@ r11A=
B C=
D "--E=
F ]G=
H LI=
J r11K=
L  3 3M=
P R--Q=
R rzzS=
V 8R}]W=
Z [=
\ $WR1H%%P]=
^ J5_=
` b//a=
b r11c=
d R--e=
f r11g=
h %'$;$;#%#9#9#>Q !!b&6&6&:	 ,==bhhm!$b((;BHHtO< AEy=
 =F 	
  /Q()3..

/
 	
s7   AR 6PR 	S%+S 
S%S(  S%%S( (S:c                    t        | j                  xs d      }t        | j                  xs d      }t        | j                  xs d      }t        | j                  xs d      }t        | j
                  xs d      }t        | j                  xs d      }	t        | j                  xs d      }
t        | j                  xs d      }t        |	dz  |
dz  |dz  g      }d}d}|d   dk  r|d   dk  r|d   d	k  rd}d
}n>|d   dk  r|d   dk  r|d   dk  rd}d}n!|d   dk  r|d   dk  r|d   dk  rd}d}nd}d}d}d}d}d}|}|}|rt        |j                  xs d      }|j                  xs d}t        |j                  xs d      }||z  }t        |j                  xs |      }t        |j                  xs |      }t        |j                  xs d      }t        |j                   xs d      }|dkD  r	 t        |xs d      }|dz  }||z  |z   }|dkD  r||dz
  |dz  z  z  }||z   |z   |z   |z   |z   |z   |z   }||z
  }|dkD  r||z  dz  nd}||||||||||||||dS )z
    Centralized logic for financial costs and margin calculation.
    Used by both get_ads (List) and get_ad_details (Detail).
    r   
   y&1|?      ?         r      g?3   $      g9v?g      ?F   <   gMb?g      @g1Zd?g      "@        Q?      4@   x      d   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   	length_mmwidth_mm	height_mmsortedcalculated_fixed_cost_sharereturn_rate_90davg_return_costr   r   r   r   )r&   r   r   r   r   
commissionshippingtax	ads_spendl_mmw_mmh_mmdims	daily_feeinbound_estr   return_riskstorage_totalstorage_riskinbound_finaldaily_final	risk_rater  
db_storage	curr_daysavg_days_stock
total_costr   r   s                                r)   r   r     s    ADr)).Q/JR%%*+H
 q
!Cb&&+!,I "#D!"D"#D47DGT"W-.D IKAw"}aB47b=		aB47b=T!W]		aB47b=T!W]		 KKMLMKF>>C!D **2d	 6 6 >$?/1 f99H[IF44A	BV55:; 6..3!4
>  m)r*I]N >1]BM3S[1_== 			 		 			
 		 		 		  #Z/L?NQR?Rl_4s:XYN %!"''% -()(,*#     c                    ddl m} d}|j                  rE| j                  |      j	                  |j                  |j                  k(        j                         }t        |j                  xs d      }|j                  r3|j                  dkD  r$|j                  |k  rt        |j                        }||n|j                  }t        ||||      S )uq   
    Calcula financials incluindo custos fixos e risco de devolução.
    Wraps _compute_shared_financials.
    r   r   N)r   r   r=   rd   re   rf   r   rS   r   r   r   )rw   r&   r   r   r   r   
final_dayss          r)   r   r   2  s    
 < F	vv01889O9S9SWYW]W]9]^ddf BHHM*O	b00149K9Ko9] 2 23"/";AQAQJ%b&*oNNr/  z/ads/<ad_id>/verify-videoPATCHc                    t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j                          S d|_        |j                          t        ddd      |j                          S # t        $ rB}|j                          t        dt        |      i      dfcY d }~|j                          S d }~ww xY w# |j                          w xY w)Nr$   r   r   TzVideo verified manuallyr2   messager7   r   rd   r	   re   r%   rf   r   rk   r   commitr"   rollbackrq   rg   rw   r&   r(   s       r)   verify_ad_video_manualr:  F  s    .BXXb\  %0668G^45s: 	
 $( 
		44MNO
 	
	  /
Q()3..

	/ 	
6   AB% 0$B% %	C0.'C+C0C3 +C00C3 3DDELETEc                    t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j                          S d|_        |j                          t        ddd      |j                          S # t        $ rB}|j                          t        dt        |      i      dfcY d }~|j                          S d }~ww xY w# |j                          w xY w)	Nr$   r   r   FTzVideo verification removedr4  r7   r6  r9  s       r)   unverify_ad_video_manualr>  X  s    .BXXb\  %0668G^45s: 	
 $) 
		44PQR
 	
	  /
Q()3..

	/ 	
r;  z/ads/<ad_id>/target-marginc           	      j
   t               }	 t        j                  }d|vrt        ddi      df|j	                          S |j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j	                          S 	 t        |d         }||_        |dk(  rd|_        d|_        d |_        d	|v r|d	   r	 t        |d	         }|j                   xs |j                  dk(  xr |dkD  }|j!                  d
d      }|r |j"                  |_        d|_        ||_        n	|r||_        |j%                          t        |j                  |j                  |j                  |j                  |j                  |j&                  d      |j	                          S |j                  t(              j                  t(        j*                  dk(        j                         }|r!|j,                  rt        |j,                        nd}	|j                  t(              j                  t(        j*                  dk(        j                         }
|
r!|
j,                  rt        |
j,                        nd}d}|j.                  r\|j                  t(              j                  t(        j*                  dk(        j                         }|rt        |j,                        nd}ddlm} |j                  |      j                  |j4                  |j4                  k(        j                         }d}d}|r|t        |j6                  xs d      z  }|j8                  xs d}t        |j:                  xs d      }|||z  z  }t        |j<                  xs d      }t        |j>                  xs d      }t        |j@                  xs d      }|dz  }||z  }|}||z  }|t        |jB                  xs d      z  }||z   }||z   }|dkD  r|}tE               }|jG                  |d |	||       |j%                          t        |j                  |j                  |j                  |j&                  d      |j	                          S # t        $ r" t        ddi      dfcY |j	                          S w xY w# t        $ r Y w xY w# tH        $ rB}|jK                          t        dtM        |      i      dfcY d }~|j	                          S d }~ww xY w# |j	                          w xY w)Nr   r$   zMissing target_marginr   r   r   r   zInvalid target_marginr   force_updateF)r%   r   r   r   r   r   aliquota_simples      )@fixed_packaging_costr  avg_inbound_costr   r  r  r  r  r  r  tiny_producttax_rate
fixed_costinbound_cost)r%   r   r   r   r7   )'r   r   rn   r   rk   rd   r	   re   r%   rf   r   r   r   r   r   
ValueErrorro   rS   r7  r   r   keyvaluer   r   r   r=   r  r  r  r   r   r   r   r   calculate_marginr"   r8  rq   )rg   rw   r   r&   r   new_suggestedis_new_strategyr@  
tax_configrG  fixed_pkg_configrH  rI  
sc_inboundr   financial_metricextra_fixed_costextra_inbound_costr*  r  r#  r$  
days_stockr-  calc_storagetotal_fixed_costtotal_inbound_costcalc_servicer(   s                                r)   update_target_marginr[  j  s   	BB||$&G%<=>C~ 	
{ XXb\  %0668G^45s:v 	
q	E_-.C"B ax*+')*&%)" $.?)@ %d+<&= > (*'>'>#>#^"BYBY]^B^"kdgjkdk#xx>".0hhB+-.B*)6B&!)6B& 		%%%'%5%5')'9'9,.,C,C+-+A+A&(&7&7  j 	
U XXl+22<3C3CGY3YZ``b
.8Z=M=M5))*SW88L1889I9IMc9cdjjl6FK[KaKaU+112gj
::((<0778H8HL^8^_eegZ7AE*"2"23s\ 	@88$:;BBCYC]C]acagagCghnnp &6&R&R&WVW XX )88@DI#$4$D$D$LMO_!<= .@@IEJI 0 E E MNKr//526J'!^N%6L "- , &6&H&H&MA NN &(88),>>!!3.0%%bth[k  {M%  	N
		%%--!11 //	
  	
]  	EW&=>?DDZ 	
]	EB  R  /
Q()3..

	/ 	
s   "S AS $/R 	S CS ;KS R?,S >R??S 	SS SS 	T'TTT  TT   T2z/ads/<ad_id>/logsc                 D   ddl m} ddlm}m} t               }	 d|  d}|j                  |      j                   ||j                  j                  |      |j                  j                  |                  j                   ||j                              j                  d      j                         }t        |D cg c]`  }|j                   |j                  j#                         |j$                  |j&                  |j                  |j                  |j(                  db c}      |j+                          S c c}w # t,        $ rB}t.        j1                  d|  d|        t        g       d	fcY d
}~|j+                          S d
}~ww xY w# |j+                          w xY w)u   
    Retorna logs do sistema relacionados a este anúncio.
    Busca por logs onde o ad_id aparece na mensagem ou nos detalhes.
    r   )	SystemLog)or_r   r   r   )r%   	timestamplevelmoduler5  detailsr   zError fetching logs for ad r   r7   N)app.models.system_logr]  
sqlalchemyr^  r   r   rd   re   r5  r   rb  r   r_  r   rh   r   r%   r   r`  ra  r   rk   r"   loggerr$   )	rg   r]  r^  r   rw   search_termlogslogr(   s	            r)   get_ad_logsri    sV    0$	B %lxx	"))!!''4!!''4

 (4	++,
-eeBi 	    &&002YYjj{{{{jj
   	
   25'A3?@r{C

	  	
sC   B$D? >A%D:#D? :D? ?	F
'F/F
0F F

F Fz/ads/<ad_id>/execute-price-stepPOSTc                 R   ddl m} t        j                         xs i }|j	                  d      }|!	 t        |      }|dk  rt        ddi      dfS 	  || |      }|j	                  d      rt        |      S t        |      d	fS # t        t        f$ r t        ddi      dfcY S w xY w)
z
    Manually execute a pricing step for a specific ad.
    
    Body (optional):
        target_price: float - If provided, jumps directly to this price.
                              If not, calculates the next step automatically.
    r   )execute_single_ad_steptarget_pricer$   ztarget_price must be positiver   zInvalid target_pricer2   r7   )	app.jobs.pricing_jobrl  r   get_jsonro   r   r   rJ  	TypeError)rg   rl  r   rm  results        r)   execute_price_steprr    s     <#D88N+L 	C .Lq )HIJCOO !
 $E<8Fzz)vv## I& 	CG%;<=sBB	Cs   B B&%B&z/ads/<ad_id>/pause-strategyc                    t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j                          S t        j                         xs i }|j                  dd      }|r|j                  |_        d|_        d}n+t        |d      r|j                  r|j                  |_        d	}|j                          t        d||d
      |j                          S # t        $ r]}|j!                          t"        j%                  d|  d|        t        dt'        |      i      dfcY d}~|j                          S d}~ww xY w# |j                          w xY w)z~
    Pause or resume the pricing strategy for an ad.
    
    Body:
        paused: bool - True to pause, False to resume
    r$   r   r   pausedTr   zStrategy pausedpaused_target_marginzStrategy resumed)r2   r5  rt  zError pausing strategy for r   r7   N)r   rd   r	   re   r%   rf   r   rk   r   ro  ro   r   ru  hasattrr7  r"   r8  re  r$   rq   )rg   rw   r&   r   rt  r5  r(   s          r)   pause_strategyrw  6  sS    
B!XXb\  %0668G^45s:< 	
9 !'R(D) &(&6&6B# B'G r12r7N7N#%#:#: (G
		
  	
  /
25'A3?@Q()3..

/
 	
s8   AD 0BD 	E7AE2E7E: 2E77E: :Fz/ads/<ad_id>/price-historyc                    ddl m} t               }	 |j                  |      j	                  |j
                  | k(        j                  |j                  j                               j                  d      j                         }t        |D cg c]  }|j                  t        |j                        t        |j                        |j                   rt        |j                         nd|j"                  |j$                  |j&                  |j                  r|j                  j)                         nd|j*                  |j,                  d
 c}      |j/                          S c c}w # t0        $ rB}t2        j5                  d|  d|        t        g       dfcY d}~|j/                          S d}~ww xY w# |j/                          w xY w)	z5
    Get the price adjustment history for an ad.
    r   )PriceAdjustmentLog   N)
r%   	old_price	new_pricerm  step_numbertotal_stepstrigger_typeexecuted_atr   error_messagez!Error fetching price history for r   r7   )app.models.pricing_logry  r   rd   re   rg   r   r  r   r   rh   r   r%   r   r{  r|  rm  r}  r~  r  r   r   r  rk   r"   re  r$   )rg   ry  rw   rg  rh  r(   s         r)   get_price_historyr  c  sb   
 :	Bxx*+22$$-

(%11668
9%%)CCE 	    &&s}}-s}}-7:7G7GE#"2"23T????,,:=//3??446tjj ..
    	
!   8r!EFr{C

	  	
sC   A:E% B=E 	E%  E% %	F0.'F+F0F3 +F00F3 3Gz/ads/<ad_id>/promotionsc           	      >   ddl m} t               }	  ||      }|j                  |       }|j	                  |       }t        |j                  dd      |j                  dg       |j                  dg       |j                  d      xs |j                  d      d      |j                          S # t        $ rP}t        j                  d	|  d
|        t        dg g t        |      d      dfcY d}~|j                          S d}~ww xY w# |j                          w xY w)zE
    Get promotions for an ad - both active and available deals.
    r   PromoServicehas_promotionsF
promotionsdealsr$   )r  current_promotionsavailable_dealsr$   zError fetching promotions for r   r7   N)app.services.promo_servicer  r   get_item_promotionsget_available_dealsr   ro   rk   r"   re  r$   rq   )rg   r  rw   promo_servicecurrent	availabler(   s          r)   get_ad_promotionsr    s   
 8	B$R(  33E: "55e<	%kk*:EB")++lB"?(}}Wb9[[)CY]]7-C	
  	
  5eWBqcBC#"$!V	
 
  	 	
 	
s0   BB. .	D75D,D-D
 DD
 
Dc                    ddl m} t               }	 t        j                         xs i }|j                  d      }|st        ddi      df|j                          S 	 t        |      }t        |j                  dd	            } ||      }|j                  | ||      }|j                  d
      rt        |      |j                          S t        |      df|j                          S # t        t        f$ r" t        ddi      dfcY |j                          S w xY w# t        $ rN}t        j                  d|  d|        t        dt!        |      d      dfcY d}~|j                          S d}~ww xY w# |j                          w xY w)z
    Apply a PRICE_DISCOUNT promotion to an ad.
    
    Body:
        deal_price: float - The discounted price
        days: int - Duration (max 14, default 14)
    r   r  
deal_pricer$   zdeal_price is requiredr   zInvalid deal_pricedays   r2   zError applying promotion to r   Fr2   r$   r7   N)r  r  r   r   ro  ro   r   rk   r   rJ  rp  r   apply_promotionr"   re  r$   rq   )	rg   r  rw   r   r  r  r  rq  r(   s	            r)   apply_ad_promotionr    se    8	B!'RXXl+
G%=>?D( 	
%	Az*J 488FB'($R(..uj$G::i 6? 	
 6?C'
 	
! I& 	AG%9:;S@@ 	
!	A  A3E7"QC@A53q6:;S@@

	A 	
sZ   9D C' (AD 
D 'DD DD 	E2$3E-E2E5 -E22E5 5Fc                    ddl m} t               }	  ||      }|j                  |       }|j	                  d      rt        |      |j                          S t        |      df|j                          S # t        $ rN}t        j                  d|  d|        t        dt        |      d      d	fcY d
}~|j                          S d
}~ww xY w# |j                          w xY w)z<
    Remove active PRICE_DISCOUNT promotion from an ad.
    r   r  r2   r   zError removing promotion from r   Fr  r7   N)r  r  r   remove_promotionro   r   rk   r"   re  r$   rq   )rg   r  rw   r  rq  r(   s         r)   remove_ad_promotionr    s    
 8	B$R(//6::i 6? 	
 6?C'
 	
	  A5eWBqcBC53q6:;S@@

	A 	
s5   4A4 A4 4	C=3C0C1C CC C z/ads/<ad_id>/costc                    t               }	 t        j                  }d|vrt        ddi      df|j	                          S t        |d         }|j                  t              j                  t        j                  | k(        j                         }|st        ddi      df|j	                          S |j                  }||_        t        |j                  |j                  ||dd	      }|j                  |       |j                  rV|j                  t              j                  t        j                  |j                  k(        j                         }|r||_        |j                  t               j                  t         j"                  d
k(        j                         }|r!|j$                  rt        |j$                        nd}	|j                  t               j                  t         j"                  dk(        j                         }
|
r!|
j$                  rt        |
j$                        nd}d}|j&                  r\|j                  t               j                  t         j"                  dk(        j                         }|rt        |j$                        nd}t)               }|j+                  |d |	||       |j-                          t        d||j.                  |j0                  d      |j	                          S # t2        $ rB}|j5                          t        dt7        |      i      dfcY d }~|j	                          S d }~ww xY w# |j	                          w xY w)Nr   r$   zMissing costr   r   r   manual_dashboarduser)r=   
ml_item_idold_costnew_costsource
changed_byrA  rB  rC  r  rD  rE  T)r2   r  r   r   r7   )r   r   rn   r   rk   r   rd   r	   re   r%   rf   r   r   r=   addr   r   rK  rL  r   r   rM  r7  r   r   r"   r8  rq   )rg   rw   r   r  r&   r  rh  	tiny_prodrP  rG  rQ  rH  rI  rR  rZ  r(   s                   r)   update_ad_costr    s   	B8||G^45s:j 	
g f&XXb\  %0668G^45s:` 	
] 77 uu%
 	s 66-44[__5NOUUWI!)	 XXl+22<3C3CGY3YZ``b
.8Z=M=M5))*SW88L1889I9IMc9cdjjl6FK[KaKaU+112gj
::((<0778H8HL^8^_eegZ7AE*"2"23s\.0%%bth[e  uA%  	B
		  //OO	
  	
	  /
Q()3..

	/ 	
s<   "K: A!K: 1H8K: :	M'M *M+M  MM M)N)/flaskr   r   rd  r   r   app.apir   app.core.databaser   app.models.adr	   app.models.ml_metrics_dailyr
   app.services.pricing_enginer   app.services.stock_enginer   app.services.ad_quality_servicer   app.services.margin_calculatorr   app.models.system_configr   r#   app.models.cost_historyr   app.models.tiny_productr   r*   router   r   r   r   r   r:  r>  r[  ri  rr  rw  r  r  r  r  r   r/  r)   <module>r     sL   "    *  6 5 1 1 < B 1  2 /
. 5wG@ H@F fug&` '`D nug.l /l\pdO( )G9= >" )H:> ?" *WI>D ?DL !E73" 4"J /&B$ C$< +fX>) ?)X *UG< => '%9 :D '&:$ ;$N '(< =* !G95: 6:r/  