
    vgL                        d Z ddlZddlmZmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZ  G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d d      Z$ G d d      Z% G d d      Z& G d d       Z' G d! d"e      Z( ejR                  d#      rdd$lm*Z*  G d% d&e      Z+yy)'z
This module contains custom filter classes used for filtering
various models in the Leave Management System app.
The filters are designed to provide flexible search and filtering
capabilities for LeaveType, LeaveRequest and AvailableLeave models.
    N)datetime	timedelta)forms)apps)Q)	TruncYear)gettext)gettext_lazy)
DateFilter	FilterSetNumberFilterfilters)r   )Employee   )AvailableLeaveLeaveAllocationRequestLeaveRequest	LeaveTypeRestrictLeavec                      e Zd ZdZ ej
                  dd      Z ej
                  dd      Z ej
                  dd      Z ej
                  dd      Z	 ej
                  dd      Z
 ej
                  dd      Z G d	 d
      Zy)LeaveTypeFilterz
    Filter class for LeaveType model.

    This filter allows searching LeaveType objects based on their name and payment attributes.
    name	icontains
field_namelookup_exprcarryforward_maxgtelte
total_daysc                       e Zd ZdZeZdZdgZy)LeaveTypeFilter.MetaE "
        Meta class defines the model and fields to filter
        __all__iconN)__name__
__module____qualname____doc__r   modelfieldsexclude     !/var/www/horilla/leave/filters.pyMetar"   2   s    	 (r.   r0   N)r&   r'   r(   r)   r   
CharFilterr   searchcarry_forward_gtecarry_forward_ltetotal_days_gtetotal_days_lter0   r-   r.   r/   r   r       s     7[IDW6{KF***%5 +**%5 (W''<USN'W''<USN r.   r   c                       e Zd ZdZ ej
                  dd      Z ej                  e	j                  j                          ej                               Z edd ej                   dd	i
            Z edd      Z edd      Z edd      Z edd      Z edd      Z edd      Z G d d      Zdddd fdZ xZS )AssignedLeaveFilterz
    Filter class for AvailableLeave model.

    This filter allows searching AvailableLeave objects based on leave type,
    employee, assigned date and payment attributes.
     employee_id__employee_first_namer   r   )querysetwidgetassigned_dateexacttypedateattrsr   r   r;   available_daysr   r   carryforward_daystotal_leave_daysc                       e Zd ZdZeZg dZy)AssignedLeaveFilter.Metar#   )employee_idleave_type_idrC   available_days__gteavailable_days__lterD   carryforward_days__gtecarryforward_days__lterE   total_leave_days__gtetotal_leave_days__lter<   N)r&   r'   r(   r)   r   r*   r+   r-   r.   r/   r0   rG   b   s    	 
r.   r0   Nrequestprefixc                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y Ndatar:   rQ   rR   id	super__init__formr+   keysuuiduuid4r;   rA   selfrV   r:   rQ   rR   field	__class__s         r/   rZ   zAssignedLeaveFilter.__init__w   j    dXwvVYY%%**, 	KE<@JJL>DIIU#**006	Kr.   NN)r&   r'   r(   r)   r   r1   r2   django_filtersModelMultipleChoiceFilterr   objectsallr   SelectMultiplerH   r   	DateInputr<   r   rJ   rK   rL   rM   rN   rO   r0   rZ   __classcell__rb   s   @r/   r8   r8   <   s      W5;F ;.::!!%%'#u##%K "uff%56M
 '2BPUV&2BPUV)&E *&E )%5 )%5
 
*KD K Kr.   r8   c                       e Zd ZdZ ej
                  d      Z ej
                  d      Z edd e	j                  ddi	      
      Z edd e	j                  ddi	      
      Z edd e	j                  ddi	      
      Z edd e	j                  ddi	      
      Z ej
                  dd      Z G d d      Zd Zd Zdddd fdZ xZS )LeaveRequestFilterz
    Filter class for LeaveRequest model.
    This filter allows searching LeaveRequest objects
    based on employee,date range, leave type, and status.
    overall_leave_filtermethodfilter_by_nameend_dater   r>   r?   r@   rB   
