
    wis              
         S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	  S SK
J
r
Jr  S SKJr  S SKJrJrJrJr  \" \5      R)                  5       R*                  S   r\S	-  R)                  5       r\S
-  r\S-  r\S-  S-  S-  r\S-  S-  r\S-  S-  r\S-  S-  r\R<                  " S\R>                  5      r \R<                  " S\R>                  5      r!\R<                  " S\R>                  5      r"\R<                  " S5      r#/ SQr$SSSSSSS S!S"S.	r%S#r&/ S$Qr'\ " S% S&5      5       r(\ " S' S(5      5       r)SDS) jr*SES* jr+SFS+ jr,SGS, jr-SGS- jr.SHS. jr/SIS/ jr0SJS0 jr1SKS1 jr2SLS2 jr3SMS3 jr4SNS4 jr5SOS5 jr6      SPS6 jr7 SQ     SRS7 jjr8SSS8 jr9STS9 jr:SUS: jr;SVS; jr<SWS< jr=SXS= jr>SYS> jr?SZS? jr@S[S\S@ jjrASWSA jrBS]SB jrC\DSC:X  a  \C" 5         gg)^    )annotationsN)defaultdict)	dataclassfield)datetime	timedelta)Path)DictListOptionalTuple   Pulled_Info	InventoryzNon-FootwearBoot_FeaturesRW_ScraperszRW_Site_Scrape_Merged.mddatazinventory-data.jsonVoucherszvoucher_scanned_accounts.jsonconfigzboot_feature_overrides.jsonz(\d{8})_On_Hand_Footwearz(\d{8})_On_Hand_Non_Footwearz!^\d{8}_On_Hand_Non_Footwear\.csv$z:^(?P<style>\d+)(?P<width>[A-Z]\d?|[A-Z]+)?(?P<size>\d{3})$)	A2ABCDEE2E3Hr   r   r   r   r   r   r   r   r   z
No details)zOxford/AthleticChukkaHikerz5"z6"z7"z8"z9"z10"z11"z12"c                  \    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S
\S'   Srg)StyleFeature7   strstylenamebrandurlimagefloatpricezDict[str, int]features N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r-       </media/justin/syncPi/Shared/61_RW_Site/scripts/build_data.pyr"   r"   7   s&    J
IJ	HJLr4   r"   c                  x    \ rS rSr% S\S'   SrS\S'   \" \S9rS\S	'   \" S
 S9r	S\S'   Sr
S\S'   SrS\S'   Srg)InventoryAggregateB   r$   
norm_style        r*   	total_qty)default_factoryzset[str]
raw_stylesc                      [        [        5      $ N)r   dictr-   r4   r5   <lambda>InventoryAggregate.<lambda>G   s
    KX\L]r4   Dict[float, Dict[str, float]]size_map
