
    hN                    *   U 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mZmZm	Z	 d dl
mZ d dlmZmZmZmZmZ d dlmZ d dlZd dlmZ d dlmZ  ej        d	          ZdodZ e            Z e ee                    Z e            Zg dZ g dZ! ej"                    Z#d Z$dpdZ%dddddddZ&dqdZ'd Z(drd!Z)dsd"Z*dtd$Z+dud(Z,dvd+Z-dwd.Z. ej/        d/          d0f ej/        d1          d2f ej/        d3          d4fgZ0d5e1d6<   dxd9Z2dyd@Z3dzdAZ4d{dEZ5d|dGZ6d}dHZ7 ej/        dI          Z8d~dKZ9dddPZ:ddRZ;	 	 	 ddd\Z<dd_Z=ddaZ>ddbZ?g dcZ@dde1de<   ddfZAddgZB ej/        dh          ZCddiZDddlZE ej/        dm          ZFddnZGdS )    )annotationsN)datetimedate	timedelta)Path)OptionalListDictAnyTuple)defaultdict)Jinja2Templates)
get_clientz
govbot.webreturnr   c                     t          t                                                    } | j        d         dz  | j        d         dz  | j        d         dz  g}|D ]}|                                r|c S |d         S )N   	templates   r   )r   __file__resolveparentsexists)here
candidatesds      !/var/www/html/bot/app/web/core.py_find_templates_dirr      s    >>!!##D,q/K/,q/K/,q/K/1J   88:: 	HHH	a=    )	directory)   한국전력공사   한국남동발전   한국중부발전   한국서부발전   한국남부발전   한국동서발전   한국수력원자력	   한전KPS	   한전KDN   한국전력기술   한전원자력연료)u   상임기관장   상임감사   상임이사   비상임이사c                     t                               d                              d                                          j        pg } d | D             S )Ngov_staff_current*c                0    i | ]}|d          |d         f|S )	person_idsource .0rs     r   
<dictcomp>z1_current_map_by_person_source.<locals>.<dictcomp>*   s'    ;;;Q{^Qx[)1;;;r   )sbtableselectexecutedata)rowss    r   _current_map_by_person_sourcer?   (   sJ    88'((//44<<>>CIrD;;d;;;;r   
person_ids	list[int]dict[int, str]c                "   | si S t          t          d | D                                 }t                              d                              d                              d|                                          j        pg }d |D             S )Nc                0    g | ]}|t          |          S N)intr6   xs     r   
<listcomp>z$_person_name_map.<locals>.<listcomp>/   s    CCC!Q]s1vv]]]r   person_registryzperson_id,canonical_namer2   c                p    i | ]3}|d          |                     d          pt          |d                    4S )r2   canonical_name)getstrr5   s     r   r8   z$_person_name_map.<locals>.<dictcomp>1   s=    [[[QRAkNQUU#344KAkN8K8K[[[r   )sortedsetr9   r:   r;   in_r<   r=   )r@   uniqr>   s      r   _person_name_maprS   ,   s     	#CCzCCCDDEED88%&&--.HIIMMk[_``hhjjousuD[[VZ[[[[r   u   입사(신규)   퇴사   부서이동   직위변경   전화변경u'   개명(권장: 퇴사/입사로 처리))NEWDEPARTEDMOVECHANGE_POSITIONCHANGE_PHONECHANGE_NAMEtrN   c                8    t                               | |           S rE   )	_EVENT_KOrM   )r^   s    r   	_ev_labelra   8   s    Y]]1a%8%88r   c                    t          t                    }| D ]%}||                    |          xx         dz  cc<   &t          |          S )Nr   )r   rF   rM   dict)itemskeycits       r   _group_countrh   :   sK    CA  	"&&++!77Nr   	List[str]c                   | g S t          | t                    rd | D             S t          | t                    r|                                 }|r|                                dk    rg S |                    d          r\|                    d          rG	 t          j        |          }t          |t                    rd |D             S n# t          $ r Y nw xY wd|v rd |
                                D             S d|v rd	 |                    d          D             S |gS t          |                                           gS )
Nc                    g | ]D}t          |                                          #t          |                                          ES r4   rN   striprG   s     r   rI   z_as_list.<locals>.<listcomp>C   s9    >>>1s1vv||~~>A>>>r   none[]c                    g | ]D}t          |                                          #t          |                                          ES r4   rl   rG   s     r   rI   z_as_list.<locals>.<listcomp>K   s9    HHHqQHCFFLLNNHHHr   
c                ^    g | ]*}|                                 |                                 +S r4   rm   r6   r^   s     r   rI   z_as_list.<locals>.<listcomp>M   s-    MMMA17799MaggiiMMMr   |c                ^    g | ]*}|                                 |                                 +S r4   rt   ru   s     r   rI   z_as_list.<locals>.<listcomp>N   s-    KKKAKaggiiKKKr   )
isinstancelistrN   rm   lower
startswithendswithjsonloads	Exception
splitlinessplit)valsvs      r   _as_listr   @   sS   
{2I#t ?>>>>>>#s IIKK0AGGIIv%%by<< 	#C 	##JqMMa&& IHHAHHHHI"""dd"199MMMMMM!88KKKKKKs
HHNNs   4C 
CCc                R    t          |           }|rd                    |          ndS )Nrr   -)r   join)r   arrs     r   _normalize_multiliner   R   s&    
3--C )499S>>>c)r   rF   c                B    t          |           S # t          $ r Y dS w xY w)Nl    J))rF   r   )r   s    r   _to_int_safer   V   s&    A###VVV#s    
r7   dict | Nonerc   c                @      s	dddddddS d  fddD             S )Nr   )r3   
departmentpositionnamephonetaskc                2    | pd                                 pdS )N r   rt   )rH   s    r   _sz_pack_row_for_table.<locals>._s]   s    qwBoo''.3.r   c                N    i | ]!}|                      |                    "S r4   rM   )r6   kr   r7   s     r   r8   z'_pack_row_for_table.<locals>.<dictcomp>^   s-    ]]]qAbbqll]]]r   r4   )r7   r   s   `@r   _pack_row_for_tabler   Z   sL     `#CPS[^___...]]]]]$\]]]]r   dep
str | Nonec                   | sd S |                                  }t          j        dd|t          j                  }|                                }t
          D ]}|                    dd          |v r|c S d|v rdS d|v rdS d	|v sd
|v sd|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d S )Nu    (?:\(주\)|㈜|주식회사|\s+)r   )flags KPSr'   KDNr(   KEPCOu   한국전력u   한전r    u   남동발전r!   u   중부발전r"   u   서부발전r#   u   남부발전r$   u   동서발전r%   u   수력원자력r&   u   전력기술r)   u   원자력연료r*   )rm   resubIupperCOMPANY_ORDERreplace)r   r   s0sUlbls        r   _norm_company_labelr   a   s<   tt		A	3R"$	G	G	GB	B 1 1;;s2"$$Sjjj${{;;{{;;"}}",,BG[G[$8$8$8$8$8$8$8$8$8$8B'>'>$8$8B'>'>4r   posOptional[str]c                    | sd S |                                  }|                    dd          }d|v rdS d|v rdS d|v rd|vrdS d|v rdS |t          v r|S d S )Nr   r   u	   비상임r-   r+   u   감사위원r,   )rm   r   	POS_ORDER)r   pp0s      r   _normalize_positionr   u   s    tt		A	
3r		Ba 1 1NN{!33NN>>I~~ax4r   uC   ^\s*(\d{4})[.\-\/년\s]*(\d{1,2})[.\-\/월\s]*(\d{1,2})[일\s]*\s*$ymdu2   ^\s*(\d{4})[.\-\/년\s]*(\d{1,2})[.\-\/월\s]*\s*$ymz^\s*(\d{4})\s*$yzList[Tuple[re.Pattern, str]]_DATE_PATTERNSr   2Tuple[Optional[int], Optional[int], Optional[int]]c                   | sdS t          |                                           }t          D ]\  }}|                    |          }|rt	          |                    d                    }|dk    rG|t	          |                    d                    t	          |                    d                    fc S |dk    r'|t	          |                    d                    d fc S |dk    r|d d fc S 	 t          j        |d d                                                   }|j	        |j
        |j        fS # t          $ r Y dS w xY w)	N)NNNr   r   r      r   r   
   )rN   rm   r   matchrF   groupr   fromisoformatr   yearmonthdayr   )r   r^   patkindmr   r   s          r   _parse_date_partsr      sA   %%%AA# 1 1	TIIaLL 	1AGGAJJAU{{1c!''!**oos1771::#FFFFTzz1c!''!**oot#;;;;Syy1dD=000 "1SbS6**//11vqw%%       s   4AD6 6
