+
    Hci V                    J   R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H	t	H
t
 ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIt^ RIHtHtHt ^ R	IHt ^ R
IHt  ^ RIHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t) ]! ],4      P[                  4       P\                  t/]/R,          t0]/R,          t1Rt2Rt3] ! R R4      4       t4R R lt5 ! R R]Pl                  4      t7 ! R R4      t8R R lt9]:R8X  d   ];! ]9! 4       4      hR#   ]* d     ^ RI+HtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)  Li ; i)a:  Unified GUI voucher scraper.

Features:
- Pull one URL
- Pull by search term
- Pull all accounts
- Run 1..25 workers with live monitoring
- Edit voucher_scanned_accounts.json
- Save voucher results directly into the ALL folder as markdown files

Runs on Linux/Windows with Python + Selenium + Firefox/Geckodriver.
)annotationsN)	dataclass)datetimetimezone)Path)DictListOptionalSequence)urljoin)
filedialog
messageboxttk)ScrolledText)By)_safe_fs_componentbuild_driverdrop_hidden_product_columnsextract_all_datatable_rowsextract_program_summary_blockfilter_accounts_termfind_table_by_headers"get_account_name_from_summary_spanget_account_program_linksget_all_accounts_from_resultslogin#parse_company_information_from_textzvoucher_scanned_accounts.jsonALLzFhttps://portal.redwingforbusiness.com/RWS_AccountsListPage?tab=accountc                  @    ] tR t^Ht$ R]R&   R]R&   R]R&   R]R&   RtR# )VoucherRecordstrrel_pathfoldernamecontent N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r%       Voucher_List_Scraper.pyr   r   H   s    MK
ILr,   r   c               (    V ^8  d   QhRRRRRRRR/# )   account_urlr    program_urlprogram_namereturnr%   )formats   "r-   __annotate__r5   P   s*     1# 1# 1#3 1#VY 1#^a 1#r,   c                   V P                  V4       \        P                  ! R 4       \        V 4      pV'       g,    V P	                  \
        P                  R4      P                  p\        V RR.4      pV'       g#   \        V R.4      ;'       g    \        V R.4      p. p. pV'       d   \        W4      w  rg\        Wg4      w  rg. pVP                  RV 24       VP                  R4       VP                  RV 24       VP                  RV 24       VP                  R	\        P                  ! \        P                   4      P#                  R
R7       24       VP                  R4       VP                  R4       VP                  R4       TP                  T;'       g    R4       VP                  R4       VP                  R4       VP                  R\%        V4       R24       V'       Ed!   V'       Ed   VP                  R4       VP                  RP'                  R V 4       4      4       V F  p	V	 U
u. uF.  q;'       g    RP)                  RR4      P)                  RR4      NK0  	  pp
\%        V4      \%        V4      8  d+   VR.\%        V4      \%        V4      ,
          ,          ,          p\%        V4      \%        V4      8  d   VR\%        V4       pVP                  RP'                  V4      4       K  	  VP                  R4       MVP                  R4       RP'                  V4      R,           #   \         d    Rp ELi ; iu up
i )333333?body StylezProduct NameProductz# - **Account URL**: z- **Program URL**: - **Scraped UTC**: secondstimespecz## Program Summary```text```z## Product List (all rows) - z rowsz```csv,c              3  D   "   T F  qP                  R R4      x  K  	  R# 5i)rC   ;N)replace).0hs   & r-   	<genexpr>*_build_program_markdown.<locals>.<genexpr>u   s     C7aiiS117s    
 rE   Nz&_No product table found (or no rows)._)gettimesleepr   find_elementr   TAG_NAMEtext	Exceptionr   r   r   appendr   nowr   utc	isoformatlenjoinrF   )driverr0   r1   r2   summarytable_idheadersrowslinesrowccleans   &&&&        r-   _build_program_markdownrc   P   s   
