
    0hg                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZmZmZmZ d dlmZmZ d dlZd dlZd dlmZ ej                            ej                            ej                            e          dd                    Zeej        vrej                            e           d dlmZ g dZd	Z d
Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ) ej*        d          p ej*        d          Z+ ej*        d          p ej*        d          Z, ej*        dd          -                                Z. ej/        d          Z0 ej1                    Z2e23                     ej4        d                     e05                    e2           e06                    e.            ej7        d          Z8dld Z9dmd#Z:dnd$Z;dod&Z<dpd(Z=dqd+Z>dmd,Z?drd0Z@dsd2ZAdtd4ZBdtd5ZCdudvd8ZDdwd:ZEdxdyd?ZFdxdzdAZGd{dCZHdD ZId|dGZJd}dKZKd~ddQZLddTZMddVZNddd]ZOdd^ZPdd`ZQddbZRdddfZSdddiZTdj ZUeVdkk    r eU             dS dS )    )annotationsN)AnyDictListOptionalTuple)datetime	timedelta)	PdfReaderz..
get_client)C0247C0042C0043C0066C0082C0220C0259C0248C0306C0305C0236z/https://alio.go.kr/item/itemReportListSusi.jsonz(https://alio.go.kr/item/itemOrganList.doz$https://alio.go.kr/download/pdf.jsonkepco_id	kepco_rawkepco_org_stgkepco_org_snapshotkepco_org_cur	kepco_orgkepco_historyTELEGRAM_BOT_TOKENTG_BOT_TOKENTELEGRAM_CHAT_ID
TG_CHAT_ID	LOG_LEVELINFO	group_n8nz[%(levelname)s] %(message)su   ^\s*\(?공석\)?\s*$nameOptional[str]returnboolc                    | sdS t          |                                           }t                              |          rdS |dv S )NFT>      결원-)strstripVACANCY_PATmatch)r'   ss     */var/www/html/bot/app/crawler/group_n8n.pyis_vacant_namer4   ?   sJ     uD		A t    r2   r.   c                    | sdS |                      dd          } t          j        dd|           } t          j        dd|           } |                                 S )N z[ \t]+ z
[ ]*\n[ ]*
)replaceresubr/   r2   s    r3   	normalizer?   G   sV     r			$A
y#q!!A
}dA&&A7799r5   c                    | sdS t          j        dd|                                           }|dv pt          j        d|          d uS )NT\s+r7   >      –   —r-   u   (미정|무기한))r<   r=   r/   search)r2   vs     r3   is_blank_daterF   O   sO    TT
vr1##%%A##Vry1F'J'JRV'VVr5   patternc                    t          j        | |          }|r'|                    d                                          nd S )N   r<   rD   groupr/   )rG   r2   ms      r3   pickrM   T   s9    
	'1A!",1771::,r5   merged_textc                    t          j        d|           }|r'|                    d                                          nd S )Nu-   임원\s*현황\s*\n([^\n]+)\n임원\s*현황rI   rJ   )rN   rL   s     r3   extract_department_from_headerrP   X   s:    
	BKPPA!",1771::,r5   texts	List[str]c                    d                     d | D                       }t          j        dd|          }|                                S )Nr:   c                0    g | ]}|t          |          S  )r?   ).0ts     r3   
<listcomp>z$merge_page_texts.<locals>.<listcomp>]   s#    999q9	!999r5   z\n{2,})joinr<   r=   r/   )rQ   joineds     r3   merge_page_textsr[   \   sC    YY99e999::FVItV,,F<<>>r5   c                V    t          j        dd| pd                                          S NrA   r7   r<   r=   r/   r>   s    r3   _normalize_namer_   a   s&    6&"qwB((..000r5   deptstartTuple[str, str, Optional[str]]c                *    | t          |          |pd fS N)r_   )r`   r'   ra   s      r3   _keyre   d   s    /$''$77r5   	posted_atc                   | sd S |                                                      dd          }t          j        d|          r|S t          j        d|          }|rst	          |                    d                    t	          |                    d                    t	          |                    d                    }}}|dd	|d
d	|d
S d S )Nr9   r7   z^\d{4}-\d{2}-\d{2}$z^(\d{4})\.(\d{1,2})\.(\d{1,2})$rI         04dr-   02d)r/   r;   r<   r1   intrK   )rf   r2   rL   ymods         r3   _to_isorp   g   s     t!!#r**A	x&** 
3Q77A +qwwqzz??C

