+
    wis                    R   ^ RI Ht ^ RIt^ RIt^ RIt^ RIHt ^ RIHtH	t	 ^ RI
H
t
Ht ^ RIHt ^ RIHtHtHtHt ]! ]4      P)                  4       P*                  ^,          t]R,          P)                  4       t]R	,          t]R
,          t]R,          R,          R,          t]R,          R,          t]R,          R,          t]R,          R,          t]P<                  ! R]P>                  4      t ]P<                  ! R]P>                  4      t!]P<                  ! R]P>                  4      t"]P<                  ! R4      t#. R[Ot$RRRRRRRRRRRRRRRRR R /	t%R!t&. R\Ot'] ! R" R#4      4       t(] ! R$ R%4      4       t)R& R' lt*R( R) lt+R* R+ lt,R, R- lt-R. R/ lt.R0 R1 lt/R2 R3 lt0R4 R5 lt1R6 R7 lt2R8 R9 lt3R: R; lt4R< R= lt5R> R? lt6R@ RA lt7R]RB RC llt8RD RE lt9RF RG lt:RH RI lt;RJ RK lt<RL RM lt=RN RO lt>RP RQ lt?RR RS lt@R^RT RU lltARV RW ltBRX RY ltC]DRZ8X  d
   ]C! 4        R# R# )_    )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Hz
No detailsc                  ^    ] tR t^7t$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R	]R
&   RtR# )StyleFeaturestrstylenamebrandurlimagefloatpricezDict[str, int]features N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r)       scripts/build_data.pyr   r   7   s&    J
IJ	HJLr0   r   c                      ] tR t^Bt$ R]R&   RtR]R&   ]! ]R7      tR]R&   ]! R	 R7      t	R
]R&   Rt
R]R&   RtR]R&   RtR# )InventoryAggregater    
norm_style        r&   	total_qty)default_factoryzset[str]
raw_stylesc                 	     \        \        4      # N)r   dictr)   r0   r1   <lambda>InventoryAggregate.<lambda>G   s
    KX\L]r0   Dict[float, Dict[str, float]]size_map
