o
    B_i                     @  s   d dl mZ d dlmZ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 ddlmZmZ d	d
lmZmZmZ eddG dd dZd1ddZd2ddZd3dd Zd4d#d$Zd5d*d+Zd6d,d-Zd7d.d/Z d0S )8    )annotations)	dataclassfield)Path)DictListOptionalSequenceTuple)PageLocator   )shot)log_steppause   )_wait_timesheet_ready_click_save_close_session_limit_if_anyT)frozenc                   @  sl   e Zd ZU eedZded< eedZded< edd dZded< dZ	d	ed
< dZ
ded< dZded< dS )
DeleteRule)default_factorySequence[str]overheads_to_deletetasks_to_deletec                   C  s   dgS )NzLunch Break - Unpaid r   r   r   \/var/www/html/flask_server/apps/aroflo_connector_app/ui_automation/flows/timesheet_delete.py<lambda>   s    zDeleteRule.<lambda>protected_overheadsexactstr
match_modeFbool
delete_allinclude_protectedN)__name__
__module____qualname__r   listr   __annotations__r   r   r!   r#   r$   r   r   r   r   r      s   
 r   pager   run_dirr   rulereturnNonec                C  s.  t | | t|  t| |d td|  t|d | d}t||\}}td|  dt| dt| d|j	 d|j
 
|  t| |d	 t|d
 |s`td|  t| |d t|d d S t|ddD ]2\}}|d }	td|d  d|d d|d d|d |  t|	 t| |d|d qft|d t|  | d t | | t| |d td|  t|d t|  | d}
t|
|\}}|rg }|d d D ]}|d |d  d!|d d"|d d#|d  qt| |d$ td%d&| t| |d' td'|  t|d( d S ))Nzts-delete-01-readyz$Timesheet ready (before delete scan)z
tr.taskRowzts-delete: rows=z candidates=z	 skipped=z delete_all=z include_protected=zts-delete-02-scannedz#Scanned rows (before applying zero)z-ts-delete: no candidates found; nothing to dozts-delete-03-nothing-to-deletezNo candidates (no save)r   )startrowzts-delete: zeroing row#	row_indexz kind=kindz label=labelz hours=hourszts-delete-03-zeroed-02dz(All selected rows set to 0 (before save)i  zts-delete-04-after-savez After save (before verification)
   zrow# z='z' hours=z ts-delete-99-verification-failedz.ts-delete verification failed; still present: z; zts-delete-05-verification-okzVerification OK)r   r   r   r   r   locator
_scan_rowscountlenr#   r$   	enumerateget_set_hours_zeror   wait_for_timeoutappendRuntimeErrorjoin)r*   cfgr+   r,   rows
candidatesskippedicandr0   
rows_after	remaining_detailsrr   r   r   run    sb   



 


0





:
rN   rD   r   7Tuple[List[Dict[str, object]], List[Dict[str, object]]]c              	   C  s  g }g }|   }t|D ]}| |}t|}|d u s|dkr qt|d}t|d}	t|}
|p5|	p5|
p5d}|r:dn|	r>dnd}t|oJt||j|j	}|j
rk|r_|js_||d||d	 q||||||d
 q|sz|	sz||d||d	 q|r||d||d	 q|rt||j|j	r|||d||d
 q|	r|jrt|	|j|j	r|||d|	|d
 q||d||d	 q||fS )Nr   zinput.schOverheadzinput.schTaskz	<unknown>overheadtaskunknownz2protected (delete_all but include_protected=False))r1   reasonr3   r4   )r1   r0   r2   r3   r4   z"hours>0 but no schOverhead/schTaskzprotected overheadzdoes not match delete rule)r:   rangenth_read_hours_read_optional_value_row_label_fallbackr"   _matches_anyr   r!   r#   r$   r@   r   r   )rD   r,   rE   rF   totalidxr0   r4   rP   rQ   label_fallbackr3   r2   is_protectedr   r   r   r9   ^   sH   



r9   r0   Optional[float]c                 C  s   |  dj}| dkrd S z|jddpd }W n
 ty$   Y d S w |dkr+d S |dd}zt|W S  ty@   Y d S w )Ninput.tsHoursr     timeout ,.)	r8   firstr:   input_valuestrip	Exceptionreplacefloat
ValueError)r0   inprawr   r   r   rV      s    
rV   selectorr    c                 C  sH   |  |j}| dkrdS z|jddpd W S  ty#   Y dS w )Nr   rc   r`   ra   )r8   rf   r:   rg   rh   ri   )r0   ro   locr   r   r   rW      s   rW   textpatternsr   moder"   c                   sR   | pd    dd |D }|dkrt fdd|D S t fdd|D S )Nrc   c                 S  s   g | ]
}|pd    qS )rc   )rh   lower.0pr   r   r   
<listcomp>   s    z _matches_any.<locals>.<listcomp>containsc                 3  s    | ]	}|o	| v V  qd S Nr   ru   tr   r   	<genexpr>       z_matches_any.<locals>.<genexpr>c                 3  s    | ]	}|o	| kV  qd S rz   r   ru   r{   r   r   r}      r~   )rh   rt   any)rq   rr   rs   patsr   r{   r   rY      s
   rY   c                 C  s&   z|  dpdW S  ty   Y dS w )u   
    Intento best-effort para tener un label (para logs) sin asumir estructura exacta.
    No afecta la lógica (solo observabilidad).
    a  (tr) => {
                const inputs = Array.from(tr.querySelectorAll('input'))
                  .filter(i => (i.type || '').toLowerCase() !== 'hidden')
                  .filter(i => !i.classList.contains('tsHours'))
                  .map(i => (i.value || '').trim())
                  .filter(v => v.length > 0);
                // Tomar el primero si existe
                return inputs[0] || '';
            }rc   )evaluateri   )r0   r   r   r   rX      s   
rX   c                 C  sz   |  dj}| dkrtd|  |d z|d W n	 ty)   Y nw z|d W d S  ty<   Y d S w )Nr_   r   z3No encuentro input.tsHours en la fila seleccionada.0EnterTab)r8   rf   r:   rA   clickfillpressri   )r0   hrsr   r   r   r>      s   
r>   N)r*   r   r+   r   r,   r   r-   r.   )rD   r   r,   r   r-   rO   )r0   r   r-   r^   )r0   r   ro   r    r-   r    )rq   r    rr   r   rs   r    r-   r"   )r0   r   r-   r    )r0   r   r-   r.   )!
__future__r   dataclassesr   r   pathlibr   typingr   r   r   r	   r
   playwright.sync_apir   r   core.artifactsr   core.logr   r   timesheet_creater   r   r   r   rN   r9   rV   rW   rY   rX   r>   r   r   r   r   <module>   s"   

>
<



