
    |2j\                         d dl Z d dlZd dlZd dlZd dl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  G d d	      Zy)
    N)Session)or_)SessionLocal)NfeItem	NfeImport)Ad)TinyProductc                       e Zd Zededefd       Zedefd       Zedefd       Zedefd       Z	ede
d	ed
ededededefd       Zy)NfeLinkerServicetextreturnc                     | sydj                  d t        j                  d|       D              } | j                         } t	        j
                  dd|       } dj                  | j                               } | S )N c              3   R   K   | ]  }t        j                  |      d k7  s| ! yw)MnN)unicodedatacategory).0cs     M/var/www/hypershopcomercio.com.br/hyper-ai/app/services/nfe_linker_service.py	<genexpr>z2NfeLinkerService.normalize_text.<locals>.<genexpr>   s$     hQH\H\]^H_cgHgqhs   ''NFDz[^A-Z0-9\sVWL] )joinr   	normalizeupperresubsplit)r   s    r   normalize_textzNfeLinkerService.normalize_text   s`    wwh+"7"7t"Dhhzz|vv'd3xx

%    c                    | s&t               t               t               t               fS | j                         } t        d t        j                  d|       D              }t        d t        j                  d|       D              }t        d t        j                  d|       D              }t               }dD ].  }t        j                  d| d|       s|j                  |       0 ||||fS )	Nc              3   &   K   | ]	  }| d   yw)VN )r   vs     r   r   z;NfeLinkerService.extract_critical_tokens.<locals>.<genexpr>!   s     SqcGS   z\b(110|127|220)\s*[Vv]\bc              3   &   K   | ]	  }| d   yw)WNr%   )r   ws     r   r   z;NfeLinkerService.extract_critical_tokens.<locals>.<genexpr>"   s     KqcGKr'   z\b(\d+)\s*[Ww]\bc              3   &   K   | ]	  }| d   yw)LNr%   )r   ls     r   r   z;NfeLinkerService.extract_critical_tokens.<locals>.<genexpr>#   s     Ls!WLr'   z\b(\d+)\s*[Ll]\b)	PRETOBRANCOVERMELHOAZULAMARELOVERDECINZAPRATAINOXz\b)setr   r   findallsearchadd)r   voltswattsliterscolorsr   s         r   extract_critical_tokensz(NfeLinkerService.extract_critical_tokens   s    CE35#%66zz|SRZZ0KT%RSSKRZZ0CT%JKKLbjj1Dd&KLLf 	;AyyBqcd+VZZ]	;eVV++r!   nfe_idc           
      H	   t               }	 |j                  t              j                  t        j                  | k(        j                         }|sddi|j                          S |j                  t              j                  t        j                  | k(  t        j                  j                  ddg            j                         }t        |      dddg d}|j                  t        j                  t        j                  t        j                        j                         }|j                  t         j                  t         j                  t         j"                        j                         }ddlm} |j                  |j                  |j(                  |j                  |j*                        j                         }|D 	ch c]  }	|	j(                  s|	j(                   }
}	i }|D ]=  }	|	j(                  |vrg ||	j(                  <   ||	j(                     j-                  |	       ? |D ]  }t.        j1                  |||||||
      }|s;|dxx   d	z  cc<   |d
   j-                  |j2                  |j4                  ddd       \|j7                  d d       |d   }d}t        |      d	kD  r>|d	   }|d   |d   z
  dk  r+|j9                  d      |j9                  d      k7  rd}nd|d<   |r?|dxx   d	z  cc<   |d
   j-                  |j2                  |j4                  d|dd d       |d   dk(  r|dxx   d	z  cc<   |d   |_        |j9                  d      |_        |j9                  d      |_        |j9                  d       |_         d|_	        |d   |_!        |d   |_"        |d
   j-                  |j2                  |j4                  d|d!       |dxx   d	z  cc<   |d
   j-                  |j2                  |j4                  dd"|dd d#        |jG                          ||j                          S c c}	w # tH        $ rA}|jK                          tM        jN                  d$tQ        jR                                 |d}~ww xY w# |j                          w xY w)%z
        Runs the heuristic linker for all pending items in a specific NFe.
        Returns a summary of the operations.
        errorNFe not foundpending	suggestedr   )total_itemssuggested_countambiguous_countpending_countsuggestionsAdVariationrI      rJ   zNo candidates found)n_itemdescriptionstatusreasonc                     | d   S )Nscorer%   xs    r   <lambda>z-NfeLinkerService.run_linker.<locals>.<lambda>a   s
    aj r!   TkeyreverseFrS      skuMULTIPLE_LISTINGS_SAME_SKUmethodrH   	ambiguousN   )rN   rO   rP   
candidates
confidencehighrG   mlb_idvariation_idcatalog_product_id)rN   rO   rP   suggested_matchz(Single candidate but not high confidence)rN   rO   rP   rQ   r`   zError in run_linker: )*r   queryr   filteridfirstcloser   r@   link_statusin_alllenr   r[   titler	   nameapp.models.ad_variationrL   ad_idattribute_combinationappendr   _generate_candidatesrN   rO   sortget
linked_skulinked_mlb_idlinked_variation_idlinked_catalog_product_idlink_confidencelink_methodcommit	ExceptionrollbackloggingrB   	traceback
format_exc)r@   dbnfeitemssummaryall_adsall_tinyrL   all_variationsr&   ads_with_variationsvariations_by_aditemr`   top_candidateis_ambiguoussecond_candidatees                     r   
run_linkerzNfeLinkerService.run_linker)   sg    ^m	((9%,,Y\\V-CDJJLC1T HHJQ HHW%,,W^^v-EwGZGZG^G^`ikv_wGxy}}E  #5z#$#$!"!G hhruubffbhh7;;=GxxAQAQRVVXH;XX!!11	
 ce  5C"Nqagg177"N"N!# 477"2202$QWW- )0034
  @-BB2sDRY[ceu  xK  L
!O,1,M*11"&++'+'7'7"+"7	3   $8$G *1$ z?Q&'1!}$%g.1A'1JJaO(,,U37G7K7KE7RR+/L 7SM(3-.!3.M*11"&++'+'7'7"-&0!n	3  %\2f< 12a72 +8*>-:->->x-H*3@3D3D^3T09F9J9JK_9`6+6(/<\/J,+8+B(.55&*kk+/+;+;&1/<	7   0A50.55&*kk+/+;+;&/&P*4Ra.7 u@D IIK HHJe #OZ  	KKMMM1)2F2F2H1IJKG	
 HHJsD   AQ %EQ P=P=#I	Q =Q 	R<RRR R!c                 	   t               }	 |j                  t              j                  t        j                  | k(        j                         }|sddi|j                          S |j                  t              j                  t        j                  | k(  t        j                  dk(  t        j                  j                  d      t        j                  j                  d            j                         }ddlm} dddg d}|D ]2  }|j                  |      j                  |j"                  |j                  k(        j                         }|s|dxx   d	z  cc<   Y|D cg c]l  }|j$                  s|j$                  j'                         j)                         t+        |j,                        j'                         j)                         k(  sk|n }	}t/        |	      d	k(  rR|	d   j                  |_        |d
xx   d	z  cc<   |d   j1                  d|j2                   d|j                   d       0t4        j7                  |j8                        \  }
}}}|j:                  r|j:                  j)                         nd}g }|D ]  }d}|j<                  xs ddz   |j$                  xs dz   j)                         }t4        j7                  |      \  }}}}d}|
r|
|z  r|dz  }d}n|r|dz  }|r||z  r|dz  }d}n|r|dz  }|r||z  r|dz  }d}n|r|dz  }|r||z  r|dz  }d}n|r|dz  }|r||v r|dz  }d}|s|dkD  s|j1                  ||f        |r|j?                  d d       |d   d   }|D cg c]  }|d   |k(  s| }}t/        |      d	k(  rU|d   d	   j                  |_        |d
xx   d	z  cc<   |d   j1                  d|j2                   d|j                   d       d|_	        d|_         d|_!        |dxx   d	z  cc<   |d   j1                  d|j2                   d       5 |jE                          ||j                          S c c}w c c}w # tF        $ rA}|jI                          tK        jL                  dtO        jP                                 |d}~ww xY w# |j                          w xY w)u_   
        Reprocessa itens já confirmados para preencher variation_id quando faltante.
        rB   rC   	confirmedNr   rK   )updated_countconflict_countskipped_countlogsr   rM   r   r   zItem u   : Vinculado à variação z por SKU exato.r   r   F
   T      c                     | d   S )Nr   r%   rT   s    r   rV   z/NfeLinkerService.run_backfill.<locals>.<lambda>   s
    !A$ r!   rW   u    por heurística.rE   backfill_conflictlowr   uR   : Múltiplas variações ou nenhuma clara. Marcado como 'suggested' para revisão.zError in run_backfill: ))r   rg   r   rh   ri   rj   rk   r   r@   rl   rz   isnotr{   is_rn   rr   rL   rs   r[   stripr   strry   ro   ru   rN   r   r?   rO   sku_supplierrt   rw   r~   r}   r   r   r   r   rB   r   r   )r@   r   r   r   rL   r   r   varsr&   exact_sku_matchesi_voltsi_wattsi_litersi_colorsi_cprodr`   rS   v_textc_voltsc_wattsc_litersc_colorsmatched_any	top_scorer   top_matchesr   s                              r   run_backfillzNfeLinkerService.run_backfill   s   
 ^Y	((9%,,Y\\V-CDJJLC1l HHJi HHW%,,&(##{2%%++D1++//5	
 ce  < "#"#!"	G  ;Pxx,33K4E4EI[I[4[\``bO,1, 15  %A1!%%++-BUBUBW[^_c_n_n[o[u[u[w[}[}[BQ  %A!  %A()Q./@/C/F/FD,O,1,FO**U4;;-?YZ^ZrZrYs  tC  ,D  E 8H7_7_`d`p`p7q4(H7;7H7H$++113d
 6AE 66<"Cquu{PRSZZ\F;K;c;cdj;k8GWh"'K7W#4erkeQU; %2+%7W#4erkeQU; %2+%Hx$7"TXk!5B;5Hx$7"TXk!5B;57f#4erkeQU;"uqy"))5!*5+6. OOOE *1a 0I.8"NAaDI<M1"NK"N;'1,3>q>!3D3G3G00A50..t{{mC]^b^v^v]w  xI  0J  K  $/ #6 ',$()Q.)&&t{{m  <N  (O  Pw;Pz IIK HHJ{ %AN #O"  	KKMMM3I4H4H4J3KLMG	
 HHJsj   AQ' %C=Q' "Q4AQQE,Q'  Q' 7Q' =Q"Q"B=Q' 
Q' '	R10<R,,R11R4 4Sr   r   r   r   r   r   r   c                   +,- g -t               ,,-fd++fd}|j                  r| j                  t              j	                  t
              j                  t
        j                  |j                  k(  t        j                  |j                  k(  t        j                  dk(  t        j                  j                  d             j                         }|rb +|j                  |j                  |j                  |j                  d d dddd|j                   d|j                   d	|j                   d

       t        j!                  |j"                  xs d      \  }	}
}}|j$                  rt'        |j$                        j)                         j+                         dvr| j                  t,              j                  t,        j.                  |j$                  k(        j1                         }|D ]  }t        j!                  |j2                  xs ddz   |j4                  xs dz         \  }}}}d}|	r	|r|	|z  sd}|r	|r||z  sd}|r	|r||z  sd}|r ||dddd       q ||dddd|j$                   d|j6                           | j                  t8              j                  t;        t8        j4                  |j$                  k(  t8        j4                  j=                  d|j$                   d                  j1                         }|D cg c]  }|j4                  |j$                  k(  s|  }}|D ]C  } +|j4                  d d d |j>                  d dddd|j$                   d|j4                   d

       E |j"                  rtA        jB                  d|j"                  t@        jD                        }|r|jG                  d      jI                  dd      j+                         }| j                  t,              j                  t,        j6                  |k(        j                         }|r ||dddd | d!       |j                  r| j                  t,              j                  t,        j4                  |j                  k(        j1                         }|D ].  }tK        |      dk(  rdnd"} ||d#d$|d%|j                   d&       0 | j                  t8              j                  t8        j4                  |j                  k(        j1                         }|D ]F  } +|j4                  d d d |j>                  d d'd$tK        |      dk(  rdnd"d%|j                   d(
       H |j"                  rt        jM                  |j"                        }|rh|D ]  \  }}}|s
t        jM                  |      } | s"tO        jP                  d ||       jS                         }!tU        |!dz        }"|"d)k\  s[|"d$k\  rd"nd}|v r\jW                  |g       D ]F  }# +|#j4                  ||#j6                  d ||#jX                  d*|"|d+|" d,| d-|#jX                   d.
       H |s +||d d |d d*|"|d+|" d,| d/
        |D ]  \  }$}%}&|&s
|%st        jM                  |&      }'|'s%tO        jP                  d ||'      jS                         }!tU        |!dz        }"|"d)k\  s^|"d$k\  rd"nd} +|%d d d |&d d0|"|d1|" d,|& d/
        tK        -      dkD  rT|j"                  rG|j                  r|j                  j+                         nd }(-D ]  })|)jW                  d2      xs ddz   |)jW                  d3      xs dz   dz   |)jW                  d4      xs dz   j+                         }*t        j!                  |*      \  }}}}|	r"|	|z  r|)d5xx   d6z  cc<   n|r|)d5xx   d7z  cc<   |
r"|
|z  r|)d5xx   d6z  cc<   n|r|)d5xx   d7z  cc<   |r"||z  r|)d5xx   d6z  cc<   n|r|)d5xx   d7z  cc<   |r"||z  r|)d5xx   d6z  cc<   n|r|)d5xx   d7z  cc<   |(s|(|*v s|)d5xx   d8z  cc<    -S c c}w )9Nc
                       sy  f}
|
v ry t         fdt              D        d      } |||||||	d
}|dk\  r||   d   kD  r||<   y y j                  |       j                  |
       y )Nc              3      K   | ]<  \  }}|d    k(  s|j                  d      k(  s$|j                  d      k(  s9| > yw)r[   rc   rd   N)rx   )r   ir   rc   r[   rd   s      r   r   zONfeLinkerService._generate_candidates.<locals>.add_candidate.<locals>.<genexpr>  s`       !atq!%TW\]\a\abj\kou\uz{zz  AO  {P  T`  {`  !as   AAAA
r[   rc   rd   re   rp   variation_namer]   rS   ra   explanationr   rS   )next	enumerateru   r:   )r[   rc   rd   re   rp   r   r]   rS   ra   r   rX   existing_idxcandcandidate_keysr`   s   ```          r   add_candidatez<NfeLinkerService._generate_candidates.<locals>.add_candidate  s    -Cn$  !ay/D  !a  ce  fL   ,&8"0 (*D q :l3G<</3J|, = !!$'""3'r!   c                    | j                   v rj                  | j                   g       D ]a  } |j                  | j                   |j                   t        | dd       | j                  |j
                  |||| d|j
                   d
       c y  | j                  | j                   d t        | dd       | j                  d ||||
       y )Nre   u    (Variação: )r   )ri   rx   r[   getattrrp   rt   )	ad_objr]   rS   ra   explanation_prefixr&   r   r   r   s	         r   expand_ad_candidateszCNfeLinkerService._generate_candidates.<locals>.expand_ad_candidates#  s    yy//)--fii< A!EE%yy%&TT+26;OQU+V$ll'('>'>%##-'9&:.I`I`Haab$c 

!99!%'.v7KT'R ,,#'!) 2r!   r   historical_supplier_coded   rb   u   Histórico: Fornecedor z cProd u    já vinculado ao SKU .r   r   )r   zSEM GTINNONEr   FTean_match_with_conflict2   r   z(EAN bate, mas voltagem/litragem diverge.	ean_match_   zEAN u    bate com anúncio %ean_match_tinyz" bate exatamente com Produto Tiny z(MLB\s?\d+)rM   	regex_mlb\   u   Código u    extraído da descriçãomediumsku_supplier_matchU   u   Código do fornecedor z bate com nosso SKUsku_supplier_match_tinyz bate com SKU Tiny.K   fuzzy_descriptionu   Similaridade de descrição (z%): 'u   ' (Variação: r   'fuzzy_description_tinyu"   Similaridade de descrição Tiny (rp   r   r[   rS   r   r   r   )-r7   r   rg   r   r   r   rh   issuer_cnpjrl   ry   r   rj   rz   r{   r|   r   r?   rO   eanr   r   r   r   gtinrn   rp   r[   ri   r	   r   likerq   r   r9   
IGNORECASEgroupreplacero   r    difflibSequenceMatcherratiointrx   rt   ).r   r   r   r   r   r   r   r   historyr   r   r   r   
ads_by_eanadr   r   r   r   conflicttiny_by_eanttiny_strict	mlb_matchmlb_code
ads_by_skuconftiny_by_sku	norm_descrs   ad_skuad_title
norm_titler   rS   r&   t_idt_skut_name	norm_namer   r   	cand_textr   r   r`   s.        ``                                    @@@r   rv   z%NfeLinkerService._generate_candidates   s   
	(<	@ hhw',,Y7>>%%8$$(9(99##{2""((.	
 eg  **"00!(!<!<'.'H'H#'5%"9#//9J'RVRcRcQddz  |C  |N  |N  {O  OP  !Q 0@/W/WX\XhXhXnln/o,(H 88DHH++-335=UU",,RWW-@AEEGJ  s7G7_7_acaiaiaomosv`vz|  {A  {A  {G  EG  aH  8I4(H w'0AtH(X2ESW(X2ESW(-FEU}(["fTXXJVijljojoipFqrs ((;/66KOOtxx/1E1E$((STo1VWce  '2GQUUdhh5F1GKG  !%'+&&#'+%"&txxj0RSTSXSXRYYZ [ 		.$2B2BBMMRI$??1-55c2>DDFXXb\((():;AAC(["fQYPZZsFtu ",,RVVt7H7H-HIMMOJ  J!$ZA!5v8$R)=r4Kabfbsbsat  uH  JI  JJ ((;/66{$J[J[7[\``bK  !%'+&&#'4),[)9Q)>vH"89J9J8KK^ _ (778H8HII/6 $&+E68%5%D%DX%N
)8 ' 7 7i T Z Z \ #ECK 0 B;/4{8D$(;;)9)=)=eR)H !&A$1,-EE/456TT;?.6787N7N/B.3376STYSZZ_`h_iixyz  zQ  zQ  yR  RS  5T%&!& $*$1,2/459;?.67;/B.3376STYSZZ_`h_iij4k%&3$&L ,4 'D%%$4$C$CF$K	(( ' 7 7i S Y Y [ #ECK 0 B;/4{8D)$)'+-137&,/3'?&++/.PQVPWW\]c\dde,f. z?Q4#3#3373D3Dd''--/$G" ("hhw/52<IY@Z@`^`adggkokskstykz  lA  A  B  I  I  K	7G7_7_`i7j4(H ($w-2*=- $w-2"5- ($w-2*=- $w-2"5- (*DMR,?M!4=B#6= (*DMR,?M!4=B#6= w)3MR'M5(8 _ Hs   a"2a"N)__name__
__module____qualname__staticmethodr   r    r?   r   r   r   r   r   r   listdictr7   rv   r%   r!   r   r   r      s    S S   	,c 	, 	, s3 s sj ^S ^ ^@ } }y } }RV }bf }z~ }  VY } }r!   r   )r   r   r   r   r   sqlalchemy.ormr   
sqlalchemyr   app.core.databaser   app.models.nfer   r   app.models.adr   app.models.tiny_productr	   r   r%   r!   r   <module>r	     s2    	     "  * -  /q qr!   