total_costtotal_ext_costr)   N)r*   r+   r,   r-   r.   r6   r   setr8   r?   r@   rA   r/   r)   r0   r1   r3   r3   B   sE    OIu 5J5.3D].^H+^JNEr0   r3   c                    V ^8  d   QhRRRR/# )   r!   r    returnr)   )formats   "r1   __annotate__rG   L   s      3 3 r0   c                    \        T ;'       g    R 4      P                  4       pV'       d)   V^ ,          P                  4       '       g   VR,          pK0  VP                  R4      # )    NN0)r    stripisdigitlstrip)r!   values   & r1   normalize_stylerQ   L   sH    ""$E
a((**b	<<r0   c                    V ^8  d   QhRRRR/# )rD   	width_rawr    rE   zOptional[str]r)   )rF   s   "r1   rG   rG   S   s      s } r0   c                    \        T ;'       g    R 4      P                  4       P                  4       pV'       g   R# VR8X  d   R# VR
9   d   R# VR9   d   R# VR9   d   R# VR9   d   R# VR9   d   V# VR	8X  d   R# R# )rI   NAAr   r   r   r   r   r   E1>   2Er   EEW2>   3Er   EEE>   r   4EE4EEEE>   r   M>   r   r   r   r   )r    rM   upper)rS   rP   s   & r1   normalize_widthra   S   s~    	R &&(..0E}((##))
$$}r0   c                    V ^8  d   QhRRRR/# )rD   style_wd_sizer    rE   z4Tuple[Optional[str], Optional[float], Optional[str]]r)   )rF   s   "r1   rG   rG   h   s      s /c r0   c                h   \         P                  ! R R\        T ;'       g    R4      P                  4       P	                  4       4      pV'       g   R
# \        V4      ^8  d   VR,          P                  4       '       di   VRR P                  4       '       dP   VR,          pV^R p\        VRR 4      R,          p\        V4      ;'       g    T;'       g    Rp\        V4      WE3# \        P                  V4      pV'       g   \        V4      ^8  d   VRR P                  4       '       d   \        VRR 4      R,          pVRR p\         P                  ! RV4      pV'       g   R
# VP                  R4      ;'       g    Rp\        V4      ;'       g    T;'       g    Rp\        VP                  R4      4      WE3# R
# VP                  R4      ;'       g    Rp\        VP                  R4      4      \        VP                  R	4      4      R,          \        V4      ;'       g    T;'       g    R3# )z\s+rI   N:N   Ng      $@r   z^(?P<style>\d+)(?P<width>.*)$widthr!   size)NNN)resubr    rM   r`   lenrN   intra   rQ   STYLE_WD_SIZE_REmatchgroup)	rc   rP   style_digitsrS   rg   	width_keyrn   prefixprefix_matchs	   &        r1   parse_style_wd_sizert   h   s   FF62s=#6#6B7==?EEGHE
5zQ59,,..5:3E3E3G3GRy!BK	5:%#I.DD93C3C	|,d==""5)Eu:?uRSz1133uRSz?T)D3BZF88$DfML''$**7399rI'	2HHy7G7GCI"<#5#5g#>?PPG$**IG,-EKK 4'	"88y'7'7C r0   c                    V ^8  d   QhRRRR/# rD   rP   r    rE   r&   r)   )rF   s   "r1   rG   rG      s     ' '# '% 'r0   c                    \        V 4      # r:   )parse_powerbi_numberrP   s   &r1   parse_currencyrz      s    &&r0   c                    V ^8  d   QhRRRR/# rv   r)   )rF   s   "r1   rG   rG      s        r0   c                   \        T ;'       g    R 4      P                  4       pV'       g   R# VP                  RR 4      P                  RR 4      P                  RR4      P                  RR 4      p \        V4      #   \         d     R# i ; i)rI   r5   $,(-))r    rM   replacer&   
ValueError)rP   texts   & r1   rx   rx      sz    u{{!!#D<<R ((b199#sCKKCQSTDT{ s   1
A< <B
Bc                   V ^8  d   QhRR/# )rD   rE   zDict[str, dict]r)   )rF   s   "r1   rG   rG      s       r0   c                    \         P                  4       '       g   / #  \        P                  ! \         P	                  R R7      4      p \        T \        4      '       g   / # / pT P                  4        EF  w  r#\        T\        4      '       d   \        T\        4      '       g   K4  \        T4      pT'       g   KI  TP                  R/ 4      p\        T\        4      '       g   / pR\        TP                  RR4      ;'       g    R4      P                  4       R\        TP                  RR4      ;'       g    R4      P                  4       R\        TP                  RR4      ;'       g    R4      P                  4       R\        TP                  RR4      ;'       g    R4      P                  4       R\        \        TP                  RR4      ;'       g    R4      4      RTP                  4        UUu/ uFF  w  rg\        T\        4      '       g   K  \        T4      \        T;'       g    ^ 4      '       d   ^M^ bKH  	  upp/Y&   EK  	  T#   \
         d    / u # i ; iu uppi )	utf-8encodingr(   r"   rI   r#   r$   r%   r'   )FEATURE_OVERRIDES_PATHis_filejsonloads	read_text	Exception
isinstancer;   itemsr    rQ   getrM   rz   rl   )rawoutr!   payloadr4   r(   keyrP   s           r1   load_feature_overridesr      s   !))++	jj/9979KL c4  	C))+%%%Z-F-F$U+
;;z2.(D))HCFB/5526<<>SWb177R8>>@3w{{5"-334::<SWb177R8>>@^CGR(@(F(FB$GHQYQ_Q_QazQa:3eopsuxey>SEJJQ1Q>Qaz
 &" J-  	( {s)   *I 3I I *I 7I IIc               $    V ^8  d   QhRRRRRR/# )rD   r!   r    r   r;   rE   r)   )rF   s   "r1   rG   rG      s!     9 9 9t 9 9r0   c                *   \        V 4      pV'       g   \        R 4      h\        4       pVP                  R/ 4      p\	        V\
        4      '       g   / pR\        VP                  RR4      ;'       g    R4      P                  4       R\        VP                  RR4      ;'       g    R4      P                  4       R\        VP                  RR4      ;'       g    R4      P                  4       R\        VP                  RR4      ;'       g    R4      P                  4       R\        \        VP                  RR4      ;'       g    R4      4      RVP                  4        UUu/ uFF  w  rV\	        V\        4      '       g   K  \        V4      \        T;'       g    ^ 4      '       d   ^M^ bKH  	  upp/W2&   \        P                  P                  RRR	7       \        P                  \        P                   ! V^RR
7      RR7       RV/W2,          C# u uppi )zStyle is requiredr(   r"   rI   r#   r$   r%   r'   Tparentsexist_ok)indent	sort_keysr   r   r!   )rQ   r   r   r   r   r;   r    rM   rz   r   rl   r   parentmkdir
write_textr   dumps)r!   r   r4   existingr(   r   rP   s   &&     r1   save_feature_overrider      s    'J,--%'H{{:r*Hh%%GKK+11r288:W[["-334::<s7;;ub)//R0668W[["-334::<GKK$<$B$B CDX^^M]vM]zsakloqtau:SXC

OOq:M]vH !!''t'D%%djj!t&T_f%gZ88#788	 ws   !H HH%Hc                   V ^8  d   QhRR/# )rD   rE   r	   r)   )rF   s   "r1   rG   rG      s      4 r0   c                 D   \         P                  R 4       U u. uF  q P                  4       '       g   K  V NK  	  pp V'       g   \        R\          24      h. p. pV Ft  p \        P                  V P                  4      pV'       g   VP                  V 4       K=  VP                  \        P                  ! VP                  ^4      R4      V 34       Kv  	  V'       d%   VP                  R RR7       V^ ,          ^,          # VP                  R RR7       V^ ,          # u up i )*On_Hand_Footwear*.csvzNo inventory export found in %Y%m%dc                    V ^ ,          # r   r)   items   &r1   r<   +find_latest_inventory_csv.<locals>.<lambda>   s    DGr0   Tr   reversec                6    V P                  4       P                  # r:   statst_mtime)paths   &r1   r<   r      s    $))+"6"6r0   )INVENTORY_DIRrglobr   FileNotFoundErrorDATE_REsearchr"   appendr   strptimero   sort)r   
candidatesdatedundatedrn   s        r1   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                    V ^8  d   QhRRRR/# )rD   r   r	   rE   boolr)   )rF   s   "r1   rG   rG      s     
 
D 
T 
r0   c                ~    V P                  R RRR7      ;_uu_ 4       p\        P                  ! V4      p\        VR4       V FH  p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   K?   RRR4       R# 	  RRR4       R#   + '       g   i     R# ; i  \
         d     R# i ; i)r	utf-8-sigrI   r   newlineNc              3  h   "   T F(  p\        T;'       g    R 4      P                  4       x  K*  	  R# 5i)rI   N)r    rM   ).0cells   & r1   	<genexpr>,non_footwear_csv_has_data.<locals>.<genexpr>   s&     ?34s4::2,,..3s   22TF)opencsvreadernextanyOSError)r   handler   rows   &   r1   non_footwear_csv_has_datar      s    YYs["Y==ZZ'F3?3?333?3??? >=  >  >=   sG   B- AB%BBB- BB- B*	$B- *B- -B<;B<c                   V ^8  d   QhRR/# )rD   rE   zOptional[Path]r)   )rF   s   "r1   rG   rG      s       r0   c                    \         P                  4       '       g   R # \         P                  R4       U u. uF  q P                  4       '       g   K  V NK  	  pp V'       g   R # . pV Fv  p \        P                  V P                  4      pV'       g   K,  \        V 4      '       g   K?  VP                  \        P                  ! VP                  ^4      R4      V 34       Kx  	  V'       g   R # V Uu. uF=  p\        P                  V^,          P                  ;'       g    R4      '       g   K;  VNK?  	  ppV'       d%   VP                  R RR7       V^ ,          ^,          # VP                  R RR7       V^ ,          ^,          # u up i u upi )Nz*On_Hand_Non_Footwear*.csvr   rI   c                V    V ^ ,          V ^,          P                  4       P                  3# r   r   r   s   &r1   r<   8find_latest_non_footwear_inventory_csv.<locals>.<lambda>  s    Qa1H1H'Ir0   Tr   c                V    V ^ ,          V ^,          P                  4       P                  3# r   r   r   s   &r1   r<   r     s    a$q',,.*A*A Br0   )NON_FOOTWEAR_INVENTORY_DIRis_dirr   r   NON_FOOTWEAR_DATE_REr   r"   r   r   r   r   ro   NON_FOOTWEAR_COMBINED_NAME_RErn   r   )r   r   r   rn   r   combineds         r1   &find_latest_non_footwear_inventory_csvr      s0   %,,..#=#C#CD`#at#a4eqeqes$$#aJt)+E$++DII6(..h''AA4HI  !&b*G*M*MdSTgllN`N`^`*aHbISWX{1~	JJBDJQ8A;- u  cs   FF.-F
F+Fc                    V ^8  d   QhRRRR/# )rD   liner    rE   z	List[str]r)   )rF   s   "r1   rG   rG   
  s     * *S *Y *r0   c                   \        \        P                  ! V .R R7      4      pV'       d   V^ ,          R8X  d
   VR,          pV'       d   VR,          R8X  d   VRR pV Uu. uF  q"P                  4       NK  	  up# u upi )|)	delimiterrI   rJ   N)r   r   r   rM   )r   r   r   s   &  r1   split_markdown_rowr   
  sc    
szz4&C0
1C
s1v|"g
s2w"}#2h%()STJJLS)))s   !A<c                   V ^8  d   QhRR/# )rD   rE   z)Tuple[Dict[str, StyleFeature], List[str]]r)   )rF   s   "r1   rG   rG     s     B) B)@ B)r0   c                 L
   \         P                  R R7      P                  4       p V  Uu. uF+  qP                  4       P	                  R4      '       g   K)  VNK-  	  pp\        V4      ^8  d   \        R\          24      h\        V^ ,          4      pVR,           Uu. uF  p\        V4      NK  	  ppV Uu. uFa  p\        V4      \        V4      8X  g   K  V'       g   K(  V^ ,          '       g   K9  V^ ,          ^ ,          P                  4       '       g   K_  VNKc  	  pp0 RmpV Uu. uF  qV9  g   K  VNK  	  p	p/ p
V EFh  p\        \        W54      4      p\        VP                  RR4      4      pV'       g   K=  V	 Uu/ uF?  q\        VP                  V4      ;'       g    RP                  4       ;'       g    R4      bKA  	  ppRV9   d5   RV9  d.   VP                  R4      VR&   V	 Uu. uF  qR8X  d   RMTNK  	  p	p\        VVP                  RR4      P                  4       VP                  R	R4      P                  4       VP                  RR4      P                  4       VP                  RR4      P                  4       \!        VP                  R
R4      4      VR7      W&   EKk  	  \#        4       pVP%                  4        EFW  w  ppV
P                  V4      p\        V'       d   VP&                  M/ 4      pVP)                  VP                  R/ 4      4       \        T\+        TP                  RV'       d   VP,                  MR4      4      \+        TP                  RV'       d   VP.                  MR4      4      \+        TP                  RV'       d   VP0                  MR4      4      \+        TP                  RV'       d   VP2                  MR4      4      \5        TP                  RV'       d   VP6                  MR4      ;'       g    R4      VR7      W&   EKZ  	  . p\9        4       pV	 F9  pVR8X  d   RMTpVV9   d   K  VP;                  V4       VP=                  V4       K;  	  VP?                  4        F`  pVP                  R/ 4      PA                  4        F9  pVR8X  d   RMTpVV9   d   K  VP;                  V4       VP=                  V4       K;  	  Kb  	  R F  pVV9  g   K  VP=                  V4       K  	  V
V3# u upi u upi u upi u upi u upi u upi )r   r   r   z$Could not parse markdown table from :rD   NNStyle #NameURLImageBrandPricerI   rL   z
Safety ToeAny Safety Toe)r!   r"   r#   r$   r%   r'   r(   r(   r"   r#   r$   r%   r'   r5   >   r   r   r   r   r   r   )Heritage
Resoleable)!SCRAPE_PATHr   
splitlinesrM   
startswithrk   r   r   rN   r;   ziprQ   r   rl   popr   rz   r   r   r(   updater    r"   r#   r$   r%   r&   r'   rB   addr   valueskeys)	raw_linesr   table_linesheadersfeature_rowsr   rowscoreheaderfeature_namesfeature_maprecordr4   r"   r(   	overridesoverrider   merged_featuresdeduped_featuresseenmappedfeature_namerequired_features                           r1   load_featuresr    sH   %%w%7BBDI$-NID1H1H1M44IKN
;!?}MNN Q0G9DRI&t,LI'o<C3s8s7|+CCCPSTUPVPVC[^_`[abc[d[l[l[nCC<Do@D*1H'45GVV'MH+-Kc''($VZZ	2%>?
TabTaD#vzz$/663==?F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Y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sS   &TTT5TTT0!TT&T3T !T"T:T-T!c                    V ^8  d   QhRRRR/# )rD   csv_pathr	   rE   Dict[str, InventoryAggregate]r)   )rF   s   "r1   rG   rG   X  s      T &C r0   c                   / pV P                  R RRR7      ;_uu_ 4       p\        P                  ! V4      pRVP                  ;'       g    . 9  g   RVP                  ;'       g    . 9  d   \	        RVP                   24      hV EF  p\        VP                  RR4      4      P                  4       pV'       d   V^ ,          P                  4       '       g   KT  \        V4      pRpRpVP                  R4      '       d$   \        VR,          4      w  rpV	'       d   T	pT
pTp\        VP                  R^ 4      4      pVP                  V\        VR	7      4      pV;P                  V,          un        VP                  P!                  V4       V;P"                  \%        VP                  R
R4      4      ,          un        V;P&                  \%        VP                  RR4      4      ,          un        Vf   EKs  V'       g   EK~  VP(                  P                  V/ 4      p\+        VP                  VR4      4      V,           W&   EK  	  RRR4       V#   + '       g   i     T# ; i)r   r   rI   r   StyleQtyz(Inventory CSV missing required columns: NStyleWdSizer4   CostExtCostr5   )r   r   
DictReader
fieldnamesr   r    r   rM   rN   rQ   rt   rx   
setdefaultr3   r6   r8   r   r@   rz   rA   r?   r&   )r  
aggregatesr   r   r   	raw_styler4   rg   rq   parsed_styleparsed_sizeparsed_widthqtyaggcurrents   &              r1   load_inventoryr$  X  s   02J	s["	=	='6,,223uVEVEVE\E\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'   AI%A2IDI9IAII$	c               $    V ^8  d   QhRRRRRR/# )rD   targetr  sourcerE   r)   )rF   s   "r1   rG   rG   x  s&      )) #r0   c           	        VP                  4        EF?  w  r#V P                  V\        VR 7      4      pV;P                  VP                  ,          un        VP                  P                  VP                  4       V;P                  VP                  ,          un        V;P                  VP                  ,          un        VP                  P                  4        Fq  w  rVVP                  P                  V/ 4      pVP                  4        F<  w  r\        VP                  VR4      4      \        T	;'       g    R4      ,           Wx&   K>  	  Ks  	  EKB  	  V # )r  r5   )r   r  r3   r6   r8   r   r@   rA   r?   r&   r   )
r&  r'  r4   incomingr"  rg   	width_mapr#  rf   r!  s
   &&        r1   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 !/ Mr0   c               $    V ^8  d   QhRRRRRR/# )rD   r  r	   existing_inventoryz$Dict[str, InventoryAggregate] | NonerE   r  r)   )rF   s   "r1   rG   rG     s&     * **<* #*r0   c                   / pV P                  R RRR7      ;_uu_ 4       p\        P                  ! V4      pV EF|  p\        VP	                  RR4      ;'       g    R4      P                  4       P                  4       pVR8w  d   KN  \        VP	                  RR4      4      P                  4       pV'       d   V^ ,          P                  4       '       g   K  \        V4      pRp	Rp
