
    Hci V                    L   d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m	Z	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZ ddlZdd	lmZmZmZ dd
lmZ ddlmZ 	 ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) n'# e*$ r ddl+mZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) Y nw xY w ee,          -                                j.        Z/e/dz  Z0e/dz  Z1dZ2dZ3e G d d                      Z4ddZ5 G d dej6                  Z7 G d d          Z8d dZ9e:dk    r e; e9                      dS )!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                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )VoucherRecordstrrel_pathfoldernamecontentN)__name__
__module____qualname____annotations__     Voucher_List_Scraper.pyr    r    H   s4         MMMKKKIIILLLLLr+   r    account_urlr!   program_urlprogram_namereturnc                   |                      |           t          j        d           t          |           }|s9	 |                     t
          j        d          j        }n# t          $ r d}Y nw xY wt          | ddg          }|s"t          | dg          pt          | dg          }g }g }|r&t          | |          \  }}t          ||          \  }}g }|                    d|            |                    d           |                    d|            |                    d	|            |                    d
t          j        t          j                                      d                      |                    d           |                    d           |                    d           |                    |pd           |                    d           |                    d           |                    dt%          |           d           |r|r|                    d           |                    d                    d |D                                  |D ]}	d |	D             }
t%          |
          t%          |          k     r&|
dgt%          |          t%          |
          z
  z  z  }
t%          |
          t%          |          k    r|
d t%          |                   }
|                    d                    |
                     |                    d           n|                    d           d                    |          dz   S )N333333?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  B   K   | ]}|                     d d          V  dS )r>   ;Nreplace).0hs     r,   	<genexpr>z*_build_program_markdown.<locals>.<genexpr>u   s0      CCaaiiS11CCCCCCr+   c                f    g | ].}|pd                      dd                               dd          /S )r4   
 r>   r@   rA   )rC   cs     r,   
<listcomp>z+_build_program_markdown.<locals>.<listcomp>w   s<    QQQag2&&tS1199#sCCQQQr+   z&_No product table found (or no rows)._rG   )gettimesleepr   find_elementr   TAG_NAMEtext	Exceptionr   r   r   appendr   nowr   utc	isoformatlenjoin)driverr-   r.   r/   summarytable_idheadersrowslinesrowcleans              r,   _build_program_markdownr`   P   sa   
JJ{JsOOO+F33G 	))"+v>>CGG 	 	 	GGG	 %Vg~-FGGH j(';;i?TU[^g]h?i?iGD C268DD3GTBBE	LL$l$$%%%	LL	LL4{44555	LL4{44555	LLax|HL'A'A'K'KU^'K'_'_aabbb	LL	LL%&&&	LL	LLB	LL	LL	LLATAAABBB ?4 ?XSXXCC7CCCCCDDD 	* 	*CQQSQQQE5zzCLL(("WE

!:;;5zzCLL((nGn-LL%))))U=>>>99Ud""s   %A" "A10A1c                  (     e Zd Zd fd	Zdd
Z xZS )
FileWriteroutput_rootr   in_q&'queue.Queue[Optional[VoucherRecord]]'log_q'queue.Queue[tuple]'r0   Nonec                    t                                          d           || _        || _        || _        d| _        d S )NT)daemonr   )super__init__rc   rd   rf   saved)selfrc   rd   rf   	__class__s       r,   rl   zFileWriter.__init__   s?    %%%&	



r+   c                   | j                             dd           	 	 | j                                        }|| j                                         nt          j        d |j                            d          D              }|j	                            dd           |
                    |j        pdd           | xj        dz  c_        | j                            d	| j        |j        f           | j                                         	 | j                            d
| j        df           d S # | j                            d
| j        df           w xY w)NT)parentsexist_okc                    g | ]}||S r*   r*   )rC   parts     r,   rJ   z"FileWriter.run.<locals>.<listcomp>   s    .`.`.`[_.`t.`.`.`r+   /r4   utf-8encoding   rm   writer_done)rc   mkdirrd   rK   	task_doneBASE_DIRjoinpathr"   splitparent
write_textr%   rm   rf   put)rn   recout_paths      r,   runzFileWriter.run   sO   td;;;	<&immoo;I'')))#,.`.`@R@RSV@W@W.`.`.`a%%dT%BBB##CK$52#HHH

a