OOS__q2***"***1****4r5   iso_ymdc                |    t          j        | d          }|t          d          z
  }|                    d          S )N%Y-%m-%drI   )days)r	   strptimer
   strftime)rq   dtprevs      r3   _iso_prev_dayry   s   s;    		7J	/	/B	q!!!!D==$$$r5   c                d    t          j        | d          }|j         d|j        dd|j        ddS )Nrs   u   년 rk   u   월 u   일)r	   ru   yearmonthday)rq   rw   s     r3   _to_kor_dater~   x   s?    		7J	/	/Bg<<28<<<RV<<<<<r5   department_hintList[Dict[str, Any]]c                   |pt          |           }|                     d          }|dk    r
| |d          n| }d t          j        d|          D             }g }|D ]}t	          |          }|                    d          sd|v rt          j        d|          sAt          d|          }	t          d	|          }
t          d
|          }t          d|          }t          j        d|          }|r'|                    d          	                                nd }|r'|                    d          	                                nd }t          |          rd nt          j        dd|pd          }t          |          rd nt          j        dd|pd          }d }t          j        d|          }|r'|                    d          	                                }t          |          rd nt          j        dd|pd          }t          d|          }g }|rd t          j        d|          D             }dd} ||	          dv s ||
          dv r|
s|                    ||
|	||||||d	           |S )Nu   직위 r   c                <    g | ]}t          j        d |          |S )u	   ^직위\s)r<   r1   )rV   secs     r3   rX   z parse_people.<locals>.<listcomp>   s*    ```BH\[^D_D_````r5   u   \n(?=직위\s)u   직위 변경 전u   변경사유u   (임기|직책|성별)\su   직위\s*([^\n]+?)\s*성명u4   성명\s*([^\n]+?)(?=\s*(?:직책|성별|임기|\n))u-   직책\s*([^\n]+?)(?=\s*(?:성별|임기|\n))u   성별\s*([남여])uG   임기\s*\(시작일\)\s*([^\n(]+?)\s*\(종료일\)\s*([^\n]+?)(?:\n|$)rI   rh   rA   r9   r7   uG   (?:사유\s*발생(?:일자|일)|사유발생(?:일자|일))\s*([^\n]+)u   주요경력\s*([\s\S]*?)(?=\n\s*(?:선임절차|선임절차규정|당연직여부|직위\s|기준일|제출일|기관 공시 담당자|$))c                ^    g | ]*}|                                 |                                 +S rU   r/   )rV   lns     r3   rX   z parse_people.<locals>.<listcomp>   s-    XXXRRXXZZXbhhjjXXXr5   z\n+xr(   r)   r.   c                2    | pd                     dd          S )Nr7   r9   )r;   r   s    r3   tokzparse_people.<locals>.tok   s    !'r1B1B31K1K*Kr5   >      직위	   변경전>      성명	   변경후)	
departmentr'   positiongenderra   endtaskreason_datecareerr   r(   r)   r.   )rP   findr<   splitr?   
startswithrD   rM   rK   r/   rF   r=   append)rN   r   r   	start_idxbodysectionsoutrawr   r   r'   r   r   rL   	start_rawend_rawra   r   
reason_rawm_reasonr   career_blockr   r   s                           r3   parse_peopler      s    O$B;$O$OJ  ++I&/1nn;yzz""+D``rx(94@@```H "C 4 4nn >>-.. 	>S3H3HQSQZ[vx{Q|Q|3H6<<OQTUUH#NN.44 I`beff*+5AGGAJJ$$&&&	*+5AGGAJJ$$&&&%i00ZbfVS)/WY6Z6Z%g..ZbfVS'/WY6Z6Z 
9gilmm 	3!**0022J+J77bddRVFCQ[Qa_a=b=b  \
 
  	YXX28FL+I+IXXXF 	LKKK3x==333ss4yyD[7[7[ 	

$ &

 

 
	 
	 
	 
	 Jr5   requests.Sessionc                 d    t          j                    } | j                            ddi           | S )Nz
User-Agentz*GovBot/1.0 (+https://work.jjickjjicks.com))requestsSessionheadersupdater>   s    r3   make_sessionr      s<    AIB    Hr5   Fapba_iddebugOptional[Dict[str, Any]]c           	        |ddd}|                      t          |d          }|r:t                              d||j        |j                             d                     dd	d
dd}d|dd}|                     t          |t          j	        |          d          }|rHt                              d||j        |j                             d          |j
        d d                    	 |                                }n# t          $ r Y d S w xY w|                     d          dk    rd S |                     d          pi                      d          pg }	|                     d          pi                      d          pi }
