
    siO                        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mZ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jZ                  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)Employee)r   HorillaFilterSetfilter_by_name)getattribute   )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     1/var/www/python-projects/worksol/leave/filters.pyMetar%   3   s    	 (r1   r3   N)r)   r*   r+   r,   r   
CharFilterr   searchcarry_forward_gtecarry_forward_ltetotal_days_gtetotal_days_lter3   r0   r1   r2   r   r   !   s     7[IDW6{KF***%5 +**%5 (W''<USN'W''<USN r1   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_idrF   available_days__gteavailable_days__lterG   carryforward_days__gtecarryforward_days__lterH   total_leave_days__gtetotal_leave_days__lter?   N)r)   r*   r+   r,   r   r-   r.   r0   r1   r2   r3   rJ   c   s    	 
r1   r3   Nrequestprefixc                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y Ndatar=   rT   rU   id	super__init__formr.   keysuuiduuid4r>   rD   selfrY   r=   rT   rU   field	__class__s         r2   r]   zAssignedLeaveFilter.__init__x   j    dXwvVYY%%**, 	KE<@JJL>DIIU#**006	Kr1   NN)r)   r*   r+   r,   r   r4   r5   django_filtersModelMultipleChoiceFilterr   objectsallr   SelectMultiplerK   r   	DateInputr?   r   rM   rN   rO   rP   rQ   rR   r3   r]   __classcell__re   s   @r2   r;   r;   =   s      W5;F ;.::!!%%'#u##%K "uff%56M
 '2BPUV&2BPUV)&E *&E )%5 )%5
 
*KD K Kr1   r;   c                       e Zd ZdZ ej
                  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.
    r   method	search_inoverall_leave_filterend_dater!   rA   rB   rC   rE   
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&   )rZ   rK   rL   statusdepartment_nameoverall_leave+employee_id__employee_work_info__company_id1employee_id__employee_work_info__employee_type_id,employee_id__employee_work_info__job_role_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.   r0   r1   r2   r3   rz      s    	 
r1   r3   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)r{   )days   )r{   r   r   r   )day      )monthr         rw   )yearr   weekr   )r   todayfilterr   r   weekdayreplacer   r   annotater   )rc   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                  r2   ru   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r1   c                    | j                   j                  d      r|S 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search_field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)rL   r{   r   2employee_id__employee_work_info__job_position_id__r~   r   r     +employee_id__employee_first_name__icontains*employee_id__employee_last_name__icontainsr   r   r0   rY   getsplitlenjoinr   
rc   r=   r   r   filter_methodr   parts
first_name	last_namer   s
             r2   r   z!LeaveRequestFilter.filter_by_name   s   99==(O >) ?F CN;|
 yy}}^4KKMEqJ/25zA~qr+2I i#??@J?H +   #??@J +   #???H +   #&&|4F&x9&%9Hr1   NrS   c                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y rW   r[   rb   s         r2   r]   zLeaveRequestFilter.__init__  rf   r1   rg   )r)   r*   r+   r,   rh   r4   r5   r   r}   r   r   rm   	from_dateto_daterw   rv   r|   r3   ru   r   r]   rn   ro   s   @r2   rq   rq   ~   s    '^&&.>?F,>,,K@L-N--5KLMuff%56I
 uff%56G uff%56J uff%56H
 0n//OO

 
.*X#JKD K Kr1   rq   c                       e Zd ZdZ ej
                  d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   rv   r!   rA   rB   rC   rE   rw   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@   )rL   r{   Nr   r0   r1   r2   r3   r   5  s    	 %Yi
r1   r3   NrS   c                L   t         |   ||||       ddlm} t	        |dd       }|j
                  j                  j                  j                         }t        j                  j                  |j                  dd            }|| j                  j                  d   _        y )	NrX   r   )_thread_localsrT   rL   T)flat)id__in)r\   r]   horilla.horilla_middlewaresr   getattruseremployee_getleaverequest_setrk   r   rj   r   values_listr^   r.   r=   )	rc   rY   r=   rT   rU   r   leave_requestsassigned_leave_typesre   s	           r2   r]   zUserLeaveRequestFilter.__init__@  s    dXwvV>.)T: 22CCGGI(0077!--oD-I  8  
 6J		)2r1   rg   )r)   r*   r+   r,   r   r4   r5   