JJ{JJsO+F3G	))"++v>CCG %Vg~-FGH(';ii?TU[^g]h?iGD26D3GBE	LL2l^$%	LL	LL&{m45	LL&{m45	LL&x||HLL'A'K'KU^'K'_&`ab	LL	LL%&	LL	LLB	LL	LL	LL0T5ABw44XSXXC7CCDCMPQSgg2&&tS199#sCSEQ5zCL("WE
!:;;5zCL(nG-LL%)  	U=>99Ud""S  	G	> Rs   *L9 :M'M9M
	M
c                  :   a  ] tR t^tR V 3R lltR R ltRtV ;t# )
FileWriterc               (    V ^8  d   QhRRRRRRRR/# )	r/   output_rootr   in_qz&'queue.Queue[Optional[VoucherRecord]]'log_qz'queue.Queue[tuple]'r3   Noner%   )r4   s   "r-   r5   FileWriter.__annotate__   s+      D 0V _s x| r,   c                	Z   < \         SV `  R R7       Wn        W n        W0n        ^ V n        R# )T)daemonN)super__init__rg   rh   ri   saved)selfrg   rh   ri   	__class__s   &&&&r-   ro   FileWriter.__init__   s*    %&	

r,   c                   V ^8  d   QhRR/# r/   r3   rj   r%   )r4   s   "r-   r5   rk      s     < <T <r,   c                	N   V P                   P                  R R R7         V P                  P                  4       pVf   V P                  P	                  4        M\
        P                  ! VP                  P                  R4       Uu. uF  q"'       g   K  VNK  	  up!  pVP                  P                  R R R7       TP                  VP                  ;'       g    RRR7       V ;P                  ^,          un        V P                  P                  RV P                  VP                  34       V P                  P	                  4        EK,  V P                  P                  RV P                  R34       R# u upi   T P                  P                  RT P                  R34       i ; i)	T)parentsexist_okN/r9   utf-8encodingrp   writer_done)rg   mkdirrh   rM   	task_doneBASE_DIRjoinpathr!   splitparent
write_textr$   rp   ri   put)rq   recpartout_paths   &   r-   runFileWriter.run   s2   td;	<iimmo;II'')#,,@R@RSV@W.`@W[_tt@W.`a%%dT%B##CKK$5$52#H

a


S\\BC		##%JJNNM4::r:; /a JJNNM4::r:;s+   A'E: 	E5E5?E: A1E: 5E: :*F$)rh   ri   rg   rp   )r&   r'   r(   r)   ro   r   r+   __classcell__)rr   s   @r-   re   re      s     < <r,   re   c                     ] tR t^tR R ltR R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR' R( ltR)tR*# )+VoucherScraperGUIc                    V ^8  d   QhRRRR/# )r/   rootztk.Tkr3   rj   r%   )r4   s   "r-   r5   VoucherScraperGUI.__annotate__   s      U t r,   c                	"   Wn         V P                   P                  R 4       V P                   P                  R4       \        P                  ! 4       V n        \        P                  ! RR7      V n        \        P                  ! 4       V n        \        P                  ! 4       V n
        RV n        . V n        RV n        ^ V n        ^ V n        ^ V n        ^ V n        / V n        V P'                  4        V P)                  4        V P+                  4        R# )zRW Voucher File Scraper1300x860i  )maxsizeN)r   titlegeometryqueueQueueri   write_qtask_q	threadingEvent