|
                     d          }|	sd S |	d         }|                     d          |                     d          |                     d          |dS )NiQO  rI   )apbaIdreportFormRootNopageNo   paramstimeoutz[%s] prewarm %s %szcontent-typezhttps://alio.go.krzhttps://alio.go.kr/XMLHttpRequestzapplication/json;charset=UTF-8)OriginRefererzX-Requested-WithzContent-Type120305)r   r   r   )r   datar   z[%s] list %s %s %si  statussuccessr   result	organInfoapbaNar   disclosureNoidatetitle)r   r   r   organ)getPREWARM_URLloggerr   status_coder   postLIST_URLjsondumpstext	Exception)r2   r   r   
pre_paramsr0headers_jsonr   rr   r   
organ_info
organ_namefirsts                r3   fetch_first_itemr      s   #!LLJ	
{:r	:	:B d)7BNBJNNSaDbDbccc '(,8	 L W'JJD	xDJt4D4DbQQA p)7AM19==Q_C`C`bcbhimjmimbnooovvxx   ttxxY&&thhv$"))(339rF((6""(b--k::@bJ))J t1IE		.117##7##	  s   (C= =
D
Ddisclosure_noc                B   d|i}|                      t          |d          }|r&t                              d|j        |j                   |j        dk    rd S d| d}t          |d          5 }|                    |j                   d d d            n# 1 swxY w Y   |S )	Nr   <   r   z[PDF] %s -> %s   z
/tmp/alio_z.pdfwb)	r   PDF_URLr   r   urlr   openwritecontent)r2   r   r   r   r   out_pathfs          r3   fetch_pdf_to_tmpr      s    m,F	gfb11A =%quam<<<}t/M///H	h		 		              Os   -BBBpdf_pathc                    g }t          |           }|j        D ]A}	 |                                pd}n# t          $ r d}Y nw xY w|                    |           B|S )Nr7   )r   pagesextract_textr   r   )r   rQ   readerpagerW   s        r3   pdf_to_page_textsr      s|    Ex  F  	!!##)rAA 	 	 	AAA	QLs   3AAc                     t                      S rd   r   rU   r5   r3   sbr     s    <<r5   tableid_valuec                h   	 |                      |                              d                              d|                              d                                          }|j        pg }t          |          dk    S # t          $ r(}t          	                    d|||           Y d }~dS d }~ww xY w)NidrI   r   z exists check failed (%s, %s): %sF)
r   selecteqlimitexecuter   lenr   r   warning)clientr   r   resrowses         r3   sb_row_exists_idr     s    ll5!!((..11$AAGGJJRRTTx~24yy1}   95(ANNNuuuuus   A<A? ?
B1	B,,B1rowDict[str, Any]Nonec                z    |                      |                              |                                           d S rd   )r   insertr   )r   r   r   s      r3   	sb_insertr    s4    
LLs##++-----r5   HTMLTr   
parse_modedisable_previewc                x   t           }t          }|r|st                              d           dS d| d}|| ||d}	 t	          j        ||d          }|j        dk    r(t                              d	|j        |j                   dS d
S # t          $ r&}t                              d|           Y d }~dS d }~ww xY w)Nz[TG] skipped (no token/chat id)Fzhttps://api.telegram.org/botz/sendMessage)chat_idr   r  disable_web_page_preview   )r   r   r   z[TG] send failed %s: %sTz[TG] send error: %s)
r!   r#   r   infor   r   r   r   r   r   )	r   r  r  tokenr  r   payloadr   r   s	            r3   send_telegramr    s    EG  5666u
<
<
<
<C $3	 GM#GR888=CNN4amQVLLL5t   ,a000uuuuus   AB	 	
B9B44B9r   pdf_urlc                    t          j        | pd          }t          j        |d          }d| d| dg}d                    |          S )Nr-   T)quoteu'   그룹사 신규 임원공시입니다.z	<a href="u   ">자세히 보기</a>r:   )htmlescaperY   )r   r  org_escurl_escliness        r3   build_tg_messager  1  sZ    k%,3''Gk'...G15W555E
 99Ur5   targetc                
   t          t          j                              }|                     d                              ||dt          j                                                    d                                           |S )Ncrawler_runrunning)r   r  r   
