
    Xj                     R    d dl mZmZmZmZ d dlmZ  G d dej                        Zy)    )_apifieldsmodels)ValidationErrorc                      e Zd ZdZdZdZ ej                  ddd      Z ej                  dd	d
      Z	 ej                  dddd      Z ej                  ddd      Z ej                  ddd      Z ej                  d      Z ej                  d      Z ej&                  dd      Z ej,                  dd      d        Zd Zej2                  d        Zy) XenoLeaveApproverzxeno.leave.approverz=Approval chain step template (per department or per employee)z&employee_id, department_id, step_orderzhr.employeezEmployee (specific override)zIf set, this step belongs to this employee's override chain, which fully replaces the department chain when it has any active steps.)stringhelpzhr.departmentzDepartment (default chain)zYApplies to every employee in this department who has no employee-specific override chain.Step   Tz_Order this step is acted on in, within this employee's or department's chain. Lower runs first.)r
   defaultrequiredr   Approverz"e.g. 'Department Head', 'Manager'.)r   r   r   z	res.userszSpecific approver for this step. Leave blank for 'any Time Off Officer/Administrator may act' (matches XENHR's nullable approver_user_id).)r   z5Optional context, e.g. 'covers for X while on leave'.)r   zCHECK(step_order > 0)zStep must be 1 or higher.employee_iddepartment_idc                 l    | D ]/  }|j                   r|j                  rt        t        d             y )NzSet either an Employee or a Department for this approval step (or both, for an employee override that also records which department it belongs to).)r   r   r   r   )selfrecs     #xeno_leave/models/leave_approver.py_check_targetzXenoLeaveApprover._check_target&   s:     	C??3+<+<%aD'  	    c           	         g }| D ]}  }|j                   j                  xs |j                  j                  xs d}|j                  j                  xs d}|j	                  |j
                  | d|j                   d| f        |S )N?zAny HR/Adminu	    · step u    → )r   namer   user_idappendid
step_order)r   outr   targetapprovers        r   name_getzXenoLeaveApprover.name_get0   s     	VC__))JS->->-C-CJsF{{''9>HJJ6()CNN3C5
 STU	V 
r   c                     g }d}| j                  dd|j                  fdgd      }|rD|D ]>  }|j                  ||j                  |j                  j                  xs dd       |dz  }@ n||j
                  rp| j                  d	d|j
                  j                  fd
dgd      }|D ]>  }|j                  ||j                  |j                  j                  xs dd       |dz  }@ |j                  |ddd       |S )a  Resolve the approval chain that will be materialized when this
        employee submits a leave, mirroring XENHR's
        ApproverConfigController::buildChain exactly:
        1. Employee-level override steps (active, ordered) if any exist --
           these fully REPLACE the department chain, they are never merged
           with it.
        2. Otherwise the department's active steps, ordered.
        3. Always append a final synthetic "HR Manager" step with no
           specific approver (any Time Off Officer/Administrator may act).

        Returns a list of dicts: step_order, label, approver_user_id (int
        or None). Does not touch the database.
        r   r   =)activer%   Tr   )orderN)r   labelapprover_user_idr   )r   r%   Fz
HR Manager)searchr   r   r(   r   r   )r   employeestepsr'   	emp_rulesrule
dept_ruless          r   build_chainzXenoLeaveApprover.build_chain8   s2    KKC-/D!
   	 ! "'!ZZ(,(?4 
 
 ## #x'='='@'@A+%& "	 % #J
 # "'!ZZ(,(?4 
 
 	! $
 	
 r   N)__name__
__module____qualname___name_description_orderr   Many2oner   r   Integerr   Charr(   r   Booleanr&   noter   
Constraint_step_order_positiver   
constrainsr   r#   modelr0    r   r   r	   r	      s   !ERL5F!&//<K
 $FOO <12M  q456J FKKz13E fooJ"#G
 V^^D)F6;;STD,6,,!< S^^M?3 4 	YY0 0r   r	   N)	odoor   r   r   r   odoo.exceptionsr   Modelr	   r@   r   r   <module>rD      s     ' ' +d dr   