o
    PCVj"  ã                   @   s¸   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„ Zdd„ Zd"dd„Z	d	d
„ Z
d"dd„Zd"dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd#dd„Zdd„ Zd d!„ ZdS )$é    )ÚPROVINCIAS_CON_NUMERONc                 C   s$   t | |ƒ}|r	|S td|||ƒ}|S )uØ   
    Ejecuta Regla1 y Regla2 en orden para intentar obtener el CUIT sugerido.
    Si Regla1 no resuelve, Regla2 busca por razon_social independientemente
    de si habÃ­a un CUIT original (que resultÃ³ inÃºtil).
    N)ÚRegla1ÚRegla2)ÚcuitÚrazon_socialÚ	provinciaÚ	conn_readÚsugerido© r
   úB/home/develop/edictos_py/central_edictos/helpers/cuit_homonimia.pyÚbuscar_cuit_sugerido   s
   
r   c                 G   s8   |   ¡ }z|j|g|¢R Ž  | ¡ W | ¡  S | ¡  w ©N)ÚcursorÚexecuteÚfetchallÚclose)ÚconnÚsqlÚparamsÚcr
   r
   r   Ú_exec   s
   r   c                 C   sd   zt | ddd |d|d d d d d d d fƒW S  ty1 } zt d|› d|› �¡ W Y d }~d S d }~ww )NúFEXEC [dbo].[buscador_paises_padron] ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?ÚmasivosÚARzError al buscar por CUIT cuit=ú: ©r   Ú	ExceptionÚloggingÚerror)r   r   Úcod_provinciaÚer
   r
   r   Úejecutar_busqueda_cuit    s   ý€þr!   c                 C   s@   t jdd| t jd�} t jdd| t jd�} t jdd| t jd�} | S )Nú\bS[\s\.]*A[\s\.]*S\bÚSAS)Úflagsú\bS[\s\.]*R[\s\.]*L\bÚSRLú\bS[\s\.]*A\bÚSA)ÚreÚsubÚ
IGNORECASE)Útextor
   r
   r   Úcompactar_siglas+   s   r-   c                 C   sl   zt |ƒ}t| ddd |d|d d d d d d d fƒW S  ty5 } zt d|› d|› �¡ W Y d }~d S d }~ww )Nr   r   r   z"Error al buscar por razon_social='ú': )r-   r   r   r   r   ©r   r   r   r    r
   r
   r   Úejecutar_busqueda_rs1   s   ý€þr0   c                 C   sj   zt | ddd |d|d d d d d d d fƒW S  ty4 } zt d|› d|› d|› �¡ W Y d }~d S d }~ww )Nr   Úbuscadorr   z,Error al buscar por provincia razon_social='z' cod_provincia=r   r   r/   r
   r
   r   Úejecutar_busqueda_prov=   s   ý€þr2   c                 C   sl   | r4|   ¡ dkr4t| ƒ} t|| d�pg }t|ƒdkr$t d| › �¡ | S t d| › dt|ƒ› d�¡ d S d S )NÚnull)r   é   u    Regla1: CUIT Ãºnico encontrado: u'   Regla1: sin resultado Ãºnico para cuit=z (encontrados: ú))ÚlowerÚpurgar_cuitr!   Úlenr   Údebug)r   r   Ú
resultadosr
   r
   r   r   H   s   r   c           
         sœ  | rt | ƒ ¡ dk�rGˆ �rGˆ  ¡ dk�rGtˆ ƒ}z
t||d�p!g }W n tyA } zt dˆ › d|› �¡ W Y d }~d S d }~ww |sOt dˆ › d�¡ d S z	dd„ |D ƒ}W n tyk   t d	ˆ › d�¡ Y d S w t|ƒd
kr‚|d d }t d|› �¡ |S ‡ fdd„|D ƒ}t|ƒd
kr¡|d d }t d|› �¡ |S |�r7t	 
| ¡  ¡ ¡}	|	d u r¼t d|› d�¡ |S zt|||	d�pÅg }W n! tyè } zt dˆ › d|	› d|› �¡ W Y d }~d S d }~ww |sõt d|	› �¡ d S z	dd„ |D ƒ}W n t�y   t dˆ › d�¡ Y d S w t|ƒd
k�r*|d d }t d|› �¡ |S t dt|ƒ› d�¡ |S t dˆ › dt|ƒ› d�¡ |S t d¡ d S )Nr3   ©r   z+Regla2: error en busqueda_rs razon_social='r.   z*Regla2: sin resultados para razon_social='ú'c                 S   ó   g | ]
}|d  |d f‘qS ©é   é   r
   ©Ú.0Úrr
   r
   r   Ú
