o
    sciC                     @  s   d dl 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mZ ddlmZmZmZmZ d dlmZ dZd	Zd
ZdZdZdZdZd"ddZd#ddZd$ddZd%dd Zd!S )&    )annotations)date)AnyDictListTupleOptional   )ZoneOperation	ParamSpec   )requestraw_wrapcoerce_page_sizecoerce_orderlist_timesheetsget_timesheetget_timesheets_by_userget_timesheets_by_taskget_timesheets_by_typeget_timesheets_after_workdateget_timesheets_by_user_rangereturnList[ParamSpec]c                	   C  s@   t ddddt ddddt dddd	t d
dddt ddddgS )NwherestringFu   Cláusula WHERE estilo AroFlo.orderz/Orden: campo|asc o campo|desc (AroFlo 'order').pageintegeru   Número de página (1..N).pageSizeu4   Cantidad de registros por página (AroFlo pageSize).rawboolean/Si true, devuelve respuesta cruda + meta debug.)r    r#   r#   M/var/www/html/flask_server/apps/aroflo_connector_app/zones/timesheets/base.py_common_list_paramspec   s   r%   List[ZoneOperation]c                   C  s  t tddddddgd dd dd	t d
g dddt tddddddditddddtddddgd
dgddt tdddddd d d dd ddtddddgt d
ddgddt tdddddd d d d d dd tddddtd!ddd"td#ddd$td%ddd&td'd(dd)tddddgd
g d*ddt td+d,dddd d d dd dd-td.ddd/gt d
d0d1gddt td2d3dddd d d dd dd4td5ddd6gt d
d7d8gddt t	d9d:dddd d d dd dd;td<ddd=gt d
d>d?gddgS )@NzList TimesheetsuA   Lista timesheets (zone=timesheets) con WHERE/ORDER y paginación.GETreadTand|workdate|>|2001-01-01r   F)r   r   r   r   r    
timesheets)zListar timesheetszFiltrar timesheets con WHEREzOrdenar timesheets con ORDERlow)codelabeldescriptionhttp_methodside_effect
idempotentdefault_paramsparamscategory	use_cases
risk_levelzGet TimesheetuN   Obtiene un registro específico por timesheetid (where=and|timesheetid|=|...).r    timesheetidr   zTimesheetID (AroFlo).r!   r"   z1Consultar detalle de un timesheet por timesheetidzTimesheets by Userz/Lista timesheets filtrados por userid (AroFlo).)useridr   r   r   r   r    r8   zUserID (AroFlo).zVer timesheets de un usuariozAuditar horas por empleadozTimesheets by User (Date Range)u   Lista timesheets de un usuario filtrando por rango de workdate (from_date..to_date) con paginación y corte local (robusto ante limitaciones del WHERE de AroFlo).)r8   	from_dateto_dater   r   r    r9   zFecha inicio (YYYY-MM-DD).r:   zFecha fin (YYYY-MM-DD).r   zOrden. Default: workdate|asc.r   r   u"   Cantidad de registros por página.)zReporte por rango de fechaszPayroll/leave auditingu'   Sincronización incremental por ventanazTimesheets by Taskz/Lista timesheets filtrados por taskid (AroFlo).)taskidr   r   r   r   r    r;   zTaskID (AroFlo).zVer horas asociadas a una taskz Auditar costo/tiempo por trabajozTimesheets by Typeu4   Lista timesheets filtrados por type (según AroFlo).)typer   r   r   r   r    r<   zITipo de timesheet (ej: Productive/Non-Productive u otro enum del tenant).zFiltrar por tipou   Reportes por categoría de horazTimesheets after WorkDatezNLista timesheets posteriores a una workdate (YYYY-MM-DD) o equivalente AroFlo.)workdater   r   r   r   r    r=   z,Fecha (YYYY-MM-DD) para filtrar posteriores.zTraer registros recientesu%   Sincronización incremental por fecha)
r
   OP_LISTr%   OP_GETr   
OP_BY_USEROP_BY_USER_RANGE
OP_BY_TASK
OP_BY_TYPEOP_AFTER_WORKDATEr#   r#   r#   r$   get_operations#   s(  					 rE   operation_codestrboolc                 C  s   | t tttttthv S )N)r>   r?   r@   rB   rC   rD   rA   )rF   r#   r#   r$   supports   s   rI   clientr   r3   Dict[str, Any]c           $   
     s  t |ddt|t|dIdd	}dJfdd}dKdd dLdd}| tkrM||ddgd}t|dd}|dk rGtd|||dS | tkrp|d }d| }	dd|	fd g}
