o
    ~1ic                     @  sp   d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	m
Z
mZ d dlmZ eG dd dZG dd	 d	Zd
S )    )annotations)	dataclass)date	timedelta)AnyDictListOptional)AroFloClientc                   @  sZ   e Zd ZU dZdZded< dZded< dZded< dZded< dZ	ded	< dZ
ded
< dS )TimesheetFiltersz
    Filtros de alto nivel para el endpoint de timesheets.

    Todos son opcionales. Si NO pasas filtros de fecha, AroFlo aplica
    su WHERE por defecto:
      AND workdate > DATEADD(d, -30, GETUTCDATE())
    NOptional[str]timesheetidtaskiduseridtypezOptional[date]workdate_fromworkdate_to)__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r    r   r   S/var/www/html/flask_server/apps/aroflo_connector_app/features/timesheets/service.pyr      s   
 r   c                   @  sV   e Zd ZdZd"ddZd#ddZd$ddZ				d%d&ddZ				d'd(d d!ZdS ))TimesheetServicezF
    Servicio para leer timesheets desde AroFlo (zona READ ONLY).
    clientr
   returnNonec                 C  s
   || _ d S )N)r   )selfr   r   r   r   __init__#   s   
zTimesheetService.__init__filtersTimesheetFilters | Noner   c                 C  s   |sdS g }|j r|d|j  d |jr |d|j d |jr0|d|jd d |jr@|d|jd d |sDdS d|S )	z
        Construye el WHERE SQL para AroFlo a partir de los filtros de fechas.
        Solo metemos en el WHERE lo que realmente es fecha/ID interno.
        El resto (userid, type, etc.) viaja como extra_params.
        Nztimesheetid = ''z
taskid = 'zworkdate >= 'z%Y-%m-%dzworkdate <= 'z AND )r   appendr   r   strftimer   join)r   r    clausesr   r   r   _build_where_clause)   s$   
z$TimesheetService._build_where_clauseDict[str, Any]c                 C  s0   |si S i }|j r|j |d< |jr|j|d< |S )u   
        Filtros que van como querystring directo en VarString (no en WHERE).
        Ejemplo típico según la API:
          - userid
          - type (Productive / Non-Productive / Expense)
        r   r   )r   r   )r   r    extrar   r   r   _build_extra_paramsJ   s   

z$TimesheetService._build_extra_paramsN   workdateFpageintorder_bystrinclude_raw_responseboolc           
      C  s~   |  |}| |}| jjd||||dd}|r|S |di }|dg }	|	t|ddt|ddt|d	dd
S )u  
        Devuelve la página de timesheets desde AroFlo.

        :param filters: filtros opcionales (TimesheetFilters)
        :param page: página a consultar (1 por defecto)
        :param order_by: campo de orden (por defecto 'workdate')
        :param include_raw_response: si True, devuelve la respuesta completa
                                     de la zona. Si False, solo zoneresponse["timesheets"].
        
timesheetsGET)zoner-   whereorderextra_paramsmethodzoneresponse
pagenumber1currentpageresults0maxpageresults)r3   r;   r=   r?   )r'   r*   r   requestgetr.   )
r   r    r-   r/   r1   where_clauser8   responser5   r3   r   r   r   list_timesheetsa   s&   

	z TimesheetService.list_timesheets   daysr   r   c                 C  s4   t  }|t|d }t||||d}| j||dS )uP   
        Helper de conveniencia: últimos N días, con filtros simples.
        )rF   )r   r   r   r   )r    r-   )r   todayr   r   rD   )r   rF   r-   r   r   rG   	from_dater    r   r   r   list_recent   s   
zTimesheetService.list_recent)r   r
   r   r   )r    r!   r   r   )r    r!   r   r(   )Nr+   r,   F)
r    r!   r-   r.   r/   r0   r1   r2   r   r(   )rE   r+   NN)
rF   r.   r-   r.   r   r   r   r   r   r(   )	r   r   r   r   r   r'   r*   rD   rI   r   r   r   r   r      s    


!+r   N)
__future__r   dataclassesr   datetimer   r   typingr   r   r   r	   %apps.aroflo_connector_app.core.clientr
   r   r   r   r   r   r   <module>   s   