leave_typer   r   rm   r   r   rw   rv   r3   r]   rn   ro   s   @r2   r   r     s      W(kF $##(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r1   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.
    rZ   r   r   r   r   r<   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@   )rZ   
created_byr{   rL   rK   N)r)   r*   r+   r,   r   r-   r.   r0   r1   r2   r3   r   b  s.    	 ')")i%Y#9
r1   r3   N)r)   r*   r+   r,   rh   r   rZ   r   r4   r   r5   number_of_days_up_tonumber_of_days_more_thanr3   r0   r1   r2   r   r   L  s     
%	$	$	5B###(kJ  W5;F 07//#  4w33# 
 
r1   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   SelectrK   r   rL   
Leave Typerw   z
Start Dater{   Statusr   Requested Daysr   Reporting Managerr   
Departmentr   Job Positionr   Employment Typer~   CompanyNr)   r*   r+   r,   r   r.   r0   r1   r2   r   r   q  s    
 
Qx[	*&	!L/*	q'	1X;	1-./C!"	
 
:1\?K	;Q~=NO	<a@Q>RS	6)EFr1   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   rL   r   r{   r   r   r   Nr   r0   r1   r2   r   r     sB    
 
Qx[	!L/*	1X;	1-./	Fr1   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   rK   r   rL   r   rF   zAvailable DaysrG   zCarry Forward DaysrH   zTotal Leave Days Daysr?   zAssigned Dater   r   r   r   r   r   r   r   r~   r   Nr   r0   r1   r2   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Fr1   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   rK   r   rL   r   r{   r   r   r   r   r   r   r   r   r   r   r   r~   r   Nr   r0   r1   r2   r   r     s    
 
Qx[	*&	!L/*	1X;	1-./C!"	
 
:1\?K	;Q~=NO	<a@Q>RS	6)EFr1   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   rw   r!   rA   rB   rC   rE   rv   r"   c                       e Zd ZdZeZdZy)RestrictLeaveFilter.Metar   r'   N)r)   r*   r+   r,   r   r-   r.   r0   r1   r2   r3   r     s    	 r1   r3   NrS   c                   t         |   ||||       | j                  j                  j	                         D ]E  }t        j                          | j                  j                  |   j                  j                  d<   G y rW   r[   rb   s         r2   r]   zRestrictLeaveFilter.__init__  rf   r1   rg   )r)   r*   r+   r,   r   r4   r5   r   r   rm   r   r   r3   r]   rn   ro   s   @r2   r   r     s      W7LFuff%56I
 uff%56G KD K Kr1   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.
        rZ   r   r   r   r   r   rr   created_by__employee_getr@   classzform-controlrC   rE   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@   )rZ   r   r{   rL   rK   N)r)   r*   r+   r,   r   r-   r.   r0   r1   r2   r3   r      s.     -Ei-4I")") 'yFr1   r3   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 )Nr   r   r   r   r   )r   r{   
departmentjob_positioncompanyr   r   r   r   r   r   r   r   r0   r   r   s
             r2   r   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_=Or1   N)r)   r*   r+   r,   rh   r   rZ   r   r4   r   r5   r   rl   r   r   r   r3   r   r0   r1   r2   r   r     s    	 )^((D9'W'',+

 $##+;<#<>#<#<1'5''w.GH$
 
  4w33'U 
 $87#7#7'U$
 	 	!	r1   r   )0r,   r`   r   r   rh   djangor   django.appsr   django.db.modelsr   django.db.models.functionsr   django.utils.translationr	   __r
   r   r   r   r   r   employee.modelsr   horilla.filtersr   r   3horilla_views.templatetags.generic_template_filtersr   modelsr   r   r   r   r   r   r;   rq   r   r   r   r   r   r   r   is_installedr   r   r0   r1   r2   <module>r     s     (     0 2 6 G G $ G G L i 8>K) >KBPK) PKf8JY 8Jv"
9 "
J .
 
 0 ,K) KB 4\"0H H #r1   