EEOptional[int]r   r   assume_lastboolOptional[date]c                    | d S ||rdnd}||rt          j        | |          d         nd}t          | ||          S # t          $ r Y d S w xY w)N   r   )calendar
monthranger   r   )r   r   r   r   s       r   _parts_to_dater      sk    yyK.bbQ!ykHh)!Q//22q!Q1	!!!TTT!s   ? 
AAc                >    | dS |r|dnd}|r|dnd}|  d| d| S )Nr   02dz??r4   )r   r   r   mmdds        r   _fmt_date_displayr      sK    y	"AdB	"AdB"rr   rawr   tuple[str, Optional[date]]c                    | dS t          |                                           }|r|                                dk    rdS t          |          \  }}}t	          |||          }t          |||d          }||fS )N)r   Nrn   T)r   )rN   rm   rz   r   r   r   )r   r   r   r   r   dispcmp_ds          r   _date_display_and_comparer      s    
{99CA3		6!!))""GAq!Q1%%D1a555E;r   gc                    t          | pd                                                                          }|sdS |dv rdS |dv rdS t          |           S )Nr   r   >      女   여성   여자ffemale   여r   >      男   남성   남자r   male   남r   )rN   rm   rz   )r   r   s     r   _gender_labelr      s^    AG""$$ASS888666uuq66Mr   c                (    t          |           dk    S )Nr   )r   )r   s    r   
_is_femaler      s    }Q'7'7'> >r   u3   (?<![가-힣A-Za-z0-9])한전(?![가-힣A-Za-z0-9])careerc                p    | sdS t          |           }d|v rdS t                              |          rdS dS )NFr    T)rN   _KEPCO_WORD_REsearch)r   r^   s     r   _is_kepco_alum_textr      sC    %%FAq  Q,5r         @urltimeoutfloatc                    	 t          j                     }t          j        | |ddi          }t          t          j                     |z
  dz            }d|j        cxk    rdk     rn n|dk     rdnd	|d
S d|d
S # t
          $ r dd d
cY S w xY w)Nz
User-Agentz
govbot/1.0)r   headers     i  i  OKu   지연)labelmsu   불량)timerequestsrM   rF   status_coder   )r   r   t0r7   r   s        r   _ping_statusr      s    ,Y[[Lg\7RSSS$)++b.$&''!-%%%%#%%%%%%'WWTT("EEE b))) , , , d+++++,s   A3A; 6A; ;BBr:   c                   t          j                    t          d          z
  }	 t                              |                               d                              d|                                                                          }t          |j
        pg           S # t          $ rJ 	 t                              |                               d                              dd                              d	                                          }|j
        pg }n# t          $ r Y Y d
S w xY wd
}|D ]}|                    d          p|                    d          }|s/d }t          |                                          }t          j        |d d                   }n@# t          $ r3 t          j        |d d         d          }n# t          $ r d }Y nw xY wY nw xY w|r||k    r|dz  }|cY S w xY w)N   )hourszid,created_at
created_atr0   idTdescr   r   	posted_at   r   z%Y-%m-%dr   )r   utcnowr   r9   r:   r;   gte	isoformatr<   lenr=   r   orderlimitrM   rN   rm   r   strptime)	r:   cutoffresr=   cntr7   tsdtr   s	            r   _count_last_24hr     s   _!4!4!44Fhhuoo$$_5599,HXHXHZHZ[[ccee38>r"""   	((5//((--33Dt3DDJJ4PPXXZZC8>rDD 	 	 	111	 		- 		-A|$$:k(:(:BxBBA,QssV44 , , ,"+AcrcFJ??RR +++t"""+, ,bFllC1HC


#s   A:B! !G6-A0DG6
D-(G6,D--AG6F#"G6#
G -G
G G	G G	G G6G  G65G6titletag   source_label	title_keyurl_keytag_key
limit_scanList[Dict[str, Any]]c           	        t          j                                                    }	 t                              |                               d                              dd                              |                                          }|j	        pg }n# t          $ r g }Y nw xY wg }	|D ]}
t          |
                    d          p|
                    d          pd          d d         }||k    rZ|	                    ||
                    |          pd	|r|
                    |          nd |
                    |          |d
           |	S )Nr0   r  Tr  r  r  r   r   r   )srcr  r  r   r   )r   todayr
  r9   r:   r;   r  r  r<   r=   r   rN   rM   append)r:   r  r  r  r  r  	today_strr  r>   outr7   r   s               r   _today_items_fromr$     sU    