S\BCCC	##%%%&  JNNM4:r:;;;;;DJNNM4:r:;;;;s   C1D4 4$E)rc   r   rd   re   rf   rg   r0   rh   r0   rh   )r&   r'   r(   rl   r   __classcell__)ro   s   @r,   rb   rb      sQ             < < < < < < < <r+   rb   c                      e Zd Zd.dZd/dZd/dZd0d
Zd1dZd/dZd/dZ	d/dZ
d/dZd2dZd3dZd/dZd/dZd4dZd5dZd6d#Zd7d'Zd8d)Zd9d+Zd/d,Zd-S ):VoucherScraperGUIroottk.Tkr0   rh   c                (   || _         | j                             d           | j                             d           t          j                    | _        t          j        d          | _        t          j                    | _        t          j	                    | _
        d | _        g | _        d | _        d| _        d| _        d| _        d| _        i | _        |                                  |                                  |                                  d S )NzRW Voucher File Scraper1300x860i  )maxsizer   )r   titlegeometryqueueQueuerf   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)rn   r   s     r,   rl   zVoucherScraperGUI.__init__   s    		1222	:&&&+0;==
?D{SV?W?W?W,1KMM#/++,0/16: -/r+   c                2   t          j        | j        d          }|                    d           t	          j        d          | _        t          j        |d                              d	d	d
           t          j	        |d| j        d| j
                                      d	dd
           t          j	        |d| j        d| j
                                      d	dd
           t          j	        |d| j        d| j
                                      d	dd
           t	          j                    | _        t	          j        d          | _        t	          j        d          | _        t	          j        d          | _        t          j        |d                              dd	d
           t          j        || j        d          | _        | j                            ddddd           t          j        |d                              dd	d
           t          j        || j        d          | _        | j                            ddd
d            t          j        |d!| j        "                              ddd
d#            t          j        |d$                              ddd%           t          j        |dd&| j        d'          | _        | j                            dd(d
d            t          j        |d)| j        *          | _        | j                            ddd
d+,           t          j        |d-| j        d./          | _        | j                            ddd
d+d+0           t	          j        d1t8                     | _        t          j        || j        2                              dddd
d+d34           t=          d5          D ]}|                    ||d6v rdnd	7            t          j         | j        d89          }|                    d:ddd;           t          j        |d5          }t          j        |d5          }|!                    |d7           |!                    |d7           t          j        |d<                              d
=           t          j"        |d>d?d@A          | _#        | j#        $                    dBdC           | j#                            d           t	          j        dD          | _%        t          j        || j%        2                              d
d+E           t          j        |dF                              d
d+E           tM          |dGdHI          | _'        | j'                            d:dJ           t          j        |dK                              d
=           t          j        |          }|                    ddLM           t          j        |dN| j(        *                              dOP           t          j        |dQ| j)        *                              dOd+R           t          j        |dS| j*        *                              dOd+R           t          j        |dT| j+        *                              dOd+R           tM          |dUV          | _,        | j,                            d:dJ           | 
                                 d S )WN   )paddingx)fillurl)valuezMode:)rP   r   w)r^   columnstickyzPull one URL)rP   variabler   commandry   zPull search termsearch   zPull allall   aaT   zURL:x   )textvariablewidthew)   r   )r^   r   