stop_eventwriterworkers
dispatchertotal_taskscompleted_tasksfailed_tasks
saved_rowsworker_states	_build_ui_load_json_file
_pump_logs)rq   r   s   &&r-   ro   VoucherScraperGUI.__init__   s    			12		:&+0;;=
?D{{SV?W,1KKM#//+,0/16: -/r,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r      s     F F4 Fr,   c           	     	   \         P                  ! V P                  ^R7      pVP                  RR7       \        P
                  ! RR7      V n        \         P                  ! VRR7      P                  ^ ^ RR	7       \         P                  ! VR
V P                  RV P                  R7      P                  ^ ^RR	7       \         P                  ! VRV P                  RV P                  R7      P                  ^ ^RR	7       \         P                  ! VRV P                  RV P                  R7      P                  ^ ^RR	7       \        P
                  ! 4       V n        \        P
                  ! RR7      V n        \        P                  ! RR7      V n        \        P                  ! ^R7      V n        \         P                  ! VRR7      P                  ^^ RR	7       \         P"                  ! WP                  ^xR7      V n        V P$                  P                  ^^^RRDR7       \         P                  ! VRR7      P                  ^^ RR	7       \         P"                  ! WP                  ^(R7      V n        V P&                  P                  ^^RRDR7       \         P(                  ! VRV P                  R7      P                  ^^RRER7       \         P                  ! VRR7      P                  ^^RR	7       \         P*                  ! V^^V P                   ^R7      V n        V P,                  P                  ^^RRDR7       \         P.                  ! VRV P0                  R7      V n        V P2                  P                  ^^RRFR7       \         P.                  ! VR V P4                  R!R"7      V n        V P6                  P                  ^^RRFRFR#7       \        P
                  ! R$\8         2R7      V n        \         P                  ! WP:                  R%7      P                  ^^^RRFRGR&7       \=        ^4       F  pTP?                  Y"RH9   d   ^M^ R'7       K   	  \         P@                  ! V P                  R(R)7      pVP                  R*R^^R+7       \         P                  ! V^R7      p\         P                  ! V^R7      pVPC                  V^R'7       VPC                  V^R'7       \         P                  ! VR,R7      P                  RR-7       \         PD                  ! VRIR/^R07      V n#        V PF                  PI                  R.R1R7       V PF                  P                  RR7       \        P
                  ! R2R7      V n%        \         P                  ! W@PJ                  R%7      P                  RRFR37       \         P                  ! VR4R7      P                  RRFR37       \M        V^R5R67      V n'        V PN                  P                  R*RR77       \         P                  ! VR8R7      P                  RR-7       \         P                  ! V4      pVP                  RRJR97       \         P.                  ! VR:V PP                  R7      P                  R;R<7       \         P.                  ! VR=V PR                  R7      P                  R;RFR>7       \         P.                  ! VR?V PT                  R7      P                  R;RFR>7       \         P.                  ! VR@V PV                  R7      P                  R;RFR>7       \M        VRARB7      V n,        V PX                  P                  R*RR77       V P                  4        RC# )K   )paddingx)fillurl)valuezMode:)rR   w)r`   columnstickyzPull one URL)rR   variabler   commandzPull search termsearchzPull allallaaTzURL:)textvariablewidthew)r`   r   
columnspanr   padxzSearch:)r`   r   r   r   Headless)rR   r   zWorkers (1-25):e)from_tor   r   Start)rR   r   )r`   r   r   padyStopdisabled)rR   r   state)r`   r   r   r   r   Output: )r   )r`   r   r   r   r   r   )weight
horizontal)orientboth)r   expandr   r   Workers)anchorstatusheadings)columnsshowheightStatusIdle)r   r   Logword)r   wrap)r   r   z(voucher_scanned_accounts.json (editable))r   r   z	Load JSONleft)sidez	Save JSON)r   r   zFormat JSONzOpen JSON As...none)r   N)       )   r   )r   r   )   r   >         )r   )r   r   )-r   Framer   packtk	StringVarmode_varLabelgridRadiobutton_refresh_modeurl_varterm_var
BooleanVarheadless_varIntVarworkers_varEntry	url_entry
term_entryCheckbuttonSpinboxworker_spinButtonstart	start_btnstopstop_btn
OUTPUT_DIR
status_varrangecolumnconfigurePanedwindowaddTreeviewworker_treeheadingprogress_varr   log_textr   _save_json_file_format_json_open_json_other	json_text)rq   topimidr   rightbtnss   &      r-   r   VoucherScraperGUI._build_ui   s   ii		1-c51		#G$))a#)F.4==PU_c_q_qrww|}  GH  QTw  	U"4t}}T\fjfxfxy~~  DE  NO  X[~  	\*t}}E[_[m[mnssxy  CD  MPs  	Q||~40MM5991-		#F#((Qq(E3\\M!$VT		#I&++!C+H))Cmm2N1SvF*t7H7HINNST]^gjqxNy		#-.33!C3P;;s!IYIYabc!AcGCgtzzJ!CfE