&&((Ihhuoo$$S))//4/@@FFzRRZZ\\x~2   
C 	 	k""?aeeL&9&9?R@@"E	>>JJ#y))0S*1;gtuuW~~     Js   A0B B'&B'csv_str	list[str]c                t    | pd                                 }|sg S d |                    d          D             S )Nr   c                ^    g | ]*}|                                 |                                 +S r4   rt   ru   s     r   rI   z%_event_labels_csv.<locals>.<listcomp>   s-    999!qwwyy9AGGII999r   ,)rm   r   )r%  r   s     r   _event_labels_csvr*     s?    	BARi99qwws||9999r   r   c           	     @    ddddddddd	                     | |           S )
Nu   신규rT   rU   rV   rW   u   업무변경u   이름변경u   변경없음)rX   rY   rZ   r[   r\   CHANGE_TASKr]   	NO_CHANGEr   )r   s    r   
_label_korr.     s4    (.($>"	 
 
c!Qiir   c                V    t          j        dd| pd                                          S N\s+r   )r   r   r   r   s    r   _normalize_namer3    &    6&ag2''--///r   ))u	   장관실r   u   장관)	   대변인r   r5  )u   홍보담당관r      과장)u   홍보지원팀r      팀장)	   감사관r   r8  )u   감사담당관r   r6  )u
   제1차관r   u   1차관)u   운영지원과r   r6  )u   기획조정실r      실장)u   정책기획관r      국장)u   기획재정담당관r   r6  )u   혁신행정담당관r   r6  )u   규제개혁법무담당관r   r6  )u   정보관리담당관r   r6  )u   정보보호담당관r   r6  )u   비상안전기획관r   r:  )u   산업재난담당관r   r6  )u   산업정책실r   r9  )u   산업정책관r   r:  )u   산업정책과r   r6  )u   산업일자리혁신과r   r6  )u   산업환경과r   r6  )u   산업인공지능혁신과r   r6  )u   기업정책팀r   r7  )u   산업공급망정책관r   r:  )u   산업공급망정책과r   r6  )u   소재부품장비개발과r   r6  )u   철강세라믹과r   r6  )u   화학산업팀r   r7  )u   제조산업정책관r   r:  )u   기계로봇제조정책과r   r6  )u   자동차과r   r6  )u   조선해양플랜트과r   r6  )u   엔지니어링디자인과r   r6  )u   첨단민군혁신지원과r   r6  )u   첨단산업정책관r   r:  )u   반도체과r   r6  )u   배터리전기전자과r   r6  )u   바이오융합산업과r   r6  )u   섬유탄소나노과r   r6  )u   디스플레이가전팀r   r7  )u   산업기반실r   r9  )u   산업기술융합정책관r   r:  )u   산업기술정책과r   r6  )u   산업기술개발과r   r6  )u   산업기술시장혁신과r   r6  )u   규제샌드박스팀r   r7  )u   지역경제정책관r   r:  )u   지역경제총괄과r   r6  )u   지역경제진흥과r   r6  )u   입지총괄과r   r6  )u   중견기업정책관r   r:  )u   중견기업정책과r   r6  )u   중견기업지원과r   r6  )u   유통물류과r   r6  )u
   제2차관r   u   2차관)u   에너지정책실r   r9  )u   에너지정책관r   r:  )u   에너지정책과r   r6  )u   에너지효율과r   r6  )u   에너지기술과r   r6  )u   전력정책관r   r:  )u   전력산업정책과r   r6  )u   전력시장과r   r6  )u   신산업분산에너지과r   r6  )u   전력계통혁신과r   r6  )u   재생에너지정책관r   r:  )u   재생에너지정책과r   r6  )u   재생에너지산업과r   r6  )u   재생에너지보급과r   r6  )u   수소경제정책관r   r:  )u   수소경제정책과r   r6  )u   수소산업과r   r6  )u   에너지안전과r   r6  )u   자원산업정책국r   r:  )u   자원안보정책과r   r6  )u   석유산업과r   r6  )u   가스산업과r   r6  )u   석탄산업과r   r6  )u   광물자원팀r   r7  )u   원전산업정책국r   r:  )u   원전산업정책과r   r6  )u   원전환경과r   r6  )u   원전지역협력과r   r6  )u   원전전략기획관r   r:  )u   원전수출진흥과r   r6  )u   원전수출협력과r   r6  )u   통상교섭본부장실r   u   통상교섭본부장)   통상차관보r   r;  )u   통상정책국r   r:  )u   통상정책총괄과r   r6  )u   미주통상과r   r6  )u   구주통상과r   r6  )u   중남미대양주통상팀r   r7  )u   신통상전략지원관r   r:  )u   신통상전략과r   r6  )u   디지털경제통상과r   r6  )u   기후에너지통상과r   r6  )u   통상협력국r   r:  )u   통상협력총괄과r   r6  )u   동북아통상과r   r6  )u   아주통상과r   r6  )u   중동아프리카통상과r   r6  )u   통상교섭실r   r9  )u   자유무역협정정책관r   r:  )u!   자유무역협정정책기획과r   r6  )u   자유무역협정이행과r   r6  )u   통상협정활용과r   r6  )u   인도태평양통상기획팀r   r7  )u   자유무역협정교섭관r   r:  )u!   자유무역협정협상총괄과r   r6  )u   자유무역협정상품과r   r6  )u$   자유무역협정서비스투자과r   r6  )u!   자유무역협정무역규범과r   r6  )u   다자통상법무관r   r:  )u   통상법무기획과r   r6  )u   세계무역기구과r   r6  )u   다자통상협력과r   r6  )u   통상분쟁대응과r   r6  )u   무역투자실r   r9  )u   무역정책관r   r:  )u   무역정책과r   r6  )u   무역진흥과r   r6  )u   수출입과r   r6  )u   투자정책관r   r:  )u   투자정책과r   r6  )u   투자유치과r   r6  )u   해외투자과r   r6  )u   무역안보정책관r   r:  )u   무역안보정책과r   r6  )u   무역안보심사과r   r6  )u   기술안보과r   r6  )u   국가기술표준원r      원장)u	   원장실r   r9  )u   지원총괄과r   r6  )u   표준정책국r   r:  )u   표준정책과r   r6  )u   국제표준협력과r   r6  )u   산업표준혁신과r   r6  )u   전기전자정보표준과r   r6  )u   기계융합산업표준과r   r6  )u!   바이오화학서비스표준과r   r6  )u$   국제표준화기구전략대응팀r   r7  )u   제품안전정책국r   r:  )u   제품안전정책과r   r6  )u   제품시장관리과r   r6  )u   제품안전정보과r   r6  )u   전기통신제품안전과r   r6  )u   생활어린이제품안전과r   r6  )u   적합성정책국r   r:  )u   시험인증정책과r   r6  )u   적합성평가과r   r6  )u   인증산업진흥과r   r6  )u   계량측정제도과r   r6  )u   기술규제대응국r   r:  )u   기술규제정책과r   r6  )u   무역기술장벽협상과r   r6  )u   기술규제조정과r   r6  )u   기술규제협력과r   r6  )u   무역위원회r   	   위원장)   상임위원r   r>  )u   무역조사실r   r:  )u   무역구제정책과r   r6  )u   산업피해조사과r   r6  )u   덤핑조사과r   r6  )u   덤핑조사지원과r   r6  )u   불공정무역조사과r   r6  )u   판정지원과r   r6  )u   광업등록사무소r      소장)u	   등록팀r   r7  )u	   심사팀r   r7  )u   동부광산안전사무소r   r?  )u   중부광산안전사무소r   r?  )u   서부광산안전사무소r   r?  )u   남부광산안전사무소r   r?  )u   전기위원회r   r=  )u	   사무국r   u   사무국장)u   경제자유구역기획단r   u   단장)u   정책기획팀r   r7  )u   혁신지원팀r   r7  )u   서비스투자지원팀r   r7  )u   개발투자지원팀r   r7  )u!   마산자유무역지역관리원r   r<  u	   관리과r   r6  u   수출산업과r   r6  )u   투자홍보과r   r6  )u!   군산자유무역지역관리원r   r<  r@  rA  )u   비상계획과r   r6  )u!   대불자유무역지역관리원r   r<  r@  rA  )u!   동해자유무역지역관리원r   r<  )u!   율촌자유무역지역관리원r   r<  )u!   김제자유무역지역관리원r   r<  r@  rA  )u!   울산자유무역지역관리원r   r<  r@  rA  zlist[tuple[str, int, str]]_MOTIE_ORDER_POSc                V    t          j        dd| pd                                          S r0  )r   r   rz   r2  s    r   _nkrD    r4  r   c                    | dS t          |                                                               dd          }t          j        dd|          }|                                S )Nr   u   এu   에r1  )_strip_invisrm   r   r   r   rz   r   r^   s     r   