VP	                  R4      '       d$   \        VR,          4      w  rpV'       d   TpTp	Tp
T;'       g    / P	                  V4      pVeU   V	eF   V
'       d>   \        VP                  P	                  V	/ 4      P	                  V
R	4      4      ^ 8  d   EKO  V	e   V
f   EKZ  \        VP	                  R
^ 4      4      pVP                  V\        VR7      4      pV;P                  V,          un        VP                   P#                  V4       V;P$                  \'        VP	                  RR4      4      ,          un        V;P(                  \'        VP	                  RR4      4      ,          un        V	f   EK0  V
'       g   EK;  VP                  P                  V	/ 4      p\        VP	                  V
R	4      4      V,           VV
&   EK  	  RRR4       V#   + '       g   i     T# ; i)r   r   rI   r   Categoryfootwearr  Nr  r5   r  r  r  r  )r   r   r  r    r   rM   lowerrN   rQ   rt   r&   r?   rx   r  r3   r6   r8   r   r@   rz   rA   )r  r-  r  r   r   r   categoryr  r4   rg   rq   r  r  r   r   r!  r"  r#  s   &&                r1   *load_mixed_non_footwear_footwear_inventoryr3    sI    13J	s["	=	='C377:r28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*0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 s3   :KA9KAK(!K
DK(K3AKK	c                    V ^8  d   QhRRRR/# )rD   r  r	   rE   zDict[str, float]r)   )rF   s   "r1   rG   rG     s     
 
D 
-= 
r0   c           
        / pV P                  R RRR7      ;_uu_ 4       p\        P                  ! V4      pV F  p\        VP	                  RR4      4      P                  4       pV'       d   V^ ,          P                  4       '       g   KS  \        V4      p\        VP	                  VR4      4      \        VP	                  R^ 4      4      ,           W&   K  	  RRR4       V#   + '       g   i     T# ; i)r   r   rI   r   r  r5   r  N)
r   r   r  r    r   rM   rN   rQ   r&   rx   )r  totalsr   r   r   r  r4   s   &      r1   load_inventory_totalsr7    s    !F	s["	=	='CCGGGR01779IIaL$8$8$:$:(3J!&vzz*c'B!CFZ[^[b[bchjk[lFm!mF  
> M 
>	= Ms   A)C!	AC!!C2	c                    V ^8  d   QhRRRR/# )rD   r  r	   rE   z(Dict[str, Dict[float, Dict[str, float]]]r)   )rF   s   "r1   rG   rG     s      4 ,T r0   c           	        / pV P                  R RRR7      ;_uu_ 4       p\        P                  ! V4      pV EF  p\        VP	                  RR4      4      P                  4       pV'       d   V^ ,          P                  4       '       g   KT  \        V4      pRpRpVP	                  R4      '       d$   \        VR,          4      w  rpV	'       d   T	pT
pTpVe   Vf   K  \        VP	                  R^ 4      4      pVP                  V/ 4      pVP                  \        V4      / 4      p\        VP	                  VR4      4      V,           W&   EK  	  RRR4       V#   + '       g   i     T# ; i)	r   r   rI   r   r  Nr  r  r5   )r   r   r  r    r   rM   rN   rQ   rt   rx   r  r&   )r  r   r   r   r   r  r4   rg   rq   r  r  r   r!  	style_mapr*  s   &              r1   load_inventory_sizesr;    s7   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   A*E
CEE+	c                   V ^8  d   QhRR/# )rD   rE   zList[Tuple[datetime, Path]]r)   )rF   s   "r1   rG   rG     s      $? r0   c                 *   . p \         P                  R 4       Fc  p\        P                  VP                  4      pV'       g   K,  V P                  \        P                  ! VP                  ^4      R4      V34       Ke  	  V P                  R RR7       V # )r   r   c                    V ^ ,          # r   r)   r   s   &r1   r<   ,inventory_files_with_dates.<locals>.<lambda>  s    d1gr0   Tr   )
r   r   r   r   r"   r   r   r   ro   r   )r   r   rn   s      r1   inventory_files_with_datesr@    ss    ')C##$<=tyy)