columnspanr   padxzSearch:(   )r^   r   r   r   Headless)rP   r   )   r   zWorkers (1-25):e   )from_tor   r   r   Start)rP   r   )r   r   )r^   r   r   padyStopdisabled)rP   r   state)r^   r   r   r   r   Output: )r   )   r   )r^   r   r   r   r   r      >   ry   r   )weight
horizontal)orientboth)r   expandr   r   Workers)anchor)statusheadingsr   )columnsshowheightr   StatusIdle)r   r   Log   word)r   wrap)r   r   z(voucher_scanned_accounts.json (editable))r   r   )r   r   z	Load JSONleft)sidez	Save JSON)r   r   zFormat JSONzOpen JSON As...none)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)rn   topimidr   rightbtnss          r,   r   zVoucherScraperGUI._build_ui   s   i	1---c5111	#G$$$))a#)FFF.4=PU_c_qrrrww|}  GH  QTw  	U  	U  	U"4t}T\fjfxyyy~~  DE  NO  X[~  	\  	\  	\*t}E[_[mnnnssxy  CD  MPs  	Q  	Q  	Q|~~4000M55591---	#F###((Qq(EEE3T\MMM!$VTTT	#I&&&++!C+HHH)Cdm2NNN1SvFFF*t7HIIINNST]^gjqxNyyy	#-...33!C3PPP;s!IYabccc!AcGGGCgtzJJJ!CfEEE
3VTYjYYYq3V&QQQ,-D
-D-DEEE	#DO44499aVW`cjpw~9q 	C 	CAqF{{!!BBBBodi===fT:::ya(((	#q)))Qa   	$Y''',,C,888<k
[]^^^   9993'''Lv666	$T%6777<<Cf<UUU	$U###((&(AAA$T"6BBBt444	%HIIINNVYNZZZy		s	(((
4k43GHHHMMSYMZZZ
4k43GHHHMMSY`fMggg
4mT5FGGGLLRX_eLfff
4/9NOOOTTZ`gmTnnn%e&999555r+   c                   | j                                                                                                         }|dk    r8| j                            d           | j                            d           d S |dk    r8| j                            d           | j                            d           d S | j                            d           | j                            d           d S )Nr   normalr   r   r   )r   rK   striplowerr   	configurer   )rn   modes     r,   r   zVoucherScraperGUI._refresh_mode   s    }  ""((**00225==N$$8$444O%%J%77777XN$$:$666O%%H%55555N$$:$666O%%J%77777r+   msgr!   c                    t          j                                        d          }| j                            dd| d| d           | j                            d           d S )Nz%H:%M:%Send[z] rG   )r   rS   strftimer  insertsee)rn   r  tss      r,   _logzVoucherScraperGUI._log  sc    \^^$$Z00U$5$5$5c$5$5$5666%     r+   runningboolc                    | j                             |rdnd           | j                            |rdnd           d S )Nr   r  r  )r   r  r   )rn   r  s     r,   _set_runningzVoucherScraperGUI._set_running  sL      W'Jzz( KKK'&IhhzJJJJJr+   c                L   t                                           s8| j                            dd           | j                            dd           d S t                               dd          }| j                            dd           | j                            d|           d S )N1.0r  z{}
rv   ignorerx   errors)	JSON_PATHexistsr  deleter  	read_text)rn   txts     r,   r   z!VoucherScraperGUI._load_json_file  s    !! 	N!!%///N!!%000F!!78!DDeU+++eS)))))r+   c                   | j                             dd                                          pd}	 t          j        |          }n:# t
          $ r-}t          j        dt          |                     Y d }~d S d }~ww xY wt          
                    t          j        |dd          dz   d	
           |                     dt                      d S )Nr#  r  {}Invalid JSONr   Findent	sort_keysrG   rv   rw   zSaved JSON: )r  rK   r  jsonloadsrQ   r   	showerrorr!   r'  r   dumpsr  rn   rawobjr   s       r,   r  z!VoucherScraperGUI._save_json_file  s    n  ..4466>$	*S//CC 	 	 	 Q888FFFFF	 	TZAGGG$NY`aaa		,,,-----   A 
A="A88A=c                   | j                             dd                                          pd}	 t          j        |          }n:# t
          $ r-}t          j        dt          |                     Y d }~d S d }~ww xY w| j         	                    dd           | j         
                    dt          j        |dd          dz              d S )	Nr#  r  r-  r.  r   Fr/  rG   )r  rK   r  r2  r3  rQ   r   r4  r!   r)  r  r5  r6  s       r,   r  zVoucherScraperGUI._format_json'  s    n  ..4466>$	*S//CC 	 	 	 Q888FFFFF	 	eU+++eTZA%O%O%ORV%VWWWWWr9  c                   t          j        t          t                    ddg          }|sd S t	          |                              dd          }| j                            dd           | j                            d|           d S )	N)JSONz*.json)All*)
initialdir	filetypesrv   r$  r%  r#  r  )	r   askopenfilenamer!   r}   r   r*  r  r)  r  )rn   pathr+  s      r,   r  z"VoucherScraperGUI._open_json_other1  s    )S]]OacoNpqqq 	F4jj""GH"EEeU+++eS)))))r+   termOptional[str]List[tuple]c                   t          | j                                                  	 t                                         t                     t          j        d           t          |pd           t                    }fd|D             }|	                                 S # 	                                 w xY w)Nheadlessg?r4   c                l    g | ]0\  }}|j         d t          j        |j                   |j        pdf1S )accountr4   )hrefr   current_urlrP   )rC   a_rowrX   s      r,   rJ   z:VoucherScraperGUI._queue_account_tasks.<locals>.<listcomp>A  sF    vvvX_XY[_opouvi);QV!D!DaflPRSvvvr+   )
r   r   rK   r   	LOGIN_URLrL   rM   r   r   quit)rn   rC  accountstasksrX   s       @r,   _queue_account_tasksz&VoucherScraperGUI._queue_account_tasks9  s    t'8'<'<'>'>???		&MMMJJy!!!JsOOO 4444V<<HvvvvckvvvEKKMMMMFKKMMMMs   A-B, ,Cr   c                2    d|                                 dfgS )Nr   r4   )r  )rn   r   s     r,   _pull_one_url_taskz$VoucherScraperGUI._pull_one_url_taskF  s    		R())r+   c           
        | j         r| j                                         rd S t          dt          dt	          | j                                        pd                              }| j                                                                        	                                }|dk    rE| j
                                                                        }|st          j        dd           d S nd}d| _        d| _        d| _        d| _        | j                                          | j        j        | j                                          t-          d|dz             D ]/}t/          |          }| j                            dd|d	
           0| j                                         |                     d           | j                            d           t;          t<          | j        | j                   | _!        | j!        "                                 tG          j$        | j%        |||fd          | _         | j         "                                 d S )Nry   r   r   zMissing URLzEnter one URL.r4   r   r  )idle)iidvaluesTzPreparing...targetargsrj   )&r   is_alivemaxminintr   rK   r   r  r  r   r   r4  r   r   r   r   r   clearr  r)  get_childrenr   r!   r  r   r!  r  setrb   r   r   rf   r   r   r   Thread	_dispatch)rn   r   r  r   widrX  s         r,   r   zVoucherScraperGUI.startI  s&   ? 	t7799 	FaRT%5%9%9%;%;%@q!A!ABBCC}  ""((**00225==,""$$**,,C $]4DEEE C   """!1!>!>!@!@AAGaK(( 	J 	JCc((C##B3y#IIII$n--- T\4:FF#*$.cSZG[dhiiir+   c                b    | j                                          |                     d           d S )NzStop requested.)r   rc  r  )rn   s    r,   r   zVoucherScraperGUI.stopm  s/    		#$$$$$r+   r  r   r`  c                >    	 |dk    r                      |          }nZ|dk    r?                      j                                                                                  }n                     d          }|s6 j                            d            j                            d            d S t          |           _	         j                            dd j	         ddf           |D ]} j
                            |            fdt          d	|d	z             D              _         j        D ]}|                                  j        D ]}|                                  j                            d             j        r j                                          j                            d
 j         j        f           d S # t$          $ rE} j                            dd| df            j                            d            Y d }~d S d }~ww xY w)Nr   r   r4   )doner   r   infozQueued z tasksc                J    g | ]}t          j        j        |fd            S )TrZ  )r   rd  _worker_loop)rC   rf  rn   s     r,   rJ   z/VoucherScraperGUI._dispatch.<locals>.<listcomp>  s@         (9tTTT  r+   ry   ri  errorzDispatcher error: )rU  rS  r   rK   r  rf   r   r   rV   r   r   r   r   r   rW   r   r   r   rQ   )rn   r  r   r   rR  tr   s   `      r,   re  zVoucherScraperGUI._dispatchq  sH   #	#u}}//44!!11$-2C2C2E2E2K2K2M2MNN11"55 
~...  &&&"5zzDJNNF$Fd.>$F$F$FKLLL # #""""    GaK00  DL \  				\  LT"""{ #  """JNNFD$8$:KLMMMMM 	# 	# 	#JNNG%=!%=%=rBCCCLT"""""""""	#s   B,G 1DG 
H:HHrf  c           
        | j                             d|df           d }	 t          | j                                                  }t          |           | j                             d|df           | j                                        s	 | j        	                                \  }}}n# t          j        $ r Y nw xY w| j                             d|d|d d          f           d}	 |dk    r|                     ||           n|                     ||           d	}n=# t          $ r0}| j                             d
d| d| d| df           Y d }~nd }~ww xY w|r8| xj        dz  c_        | j                             d| j        | j        f           n7| xj        dz  c_        | j                             d| j        | j        f           | j                                         n# |r8| xj        dz  c_        | j                             d| j        | j        f           n7| xj        dz  c_        | j                             d| j        | j        f           | j                                         w xY w| j                                        | j                             d|df           n:# t          $ r-}| j                             d
d| d| df           Y d }~nd }~ww xY w|(	 |                                 d S # t          $ r Y d S w xY wd S # |&	 |                                 w # t          $ r Y w w xY ww xY w)NworkerstartingrG  readyz	running: P   FrJ  Trm  zWorker z failed z: r4   ry   progressrW  z setup failed: )rf   r   r   r   rK   r   r   is_setr   
get_nowaitr   Empty_scrape_account_scrape_urlrQ   r   r   r|   rP  )rn   rf  rX   r  r[  _labelokr   s           r,   rl  zVoucherScraperGUI._worker_loop  s   
#z2333&	!4+<+@+@+B+BCCCF&MMMJNNHc73444o,,.. ,+/;+A+A+C+C(D&&&{   E 
#/H6#2#;/H/HIJJJ,y((,,VV<<<<((888BB  X X XJNNG-Qs-Q-QF-Q-Qa-Q-QSU#VWWWWWWWWX  ^,,1,,

D4H$J['\]]]]))Q.))

D4H$J['\]]]K))++++  ^,,1,,

D4H$J['\]]]]))Q.))

D4H$J['\]]]K))++++/ o,,.. ,2 JNNHc623333 	M 	M 	MJNNG%Fs%F%F1%F%FKLLLLLLLL	M !KKMMMMM    DD "!v!KKMMMM    D "s   A-J3 B- ,J3 -C <J3 ?C  -J3 .5D$ #G, $
E.&EG, EG, !BJ3 ,BI88:J3 2L 3
K*=#K% L %K**L 0L 
LLML21M2
L?<M>L??Mcompany_nameaccount_numberparent_accountc                P    |pd}|r| d| }|r| d| }t          |d          S )NAccount_   max_len)r   )rn   r|  r}  r~  bases        r,   _build_account_folder_labelz-VoucherScraperGUI._build_account_folder_label  sU    (y 	.--^--D 	.--^--D!$4444r+   r#   r/   r%   c                    t          |d           d}|rt           d| nt          }| d| }| j                            t	          ||||                     d S )N   r  z.mdru   )r"   r#   r$   r%   )r   OUTPUT_LABELr   r   r    )rn   r#   r/   r%   r$   
rel_folderrels          r,   _enqueue_voucherz"VoucherScraperGUI._enqueue_voucher  s{    $\3???DDD39K//v///|
$$d$$JT[bcccdddddr+   r-   c           
        |                     |           t          j        d           	 |                    t          j        d          j        }n# t          $ r d}Y nw xY wt          |          }t          |          p|                     dd          }|                     dd          }|                     dd          }| 
                    |||          }t          |d	          }	d
 |	D             }
|
spddd| dt          j        t          j                                      d           ddd|pdddg
}|                     |dd                    |                     d S |
D ]}| j                                        r d S t+          |                     d          pd                                          pd}t/          |t+          |                     d          pd                                                    }t1          ||||          }|                     |||           |                     |           t          j        d           d S )Nr2   r3   r4   r|  r  r}  r~  T)only_activec                    g | ]\}t          |                    d                     $t          |                    d          pd                                          Z|]S )activerK  r4   )r  rK   r!   r  )rC   ps     r,   rJ   z5VoucherScraperGUI._scrape_account.<locals>.<listcomp>  sX    dddaeeHoo)>)>d3quuV}}GZXZC[C[CaCaCcCcd!dddr+   z# Account Summaryr7   r8   r9   r:   z## Account Page Textr<   r=   zAccount SummaryrG   rP   ProgramrK  g?)rK   rL   rM   rN   r   rO   rP   rQ   r   r   r  r   r   rS   r   rT   rU   r  rW   r   ru  r!   r  r   r`   )rn   rX   r-   	body_textrj  r|  r}  r~  r#   programsr  r]   r  r/   r.   r%   s                   r,   rx  z!VoucherScraperGUI._scrape_account  sh   

;
3	++BK@@EII 	 	 	III	 39==9&AAhTXXn^gEhEh"2B77"2B7711,P^__,VFFFddXddd 	#3k33`hl8<&@&@&J&JT]&J&^&^``&RE !!&*;TYYu=M=MNNNF 	 	A%%'' quuV}}9	::@@BBOiL!+s155==3FB/G/G/M/M/O/OPPK-fk;P\]]G!!&,@@@JJ{###JsOOOO	 	s   %A A A 
target_urlc                   |                     |           t          j        d           |j        }d|v r|                     ||           d S d}	 |                    t          j        d          }|D ]#}|j        pd	                                }|r|} n$n# t          $ r Y nw xY wt          |d||          }|                     d||           d S )Nr2   AccountSummaryVoucherzh1,h2,legendr4   
Direct_URL)rK   rL   rM   rL  rx  find_elementsr   CSS_SELECTORrP   r  rQ   r`   r  )	rn   rX   r  curr/   rD   elr+  r%   s	            r,   ry  zVoucherScraperGUI._scrape_url  s   

:
3 s""  ---F 	$$R_nEEA  w}"++-- #&LE  	 	 	D	 *&"c<HHlL'BBBBBs   AB 
B$#B$c           
     t   	 	 | j                                         }|d         }|dk    r*|                     t          |d                              n|dk    r |                     d|d                     n|dk    r|t	          |d                   t          |d                   }}|| j        |<   t          |          }| j                            |          r| j                            ||f	           nF|d
k    rEt	          |d                   | _	        | j
                            dt           d| j	                    n|dk    r[t	          |d                   t	          |d                   }}| j                            d| j         d| d| d| j	                    n|dk    r|                     d|d                     nu|dk    rot	          |d                   t	          |d                   }}| j                            d| j         d| d| d| j	                    |                     d           | j                                          Z# t"          j        $ r Y nw xY w	 | j                            d| j                   d S # | j                            d| j                   w xY w)NTr   rj  ry   rm  zERROR: rp  r   )rY  rm   r   z | saved files: rt  zTasks total=z done=z failed=z saved=rz   z&Writer finished. Rows saved this run: ri  zCompleted. total=F   )rf   rv  r  r!   r`  r   r  r(  itemr   r   rc  r   r  r   r!  r|   r   rw  r   afterr   )rn   r  kindrf  r   rX  ri  fails           r,   r   zVoucherScraperGUI._pump_logs  s   $	2'j++--1v6>>IIc#a&kk****W__II0A001111X%%!$SVc#a&kkC.3D&s+c((C'..s33 D(--c5(-CCCW__&)#a&kkDOO''(`:(`(`t(`(`aaaaZ''!$SVc#a&kk$D%))kt'7kktkkTkkZ^Zikk    ]**IIOs1vOOPPPPV^^!$SVc#a&kk$D%))pD,<ppDppRVpp_c_npp   %%e,,,
$$&&&?'@ { 	 	 	D	IOOC11111DIOOC1111s$   II I/,J .I//J "J7N)r   r   r0   rh   r   )r  r!   r0   rh   )r  r  r0   rh   )rC  rD  r0   rE  )r   r!   r0   rE  )r  r!   r   r!   r   r`  r0   rh   )rf  r`  r0   rh   )r|  r!   r}  r!   r~  r!   r0   r!   )r#   r!   r/   r!   r%   r!   r0   rh   )r-   r!   r0   rh   )r  r!   r0   rh   )r&   r'   r(   rl   r   r   r  r!  r   r  r  r  rS  rU  r   r   re  rl  r  r  rx  ry  r   r*   r+   r,   r   r      s          .F F F FP
8 
8 
8 
8! ! ! !
K K K K* * * *. . . .X X X X* * * *   * * * *"  "  "  " H% % % %$# $# $# $#L) ) ) )V5 5 5 5e e e e* * * *XC C C C.%2 %2 %2 %2 %2 %2r+   r   r`  c                 r    t          j                    } t          |           }|                                  dS )Nr   )r   Tkr   mainloop)r   apps     r,   mainr  ;  s,    577D
D
!
!CMMOOO1r+   __main__)r-   r!   r.   r!   r/   r!   r0   r!   )r0   r`  )<__doc__
__future__r   r2  r   r   rL   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}   r'  r   r  rO  r    r`   rd  rb   r   r  r&   
SystemExitr*   r+   r,   <module>r     sv    # " " " " "        ! ! ! ! ! ! ' ' ' ' ' ' ' '       1 1 1 1 1 1 1 1 1 1 1 1                 / / / / / / / / / / - - - - - - + + + + + +                                                             " 4>>!!##*66	
T	        1# 1# 1# 1#h< < < < <! < < <6Y2 Y2 Y2 Y2 Y2 Y2 Y2 Y2x    z
*TTVV

 s   A7 7!BB