_norm_deptrH    sT    yrQ''e44A
vr1A7799r   uE   [()\[\]{}＜＞〈〉【】]|직무대리|대행|겸임|파견|서리c                    | sdS t          |           }t                              d|          }t          j        dd|          }|                                S )Nr   r1  )rF  _POS_STRIP_REr   r   rz   rG  s     r   _pos_keyrK    sP     rQA"a  A
vr1A7799r   actualexpectedc                B    t          |           t          |          k    S rE   )rK  )rL  rM  s     r   
_pos_equalrO    s    Fx1111r   z[\u200B-\u200D\uFEFF\u2060]c                    | s| S |                      dd                               dd                               dd          }t                              d|          }|S )N    r   u   —r   u   –r   )r   	_INVIS_REr   rG  s     r   rF  rF    sZ     			(C  ((44<<UCHHAb!AHr   )r   r   )r@   rA   r   rB   )r^   rN   r   rN   )r   ri   )r   rN   )r   rF   )r7   r   r   rc   )r   r   r   r   )r   r   r   r   )r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rN   )r   r   r   r   )r   r   r   rN   )r   r   r   r   )r   r   r   r   )r   )r   rN   r   r   r   rc   )r:   rN   r   rF   )r  r   r  r  )r:   rN   r  rN   r  rN   r  rN   r  r   r  rF   r   r  )r%  rN   r   r&  )r   rN   r   rN   )r   rN   r   rN   )r   r   r   rN   )rL  r   rM  r   r   r   )H
__future__r   loggingr}   r   r   r   r   r   r   pathlibr   typingr   r	   r
   r   r   collectionsr   r   starlette.templatingr   app.services.supabase_servicer   	getLoggerloggerr   TEMPLATE_DIRrN   r   r9   r   r   r   TODAYr?   rS   r`   ra   rh   r   r   r   r   r   r   compiler   __annotations__r   r   r   r   r   r   r   r   r   r  r$  r*  r.  r3  rB  rD  rH  rJ  rK  rO  rR  rF  r4   r   r   <module>r`     s   " " " " " " " ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( . . . . . . . . . .       3 3 3 3 3 3 3 3 3 3 3 3 3 3 # # # # # #  0 0 0 0 0 0 4 4 4 4 4 4		<	(	(    #"$$Occ,&7&7888	Z\\   SRR	
< < <\ \ \ \ hn$N; 	
 9 8 8 8     $* * * *$ $ $ $^ ^ ^ ^   (	 	 	 	 RZVWWY^_RZEFFMRZ"##S)0    
        " " " "          ? > > >RSS   	, 	, 	, 	, 	,   0 ELAF&)    .: : : :
   0 0 0 0J0 J0 J0  J J J JX0 0 0 0    
cdd   2 2 2 2
 BJ566	     r   