started_at)	r.   uuiduuid4r   r  r	   utcnow	isoformatr   )r   r  run_ids      r3   insert_crawler_runr"  >  sp    F
LL&&o''1133	( (  
 wyyyMr5   r!  r   r   rl   r   fail_reasonc                    t          j                                                    ||||d}|                     d                              |                              d|                                           d S )N)finished_atr   r   r   r#  r  r   )r	   r  r   r   r   r   r   )r   r!  r   r   r   r#  r  s          r3   update_crawler_runr&  H  su    ((2244" G LL&&w//224@@HHJJJJJr5   c                h    | sdS d | D             }|sdS d |D             }t          |          dk    S )u8   최소 1행 & 전원이 공석/빈이름이 아니면 OKFc                d    g | ]-}|                     d           pd                                +|.S )r'   r7   )r   r/   rV   r   s     r3   rX   z"stg_quality_ok.<locals>.<listcomp>Y  s8    BBBqQUU6]]%8b$?$?$A$ABBBBr5   c                V    g | ]&}t          |                    d                     $|'S )r'   )r4   r   r)  s     r3   rX   z"stg_quality_ok.<locals>.<listcomp>\  s/    LLLnQUU6]].K.KL!LLLr5   r   )r   )r   	non_blank
non_vacants      r3   stg_quality_okr-  U  sS     uBBDBBBI uLLYLLLJz??Qr5   r   c                   |                      d                              d                              d                              d|                              d                                          j        pg }|sdS fd|D             }|r:|                      d                              |                                           |                      d	                                                              d|                                           d
 |D             }|r:|                      d	                              |                                           t          |          S )u   
    staging(run_id, department) -> snapshot 저장 -> 현재본(kepco_org) 교체
    note: kepco_org에는 reason_date 컬럼이 없으므로 제외하고 insert
    r   zJdepartment,name,position,gender,start,end,task,reason_date,career,key_hashr!  r   '  r   c                   g | ]}|                     d           |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d	          d
S )r   r'   r   r   ra   r   r   r   r   key_hash)r!  r   r'   r   r   ra   r   r   r   r   r1  r   )rV   r   r!  s     r3   rX   z&promote_department.<locals>.<listcomp>v  s         %%--EE&MMj))eeHooUU7^^55<<EE&MM55//eeHooj))	
 	
  r5   r   r   c                T   g | ]}|                     d           |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          dS )	r   r'   r   r   ra   r   r   r   )r   r'   r   r   ra   r   r   r   r2  r)  s     r3   rX   z&promote_department.<locals>.<listcomp>  s         %%--EE&MMj))eeHooUU7^^55<<EE&MMeeHoo
	
 
	
  r5   )	r   r   r   r   r   r   r  deleter   )r   r   r!  stg_rowssnap_payloadcur_payloads     `   r3   promote_departmentr8  `  sx    	_%%	\	]	]	Hf			L*	%	%	u			    q      L   J)**11,??GGIII LL$$&&)),
CCKKMMM    K  @[!!((55==???{r5   posted_at_rawc                   !" t          |          p%t          j                                        d          }t	          |          }t          |          }|                     t                                        d          	                    d          	                    dd          
                                j        pg }fd|D             !t          !                                          }	|                     t                                        d          	                    d                              d          
                                j        pg }
i }|
D ]B}t!          |                    d	          |                    d
                    }||vr|||<   Ct          |                                          }|	|z
  }|	|z  }||	z
  }g  g "d%d}|D ]}!|         pi                     d          }||         pi                     d          }!|         pi                     d          pd}||         pi                     d          pd}|pd|pdk    r                     |            ||           ||          k    r"                    |           |r!fd|D             }t'          dt)          |          d          D ]v}|                     t                                        d|i                              d|||dz                                          dd          
                                 w|                     t                                        ddi          	                    d          	                    dd          
                                  "fd|D             }|r!fd|D             }t'          dt)          |          d          D ]d}|                     t                                        d||d                              d|||dz                      
                                 e"r!fd"D             }t'          dt)          |          d          D ]b}|                     t                                        ddi                              d|||dz                      
                                 c|D ]0}||         }|                    d	          |                    d          |                    d          |                    d           |                    d
          |                    d          |                    d!          pg ||dddd"}t1          |                    d	                    rA|                     t                                        |          
                                 |                     t                                        d          	                    d          	                    d	|                    d	                    }|                    d
          |                    d