total_costtotal_ext_costr-   N)r.   r/   r0   r1   r2   r;   r   setr=   rD   rE   rF   r3   r-   r4   r5   r7   r7   B   sE    OIu 5J5.3D].^H+^JNEr4   r7   c                    [        U =(       d    S5      R                  5       nU(       a>  US   R                  5       (       d&  USS  nU(       a  US   R                  5       (       d  M&  UR                  S5      $ )N r   r   0)r$   stripisdigitlstrip)r%   values     r5   normalize_stylerO   L   s_    ""$E
a((**ab	 a((**<<r4   c                    [        U =(       d    S5      R                  5       R                  5       nU(       d  g US:X  a  gUS;   a  gUS;   a  gUS;   a  g	US
;   a  gUS;   a  U$ US:X  a  gg )NrI   AAr   >   2Er   EEW2r   >   3Er   EEEr   >   r   4EE4EEEEr   >   r   Mr   >   r   r   r   r   E1r   )r$   rK   upper)	width_rawrN   s     r5   normalize_widthr^   S   s|    	R &&(..0E}((##))
$$}r4   c                   [         R                  " SS[        U =(       d    S5      R                  5       R	                  5       5      nU(       d  g[        U5      S:  au  US S R                  5       (       a]  USS  R                  5       (       aE  US S nUSS n[        USS  5      S-  n[        U5      =(       d    U=(       d    Sn[        U5      XE4$ [        R                  U5      nU(       d  [        U5      S	:  a  USS  R                  5       (       a  [        USS  5      S-  nUS S n[         R                  " S
U5      nU(       d  gUR                  S5      =(       d    Sn[        U5      =(       d    U=(       d    Sn[        UR                  S5      5      XE4$ gUR                  S5      =(       d    Sn[        UR                  S5      5      [        UR                  S5      5      S-  [        U5      =(       d    U=(       d    S4$ )Nz\s+rI   )NNN      g      $@r      z^(?P<style>\d+)(?P<width>.*)$widthr%   size)resubr$   rK   r\   lenrL   intr^   rO   STYLE_WD_SIZE_REmatchgroup)	style_wd_sizerN   style_digitsr]   re   	width_keyrk   prefixprefix_matchs	            r5   parse_style_wd_sizerr   h   s   FF62s=#6B7==?EEGHE
5zQ5!9,,..5:3E3E3G3GRay!BK	5:%#I.D93C	|,d==""5)Eu:?uRSz1133uRSz?T)D3BZF88$DfML'$**739rI'	2Hy7GCI"<#5#5g#>?PPG$*IG,-EKK 4'	"8y'7C r4   c                    [        U 5      $ r?   )parse_powerbi_numberrN   s    r5   parse_currencyrv      s    &&r4   c                   [        U =(       d    S5      R                  5       nU(       d  gUR                  SS5      R                  SS5      R                  SS5      R                  SS5      n [        U5      $ ! [         a     gf = f)NrI   r:   $,(-))r$   rK   replacer*   
ValueError)rN   texts     r5   rt   rt      sx    u{!!#D<<R ((b199#sCKKCQSTDT{ s   .
A9 9
BBc                    [         R                  5       (       d  0 $  [        R                  " [         R	                  SS95      n [        U [        5      (       d  0 $ 0 nU R                  5        GH  u  p#[        U[        5      (       a  [        U[        5      (       d  M2  [        U5      nU(       d  MF  UR                  S0 5      n[        U[        5      (       d  0 n[        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        [        UR                  S	S5      =(       d    S5      5      UR                  5        VVs0 s HC  u  pg[        U[        5      (       d  M  [        U5      [        U=(       d    S
5      (       a  SOS
_ME     snnS.X'   GM     U$ ! [
         a    0 s $ f = fs  snnf )Nutf-8encodingr,   r&   rI   r'   r(   r)   r+   r   r   r&   r'   r(   r)   r+   r,   )FEATURE_OVERRIDES_PATHis_filejsonloads	read_text	Exception
isinstancer@   itemsr$   rO   getrK   rv   ri   )rawoutr%   payloadr9   r,   keyrN   s           r5   load_feature_overridesr      s   !))++	jj/9979KL c4  	C))+%%%Z-F-F$U+
;;z2.(D))HFB/526<<>Wb17R8>>@w{{5"-34::<Wb17R8>>@#CGR(@(FB$GHQYQ_Q_QazQa:3eopsuxey>SEJQ1Q>Qaz
 &" J-  	( {s   'H8 I
>+I
8IIc                   [        U 5      nU(       d  [        S5      e[        5       nUR                  S0 5      n[	        U[
        5      (       d  0 n[        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        UR                  SS5      =(       d    S5      R                  5       [        [        UR                  SS5      =(       d    S5      5      UR                  5        VVs0 s HC  u  pV[	        U[        5      (       d  M  [        U5      [        U=(       d    S	5      (       a  S
OS	_ME     snnS.X2'   [        R                  R                  SSS9  [        R                  [        R                   " USSS9SS9  SU0X2   E$ s  snnf )NzStyle is requiredr,   r&   rI   r'   r(   r)   r+   r   r   r   Tparentsexist_ok   )indent	sort_keysr   r   r%   )rO   r~   r   r   r   r@   r$   rK   rv   r   ri   r   parentmkdir
write_textr   dumps)r%   r   r9   existingr,   r   rN   s          r5   save_feature_overrider      s    'J,--%'H{{:r*Hh%%GKK+1r288:W[["-34::<7;;ub)/R0668W[["-34::<GKK$<$B CDMU^^M]vM]zsakloqtau:SXC
OOq:M]vH !!''t'D%%djj!t&T_f%gZ88#788	 ws   G43+G4c                    [         R                  S5       V s/ s H  o R                  5       (       d  M  U PM     nn U(       d  [        S[          35      e/ n/ nU Hs  n [        R                  U R                  5      nU(       d  UR                  U 5        M<  UR                  [        R                  " UR                  S5      S5      U 45        Mu     U(       a  UR                  S SS9  US   S   $ UR                  S	 SS9  US   $ s  sn f )
N*On_Hand_Footwear*.csvzNo inventory export found in r   %Y%m%dc                    U S   $ Nr   r-   items    r5   rA   +find_latest_inventory_csv.<locals>.<lambda>   s    DGr4   Tr   reverser   c                6    U R                  5       R                  $ r?   statst_mtime)paths    r5   rA   r      s    $))+"6"6r4   )INVENTORY_DIRrglobr   FileNotFoundErrorDATE_REsearchr&   appendr   strptimerl   sort)r   
candidatesdatedundatedrk   s        r5   find_latest_inventory_csvr      s    #0#6#67O#Pc#P4T`T`Tb$#PJc"? OPP)+EGtyy)NN4 h''AA4HI  

+T
:Qx{LL6LE1:% ds
   DDc                    U R                  SSSS9 n[        R                  " U5      n[        US 5        U H$  n[	        S U 5       5      (       d  M    S S S 5        g   S S S 5        g! , (       d  f       g= f! [
         a     gf = f)Nr	utf-8-sigrI   r   newlinec              3  f   #    U  H'  n[        U=(       d    S 5      R                  5       v   M)     g7f)rI   N)r$   rK   ).0cells     r5   	<genexpr>,non_footwear_csv_has_data.<locals>.<genexpr>   s$     ?34s4:2,,..3s   /1TF)opencsvreadernextanyOSError)r   handler   rows       r5   non_footwear_csv_has_datar      s    YYs["Y=ZZ'F?3??? >=  >  >=   s@   A: =A)A)A: A) A: )
A73A: 7A: :
BBc                    [         R                  5       (       d  g [         R                  S5       V s/ s H  o R                  5       (       d  M  U PM     nn U(       d  g / nU Ht  n [        R                  U R                  5      nU(       d  M+  [        U 5      (       d  M=  UR                  [        R                  " UR                  S5      S5      U 45        Mv     U(       d  g U Vs/ s H7  n[        R                  US   R                  =(       d    S5      (       d  M5  UPM9     nnU(       a  UR                  S SS9  US   S   $ UR                  S	 SS9  US   S   $ s  sn f s  snf )
Nz*On_Hand_Non_Footwear*.csvr   r   rI   c                F    U S   U S   R                  5       R                  4$ Nr   r   r   r   s    r5   rA   8find_latest_non_footwear_inventory_csv.<locals>.<lambda>  s    Qa1H1H'Ir4   Tr   r   c                F    U S   U S   R                  5       R                  4$ r   r   r   s    r5   rA   r     s    a$q',,.*A*A Br4   )NON_FOOTWEAR_INVENTORY_DIRis_dirr   r   NON_FOOTWEAR_DATE_REr   r&   r   r   r   r   rl   NON_FOOTWEAR_COMBINED_NAME_RErk   r   )r   r   r   rk   r   combineds         r5   &find_latest_non_footwear_inventory_csvr      s)   %,,..#=#C#CD`#at#a4eqeqes$#aJt)+E$++DII6(..h''AA4HI  !&b*G*M*MdSTgllN`^`*aHbISWX{1~	JJBDJQ8A;- u  cs   EE&4E$E$c                    [        [        R                  " U /SS95      nU(       a  US   S:X  a  USS  nU(       a  US   S:X  a  US S nU Vs/ s H  o"R                  5       PM     sn$ s  snf )N|)	delimiterr   rI   r   )r   r   r   rK   )liner   r   s      r5   split_markdown_rowr   
  se    
szz4&C0
1C
s1v|!"g
s2w"}#2h%()STJJLS)))s   A*c                 	   [         R                  SS9R                  5       n U  Vs/ s H*  oR                  5       R	                  S5      (       d  M(  UPM,     nn[        U5      S:  a  [        S[          35      e[        US   5      nUSS   Vs/ s H  n[        U5      PM     nnU Vs/ s HQ  n[        U5      [        U5      :X  d  M  U(       d  M&  US   (       d  M2  US   S   R                  5       (       d  MO  UPMS     nn1 SknU Vs/ s H  oU;  d  M
  UPM     n	n0 n
U GHa  n[        [        X55      5      n[        UR                  S	S
5      5      nU(       d  M<  U	 Vs0 s H=  o[        UR                  U5      =(       d    SR                  5       =(       d    S5      _M?     nnSU;   a3  SU;  a-  UR                  S5      US'   U	 Vs/ s H  oS:X  a  SOUPM     n	n[        UUR                  SS
5      R                  5       UR                  SS
5      R                  5       UR                  SS
5      R                  5       UR                  SS
5      R                  5       [!        UR                  SS
5      5      US9X'   GMd     [#        5       nUR%                  5        GHM  u  nnU
R                  U5      n[        U(       a  UR&                  O0 5      nUR)                  UR                  S0 5      5        [        U[+        UR                  SU(       a  UR,                  OS
5      5      [+        UR                  SU(       a  UR.                  OS
5      5      [+        UR                  SU(       a  UR0                  OS
5      5      [+        UR                  SU(       a  UR2                  OS
5      5      [5        UR                  SU(       a  UR6                  OS5      =(       d    S5      US9X'   GMP     / n[9        5       nU	 H7  nUS:X  a  SOUnUU;   a  M  UR;                  U5        UR=                  U5        M9     UR?                  5        H^  nUR                  S0 5      RA                  5        H7  nUS:X  a  SOUnUU;   a  M  UR;                  U5        UR=                  U5        M9     M`     S H  nUU;  d  M  UR=                  U5        M     U
U4$ s  snf s  snf s  snf s  snf s  snf s  snf )Nr   r   r      z$Could not parse markdown table from r   r   >   URLNameBrandImagePriceStyle #r   rI   rJ   z
Safety ToeAny Safety Toer   r   r   r   r   )r%   r&   r'   r(   r)   r+   r,   r,   r&   r'   r(   r)   r+   r:   )Heritage
Resoleable)!SCRAPE_PATHr   
splitlinesrK   
startswithrh   r~   r   rL   r@   ziprO   r   ri   popr"   rv   r   r   r,   updater$   r&   r'   r(   r)   r*   r+   rG   addr   valueskeys)	raw_linesr   table_linesheadersfeature_rowsr   rowscoreheaderfeature_namesfeature_maprecordr9   r&   r,   	overridesoverrider   merged_featuresdeduped_featuresseenmappedfeature_namerequired_features                           r5   load_featuresr    s8   %%w%7BBDI$-NID1H1H1M4IKN
;!?}MNN Q0G9DQRI&t,LI'o<C3s8s7|+CCCPSTUPVC[^_`[abc[d[l[l[nC<Do@D*1H'45GV'MH+-Kc''($VZZ	2%>?
TabTaD#vzz$/63==?F3GGTab8#(8(H)1l)CH%&\ij\iTX1E-4O\iMj".FB'--/**Wb)//1

5"%++-**Wb)//1 GR!89#
 & '(I ) 1
H??:.Hx00"Ex||J;<".X\\&8(--LMhll7hHNNBOPHLLbIJhll7hHNNBOPWhnncRYVYZ$#
	 !2 #%5D%)\%9!tT>'  $$&$LLR8==?L)5)E%<F~HHV##F+ @ ' 74'##$45 7 (((A O
 Jo I c ksH   'SSS*S"
S"S"S"<S"	S'S'%AS,S1c           
     j   0 nU R                  SSSS9 n[        R                  " U5      nSUR                  =(       d    / ;  d  SUR                  =(       d    / ;  a  [	        SUR                   35      eU GH  n[        UR                  SS5      5      R                  5       nU(       a  US   R                  5       (       d  MN  [        U5      nS nS nUR                  S	5      (       a  [        US	   5      u  pnU	(       a  U	nU
nUn[        UR                  SS5      5      nUR                  U[        US
95      nU=R                  U-  sl        UR                  R!                  U5        U=R"                  [%        UR                  SS5      5      -  sl        U=R&                  [%        UR                  SS5      5      -  sl        Uc  GMW  U(       d  GMa  UR(                  R                  U0 5      n[+        UR                  US5      5      U-   X'   GM     S S S 5        U$ ! , (       d  f       U$ = f)Nr   r   rI   r   StyleQtyz(Inventory CSV missing required columns: r   StyleWdSizer9   CostExtCostr:   )r   r   
DictReader
fieldnamesr~   r$   r   rK   rL   rO   rr   rt   
setdefaultr7   r;   r=   r   rE   rv   rF   rD   r*   )csv_path
aggregatesr   r   r   	raw_styler9   re   ro   parsed_styleparsed_sizeparsed_widthqtyaggcurrents                  r5   load_inventoryr  X  s   02J	s["	='6,,23uVEVEVE\Z\7]GHYHYGZ[\\CCGGGR01779IIaL$8$8$:$:(3JDIww}%%:McR_N`:a7<!-J&D ,I&swwua'89C''
4FR\4]^CMMS MNNy)NNnSWWVR-@AAN.B1G"HHII,,11$;%*7;;y#+F%G#%M"- 	 
>6 7 
>	=6 s   F5H#H#AH##
H2c           	        UR                  5        GH+  u  p#U R                  U[        US95      nU=R                  UR                  -  sl        UR                  R                  UR                  5        U=R                  UR                  -  sl        U=R                  UR                  -  sl        UR                  R                  5        Hl  u  pVUR                  R                  U0 5      nUR                  5        H7  u  p[        UR                  US5      5      [        U	=(       d    S5      -   Xx'   M9     Mn     GM.     U $ )Nr
  r:   )r   r  r7   r;   r=   r   rE   rF   rD   r*   r   )
targetsourcer9   incomingr  re   	width_mapr  rd   r  s
             r5   merge_inventory_aggregate_mapr  x  s     !'

,>*,UV+++h112(---h555'00668ODll--dB7G'oo/
!&w{{5#'>!?%
sBS!S 0  9 !/ Mr4   c           
     @   0 nU R                  SSSS9 n[        R                  " U5      nU GHR  n[        UR	                  SS5      =(       d    S5      R                  5       R                  5       nUS:w  a  ML  [        UR	                  SS5      5      R                  5       nU(       a  US   R                  5       (       d  M  [        U5      nS n	S n
UR	                  S	5      (       a  [        US	   5      u  pnU(       a  UnUn	Un
U=(       d    0 R	                  U5      nUbO  U	bC  U
(       a<  [        UR                  R	                  U	0 5      R	                  U
S
5      5      S:  a  GM<  U	b  U
c  GME  [        UR	                  SS5      5      nUR                  U[        US95      nU=R                  U-  sl        UR                   R#                  U5        U=R$                  ['        UR	                  SS5      5      -  sl        U=R(                  ['        UR	                  SS5      5      -  sl        U	c  GM  U
(       d  GM  UR                  R                  U	0 5      n[        UR	                  U
S
5      5      U-   UU
'   GMU     S S S 5        U$ ! , (       d  f       U$ = f)Nr   r   rI   r   Categoryfootwearr  r   r	  r:   r  r
  r  r  )r   r   r  r$   r   rK   lowerrL   rO   rr   r*   rD   rt   r  r7   r;   r=   r   rE   rv   rF   )r  existing_inventoryr  r   r   r   categoryr  r9   re   ro   r  r  r  r   r  r  r  s                     r5   *load_mixed_non_footwear_footwear_inventoryr&    s@    13J	s["	='C377:r28b9??AGGIH:%CGGGR01779IIaL$8$8$:$:(3JDIww}%%:McR_N`:a7<!-J&D ,I*0b55jAH##	eH<M<M<Q<QRVXZ<[<_<_`ikn<o6pst6t<9#4 &swwua'89C''
4FR\4]^CMMS MNNy)NNnSWWVR-@AAN.B1G"HHII,,11$;%*7;;y#+F%G#%M	"E  
>J K 
>	=J s   HJ8JAJ
Jc           	        0 nU R                  SSSS9 n[        R                  " U5      nU H  n[        UR	                  SS5      5      R                  5       nU(       a  US   R                  5       (       d  MM  [        U5      n[        UR	                  US5      5      [        UR	                  SS5      5      -   X'   M     S S S 5        U$ ! , (       d  f       U$ = f)	Nr   r   rI   r   r  r   r:   r  )
r   r   r  r$   r   rK   rL   rO   r*   rt   )r  totalsr   r   r   r  r9   s          r5   load_inventory_totalsr)    s    !F	s["	='CCGGGR01779IIaL$8$8$:$:(3J!&vzz*c'B!CFZ[^[b[bchjk[lFm!mF  
> M 
>	= Ms   B.C
Cc                   0 nU R                  SSSS9 n[        R                  " U5      nU GH  n[        UR	                  SS5      5      R                  5       nU(       a  US   R                  5       (       d  MN  [        U5      nS nS nUR	                  S5      (       a  [        US   5      u  pnU	(       a  U	nU
nUnUb  Uc  M  [        UR	                  SS5      5      nUR                  U0 5      nUR                  [        U5      0 5      n[        UR	                  US	5      5      U-   X'   GM     S S S 5        U$ ! , (       d  f       U$ = f)
Nr   r   rI   r   r  r   r	  r  r:   )r   r   r  r$   r   rK   rL   rO   rr   rt   r  r*   )r  r   r   r   r   r  r9   re   ro   r  r  r  r  	style_mapr  s                  r5   load_inventory_sizesr,    s4   46C	s["	='CCGGGR01779IIaL$8$8$:$:(3JDIww}%%:McR_N`:a7<!-J&D ,I|y0&swwua'89Cz26I!,,U4["=I#(y#)F#G##MI %  
>* J+ 
>	=* Js   DD==
Ec                 "   / n [         R                  S5       Hb  n[        R                  UR                  5      nU(       d  M+  U R                  [        R                  " UR                  S5      S5      U45        Md     U R                  S SS9  U $ )Nr   r   r   c                    U S   $ r   r-   r   s    r5   rA   ,inventory_files_with_dates.<locals>.<lambda>  s    d1gr4   Tr   )
r   r   r   r   r&   r   r   r   rl   r   )r   r   rk   s      r5   inventory_files_with_datesr0    ss    ')C##$<=tyy)

H%%ekk!nh?FG	 >
 HH%tH4Jr4   c                   [        5       n[        U5      S:  a  SSS.$ US   u  p#U[        SS9-
  nS nS nUSS   H  u  pxXt::  d  M  UnUn  O   Uc  US   u  pV[        U5      n	[        U5      n
[	        U5      n[	        U5      n/ n[        [        U	5      [        U
5      -  S	 S
9 GH  n[        U
R                  US5      5      n[        U	R                  US5      5      nUU-
  n[        U5      S:  a  MP  / n/ n0 nUR                  U0 5      nUR                  U0 5      n[        [        U5      [        U5      -  5       H  nUR                  U0 5      nUR                  U0 5      n[        [        U5      [        U5      -  5       H  n[        UR                  US5      5      [        UR                  US5      5      -
  n[        U5      S:  a  MK  [        U5       S[        R                  UU5       3nUUU'   US:  a  UR                  U SUS 35        M  UR                  U S[        U5      S 35        M     GM     U R                  U5      nUR                  UU(       a  UR                  OSU(       a  UR                  OSUUUUUUU(       a  UR                  OSS.
5        GM     UR!                  S SS9  SUR                  UR#                  5       R%                  5       UR                  U(       a  UR#                  5       R%                  5       OSUU VVs/ s H0  u  pxUR#                  5       R%                  5       UR                  S.PM2     snnS.$ s  snnf )Nr   Fz&Not enough dated inventory CSVs found.	availablemessager      )daysr   c                F    U R                  5       (       a  [        U 5      $ U $ r?   rL   ri   ru   s    r5   rA   $build_diff_payload.<locals>.<lambda>  s/    jojwjwjyjy\_`e\f  ]E  @E  ]Er4   r   r:   &.> :gr   HERITAGErI   )
r%   r&   r'   soldQtyprevQtycurrQty	soldSizesincomingSizessizeDeltaMap
productUrlc                :    [        [        U S   5      5      U S   4$ )Nr@  r%   )absr*   )r   s    r5   rA   r9  )  s    s5Y#893w<Hr4   Tr   )datefile)r3  currentFilecurrentDatepreviousFilepreviousDater   fileHistory)r0  rh   r   r)  r,  sortedrG   r*   r   rH  format_sizeWIDTH_DISPLAYr   r&   r'   r(   r   rI  	isoformat)r,   files
current_dtcurrent_path	target_dtprevious_dtprevious_pathdtr   current_totalsprevious_totalscurrent_sizesprevious_sizesr   r9   prev_qtycurr_qtysold_qty
sold_partsincoming_partssize_delta_mapprev_size_mapcurr_size_mapre   prev_widthscurr_widthsrd   deltalabelfeatures                                 r5   build_diff_payloadrl    sP   &(E
5zA~"/WXX$QxJYA..IKM!"I?K M	 
 %*1X"*<8N+M:O(6M)-8NDS033GG  NF  G
,,Z=>++J<=h&x=4 "
$&+-&**:r:%))*b93}-M0BBCD'++D"5K'++D"5KK 03{3C CDkooeS9:U;??SXZ]C^=__u:$&t,-Q}/@/@/N.OP(-u%19%%qq	&:;"))UG1SZN*CD E D ,,z*#(/Z*1z###'!/ .-4gkk"	
7 GT 	IIHRVIW#((!(224%**:E((*4462 "
! WWY((*DII>!
 
s    7Mc                 x   [         R                  5       (       d  SSS.$ [        R                  " [         R	                  SS95      n [        U R                  S5      =(       d    / 5      n[        U R                  S5      =(       d    / 5      nS[        U5      US S	 [        U5      US S	 [         R                  S
S.$ )NFzVoucher scan cache not found.r2  r   r   completed_termsseen_accountsTx   zThe source folder currently exposes scraper/cache artifacts, not the voucher markdown records used by the desktop preview pane.)r3  completedTermCountcompletedTermsPreviewaccountCountaccountPreview
sourceFilenotes)	VOUCHER_SCAN_PATHr   r   r   r   listr   rh   r&   )r   rn  ro  s      r5   build_voucher_payloadry  8  s    $$&&"/NOOjj*44g4FGG7;;'89?R@O_5;<M!/2!0#!6M*'-',, S r4   c                h    [        U [        U 5      -
  5      S:  a  [        [        U 5      5      $ U S $ )Nr;  r>  )rH  roundr$   ri   ru   s    r5   rQ  rQ  I  s.    !%%,"67$>3s5z?PuQiPr4   c           	     4   / n[        U 5       Hr  nX   n[         Vs/ s H  oCR                  US5      S:  d  M  UPM     nnU(       d  M=  UR                  [	        U5       SSR                  S U 5       5       35        Mt     SR                  U5      $ s  snf )Nr   r=  ry   c              3  L   #    U  H  n[         R                  X5      v   M     g 7fr?   )rR  r   )r   rd   s     r5   r   "format_size_map.<locals>.<genexpr>T  s!     4qbpY^]5F5Fu5T5Tbps   "$z  )rP  WIDTH_ORDERr   r   rQ  join)rD   partsre   widthsrd   matched_widthss         r5   format_size_mapr  M  s    Ex -8U[EJJua<PST<T%[UD)*!CHH4qbp4q,q+rst ! 99U	 Vs
   BBc                6   0 n[        U 5       H|  nX   n[         Vs0 s H  oCR                  US5      S:  d  M  XCU   _M!     nnUR                  5        VVs0 s H  u  pFXE;  d  M  US:  d  M  XF_M     nnn0 UEUEU[	        U5      '   M~     U$ s  snf s  snnf r   )rP  r  r   r   rQ  )rD   
serializedre   r  rd   orderedr  extrass           r5   serialize_size_mapr  X  s    .0Jx 5@][EJJuVWDX[\D\'5-'[]/5||~b~AU*Z]`aZa*%*~b(=7(=f(=
;t$%	 !
  ^bs   B	BB'B/Bc           
     L   / nU  GH  n[        U[        5      (       d  M  [        UR                  S5      =(       d    S5      R	                  5       nU(       d  MU  UR                  [        UR                  S5      =(       d    S5      R	                  5       =(       d    S[        UR                  S5      =(       d    S5      R	                  5       [        UR                  S5      =(       d    S5      R	                  5       US.5        GM     [        U5      US [        SU5       S	.$ )
Nr4  rI   severitywarningcoder%   )r  r  r%   r4  r   )warningCountwarnings)r   r@   r$   r   rK   r   rh   max)r  limitcleanedr  r4  s        r5   build_validation_payloadr  b  s    G'4((gkk),2399;J 7 D9EKKMZQZGKK/526<<>W[[17R8>>@"		
  GOc!Um, r4   c                    [        5       n [        5       u  p[        U 5      n[        5       nU(       a  [	        U[        XC5      5      n[        R                  U R                  5      nS nU(       aB  [        R                  " UR                  S5      S5      R                  5       R                  5       n[        [        U5      [        U5      -  S S9n/ nSn	Sn
/ nU GHa  nUR!                  U5      nUR!                  U[#        US95      nUR$                  S:  a  U	S-  n	OU
S-  n
['        S UR(                  R+                  5        5       5      nUR(                  (       aV  [-        U[/        UR$                  =(       d    S5      -
  5      S	:  a(  UR1                  S
USUS SUR$                  S S3S.5        UR$                  S:  a  Uc  UR1                  SUSS.5        UR$                  S:  a)  Ub&  UR2                  (       d  UR1                  SUSS.5        UR$                  S:  a)  Ub&  UR4                  (       d  UR1                  SUSS.5        UR1                  UU(       a  UR                  OSU(       a  UR6                  OSU(       a  UR2                  OSU(       a  UR4                  OSU(       a  UR8                  OSUR$                  [        UR:                  5      [=        UR(                  5      [?        UR(                  5      U(       a  UR@                  O0 US L U(       a  X;   a  SO
U(       a  SOSS.5        GMd     U R                  U[C        [D        5      [        RF                  " 5       R                  SS9[I        U5      U	U
S.[K        U5      S .[L        [N        U[P        [R        / S!Q/ S"QS#S$/[P        S%.S&.U[U        5       [W        U5      S'.$ )(Nr   r   c                F    U R                  5       (       a  [        U 5      $ U $ r?   r8  ru   s    r5   rA   build_payload.<locals>.<lambda>  s     Y^YfYfYhYh3u:KsnsKsr4   r:  r   r
  c              3  x   #    U  H0  oR                  5         H  n[        U=(       d    S 5      v   M     M2     g7f)r:   N)r   r*   )r   r  r  s      r5   r    build_payload.<locals>.<genexpr>  s0     p<Qy]m]m]oVYszc**]o*<Qs   8:r:   gMbP?inventory_size_total_mismatchzSize map total r>  z does not match style quantity .)r  r%   r4   inventory_missing_scrape_detailsz^Positive-qty style is missing scrape details and is falling back to Heritage placeholder data.inventory_missing_urlz,Positive-qty style is missing a product URL.inventory_missing_imagez.Positive-qty style is missing a product image.r   r?  rI   zinventory+scrapescrape	inventory)r%   r&   r'   rF  r)   r+   quantity	rawStylessizesDisplaysizeMapr,   
isHeritager  seconds)timespec)stylesinventoryStyleszeroQtyStyles)inventoryCsvinventoryAsOf
sourceRootgeneratedAtcounts
validation)r   zSoft Toez	Steel ToezNon-Metallic ToezAluminum Toe)zRed WingzIrish SetterWorxr   MaleFemale)toer'   genderheight)
widthOrderwidthDisplayfeatureNamesheightOptionsheritageLabelorGroups)metar   r  voucherinventoryDiff),r   r  r  r   r  r&  r   r   r&   r   r   rl   rI  rS  rP  rG   r   r7   r;   sumrD   r   rH  r*   r   r(   r)   r'   r+   r=   r  r  r,   r$   SOURCE_ROOTnowrh   r  r  rR  HEIGHT_OPTIONSHERITAGE_LABELry  rl  )inventory_csvr,   r   r  non_footwear_inventory_csvinventory_date_matchinventory_as_of
all_stylesr  inventory_countzero_qty_countvalidation_warningsr9   rk  r  
size_totals                   r5   build_payloadr  x  s[   -/M+oH}-I!G!I!167Q]
	
 #>>-*<*<=O"++,@,F,Fq,I8TYY[eegHI6<tuJFON&( 
,,z*mmJ(:j(QR==1q OaNpCLL<O<O<Qpp
<<C
U3==3GC-H HIEQ&&;'!0A>]^a^k^klm]nnop ==1&&>' ==1!4W[[&&3'M ==1!4W]]&&5'O 	#(/Z*1z-4gkk"*1r*1sMM#CNN3 / =-cll;07G,,R%o07J<S,fmZbs~	
Q !x *..,k*#<<>33Y3Gf+#2!/
 33FG
 &))++fI!8,(	
 (*+H59 r4   c                     [         R                  R                  SSS9  [        5       n [         R	                  [
        R                  " U SS9SS9  [        S[          SU S	   S
   S    S35        g )NTr   r   )r   r   r   zWrote z with r  r  r  z styles)OUTPUT_PATHr   r   r  r   r   r   print)r   s    r5   mainr    sf    TD9oG4::ga87K	F;-vgfoh&?&I%J'
RSr4   __main__)r%   r$   returnr$   )r]   r$   r  zOptional[str])rm   r$   r  z4Tuple[Optional[str], Optional[float], Optional[str]])rN   r$   r  r*   )r  zDict[str, dict])r%   r$   r   r@   r  r@   )r  r	   )r   r	   r  bool)r  zOptional[Path])r   r$   r  z	List[str])r  z)Tuple[Dict[str, StyleFeature], List[str]])r  r	   r  Dict[str, InventoryAggregate])r  r  r  r  r  r  r?   )r  r	   r$  z$Dict[str, InventoryAggregate] | Noner  r  )r  r	   r  zDict[str, float])r  r	   r  z(Dict[str, Dict[float, Dict[str, float]]])r  zList[Tuple[datetime, Path]])r,   zDict[str, StyleFeature]r  r@   )r  r@   )rN   r*   r  r$   )rD   rC   r  r$   )rD   rC   r  zDict[str, Dict[str, float]])   )r  z
List[dict]r  ri   r  r@   )r  None)E
__future__r   r   r   rf   collectionsr   dataclassesr   r   r   r   pathlibr	   typingr
   r   r   r   __file__resolver   ROOTr  r   r   r   r  rw  r   compile
IGNORECASEr   r   r   rj   r  rR  r  r  r"   r7   rO   r^   rr   rv   rt   r   r   r   r   r   r   r  r  r  r&  r)  r,  r0  rl  ry  rQ  r  r  r  r  r  r.   r-   r4   r5   <module>r     sD   " 
  	 # ( (  . .H~''*m#,,.k)*^; O+m;>XXVm33*,/NN +HH 
**0"--
@zz"A2==Q  "

+OQSQ^Q^ _ ::[\ >
					

	
          *B'<9*,
8*B)J@)) #& @D**<* #*Z
4M`"Q,m`T zF r4   