H%%ekk!nh?FG	 >
 HH%tH4Jr0   c                    V ^8  d   QhRRRR/# )rD   r(   zDict[str, StyleFeature]rE   r;   r)   )rF   s   "r1   rG   rG     s     M M!8 MT Mr0   c                V   \        4       p\        V4      ^8  d   RRRR/# V^ ,          w  r#V\        ^R7      ,
          pRpRpVR,           F  w  rxWt8:  g   K  TpTp M	  Vf   V^,          w  rV\        V4      p	\        V4      p
\	        V4      p\	        V4      p. p\        \        V	4      \        V
4      ,          R R	7       EF#  p\        V
P                  VR
4      4      p\        V	P                  VR
4      4      pVV,
          p\        V4      R8  d   KU  . p. p/ pVP                  V/ 4      pVP                  V/ 4      p\        \        V4      \        V4      ,          4       EF	  pVP                  V/ 4      pVP                  V/ 4      p\        \        V4      \        V4      ,          4       F  p\        VP                  VR
4      4      \        VP                  VR
4      4      ,
          p\        V4      R8  d   KP  \        V4       R\        P                  VV4       2pVVV&   V^ 8  d   VP                  V RVR 24       K  VP                  V R\        V4      R 24       K  	  EK  	  V P                  V4      pTP                  RTRV'       d   VP                  MRRV'       d   VP                  MRRTRTRTRTRTRTRV'       d   VP                  MR/