<listcomp>e   ó    zRegla2.<locals>.<listcomp>z?Regla2: estructura inesperada en resultados para razon_social='r4   r   u   Regla2: RS Ãºnica sugiere c                    s,   g | ]}t tˆ ƒƒt t|d  ƒƒkr|‘qS )r4   )Úpurgar_nombreÚpurgar_espaciosrA   r;   r
   r   rD   o   s
    ÿu+   Regla2: coincidencia exacta Ãºnica sugiere zRegla2: provincia 'z%' no reconocida, retornando multiples)r   r   z-Regla2: error en busqueda_prov razon_social='z' cod_prov=r   z/Regla2: sin resultados para provincia cod_prov=c                 S   r=   r>   r
   rA   r
   r
   r   rD   ‰   rE   zMRegla2: estructura inesperada en resultados por provincia para razon_social='u/   Regla2: resultado Ãºnico por provincia sugiere z9Regla2: multiples resultados tras filtrar por provincia (r5   z>Regla2: multiples resultados sin provincia para razon_social='z' (z$Regla2: sin razon_social para buscar)Ústrr6   Ú_normalizar_razon_socialr0   r   r   r   r9   r8   r   ÚgetÚstripÚupperÚinfor2   )
r   r   r   r   Úrazon_social_limpiar:   r    Úcuit_resultÚcoincidencias_exactasÚcod_provr
   r;   r   r   V   sx   *€þþ
ÿ€þþ
r   c                 C   st   | sdS t  dd|  ¡  ¡ ¡} t  dd| ¡} t  dd| ¡} t  dd	| ¡} |  ¡ }d
d„ |D ƒ}|dd… }d |¡S )u±   NormalizaciÃ³n para modo 'masivos': compacta siglas pero no las elimina, limita a 15 palabras.
    Distinto de helpers.buscar_cuit.limpiar_razon_social, que usa modo 'buscador'.Ú z\s+ú r"   r#   r%   r&   r'   r(   c                 S   s.   g | ]}t |ƒd krtdd„ |D ƒƒr|‘qS )r4   c                 s   s   � | ]}|  ¡ V  qd S r   )Úisalnum©rB   r   r
   r
   r   Ú	<genexpr>©   s   € z6_normalizar_razon_social.<locals>.<listcomp>.<genexpr>)r8   Úany)rB   Úpr
   r
   r   rD   ©   s   . z,_normalizar_razon_social.<locals>.<listcomp>Né   )r)   r*   rK   rL   ÚsplitÚjoin©r,   Úpalabrasr
   r
   r   rI   œ   s   
rI   c                 C   s@   t  d| ¡}d dd„ |D ƒ¡}| dd¡ dd¡}| ¡  ¡ S )NÚNFKDrR   c                 S   s   g | ]	}t  |¡s|‘qS r
   )ÚunicodedataÚ	combiningrU   r
   r
   r   rD   ²   s    z!purgar_nombre.<locals>.<listcomp>ú,Ú.)r_   Ú	normalizer[   ÚreplacerK   rL   )ÚnombreÚnfkdÚ
sin_tildesÚlimpior
   r
   r   rF   °   s   rF   c                 C   ó   |   dd¡}|S )NrS   rR   ©rd   )re   Úsin_espaciosr
   r
   r   rG   ¶   ó   rG   c                 C   ri   )Nú-rR   rj   )r   Úsin_guionesr
   r
   r   r7   º   rl   r7   ç333333Ã?c                    sÐ   dd„ ‰ˆ| ƒ‰ t ‡ ‡fdd„|D ƒdd�}|sdS t|ƒdkr&|d	 d S |d	 \}}}|d d	 }|| |krNt d
|› d|d›d|| d›d�¡ |S t d|› d|d›d|d d › d|d›d�	¡ dS )uá   
    De una lista de candidatos (cuit, nombre), selecciona el mejor match
    comparando con razon_social usando palabras ordenadas + SequenceMatcher.
    Retorna el CUIT si hay un ganador claro, None si hay ambigÃ¼edad.
    c                 S   s   t |  ¡  ¡  ¡ ƒ}d |¡S )NrS   )Úsortedr6   rK   rZ   r[   r\   r
   r
   r   Ú
normalizarÄ   s   
z*seleccionar_mejor_cuit.<locals>.normalizarc                    s,   g | ]\}}t  d ˆ ˆ|ƒ¡ ¡ ||f‘qS r   )ÚdifflibÚSequenceMatcherÚratio)rB   r   re   ©Úbaserq   r
   r   rD   Ê   s     ÿz*seleccionar_mejor_cuit.<locals>.<listcomp>T)ÚreverseNr4   r   z  [MEJOR MATCH] z	 (score: z.2fz, dif: r5   z  [AMBIGUO] Mejor: z (z) vs é   )rp   r8   r   r9   rM   )r   Ú
candidatosÚumbral_diferenciaÚscoresÚmejor_scoreÚ
mejor_cuitÚmejor_nombreÚsegundo_scorer
   ru   r   Úseleccionar_mejor_cuit¾   s&   ÿý&0r€   c                 C   s<   t | ddd��}t |¡W  d   ƒ S 1 sw   Y  d S )NrC   zutf-8)Úencoding)ÚopenÚjsonÚload)ÚpathÚfr
   r
   r   Úcargar_jsonß   s   $ÿr‡   c                 C   s4   z|   ¡ r	 |   ¡ sW d S W d S  ty   Y d S w r   )Únextsetr   )r   r
   r
   r   Úconsumir_result_setsã   s   ÿÿr‰   )NN)ro   )Úhelpers.provinciasr   rr   rƒ   r   r_   r)   r   r   r!   r-   r0   r2   r   r   rI   rF   rG   r7   r€   r‡   r‰   r
   r
   r
   r   Ú<module>   s*    
	

F
!