d          n(|	                    d
|                    d
                    }|                    d#          
                                j        pg }|s?|                     t                                        |          
                                 2 D ]}||         }|                    d	          |                    d          |                    d          |                    d           |                    d
          |                    d          |                    d!          pg ||dddd"}|                     t                                        |          
                                 "D ]}||         }|                    d	          |                    d          |                    d          |                    d           |                    d
          |                    d          |                    d!          pg ||dddd"}|                     t                                        |          
                                 t4                              d$t)          |          t)          |          t)          |                                |	z
            t)                     t)          "                     dS )&ur   
    - 직전 current 스냅샷 기준 → kepco_history 업데이트
    - 규칙은 기존 설명과 동일
    rs   zPid, department, name, position, task, start, end, actual_end, posted_at, pdf_urlr   currentTc           	         i | ]:}t          |                    d           |                    d                    |;S )r'   ra   )re   r   )rV   r   r`   s     r3   
<dictcomp>z!apply_history.<locals>.<dictcomp>  sN     I I I9:T155==!%%..111I I Ir5   z5department,name,position,task,gender,start,end,careerr/  r'   ra   r   r(   r)   r.   c                V    t          j        dd| pd                                          S r]   r^   r   s    r3   
_norm_taskz!apply_history.<locals>._norm_task  s&    vfb17,,22444r5   r   r   r7   c                V    g | ]%}                     |          |         d          &S r   r2  rV   kprev_by_keys     r3   rX   z!apply_history.<locals>.<listcomp>  s4    ZZZ{WXGYGYZAt,ZZZr5   r   i  
actual_endr   NFc                $    g | ]}|v|v
|S rU   rU   )rV   rC  extend_keystask_change_keyss     r3   rX   z!apply_history.<locals>.<listcomp>  s.    ^^^q!;*>*>1L\C\C\C\C\C\r5   c                V    g | ]%}                     |          |         d          &S rA  r2  rB  s     r3   rX   z!apply_history.<locals>.<listcomp>  s4    UUU+//RSBTBTU{1~d+UUUr5   )r;  rf   r  c                V    g | ]%}                     |          |         d          &S rA  r2  rB  s     r3   rX   z!apply_history.<locals>.<listcomp>  s4    XXXA[__UVEWEWX;q>$'XXXr5   
old_careerr   r   r   )r   r'   r   r   r   ra   r   r   rf   r  r;  extendedrK  rI   zW[history] dept=%s applied: close=%d, keep_same=%d, insert=%d, extend=%d, task_change=%dr   )rp   r	   r  rv   ry   r~   r   TABLE_HISTORYr   r   r   r   setkeysTABLE_CUR_VIEWr   re   r   r   ranger   r   in_is_r4   r  r   r  )#r   r`   r9  r  rN   
posted_isoprev_isoprev_kor	prev_rows	prev_keyscur_rows
new_by_keyr   rC  new_keysto_close_keys	keep_keysinsert_keysr?  prev_endnew_end	prev_tasknew_taskids_to_closei	keep_sameids_to_keepids_oldpr  qexistrG  rD  rH  s#    `                              @@@r3   apply_historyrk    s   
 ''Q8?+<+<+E+Ej+Q+QJz**Hh''H]++22Z btRR	4004FCE I I I I>GI I IK K$$&&''I ||N++22? btUU5\\''))D?<>  HJJ  quuV}}aeeGnn55JJqM:??$$%%H(M(Iy(K8:K=?5 5 5 5  	' 	' ^)r..u55](b--e44 ^)r..v66<"	](b--f55;N2..q!!!!Z	""jj&:&:::##A&&& WZZZZmZZZq#l++T22 	W 	WALL''..h/GHH3t\!AdF(344SSt5L5LWWYYYY
LL&&	5'9::2lD!!""Y"5"5ggiii^^^^^I^^^I :UUUUYUUUq#k**D11 	: 	:ALL''..*"0 0   s4QqvX.//				 :XXXX1AXXXq#g,,-- 	: 	:ALL''..d/CDD3tWQqvX.//				  B BqMEE&MMEE&MMj))eeHooUU7^^55<<eeHoo+&
 
 !%%--(( 	LL''..w77??AAALL''..t4477dKKNNvWXW\W\]cWdWdee$%EE'NN$:AEE'4   WaeeT[nn@]@]

""$$)/R 	BLL''..w77??AAA  > >qMfEE&MMquuZ/@/@eeHooUU7^^AEE%LLeeHoo+&7U
 
 	]##**733;;====  > >qMfEE&MMquuZ/@/@eeHooUU7^^AEE%LLeeHoo+&7e
 
 	]##**733;;====