start_dater   r=   :employee_id__employee_work_info__department_id__departmentr   r   c                       e Zd ZdZeZg dZy)LeaveRequestFilter.Metar#   )rW   rH   rI   statusdepartment_nameoverall_leave+employee_id__employee_work_info__company_id5employee_id__employee_work_info__reporting_manager_id.employee_id__employee_work_info__department_id0employee_id__employee_work_info__job_position_id)employee_id__employee_work_info__shift_id-employee_id__employee_work_info__work_type_idNr&   r'   r(   r)   r   r*   r+   r-   r.   r/   r0   rw      s    	 
r.   r0   c                    t        j                         }|j                  t        |      t        |      z  t        d      z        }|t	        |j                               z
  }|t	        d      z   }|j                  d||      }|j                  d	      }	|	j                  d
	      t	        d      z   }
|
j                  |j                  k7  r|
t	        |
j                        z
  }
|j                  d|
|	      }|j                  dd      }|j                  dd      }|j                  d||      j                  t        d            j                  |      }|dk(  r|}|S |dk(  r|}|S |dk(  r|}|S |}|S )z4
        Overall leave custom filter method
        )start_date__lte)end_date__gteapproved)rx   )days   )rx   r   r   r   )day      )monthr         rt   )yearr   weekr   )r   todayfilterr   r   weekdayreplacer   r   annotater   )r`   r:   _valuer   today_leave_requestsstart_of_weekend_of_weekweekly_leave_requestsstart_of_monthend_of_monthmonthly_leave_requestsstart_of_yearend_of_yearyearly_leave_requestss                  r/   ro   z'LeaveRequestFilter.overall_leave_filter   s     'e$qu'==@TT 
 	u}} ??#iQ&77 ({- !0 !
 1-%--"-5	q8II,')9I9I*JJL!)(( "1 "

 A15mm""m5OO! ++  
 X9\2X3VV' 	 G-H  f_,H
 	 f_,H  ,Hr.   c                    dddddd}| j                   j                  d      }|s~|j                         }|d   }t        |      d	kD  rd
j	                  |d	d        nd}|r|r|j                  ||      }|S |r|j                  |      }|S |r|j                  |      }|S |j                  |      }	 |j
                  di |	|i}|S Nleave_type_id__name__icontainsstatus__icontainsEemployee_id__employee_work_info__department_id__department__icontainsIemployee_id__employee_work_info__job_position_id__job_position__icontains?employee_id__employee_work_info__company_id__company__icontains)
leave_typerx   
departmentjob_positioncompanysearch_fieldr   r     )+employee_id__employee_first_name__icontains*employee_id__employee_last_name__icontains)r   )r   r-   rV   getsplitlenjoinr   
r`   r:   r   r   filter_methodr   parts
first_name	last_namer   s
             r/   rr   z!LeaveRequestFilter.filter_by_name   s     ;)agX
 yy}}^4KKMEqJ/25zA~qr+2I i#??@J?H +    #??@J +   #???H +   #&&|4F&x9&%9Hr.   NrP   c                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y rT   rX   r_   s         r/   rZ   zLeaveRequestFilter.__init__  rc   r.   rd   )r&   r'   r(   r)   re   r1   rz   r2   r   r   rj   	from_dateto_datert   rs   ry   r0   ro   rr   rZ   rk   rl   s   @r/   rn   rn   }   s    .N--5KLM&^&&.>?Fuff%56I
 uff%56G uff%56J uff%56H
 0n//OO

 
**X!FKD K Kr.   rn   c                   X    e Zd ZdZ ej
                  dd      Z edd ej                  ddi	      
      Z
 edd ej                  ddi	      
      Z edd ej                  ddi	      
      Z edd ej                  ddi	      
      Z G d d      Zdddd fdZ xZS )UserLeaveRequestFilterz
    Filter class for LeaveRequest model specific to user leave requests.
    This filter allows searching user-specific LeaveRequest objects
    based on leave type, date range, and status.
    leave_type_id__namer   r   rs   r   r>   r?   r@   rB   rt   r   r=   c                   "    e Zd ZdZeZdgdgdZy)UserLeaveRequestFilter.MetaC
        Meta class defines the model and fields to filter
        r=   )rI   rx   Nr   r-   r.   r/   r0   r   -  s    	 %Yi