3VTYYjYq3V&Q,,x
|-DE		#OO499aVW`cjpw~9qAF{!B  oodii=fT:yya(		#q)Qa 		$Y',,C,8<<k
[]^   93'LLv6		$%6%67<<Cf<U		$U#((&(A$T"6Bt4		%HINNVYNZyy		s	(

4k43G3GHMMSYMZ

4k43G3GHMMSY`fMg

4mT5F5FGLLRX_eLf

4/9N9NOTTZ`gmTn%e&95r,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r      s     
8 
8t 
8r,   c                	   V P                   P                  4       P                  4       P                  4       pVR 8X  d;   V P                  P                  RR7       V P                  P                  RR7       R# VR8X  d;   V P                  P                  RR7       V P                  P                  RR7       R# V P                  P                  RR7       V P                  P                  RR7       R# )r   normalr   r   r   N)r   rM   striplowerr   	configurer   )rq   modes   & r-   r   VoucherScraperGUI._refresh_mode   s    }}  "((*0025=NN$$8$4OO%%J%7XNN$$:$6OO%%H%5NN$$:$6OO%%J%7r,   c                    V ^8  d   QhRRRR/# )r/   msgr    r3   rj   r%   )r4   s   "r-   r5   r     s     ! ! ! !r,   c                	    \         P                  ! 4       P                  R 4      pV P                  P	                  RRV RV R24       V P                  P                  R4       R# )z%H:%M:%Send[z] rK   N)r   rU   strftimer  insertsee)rq   r  tss   && r-   _logVoucherScraperGUI._log  sM    \\^$$Z0Uat2cU"$56% r,   c                    V ^8  d   QhRRRR/# )r/   runningboolr3   rj   r%   )r4   s   "r-   r5   r     s     K KD KT Kr,   c                	    V P                   P                  V'       d   R MRR7       V P                  P                  V'       d   RMR R7       R# )r   r  r  N)r   r  r   )rq   r&  s   &&r-   _set_runningVoucherScraperGUI._set_running  s4      Wz( K'hzJr,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r     s     * * *r,   c                	L   \         P                  4       '       g;   V P                  P                  R R4       V P                  P	                  R R4       R# \         P                  RRR7      pV P                  P                  R R4       V P                  P	                  R V4       R# )1.0r  z{}
Nrz   ignorer|   errors)	JSON_PATHexistsr
  deleter   	read_text)rq   txts   & r-   r   !VoucherScraperGUI._load_json_file  sy    !!NN!!%/NN!!%0!!78!DeU+eS)r,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r     s     . . .r,   c                	   V P                   P                  R R4      P                  4       ;'       g    Rp \        P                  ! V4      p\        P                  \        P                  ! T^RR7      R,           RR	7       T P                  R
\         24       R#   \
         d,   p\        P                  ! R\        T4      4        Rp?R# Rp?ii ; i)r-  r  {}Invalid JSONNFindent	sort_keysrK   rz   r{   zSaved JSON: )r
  rM   r  jsonloadsrS   r   	showerrorr    r1  r   dumpsr#  rq   rawobjr   s   &   r-   r  !VoucherScraperGUI._save_json_file  s    nn  .446>>$	**S/C 	TZZAG$NY`a		L,-	  	  Q8	s   B C& CCc                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r   '  s     X Xd Xr,   c           	     	   V P                   P                  R R4      P                  4       ;'       g    Rp \        P                  ! V4      pT P                   P                  R R4       T P                   P                  R \        P                  ! T^RR7      R,           4       R#   \
         d,   p\        P                  ! R\        T4      4        Rp?R# Rp?ii ; i)r-  r  r9  r:  NFr;  rK   )r
  rM   r  r>  r?  rS   r   r@  r    r3  r   rA  rB  s   &   r-   r  VoucherScraperGUI._format_json'  s    nn  .446>>$	**S/C 	eU+eTZZA%ORV%VW	  	  Q8	s   B$ $C/ CCc                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r   1  s     * *$ *r,   c                	   \         P                  ! \        \        4      RR	.R7      pV'       g   R# \	        V4      P                  RRR7      pV P                  P                  RR4       V P                  P                  RV4       R# )
