
    vg                     x    d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d Zd Zd	 Zd
 ZddZd Zd Zy)    N)datetime	timedelta)apps)Q)Employee)get_horilla_model_classc                    | |k(  r|dk(  r	|dk(  rd}|S d}|S d}d}|dk7  rd}|dk7  rd}|dk(  r|dk(  r|| z
  j                   |z   |z   dz   }|S |dk(  s|dk(  r|| z
  j                   |z   |z   }|S || z
  j                   |z   |z   dz
  }|S )Nfull_day         ?r   )days)
start_dateend_datestart_date_breakdownend_date_breakdownrequested_days
start_daysend_dayss          !/var/www/horilla/leave/methods.pycalculate_requested_daysr      s     X:-2D
2RN, ) !N( % 
:-J+H:-2D
2R&399JFQTUUN  $z15G:5U"*Z"7!=!=
!JX!U  
*00:=H1L      c                     | }|}|| }||z
  }g }t        |j                  dz         D ]!  }|t        |      z   }|j                  |       # |S )zV
    :return: this functions returns a list of dates from start date to end date.
    r   )ranger   r   append)r   r   request_start_daterequest_end_dater   requested_datesidates           r   leave_requested_datesr    )   so     $%%(::NO>&&*+ %!IaL0t$% r   c                     g }| D ]_  }|j                   }|j                  }||}||z
  }t        |j                  dz         D ]!  }|t	        |      z   }|j                  |       # a |S )zF
    :return: this functions returns a list of all holiday dates.
    r   )r   r   r   r   r   r   )holidaysholiday_datesholidayholiday_start_dateholiday_end_dateholiday_daysr   r   s           r   holiday_dates_listr(   9   s     M '$//"++#1'*<<|((1,- 	'A%	!4D  &	'' r   c                 V   g }| D ]  }|j                   }|j                  }|j                  }t        dd      D ]T  }|dk7  rt	        j
                  d       t	        j                  ||      }	 |t        |         }	|	D 
cg c]
  }
|
dk7  s	|
 }}
|D ]c  }
t        j                  | d|dd|
dd      j                         }|j                         t        |      k(  sN||vsS|j                  |       e t	        j
                  d       t	        j                  ||      }|D ]d  }|t        |         dk7  st        j                  | d|dd|t        |         dd      j                         }||vsT|j                  |       f W  |S c c}
w # t        $ r Y nw xY w)	zE
    :return: This function returns a list of all company leave datesr      N   r   -02z%Y-%m-%d)yearbased_on_weekbased_on_week_dayr   calendarsetfirstweekdaymonthcalendarintr   strptimer   weekdayr   
IndexError)company_leavesr   company_leave_datescompany_leaver.   r/   r0   monthmonth_calendarweeksdayweekdays_in_weeksr   weeks                 r   company_leave_dates_listrA   J   s    ' "=%33);;1b\ 	=E$((+!)!7!7e!D*3}+=>E8=(J(J%(J0 ='00#fAeBZqR9: $&  !LLNc2C.DD $,? ?/66t<= ((+!)!7!7e!D* =DC 123q8'00#fAeBZqc:K6L1Mb0QR&  $&   '::/66t<=/	=	"=F 1 )K " s7   .F 
FFAF!F&FF	F('F(c                 J   t        dd      }ddlm} |j                  j	                         }|j                  j                  |       j                  t        |      t        d      z        j                         rf|j                  j                  |       j                  t        |      t        d      z        }|D ]  }||j                  j                         z  }! |j                  j                  d	| d	
      j                  |j                  dd	            }|S )zG
    This function returns a queryset of attendance on leave dates
    
attendance)	app_labelmodelr   )CompensatoryLeaveRequest)employee_id)idrejected)statusT)
is_holidayrG   attendance_validatedrH   )flat)id__in)r   leave.modelsrF   objectsnonefilterexcluder   existsattendance_idallvalues_list)employeecomp_id
AttendancerF   attendances_to_excludecomp_leave_reqsreqholiday_attendances           r   get_leave_day_attendancer_   t   s    )<|TJ5'//446 	!((//H/E	g*!55	6		 3::AA  B 

'!w-!:"66
7 	 # 	>C"c&7&7&;&;&=="	> $++22XD 3 g+7747HgI  r   c                 d   d}t        j                  d      rddlm} |D ]  }|j                  j                  | |j                        j                         s9|j                  j                  | |j                        j                         j                  }|dk(  r|dz  }|dk(  s|dz  } |S )	zG
    This function returns count of workrecord from the attendance
    r   rC   )WorkRecords)rG   r   HDPr   FDPr   )
r   is_installedattendance.modelsra   rP   rR   attendance_daterT   firstwork_record_type)rX   attendancesattendance_daysra   rC   rh   s         r   rj   rj      s     O&1% 	)J""))$:+E+E * fh  ''..$,:3M3M /  UW%% ! $u,#s*O%.#q(O	) r   c                    t         j                  j                  | j                        j	                         }g }t        j                  d      r%ddlm}m	} |j                  j                  |      }nd}|D ]  }|j                  dkD  r||j                  dz
  }|j                  }j                  j                  ||      j	                         }|s[|j                  sh|j                  |j                  j                         |j                  |j                  j                          j                  j                  |	      S )
z
    Filters and returns LeaveRequest objects that have been conditionally approved by the previous sequence of approvals.
    )employee_user_idleaver   )LeaveRequestLeaveRequestConditionApproval)
manager_idNr   )leave_request_idsequence)pk__in)r   rP   rR   userrg   r   rd   rO   rn   ro   rr   rq   is_approvedr   rH   )	requestapproval_managerleave_request_idsrn   ro   multiple_approval_requestsinstancepre_sequencerq   s	            r    filter_conditional_leave_requestr|      s.     ''...MSSU!L%B%J%J%Q%Q' &R &
" &*". 
Cq #,,q0L'884<<CC!1L D eg  H00!(()B)B)E)EF$$X%>%>%A%AB
C &&.?&@@r   )N)r1   r   r   django.appsr   django.db.modelsr   employee.modelsr   horilla.methodsr   r   r    r(   rA   r_   rj   r|    r   r   <module>r      s<     (   $ 3< "'T44Ar   