r.   r0   NrP   c                L   t         |   ||||       ddlm} t	        |dd       }|j
                  j                  j                  j                         }t        j                  j                  |j                  dd            }|| j                  j                  d   _        y )	NrU   r   )_thread_localsrQ   rI   T)flat)id__in)rY   rZ   horilla.horilla_middlewaresr   getattruseremployee_getleaverequest_setrh   r   rg   r   values_listr[   r+   r:   )	r`   rV   r:   rQ   rR   r   leave_requestsassigned_leave_typesrb   s	           r/   rZ   zUserLeaveRequestFilter.__init__8  s    dXwvV>.)T: 22CCGGI(0077!--oD-I  8  
 6J		)2r.   rd   )r&   r'   r(   r)   r   r1   r   r   r   rj   r   r   rt   rs   r0   rZ   rk   rl   s   @r/   r   r     s     $##(kJ uff%56I
 uff%56G uff%56J uff%56H	
 	
	JD 	J 	Jr.   r   c                       e Zd ZdZ ej
                  d      Z ej                  dd      Z	 ej                  dd      Z
 ej
                  dd	      Z ej
                  dd
      Z G d d      Zy)LeaveAllocationRequestFilterz
    Filter class for LeaveAllocationRequest model specific to user leave requests.
    This filter allows searching user-specific LeaveRequest objects
    based on leave type, date range, and status.
    rW   r   r   r   r   r9   requested_daysr   r   c                   .    e Zd ZdZeZdgdgdgdgdgdZy)!LeaveAllocationRequestFilter.Metar   r=   )rW   
created_byrx   rI   rH   N)r&   r'   r(   r)   r   r*   r+   r-   r.   r/   r0   r   Z  s.    	 ')")i%Y#9
r.   r0   N)r&   r'   r(   r)   re   r   rW   r   r1   r   r2   number_of_days_up_tonumber_of_days_more_thanr0   r-   r.   r/   r   r   D  s     
%	$	$	5B###(kJ  W5;F 07//#  4w33# 
 
r.   r   c                       e Zd ZdZd ed      fd ed      fd ed      fd ed	      fd
 ed      fd ed      fd ed      fd ed      fd ed      fd ed      fd ed      fgZy)LeaveRequestReGroup:
    Class to keep the field name for group by option
    r   SelectrH   r   rI   
Leave Typert   z
Start Daterx   Statusr   Requested Daysr|   Reporting Managerr}   
Departmentr~   Job Position1employee_id__employee_work_info__employee_type_idEmployment Typer{   CompanyNr&   r'   r(   r)   r   r+   r-   r.   r/   r   r   i  s    
 
Qx[	*&	!L/*	q'	1X;	1-./C!"	
 
:1\?K	;Q~=NO	<a@Q>RS	6)EFr.   r   c                   \    e Zd ZdZd ed      fd ed      fd ed      fd ed	      fgZy
)MyLeaveRequestReGroupr   r   r   rI   r   rx   r   r   r   Nr   r-   r.   r/   r   r     sB    
 
Qx[	!L/*	1X;	1-./	Fr.   r   c                       e Zd ZdZd ed      fd ed      fd ed      fd ed	      fd
 ed      fd ed      fd ed      fd ed      fd ed      fd ed      fd ed      fd ed      fgZy)LeaveAssignReGroupr   r   r   rH   r   rI   r   rC   zAvailable DaysrD   zCarry Forward DaysrE   zTotal Leave Days Daysr<   zAssigned Dater|   r   r}   r   r~   r   r   r   r{   r   Nr   r-   r.   r/   r   r     s    
 
Qx[	*&	!L/*	1-./	a 456	Q678	!O,-C!"	
 
:1\?K	;Q~=NO	<a@Q>RS	6)EFr.   r   c                       e Zd ZdZd ed      fd ed      fd ed      fd ed	      fd
 ed      fd ed      fd ed      fd ed      fd ed      fd ed      fg
Zy)LeaveAllocationRequestReGroupr   r   r   rH   r   rI   r   rx   r   r   r   r|   r   r}   r   r~   r   r   r   r{   r   Nr   r-   r.   r/   r   r     s    
 
Qx[	*&	!L/*	1X;	1-./C!"	
 
:1\?K	;Q~=NO	<a@Q>RS	6)EFr.   r   c                        e Zd ZdZ ej
                  dd      Z edd ej                  ddi	      
      Z
 edd ej                  ddi	      
      Z G d d      Zdddd fdZ xZS )RestrictLeaveFilterz
    Filter class for Restrict model.

    This filter allows searching Restrictleave objects based on name and date range.
    titler   r   rt   r   r>   r?   r@   rB   rs   r   c                       e Zd ZdZeZdZy)RestrictLeaveFilter.Metar   r$   N)r&   r'   r(   r)   r   r*   r+   r-   r.   r/   r0   r     s    	 r.   r0   NrP   c                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y rT   rX   r_   s         r/   rZ   zRestrictLeaveFilter.__init__  rc   r.   rd   )r&   r'   r(   r)   r   r1   r2   r   r   rj   r   r   r0   rZ   rk   rl   s   @r/   r   r     s      W7LFuff%56I
 uff%56G KD K Kr.   r   
attendance)CompensatoryLeaveRequestc                   >   e Zd ZdZ ej
                  d      Z ej                  dd      Z	 ej                  d      Z
 ej                  d	d
 ej                  ddi            Z ej
                  dd      Z ej
                  dd      Z G d d      Zd Zy)CompensatoryLeaveRequestFilterz
        Filter class for CompensatoryLeaveRequest model specific to user leave requests.
        This filter allows searching user-specific LeaveRequest objects
        based on leave type, date range, and status.
        rW   r   r   r   r   rr   rp   created_by__employee_getr=   classzform-controlr@   rB   r   r   r   c                   .    e Zd ZdZeZdgdgdgdgdgdZy)#CompensatoryLeaveRequestFilter.MetazK
            Meta class defines the model and fields to filter
            r=   )rW   r   rx   rI   rH   N)r&   r'   r(   r)   r   r*   r+   r-   r.   r/   r0   r     s.     -Ei-4I")") 'yFr.   r0   c                    dddddd}| j                   j                  d      }|s~|j                         }|d   }t        |      d	kD  rd
j	                  |d	d        nd}|r|r|j                  ||      }|S |r|j                  |      }|S |r|j                  |      }|S |j                  |      }	 |j
                  di |	|i}|S r   r   r   s
             r/   rr   z-CompensatoryLeaveRequestFilter.filter_by_name  s     ?-e k\M  99==8L"1X
36u:>CHHU12Y/r	 )'DNCL  /  H  O  'DN  /  H O 'CL  /  H O '**<8*8??=fe_=Or.   N)r&   r'   r(   r)   re   r   rW   r   r1   r   r2   r   ri   r   r   r   r0   rr   r-   r.   r/   r   r     s    	 )^((D9'W'',+

 $##+;<#<>#<#<1'5''w.GH$
 
  4w33'U 
 $87#7#7'U$
 	 	!	r.   r   ),r)   r]   r   r   re   djangor   django.appsr   django.db.modelsr   django.db.models.functionsr   django.utils.translationr	   __r
   r   r   r   r   r   base.filtersemployee.modelsr   modelsr   r   r   r   r   r   r8   rn   r   r   r   r   r   r   r   is_installedr   r   r-   r.   r/   <module>r     s     (     0 2 6 G G " $ i 8>K) >KBLK LK^5JY 5Jp"
9 "
J .
 
 0 ,K) KB 4\"0H H #r.   