JSON)
initialdir	filetypesNrz   r.  r/  r-  r  )rK  z*.json)All*)	r   askopenfilenamer    r   r   r4  r
  r3  r   )rq   pathr5  s   &  r-   r	  "VoucherScraperGUI._open_json_other1  sf    ))S]OacoNpq4j""GH"EeU+eS)r,   c                    V ^8  d   QhRRRR/# )r/   termzOptional[str]r3   List[tuple]r%   )r4   s   "r-   r5   r   9  s       ; r,   c           	     	   \        V P                  P                  4       R 7      p \        V4       VP                  \        4       \
        P                  ! R4       \        Y!;'       g    R4       \        V4      pV UUu. uFP  w  rEVP                  '       g   K  R\        VP                  VP                  4      VP                  ;'       g    R3NKR  	  pppVVP                  4        # u uppi   TP                  4        i ; i)headlessg?r9   account)r   r   rM   r   	LOGIN_URLrN   rO   r   r   hrefr   current_urlrR   quit)rq   rT  rZ   accountsa_rowtaskss   &&     r-   _queue_account_tasks&VoucherScraperGUI._queue_account_tasks9  s    t'8'8'<'<'>?		&MJJy!JJsO 44V<HckvckX_XYopououSi););QVV!DaffllPRSckEvKKM w KKMs*   AC2 C,2C,C,C2 ,C2 2Dc                    V ^8  d   QhRRRR/# )r/   r   r    r3   rU  r%   )r4   s   "r-   r5   r   F  s     * *c *k *r,   c                	*    R VP                  4       R3.# )r   r9   )r  )rq   r   s   &&r-   _pull_one_url_task$VoucherScraperGUI._pull_one_url_taskF  s    		R())r,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r   I  s     "  " t " r,   c           
     	   V P                   '       d#   V P                   P                  4       '       d   R # \        ^\        ^\	        V P
                  P                  4       ;'       g    ^4      4      4      pV P                  P                  4       P                  4       P                  4       pVR8X  dK   V P                  P                  4       P                  4       pV'       g   \        P                  ! RR4       R # MRp^ V n        ^ V n        ^ V n        ^ V n        V P"                  P%                  4        V P&                  P(                  ! V P&                  P+                  4       !   \-        ^V^,           4       F-  p\/        V4      pV P&                  P1                  RRVR
