o
    ;i-&                     @  sh   d dl mZ d dlmZmZmZ d dlmZ ddlm	Z	m
Z
 ddd	ZdddZdddZdddZdS )    )annotations)AnyDictList	urlencode   ZoneOperation	ParamSpecreturnList[ZoneOperation]c                   C  s"  t ddddddddd	td
ddddtdddddgdddgdddt dddddddditdddddtd
ddddtdddddgdddgdddt dd d!dddtd"ddd#dgdd$d%gddd&t d'd(d)d*d+dtd,ddd-dgdd.d/gd0dd&t d1d2d3d*d+dtd,ddd4dgdd5d6gd7dd&gS )8z>
    Operaciones principales de la zona Users (sin JOIN).
    	get_usersz	Get Usersuo   Devuelve una lista paginada de usuarios usando la zona 'users' de AroFlo. Soporta filtros vía cláusula WHERE.GETreadTand|createdutc|>|2001-01-01   )wherepager   stringFu|   Cláusula WHERE estilo AroFlo, por ejemplo 'and|archived|=|false'. Si no se envía, se usa el valor por defecto configurado.)nametyperequireddescriptionr   integeru+   Número de página (1..N) para paginación.usersu4   Listar usuarios de la organización de forma generalz4Obtener un listado de usuarios creados recientementelow)codelabelr   http_methodside_effect
idempotentdefault_paramsparamscategory	use_cases
risk_levelrequires_confirmationget_users_with_positionzGet Users with set positionuR   Devuelve usuarios filtrados por 'position' u otros criterios vía cláusula WHERE.positionud   Valor del campo 'position' para filtrar usuarios. Si se envía, se combinará en la cláusula WHERE.um   Cláusula WHERE base. Si se incluye 'position', se insertará automáticamente la condición sobre ese campo.u%   Listar usuarios por cargo o posiciónu@   Buscar usuarios de un tipo específico (ej. Field Worker, Admin)get_userzGet a specific UseruW   Obtiene un usuario específico filtrando por 'userid' usando la zona 'users' de AroFlo.useridz$ID codificado del usuario en AroFlo.z4Consultar los datos completos de un usuario concretoz5Preparar detalles de un usuario antes de actualizarlo)r   r   r   r   r    r!   r#   r$   r%   r&   r'   create_userzCreate UserzfCrea uno o varios usuarios en AroFlo usando POSTXML con la estructura <users><user>...</user></users>.POSTwritepostxmlue   XML completo con la definición de uno o varios usuarios a crear, según la documentación de AroFlo.u3   Proponer la creación de un nuevo usuario en AroFloz@Automatizar el alta de usuarios a partir de otra fuente de datoshighupdate_mobilezUpdate Users mobile numberuO   Actualiza el número de móvil de un usuario usando POSTXML en la zona 'users'.uL   XML con la estructura necesaria para actualizar el móvil (userid + mobile).u7   Actualizar el número de teléfono móvil de un usuarioz;Sincronizar datos de contacto desde otro sistema con AroFlomediumr	    r3   r3   H/var/www/html/flask_server/apps/aroflo_connector_app/zones/users/base.pyget_operations
   s  
)		0	 r5   operation_codestrboolc                   s   t  fddt D S )Nc                 3  s    | ]}|j  kV  qd S )N)r   ).0opr6   r3   r4   	<genexpr>   s    zsupports.<locals>.<genexpr>)anyr5   r;   r3   r;   r4   supports   s   r>   clientr   params_listList[tuple]c                 C  s.   ddl m} ||}t|}| jdd||dS )z
    Helper para construir var_string + params y llamar client.request()
    de forma consistente (igual que el ping / users-raw).
    r   r    r   )methodr#   
var_string)urllib.parser   dictrequest)r?   r@   
_urlencoderD   query_paramsr3   r3   r4   _request_with_params   s   rJ   r#   Dict[str, Any]c                 C  s  | dkr | dd}| dd}dd|fdt|fg}t||S | dkrQ| d}| d}| dd}|s8d	}|rA| d
| }dd|fdt|fg}t||S | dkrj|d }d| }dd|fdg}t||S | dkrrtd| dkrztdtd|  )u   
    Implementación de las operaciones base de Users.

    Por ahora solo implementamos las operaciones de lectura (GET).
    Las operaciones de escritura (POST) quedan como NotImplemented
    hasta que definamos bien el XML/postxml.
    r   r   r   r   r   )zoner   r(   r)   zand|archived|=|falsez;and|position|=|r*   r+   zand|userid|=|)r   1r,   uC   [Users.base] 'create_user' aún no implementado (requiere postxml).r1   uE   [Users.base] 'update_mobile' aún no implementado (requiere postxml).u&   [Users.base] Operación no soportada: )getr7   rJ   NotImplementedError
ValueError)r6   r?   r#   r   r   r@   r)   r+   r3   r3   r4   execute   sL   	







rQ   N)r   r   )r6   r7   r   r8   )r?   r   r@   rA   r   r   )r6   r7   r?   r   r#   rK   r   r   )
__future__r   typingr   r   r   rE   r   baser
   r   r5   r>   rJ   rQ   r3   r3   r3   r4   <module>   s    
 
:
