o
    {\j                  	   @   s   d dl mZmZ d dlZd dlZd dlZd dlm  m	Z
 dZddededB deeef fddZddededB deeef fd	d
ZddededB deeef fddZdS )    )DictAnyNzMhttps://abr.business.gov.au/abrxmlsearch/AbrXmlSearch.asmx/SearchByABNv202001abnguidreturnc                    s  |  dd } |  si S |ptd}|std| d|d}tj|	d}z&tj
jt|d}tj
j|d	d
}| }W d   n1 sJw   Y  W n ty[   i  Y S w zt| W n tyn   i  Y S w dtdtdB f fdd}|d}|si S |dp|dp|d}	|dp|d}
|d}|d}|d}|d}|d}d}|s|rddd ||fD }|d}|d}d}|s|rddd ||fD }|d }|d!}t|o|pd"d"k}||	|
||||||||d#d$	S )%u   
    Consulta directa al servicio ABN Lookup (SearchByABNv202001)
    y devuelve un dict con los datos más importantes en formato 'raw'.

    Si no se encuentra el ABN o hay error, devuelve {}.
      ABR_LOOKUP_GUIDz ABR credential is not configuredN)searchStringincludeHistoricalDetailsauthenticationGuidzutf-8)data
   )timeoutNpathr   c                    s&     | }|dur|jr|j S dS )uf   
        Busca un tag usando namespace comodín, por ejemplo:
        ".//{*}identifierValue"
        N)findtextstrip)r   elemroot apps/abn_lookup_app/core.py	find_text2   s   

z!_fetch_abn_raw.<locals>.find_textz.//{*}ABN/{*}identifierValuez".//{*}mainName/{*}organisationNamez.//{*}legalName/{*}fullNamez&.//{*}businessName/{*}organisationNamez%.//{*}entityType/{*}entityDescriptionz".//{*}entityType/{*}entityTypeCodez&.//{*}entityStatus/{*}entityStatusCodez#.//{*}entityStatus/{*}effectiveFromz.//{*}recordLastUpdatedDatez..//{*}mainBusinessPhysicalAddress/{*}stateCodez-.//{*}mainBusinessPhysicalAddress/{*}postcodec                 s       | ]}|r|V  qd S Nr   .0partr   r   r   	<genexpr>\       
z!_fetch_abn_raw.<locals>.<genexpr>z,.//{*}mainBusinessPostalAddress/{*}stateCodez+.//{*}mainBusinessPostalAddress/{*}postcodec                 s   r   r   r   r   r   r   r   r    e   r!   z*.//{*}goodsAndServicesTax/{*}effectiveFromz(.//{*}goodsAndServicesTax/{*}effectiveToz
0001-01-01)
registeredfromto)	r   entity_nameentity_typestatusstatus_fromlast_updatedphysical_addresspostal_addressgst)replacer   isdigitosgetenvRuntimeErrorurllibparse	urlencodeencoderequestRequestABN_LOOKUP_URLurlopenread	ExceptionET
fromstringstrjoinbool)r   r   paramsr   reqresponse	xml_bytesr   	abn_valuer%   r&   r'   r(   r)   physical_statephysical_postcoder*   postal_statepostal_postcoder+   gst_effective_fromgst_effective_togst_registeredr   r   r   _fetch_abn_raw   s   



rM   c                 C   s~   t | |d}|sdddd| ddddd	S |d	pd
 }|dp#i }dddd|dp.| d|dkt|d|dd	S )ug   
    Versión 0 (básica) del lookup de ABN para Australia.
    Esta es la que usará wp_invoices.
    r   
abn_lookupr   AUABNFN)	serviceversioncountrytax_id_typetax_id
abn_exists	is_activerL   r%   r'   r   r,   r   Tactiver"   r%   )rM   getlowerr@   )r   r   rawr'   gst_infor   r   r   lookup_abn_basic   s0   r^   c                 C   s   t | |d}|sd| dddddddddddS |dpi }d|dp%| |d|d	|d
|d|d|d|dt|d|d|ddS )u   
    Versión 'full' pensada para consola u otras apps (más detalles).
    No la necesita wp_invoices v0, pero la usamos para --full en el CLI.
    rN   FN)rW   r   r%   r&   r'   r(   r)   r*   r+   rL   gst_fromgst_tor,   Tr   r%   r&   r'   r(   r)   r*   r+   r"   r#   r$   )rM   rZ   r@   )r   r   r\   r]   r   r   r   lookup_abn_full   s:   ra   r   )typingr   r   r/   urllib.requestr2   urllib.parsexml.etree.ElementTreeetreeElementTreer<   r8   r>   rM   r^   ra   r   r   r   r   <module>   s   $$w($