td!|
}rnt	||
S |S | t
krt|d" }||ddgd}d#| g|}t|dd}|dk rtd|||dS | tkrt|d$ }||ddgd}d%| g|}t|dd}|dk rtd|||dS | tkrt|d& }||ddgd}d'| g|}t|dd}|dk rtd|||dS | tkr<t|d( }||dg d}g |d)| }t|dd}|dk r6td|||dS | tkrt|d" }|t|d* }|t|d+ }||k r`td,t|d-phd. }| d.k}t|g }d}t }d/}d0}	 dg}
|
dd#| f |
dd2|  f |r|
d-|f r|
d3tf |
dt|f td!|
}t|tr|ni }t|d4tr|d4n|}t|tr|d5i ni }t|tr|d6g ng }|s|d7 }|d7krn|d7 }||krnqd/}d}d/}|D ]R}t|dd8p"d8} | r7| |v r.q||  |d7 } t|d(d8}!|!d u rHq|rT|!|krTd1} n||!  kr`|krhn q|| q|rnn*|d/kry|dkrynrt|trt|tk rn|d7 }||krnqdM fd<d=}"|jd>d? d@ d4dAdBt||dCdDi}#rdE|| | |rtnd ||t|dF	|#dG< |#S tdH|  )NNr    Fvr   default	List[str]r   c                S  sJ   | du rt |S t| t tfrdd | D S t|  }|r!|gS t |S )z
        Normaliza 'where' para que siempre sea List[str].
        - None -> default
        - list/tuple -> lista limpia
        - string -> [string]
        Nc                 S  s    g | ]}t | rt |qS r#   )rG   strip).0xr#   r#   r$   
<listcomp>        z3execute.<locals>._coerce_wheres.<locals>.<listcomp>)list
isinstancetuplerG   rO   )rL   rM   sr#   r#   r$   _coerce_wheres   s   zexecute.<locals>._coerce_whereswheresr   intc                   sv   dg}| D ]	}| d|f qr| df r#| dtf | dt|f t d|}r9t||S |S )Nzoner*   r   r   r   r   r'   )appendrG   r   r   )rY   r   params_listwresp)rJ   r   r   r    r#   r$   _do_list   s   zexecute.<locals>._do_listrW   rG   Optional[date]c                 S  s   | sd S t |  } | r| dkrd S d| v rdnd}| |}t|dkr'd S t|d t|d t|d }}}t|||S )N /-   r   r   r	   )rG   rO   splitlenrZ   r   )rW   seppartsymdr#   r#   r$   _parse_workdate   s   
(z execute.<locals>._parse_workdater   c                 S  s(   |  d\}}}tt|t|t|S )Nre   )rg   r   rZ   )rW   rk   rl   rm   r#   r#   r$   
_parse_ymd  s   zexecute.<locals>._parse_ymdr   r)   )rM   r   zpage debe ser >= 1.)rY   r   r7   zand|timesheetid|=|r[   )r   1r'   r8   zand|userid|=|r;   zand|taskid|=|r<   zand|type|=|r=   zand|workdate|>|r9   r:   zto_date debe ser >= from_dater   zworkdate|ascr      Tzand|workdate|>=|r   datazoneresponser*   r	    tsrK   Tuple[int, int, int]c                   s,    t | dd}|sdS |j|j|jfS )Nr=   rt   )r   r   r   )rG   getyearmonthday)ru   wd)rn   r#   r$   _wd_key  s   zexecute.<locals>._wd_keyc                 S  s    t | ddt | ddfS )Nr=   rt   r7   )rG   rw   )ru   r#   r#   r$   <lambda>  rS   zexecute.<locals>.<lambda>)key0zOK (range filtered locally))currentpageresultsr*   )statusstatusmessagers   zUapi where: userid AND workdate>=from_date; local filter: from_date<=workdate<=to_date)	strategyr8   r9   r:   r   r   pages_scannedcan_cut_earlyunique_timesheetids_seenmetau+   [Timesheets.base] Operación no soportada: )rL   r   rM   rN   r   rN   )rY   rN   r   rZ   r   r   )rW   rG   r   rb   )rW   rG   r   r   )ru   rK   r   rv   )rH   rw   r   r   r>   rZ   
ValueErrorr?   r   r   r@   rG   rB   rC   rD   rA   rO   lowersetr]   	isoformatrU   dictaddrT   rh   sort)$rF   rJ   r3   rX   ra   ro   rY   r   r7   r   r^   r`   r8   r;   tr=   base_wheresr9   r:   forced_orderr   	collectedseen_idsempty_pages	max_pagesrootrr   zritemsstopnew_ids_in_pageru   tsidr{   r|   outr#   )rn   rJ   r   r   r    r$   execute   s  









 





$
N
r   N)r   r   )r   r&   )rF   rG   r   rH   )rF   rG   rJ   r   r3   rK   r   r   )
__future__r   datetimer   typingr   r   r   r   r   baser
   r   _join_utilsr   r   r   r   r>   r?   r@   rB   rC   rD   rA   r%   rE   rI   r   r#   r#   r#   r$   <module>   s$   


 
#