KKac-  #i..#joo6G6G)6S2T2TVYZeVfVfhkl|h}h}    r5   sessiondry$Tuple[bool, Optional[str], int, int]c                   t                               d|           t          | ||          }|r*|                    d          r|                    d          st                               d|           dS |d         }|d         }|                    d          pd}	|                    d	          }
t          |
          }t                               d
||||	|
           | d| }t          |t          |          }t          | ||          }|sNt                               d|           |s+||||	|
t           d| d}|st          |t          |           d|ddfS t          |          }t          |          }t          |          }|sU||||	|
t           d| d}|st          |t          |           |s(t          ||d                   }t          |dd           |s+t          |t           ||||	|
|t           d| ||d
           t#          ||          }d}|s|rd}t%          dt          |          |          D ]n}||||z            }fd|D             }|                    t(                                        |                                           |t          |          z  }od}|smt/          ||          }|dk    rV	 t1          |||
p|pdt           d| |           n3# t2          $ r&}t                               d||           Y d}~nd}~ww xY wt                               d||||           d|||fS )u<   
    반환: (ok, department, inserted_org_rows, pages)
    z[%s] ---- start ----)r   r   r   z[%s] first item missing -> skip)FNr   r   r   r7   r   z9[%s] first: disclosureNo=%s, organ=%s, title=%s, idate=%sr-   z[%s] pdf.json fetch failed.z?disclosureNo=)r   r   r   r   rf   r  Tr   r  r  )r  r  )
r!  r   r   r   r   rf   posted_at_isor  r   rN   )r   i  c                   g | ]}|                     d           |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          pg d	
S )
r   r'   r   r   ra   r   r   r   r   )
r!  r   r'   r   r   ra   r   r   r   r   r2  )rV   rh  r!  s     r3   rX   z#process_company.<locals>.<listcomp>  s         !eeL11fEE*--%%//wuuU||f uu]33%%///R    r5   z[%s] apply_history failed: %sNz"[%s] pages=%d, stg=%d, promoted=%d)r   r  r   r   r   rp   r   TABLE_IDr   r   r  r   r[   r   r  r  	TABLE_RAWr   rQ  r   	TABLE_STGr  r   r8  rk  r   	exception)rl  r   r   r!  r   rm  r   r   r   r   r   rT  	record_idalreadyr   id_rowrQ   mergedr   msgpeopleins_stgchunkrd  partr  promotedr   s      `                        r3   process_companyr  ,  s>    KK&000WgU;;;E !		.11 !79K9K !8'BBB  .)M'NEIIg$"EIIgEJ
KKKue= = = !**5**Ivx;;G  eDDDH !4g>>> 
	4#!."%DD]DD F  4&(F333UAq   h''Ee$$FJJE  H*!@@@@
 
  	0fh/// 	H"5&*;<<C#&$GGGG  &)*'!@@@@!&
 &
 	 	 	 &%888FG !6 !q#f++u-- 	! 	!A!AeG)$D      G LL##**733;;===s4yy GG H N%feV<<a<<NfeU-Hz7GRWJsJsdqJsJsu{|||| N N N  !@'1MMMMMMMMN KK4gugxXXX%''s   !K6 6
L& L!!L&apba_idsOptional[List[str]]c           	        | pt           }t                      }t                      }ddddg d}|D ]}	 t          ||||||          \  }	}
}}|	rS|dxx         dz  cc<   |dxx         |z  cc<   |dxx         |z  cc<   |
r |d                             ||
||d	           n|d
xx         dz  cc<   nC# t
          $ r6}t                              d||           |d