4       EK&  	  VP!                  R RR7       RRRVP                  R VP#                  4       P%                  4       R!VP                  R"V'       d   VP#                  4       P%                  4       MRR#TR$V UUu. uF1  w  rxR%VP#                  4       P%                  4       R&VP                  /NK3  	  upp/# u uppi )'rD   	availableFmessagez&Not enough dated inventory CSVs found.)daysNrJ   c                H    V P                  4       '       d   \        V 4      # T # r:   rN   rl   ry   s   &r1   r<   $build_diff_payload.<locals>.<lambda>  s/    jojwjwjyjy\_`e\f  ]E  @E  ]Er0   r   r5   &.> :gr!   r"   r   r#   HERITAGEsoldQtyprevQtycurrQty	soldSizesincomingSizessizeDeltaMap
productUrlrI   c                J    \        \        V R ,          4      4      V R,          3# )rO  r!   )absr&   )r   s   &r1   r<   rH  )  s    s5Y#893w<Hr0   Tr   currentFilecurrentDatepreviousFilepreviousDater   fileHistorydatefile)r@  rk   r   r7  r;  sortedrB   r&   r   rW  format_sizeWIDTH_DISPLAYr   r"   r#   r$   r   r]  	isoformat)r(   files
current_dtcurrent_path	target_dtprevious_dtprevious_pathdtr   current_totalsprevious_totalscurrent_sizesprevious_sizesr   r4   prev_qtycurr_qtysold_qty
sold_partsincoming_partssize_delta_mapprev_size_mapcurr_size_maprg   prev_widthscurr_widthsrf   deltalabelfeatures   &                             r1   build_diff_payloadr{    s   &(E
5zA~UI/WXX$QxJYA..IKM"II?K M	 
 %*1X"*<8N+M:O(6M)-8NDS033GG  NF  G  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'z888ZWgkk"	
7 GT 	IIHRVIWT|((z(224**+((*4462!
! RWWY((*FDII>!
 
s   )7N% c                   V ^8  d   QhRR/# rD   rE   r;   r)   )rF   s   "r1   rG   rG   8  s      t r0   c                    \         P                  4       '       g   R RRR/# \        P                  ! \         P	                  RR7      4      p \        V P                  R4      ;'       g    . 4      p\        V P                  R4      ;'       g    . 4      pR RR	\        V4      R
VR,          R\        V4      RVR,          R\         P                  RR/# )rC  FrD  zVoucher scan cache not found.r   r   completed_termsseen_accountsTcompletedTermCountcompletedTermsPreview:Nx   NaccountCountaccountPreview
sourceFilenoteszThe source folder currently exposes scraper/cache artifacts, not the voucher markdown records used by the desktop preview pane.)	VOUCHER_SCAN_PATHr   r   r   r   listr   rk   r"   )r   r  r  s      r1   build_voucher_payloadr  8  s    $$&&UI/NOOjj*44g4FGG7;;'89??R@O_5;;<MTc/2!6M*--',,  S r0   c                    V ^8  d   QhRRRR/# )rD   rP   r&   rE   r    r)   )rF   s   "r1   rG   rG   I  s     Q Qu Q Qr0   c                r    \        V \        V 4      ,
          4      R 8  d   \        \        V 4      4      # V R # )rJ  rM  )rW  roundr    rl   ry   s   &r1   r`  r`  I  s.    !%%,"67$>3s5z?PuQiPr0   c                    V ^8  d   QhRRRR/# )rD   r?   r>   rE   r    r)   )rF   s   "r1   rG   rG   M  s      ;  r0   c           	     >   . p\        V 4       Fw  pW,          p\         Uu. uF  qCP                  V^ 4      ^ 8  g   K  VNK  	  ppV'       g   KB  VP                  \	        V4       RRP                  R V 4       4       24       Ky  	  RP                  V4      # u upi )r   rL  r~   c              3  L   "   T F  p\         P                  W4      x  K  	  R # 5ir:   )ra  r   )r   rf   s   & r1   r   "format_size_map.<locals>.<genexpr>T  s!     4qbpY^]5F5Fu5T5Tbps   "$z  )r_  WIDTH_ORDERr   r   r`  join)r?   partsrg   widthsrf   matched_widthss   &     r1   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                    V ^8  d   QhRRRR/# )rD   r?   r>   rE   zDict[str, Dict[str, float]]r)   )rF   s   "r1   rG   rG   X  s      !> C^ r0   c                H   / p\        V 4       F  pW,          p\         Uu/ uF$  qCP                  V^ 4      ^ 8  g   K  WCV,          bK&  	  ppVP                  4        UUu/ uF  w  rFWE9  g   K  V^ 8  g   K  WFbK  	  ppp/ VCVCV\	        V4      &   K  	  V# u upi u uppi r   )r_  r  r   r   r`  )r?   
serializedrg   r  rf   orderedr!  extrass   &       r1   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8Bc               $    V ^8  d   QhRRRRRR/# )rD   warningsz
List[dict]limitrl   rE   r;   r)   )rF   s   "r1   rG   rG   b  s!      z # t r0   c                b   . pV  EF  p\        V\        4      '       g   K  \        VP                  R 4      ;'       g    R4      P	                  4       pV'       g   KX  TP                  R\        VP                  R4      ;'       g    R4      P	                  4       ;'       g    RR\        VP                  R4      ;'       g    R4      P	                  4       R\        VP                  R4      ;'       g    R4      P	                  4       R V/4       EK  	  R\        V4      RVR\        ^V4       /# )	rD  rI   severitywarningcoder!   warningCountr  N)r   r;   r    r   rM   r   rk   max)r  r  cleanedr  rD  s   &&   r1   build_validation_payloadr  b  s    G'4((gkk),22399;CJ 7 D D9EKKMZZQZGKK/5526<<>W[[177R8>>@7		
  	GGOc!Um, r0   c                   V ^8  d   QhRR/# r}  r)   )rF   s   "r1   rG   rG   x  s     m mt mr0   c                 X   \        4       p \        4       w  r\        V 4      p\        4       pV'       d   \	        V\        WC4      4      p\        P                  V P                  4      pR pV'       dC   \        P                  ! VP                  ^4      R4      P                  4       P                  4       p\        \        V4      \        V4      ,          R R7      p. p^ p	^ p
. pV EF  pVP!                  V4      pVP!                  V\#        VR7      4      pVP$                  ^ 8  d   V	^,          p	M	V
^,          p
\'        R VP(                  P+                  4        4       4      pVP(                  '       d_   \-        T\/        VP$                  ;'       g    R4      ,
          4      R8  d+   VP1                  RR	R
VRRVR RVP$                  R R2/4       VP$                  ^ 8  d   Vf   VP1                  RRR
VRR/4       VP$                  ^ 8  d.   Ve*   VP2                  '       g   VP1                  RRR
VRR/4       VP$                  ^ 8  d.   Ve*   VP4                  '       g   VP1                  RRR
VRR/4       TP1                  R
TRV'       d   VP                  MRRV'       d   VP6                  MRRV'       d   VP2                  MRRV'       d   VP4                  MRRV'       d   VP8                  MRRVP$                  R\        VP:                  4      R \=        VP(                  4      R!\?        VP(                  4      R"V'       d   VP@                  M/ R#VR J R$V'       d	   W9   d   R%MV'       d   R&MR'/4       EK  	  R(R)V P                  R*VR+\C        \D        4      R,\        PF                  ! 4       P                  R-R.7      R/R0\I        V4      R1V	R2V
/R3\K        V4      /R4R5\L        R6\N        R7VR8\P        R9\R        R:R;. RBOR. RCOR<R=R>.R?\P        //R0VR@\U        4       RA\W        V4      /# )DNr   c                H    V P                  4       '       d   \        V 4      # T # r:   rG  ry   s   &r1   r<   build_payload.<locals>.<lambda>  s     Y^YfYfYhYh3u:KsnsKsr0   rI  r  c              3  x   "   T F0  qP                  4        F  p\        T;'       g    R 4      x  K  	  K2  	  R# 5i)r5   N)r   r&   )r   r*  r!  s   &  r1   r    build_payload.<locals>.<genexpr>  s2     p<Qy]m]m]oVYszzc**]o*<Qs   $::r5   gMbP?r  inventory_size_total_mismatchr!   rD  zSize map total rM  z does not match style quantity . 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   r#   rN  rU  rI   r%   r'   quantity	rawStylessizesDisplaysizeMapr(   
isHeritager'  zinventory+scrapescrape	inventorymetainventoryCsvinventoryAsOf
sourceRootgeneratedAtseconds)timespeccountsstylesinventoryStyleszeroQtyStyles
validationr   
widthOrderwidthDisplayfeatureNamesheightOptionsheritageLabelorGroupstoegenderMaleFemaleheightvoucherinventoryDiff)r   zSoft Toez	Steel ToezNon-Metallic ToezAluminum Toe)zRed WingzIrish SetterWorxr   ),r   r  r$  r   r+  r3  r   r   r"   r   r   ro   r]  rb  r_  rB   r   r3   r6   sumr?   r   rW  r&   r   r$   r%   r#   r'   r8   r  r  r(   r    SOURCE_ROOTnowrk   r  r  ra  HEIGHT_OPTIONSHERITAGE_LABELr  r{  )inventory_csvr(   r  r  non_footwear_inventory_csvinventory_date_matchinventory_as_of
all_stylesr  inventory_countzero_qty_countvalidation_warningsr4   rz  r"  
size_totals                   r1   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==3G3GC-H HIEQ&&;ZA>]^a^k^klm]nnop ==1&&>Z ==1!4W[[[&&3ZM ==1!4W]]]&&5ZO 	Z'zWgkk"'r'sCMMVCNN3 =-cll;G,,RgoJ<S,fmZbs~	
Q !v 	M.._#k*8<<>33Y3G#f+!?
 23FG
 	+MM^^fI68,.	
 	&(*+H59 r0   c                   V ^8  d   QhRR/# )rD   rE   Noner)   )rF   s   "r1   rG   rG     s     T Td Tr0   c                    \         P                  P                  R R R7       \        4       p \         P	                  \
        P                  ! V ^R7      RR7       \        R\          RV R,          R,          R	,           R
24       R# )Tr   )r   r   r   zWrote z with r  r  r  z stylesN)OUTPUT_PATHr   r   r  r   r   r   print)r   s    r1   mainr    sf    TD9oG4::ga87K	F;-vgfoh&?&I%J'
RSr0   __main__)	r   r   r   r   r   r   r   r   r   )zOxford/AthleticChukkaHikerz5"z6"z7"z8"z9"z10"z11"z12"r:   )   )E
__future__r   r   r   ri   collectionsr   dataclassesr   r   r   r   pathlibr	   typingr
   r   r   r   __file__resolver   ROOTr  r   r   r   r  r  r   compile
IGNORECASEr   r   r   rm   r  ra  r  r  r   r3   rQ   ra   rt   rz   rx   r   r   r   r   r   r   r  r$  r+  r3  r7  r;  r@  r{  r  r`  r  r  r  r  r  r*   r)   r0   r1   <module>r     s   " 
  	 # ( (  . .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@"*Z
4M`"Q,m`T zF r0   