R7       K/  	  V P2                  P%                  4        V P5                  R4       V P6                  P9                  R4       \;        \<        V P>                  V P@                  4      V n!        V PB                  PE                  4        \F        PH                  ! V PJ                  W#V3RR	7      V n         V P                   PE                  4        R # )Nr   zMissing URLzEnter one URL.r9   r  )iidvaluesTzPreparing...targetargsrm   )idle)&r   is_alivemaxminintr   rM   r   r  r  r   r   r@  r   r   r   r   r   clearr  r3  get_childrenr   r    r   r   r)  r  setre   r   r   ri   r   r   r   Thread	_dispatch)rq   r   r  r   widrj  s   &     r-   r   VoucherScraperGUI.startI  s   ???t7799aRT%5%5%9%9%;%@%@q!ABC}}  "((*0025=,,""$**,C$$]4DE  C   "!1!1!>!>!@AGaK(Cc(C##B3y#I ) 	$n- T\\4::F#**$..SZG[dhir,   c                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r   m  s     % %d %r,   c                	\    V P                   P                  4        V P                  R 4       R# )zStop requested.N)r   rv  r#  )rq   s   &r-   r   VoucherScraperGUI.stopm  s    		#$r,   c               (    V ^8  d   QhRRRRRRRR/# )r/   r  r    r   r   rs  r3   rj   r%   )r4   s   "r-   r5   r   q  s(     $# $#c $# $#c $#d $#r,   c           	     	    VR 8X  d   V P                  V4      pMPVR8X  d9   V P                  V P                  P                  4       P	                  4       4      pMV P                  R4      pV'       g9   V P
                  P                  R4       V P                  P                  R4       R# \        V4      V n	        V P
                  P                  RRV P                   R2R34       V F  pV P                  P                  V4       K   	  \        ^V^,           4       Uu. uF'  p\        P                  ! V P                  V3RR	7      NK)  	  upV n        V P                   F  pVP!                  4        K  	  V P                   F  pVP#                  4        K  	  V P                  P                  R4       V P$                  '       d   V P$                  P#                  4        V P
                  P                  RV P&                  V P(                  34       R# u upi   \*         dH   pT P
                  P                  R
RT 2R34       T P                  P                  R4        Rp?R# Rp?ii ; i)r   r   r9   doneNinfozQueued z tasksTrl  errorzDispatcher error: )r  r   r   )rf  rb  r   rM   r  ri   r   r   rX   r   r   r   r   rw  _worker_loopr   r   rY   r   r   r   rS   )rq   r  r   r   ra  try  r   s   &&&&    r-   rx  VoucherScraperGUI._dispatchq  s   #	#u}//4!11$--2C2C2E2K2K2MN11"5

~.  &"5zDJJNNFgd.>.>-?v$FKL" 
 !GaK00C   (9(9tT0DL \\	 "\\ " LLT"{{{  "JJNNFD$8$8$:K:KLM  	#JJNNG'9!%=rBCLLT""	#s?   A0H 36H +A5H  -HA:H AH H I-&<I((I-c                    V ^8  d   QhRRRR/# )r/   ry  rs  r3   rj   r%   )r4   s   "r-   r5   r     s     ) ) ) )r,   c           
     	   V P                   P                  R VR34       Rp \        V P                  P	                  4       R7      p\        V4       V P                   P                  R VR34       V P                  P                  4       '       Eg2    V P                  P                  4       w  r4pT P                   P                  R TRTR,           234       Rp TR8X  d   T P                  Y$4       MT P                  Y$4       R	pT'       dM   T ;P                  ^,          un        T P                   P                  RT P                  T P                   34       MKT ;P                   ^,          un        T P                   P                  RT P                  T P                   34       T P                  P#                  4        EKR  V P                   P                  R VR34       Ve    VP%                  4        R# R#   \        P                   d     KO  i ; i  \         d3   pT P                   P                  R
RT RT RT 2R34        Rp?ELGRp?ii ; i  T'       dM   T ;P                  ^,          un        T P                   P                  RT P                  T P                   34       MKT ;P                   ^,          un        T P                   P                  RT P                  T P                   34       T P                  P#                  4        i ; i  \         d0   pT P                   P                  R
RT RT 2R34        Rp?ELhRp?ii ; i  \         d     R# i ; i  Te$    TP%                  4        i   \         d     i i ; ii ; i)workerstartingNrW  readyz	running: :NP   NFrY  Tr  zWorker z failed z: r9   progressro  z setup failed: )ri   r   r   r   rM   r   r   is_setr   
get_nowaitr   Empty_scrape_account_scrape_urlrS   r   r   r   r]  )rq   ry  rZ   r  rm  _labelokr   s   &&      r-   r  VoucherScraperGUI._worker_loop  s   

#z23&	!4+<+<+@+@+BCF&MJJNNHc734oo,,..+/;;+A+A+C(D& 

#6#;-/HIJ,y(,,V<((8B ,,1,


D4H4H$J[J['\]))Q.)


D4H4H$J[J['\]KK))+JJNNHc623 !KKM "5 {{  ! XJJNNGwse8F82aS-QSU#VWWX ,,1,


D4H4H$J[J['\]))Q.)


D4H4H$J[J['\]KK))+  	MJJNNGwse?1#%FKLL	M !  !KKM   "s   A-L G8 .*L ,H CL $M 8HL HL I'II II B;LL M$MM! MM! MM!N
'M87N
8NN
NN
c               (    V ^8  d   QhRRRRRRRR/# )r/   company_namer    account_numberparent_accountr3   r%   )r4   s   "r-   r5   r     s*     5 5 5S 5be 5jm 5r,   c                	p    T;'       g    R pV'       d   V RV 2pV'       d   V RV 2p\        V^R7      # )Account_max_len)r   )rq   r  r  r  bases   &&&& r-   _build_account_folder_label-VoucherScraperGUI._build_account_folder_label  sD    ((yV1^,-DV1^,-D!$44r,   c               (    V ^8  d   QhRRRRRRRR/# )r/   r"   r    r2   r$   r3   rj   r%   )r4   s   "r-   r5   r     s/     e es e# e ePT er,   c           	     	    \        V^R7       R2pV'       d   \         RV 2M\        pV RV 2pV P                  P                  \	        WeWCR7      4       R# )   r  z.mdry   )r!   r"   r#   r$   N)r   OUTPUT_LABELr   r   r   )rq   r"   r2   r$   r#   
rel_folderrels   &&&&   r-   _enqueue_voucher"VoucherScraperGUI._enqueue_voucher  sS    $\3?@D39~Qvh/|
AdV$Tcdr,   c                    V ^8  d   QhRRRR/# )r/   r0   r    r3   rj   r%   )r4   s   "r-   r5   r     s     * *3 *4 *r,   c           
     	b   VP                  V4       \        P                  ! R 4        VP                  \        P
                  R4      P                  p\        V4      p\        V4      ;'       g    VP                  RR4      pVP                  RR4      pVP                  RR4      pV P                  WVV4      p\        VRR7      p	V	 U
u. uFa  p
\        V
P                  R	4      4      '       g   K%  \        V
P                  R
4      ;'       g    R4      P                  4       '       g   K_  V
NKc  	  pp
V'       gs   RRRV 2R\        P                   ! \"        P$                  4      P'                  RR7       2RRRT;'       g    RRR.
pV P)                  VRRP+                  V4      4       R# V F  p
V P,                  P/                  4       '       d    R# \        V
P                  R4      ;'       g    R4      P                  4       ;'       g    Rp\1        T\        V
P                  R
4      ;'       g    R4      P                  4       4      p\3        WW4      pV P)                  WV4       VP                  V4       \        P                  ! R4       K  	  R#   \         d    Rp ELUi ; iu up
i )r7   r8   r9   r  r  r  r  T)only_activeactiver[  z# Account Summaryr<   r=   r>   r?   z## Account Page TextrA   rB   zAccount SummaryrK   NrR   Programg?)rM   rN   rO   rP   r   rQ   rR   rS   r   r   r  r   r'  r    r  r   rU   r   rV   rW   r  rY   r   r  r   rc   )rq   rZ   r0   	body_textr  r  r  r  r"   programspr  r_   r2   r1   r$   s   &&&             r-   r  !VoucherScraperGUI._scrape_account  s*   

;

3	++BKK@EEI 39=9&AhhTXXn^gEh"2B7"2B711,P^_,VF%dXaeeHo)>!3quuV}GZGZXZC[CaCaCc!!Xd#%k]3%hll8<<&@&J&JT]&J&^%_`&RE !!&*;TYYu=MNA%%''quuV}99	:@@BOOiL!+s155=3F3FB/G/M/M/OPK-f;]G!!&@JJ{#JJsO 9  	I	 es)   *J 
"J,1J,J,+J,J)(J)c                    V ^8  d   QhRRRR/# )r/   
target_urlr    r3   rj   r%   )r4   s   "r-   r5   r     s     C Cc Cd Cr,   c                	   VP                  V4       \        P                  ! R 4       VP                  pRV9   d   V P	                  W4       R# Rp VP                  \        P                  R4      pV F3  pVP                  ;'       g    RP                  4       pV'       g   K1  Tp M	   \        VRW44      pV P                  RWH4       R#   \         d     L.i ; i)r7   AccountSummaryNVoucherzh1,h2,legendr9   
Direct_URL)rM   rN   rO   r\  r  find_elementsr   CSS_SELECTORrR   r  rS   rc   r  )	rq   rZ   r  curr2   rH   elr5  r$   s	   &&&      r-   r  VoucherScraperGUI._scrape_url  s    

:

3  s"  - 	$$R__nEAww}}"++-3#&L	  *&"cHlLB	  		s$   7C 	C $C (C CCc                   V ^8  d   QhRR/# ru   r%   )r4   s   "r-   r5   r     s     %2 %2D %2r,   c           
     	     V P                   P                  4       pV^ ,          pVR8X  d$   V P                  \        V^,          4      4       EMVR8X  d   V P                  RV^,           24       EMVR8X  d}   \	        V^,          4      \        V^,          4      rCW@P
                  V&   \        V4      pV P                  P                  V4      '       d   V P                  P                  WT3R7       EMMVR8X  dH   \	        V^,          4      V n	        V P                  P                  R\         RV P                   24       MVR	8X  d`   \	        V^,          4      \	        V^,          4      rvV P                  P                  R
V P                   RV RV RV P                   24       MVR8X  d   V P                  RV^,           24       MvVR8X  dp   \	        V^,          4      \	        V^,          4      rvV P                  P                  RV P                   RV RV RV P                   24       V P                  R4       V P                   P!                  4        EK_    \"        P$                   d     Mi ; iT P&                  P)                  ^T P*                  4       R#   T P&                  P)                  ^T P*                  4       i ; i)Tr  r  zERROR: r  )rk  rp   r   z | saved files: r  zTasks total=z done=z failed=z saved=r}   z&Writer finished. Rows saved this run: r  zCompleted. total=FN)ri   r  r#  r    rs  r   r  r2  itemr   r   rv  r   r  r   r)  r   r   r  r   afterr   )rq   r  kindry  r   rj  r  fails   &       r-   r   VoucherScraperGUI._pump_logs  sF   $	2jj++-1v6>IIc#a&k*W_IIAx01X%!$SVc#a&k.3&&s+c(C''..s33((--c(-CW_&)#a&kDOOO''(:,>NtN_(`aZ'!$SVc#a&k$%%))&t'7'7&8tfHTFRYZ^ZiZiYjk ]*II Fs1vhOPV^!$SVc#a&k$%%))+D,<,<+=VD6RVQWW^_c_n_n^op %%e,

$$&{{ 		 IIOOC1DIIOOC1s$   II! !I96J$ 8I99J$ $(K)r   r   r   r   r
  ri   r  r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   N)r&   r'   r(   r)   ro   r   r   r#  r)  r   r  r  r	  rb  rf  r   r   rx  r  r  r  r  r  r   r+   r%   r,   r-   r   r      su    .FP
8!
K*.X**" H%$#L)V5e*XC.%2 %2r,   r   c                   V ^8  d   QhRR/# )r/   r3   rs  r%   )r4   s   "r-   r5   r5   ;  s      c r,   c                 f    \         P                  ! 4       p \        V 4      pV P                  4        ^ # )r   )r   Tkr   mainloop)r   apps     r-   mainr  ;  s#    557D
D
!CMMOr,   __main__)<__doc__
__future__r   r>  r   r   rN   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   urllib.parser   tkinterr   r   r   r   tkinter.scrolledtextr   selenium.webdriver.common.byr   voucher_scraper_corer   r   r   r   r   r   r   r   r   r   r   r   ModuleNotFoundError(Voucher_List_Folder.voucher_scraper_core__file__resolver   r   r1  r   r  rZ  r   rc   rw  re   r   r  r&   
SystemExitr%   r,   r-   <module>r     s   #     ! '  1 1    / / - +   > >!!#**66	
T	   1#h<!! <6Y2 Y2x z
TV
 e     s   C< <#D"!D"