xx         dz  cc<   Y d }~nd }~ww xY wt          j	        d           |S )Nr   )	processedskippedinserted_org_rowsr   	companies)r   rm  r  rI   r  r   r  )r   r   insertedr   r  z[%s] error: %sg333333?)
APBA_IDSr   r   r  r   r   r   ru  timesleep)r  r   rm  r!  idsrl  r   summaryapbaokr`   insr   r   s                 r3   run_oncer    s   

hCnnGTTF!!a^`aaG  	$#27D&&X]cf#g#g#g Bc5 ($$$)$$$+,,,3,,,   E)    wK(//4tadot0u0uvvv	"""a'""" 	$ 	$ 	$-tQ777I!#	$ 	
3Ns   A?B33
C3=,C..C3c            
        t          j                    } |                     dd           |                     dd           |                     dt          dd           |                                 }|j        rt                              d	           t                      }t          |d
          }	 t          }|j                                        r7d |j                            d          D             fdt          D             }t          ||j        |j        |          }t                              d|           t#          ||d|                    dd          |                    dd                     t'          |           d S # t(          $ r@}t                              d           t#          ||dt          |                      d }~ww xY w)Nz--debug
store_true)actionz	--dry-runz--onlyr7   u)   쉼표로 apbaId 제한: 예) C0236,C0247)typedefaulthelpDEBUGr&   c                ^    h | ]*}|                                 |                                 +S rU   r   )rV   r   s     r3   	<setcomp>zmain.<locals>.<setcomp>  s-    JJJ1		JQWWYYJJJr5   ,c                    g | ]}|v |	S rU   rU   )rV   r   allows     r3   rX   zmain.<locals>.<listcomp>  s    999Qa5jjqjjjr5   )r   rm  r!  zdone: %spassedr   r   r  )r   r   r   zgroup_n8n failedfailed)r   r#  )argparseArgumentParseradd_argumentr.   
parse_argsr   r   setLevelr   r"  r  onlyr/   r   r  dry_runr  r&  r   printr   ru  )parserargsr   r!  targetsr  r   r  s          @r3   mainr    s   $&&F
	,777
L999
sB=hiiiDz !   TTF44F9?? 	:JJ	(<(<JJJE9999(999G7$*$,vVVVJ(((++gq))0!44	
 	
 	
 	
 	g   +,,,66(AOOOOs   5CF 
G;GG__main__)r'   r(   r)   r*   )r2   r(   r)   r.   )r2   r(   r)   r*   )rG   r.   r2   r.   r)   r(   )rN   r.   r)   r(   )rQ   rR   r)   r.   )r`   r.   r'   r(   ra   r(   r)   rb   )rf   r.   r)   r(   )rq   r.   r)   r.   rd   )rN   r.   r   r(   r)   r   )r)   r   )F)r2   r   r   r.   r   r*   r)   r   )r2   r   r   r.   r   r*   r)   r(   )r   r.   r)   rR   )r   r.   r   r.   r)   r*   )r   r.   r   r   r)   r   )r  T)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.   r   rl   r   rl   r#  r.   )r   r   r)   r*   )r   r.   r!  r.   r)   rl   )
r`   r.   r9  r.   r  r.   rN   r.   r)   r   )FF)rl  r   r   r.   r!  r.   r   r*   rm  r*   r)   rn  )NFFN)
r  r  r   r*   rm  r*   r!  r(   r)   r   )W
__future__r   ossysr<   r   r  r  loggingr  typingr   r   r   r   r   r	   r
   r  r   pypdfr   pathabspathrY   dirname__file__ROOT_DIRr   app.services.supabase_servicer   r  r   r   r   rr  rs  rt  
TABLE_SNAPrP  	TABLE_ORGrM  getenvr!   r#   upperr$   	getLoggerr   StreamHandlerhandlersetFormatter	Formatter
addHandlerr  compiler0   r4   r?   rF   rM   rP   r[   r_   re   rp   ry   r~   r   r   r   r   r   r   r   r  r  r  r"  r&  r-  r8  rk  r  r  r  __name__rU   r5   r3   <module>r     s   " " " " " " 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ( ( ( ( ( ( ( (         7??27<<(A(A4NNOO38HOOH 4 4 4 4 4 4
   =8
0 		!
 	 ry-..K)")N2K2KRY)**Eibi.E.E
BIk6**0022			;	'	'
'

!
!   &W&'DEE F F F   '    	   
 bj011          W W W W
- - - -- - - -   
1 1 1 18 8 8 8
 
 
 
% % % %
= = = =< < < < <B   % % % % %N
 
 
 
 
	 	 	 	     . . . .    .      K K K K K   > > > >FD D D DRo( o( o( o( o(h    2! ! !F zDFFFFF r5   