o
    ayhQ                     @   s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
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mZmZ dd
lmZmZmZmZ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 dl&m'Z' edddd Z(edddd Z)edddd Z*edddd Z+edddd Z,edddd Z-edddd Z.eddd d! Z/eddeddd"d# Z0eddd$d% Z1eddd&d' Z2eddd(d) Z3eddd*d+ Z4eddd,d- Z5eddd.d/ Z6eddd0d1 Z7eddd2d3 Z8eddd4d5 Z9eddd6d7 Z:eddd8d9 Z;eddd:d; Z<eddd<d= Z=eddd>d? Z>eddd@dA Z?edddBdC Z@edddDdE ZAedddFdG ZBedddHdI ZCedddJdK ZDedddLdM ZEedddNdO ZFdPS )Q    )timezone)ValidationError)Q)renderredirectget_object_or_404)HttpResponseJsonResponse)messages)login_required   )
DepartmentEmployee
AttendanceLeavePayroll	Deductionr   )DepartmentFormAttendanceForm	LeaveFormPayrollFormEmployeeFormDeductionForm)	Paginator)get_template)pisa)Count)datez/auth/login/)	login_urlc                 C   s&  t j }tjjdd }tjjtdddd}t jdjtdd		d}t jd
jtdd		d
}t jdjtdd		d}t
jjt tjdd d}|djtdd}tjjdd }	tjjdd }
tj 	dd d }||||||||	|
|d
}t| d|S )NT)approvedemployee)num_employeesnamer!   employee_categoryid)countemployment_typeemployment_status   days)	date__gter   status)totalF-date   )
total_employeesemployees_on_leavedepartment_countscategory_breakdowntype_breakdownstatus_breakdownattendance_summaryleave_approvedleave_pendingrecent_payrollszhr/hr_dashboard.html)r   objectsr%   r   filterr   annotater   valuesorder_byr   r   now	timedeltar   allr   )requestr0   r1   r2   r3   r4   r5   recent_attendancer6   r7   r8   r9   context rE   !/var/www/html/kangema/hr/views.pyhr_dashboard   sF   
rG   c                 C   s4   t j d}tj }t }t| d|||dS )N
first_namezhr/employee_list.html)	employeesformdepartments)r   r:   rA   r>   r   r   r   )rB   rI   rK   rJ   rE   rE   rF   employee_listF   s   
rL   c                 C   s   t t|d}t| dd|iS )Nemployee_idzhr/employee_detail.htmlr    )r   r   r   )rB   rN   r    rE   rE   rF   employee_detailS   s   rO   c                 C   @   | j dkrt| j}| r|  t| d tdS tdS )NPOSTzEmployee added successfully.rL   )methodr   rQ   is_validsaver
   successr   rB   rJ   rE   rE   rF   employee_addY      

rW   c                 C   sZ   t t|d}| jdkrt| j|d}| r|  tdS nt|d}t| d||dS )Nr$   rQ   instancerL   zhr/employee_edit.html)rJ   r    )	r   r   rR   r   rQ   rS   rT   r   r   )rB   r$   r    rJ   rE   rE   rF   employee_editc   s   

r\   c                 C   s*   t t|d}| jdkr|  tdS d S )NrY   rQ   rL   )r   r   rR   deleter   )rB   r$   r    rE   rE   rF   employee_deleter   s
   
r^   c           	      C   sr   t t|d}d}d|i}tdd}d|j d|j d|d	< t|}||}tj||d
}|j	r7tdddS |S )NrM   zhr/employee_print.htmlr    application/pdfcontent_typez
filename="_z_details.pdf"Content-DispositiondestzError rendering PDF  r,   )
r   r   r   rH   	last_namer   r   r   	CreatePDFerr)	rB   rN   r    template_pathrD   responsetemplatehtmlpisa_statusrE   rE   rF   employee_printz   s   

rp   c                 C   s\   t j d}t|d}| jd}||}t }dd |D }|||d}t	| d|S )Nr.   
   pagec                 S   s   i | ]	}|j t|d qS )rZ   )r$   r   ).0payrollrE   rE   rF   
<dictcomp>   s    z payroll_list.<locals>.<dictcomp>)payrollsadd_form
edit_formszhr/payroll_list.html)
r   r:   rA   r>   r   GETgetget_pager   r   )rB   rv   	paginatorpage_numberpage_objrw   rx   rD   rE   rE   rF   payroll_list   s   

r   c                 C   sj   | j dkr.t| j}| r$| }|  |  t| d tdS t	| d tdS t }tdS )NrQ   z"Payroll record added successfully.r    Please correct the errors below.)
rR   r   rQ   rS   rT   calculate_net_salaryr
   rU   r   error)rB   rJ   rt   rE   rE   rF   payroll_add   s   

r   c                 C   sL   t t|d}| jdkr"t| j|d}| r"|  |  tdS tdS )NrY   rQ   rZ   r   )	r   r   rR   r   rQ   rS   rT   r   r   )rB   r$   rt   rJ   rE   rE   rF   payroll_edit   s   
r   c                 C   s   t t|d}|  tdS )NrY   r   )r   r   r]   r   )rB   r$   rt   rE   rE   rF   payroll_delete   s   r   c                 C   sH   t j d}t|d}| jd}||}t }t	| d||dS )Nr"   rq   rr   zhr/department_list.html)rK   rJ   )
r   r:   rA   r>   r   ry   rz   r{   r   r   )rB   rK   r|   r}   r~   rJ   rE   rE   rF   department_list   s   

r   c                 C   s\   | j dkr#t| j}| r|  t| d tdS t| d nt }t	| dd|iS )NrQ   zDepartment added successfully.r   r   zhr/department_add.htmlrJ   )
rR   r   rQ   rS   rT   r
   rU   r   r   r   rV   rE   rE   rF   department_add   s   

r   c                 C   sf   t t|d}| jdkr/t| j|d}| r)|  t| d|j	 d t
dS t| d t
dS )NrY   rQ   rZ   Department "z" updated successfully.r   r   )r   r   rR   r   rQ   rS   rT   r
   rU   r"   r   r   )rB   department_id
departmentrJ   rE   rE   rF   department_edit   s   
r   c                 C   sH   t t|d}| jdkr |j}|  t| d| d tdS tdS )NrY   rQ   r   z" deleted successfully.r   )r   r   rR   r"   r]   r
   rU   r   )rB   r   r   department_namerE   rE   rF   department_delete   s   
r   c                 C   sf   t j d}| jdkr%t| j}| r$|  t	
| d tdS nt }||d}t| d|S )Nz-start_daterQ   !Leave request added successfully.
leave_list)leavesrJ   zhr/leave_list.html)r   r:   rA   r>   rR   r   rQ   rS   rT   r
   rU   r   r   )rB   r   rJ   rD   rE   rE   rF   r     s   

r   c                 C   p   t t|d}| jdkr(t| j|d}| r'|  t| d t	d|j
dS nt|d}||d}t| d|S 	NrY   rQ   rZ   z#Leave request updated successfully.leave_detailleave_id)leaverJ   hr/leave_detail.htmlr   r   rR   r   rQ   rS   rT   r
   rU   r   r$   r   rB   r   r   rJ   rD   rE   rE   rF   r     s   

r   c                 C   sR   t t|d}| jdkrd|_|  t| d td|jdS d|i}t	| d|S )	NrY   rQ   Tz$Leave request approved successfully.r   r   r   r   )
r   r   rR   r   rT   r
   rU   r   r$   r   rB   r   r   rD   rE   rE   rF   leave_approve.  s   
r   c                 C   sF   t t|d}| jdkr|  t| d tdS d|i}t| d|S )NrY   rQ   z#Leave request deleted successfully.r   r   r   )r   r   rR   r]   r
   rU   r   r   r   rE   rE   rF   leave_delete?  s   
r   c                 C   sT   | j dkrt| j}| r|  t| d tdS nt }d|i}t| d|S )NrQ   r   r   rJ   zhr/leave_add.html)	rR   r   rQ   rS   rT   r
   rU   r   r   )rB   rJ   rD   rE   rE   rF   	leave_addO  s   

r   c                 C   r   r   r   r   rE   rE   rF   
leave_editc  s   

r   c              
   C   s   | j dkr>t| j}| r7z|  t| d tdW S  ty6 } zt	| |j
 W Y d }~nd }~ww t	| d nt }t| dd|iS )NrQ   z!Attendance recorded successfully.attendance_listzThere was an error in the form.zhr/attendance_add.htmlrJ   )rR   r   rQ   rS   rT   r
   rU   r   r   r   messager   )rB   rJ   erE   rE   rF   attendance_addw  s   


r   c           
   	   C   s  | j dkr| jd}| jd}| jd}|s#t| d tdS d}d}|D ]=}z!tjj|d}t	jj
||d	|id
\}}	|	rG|d7 }n|d7 }W q) tjyZ   |d7 }Y q) tyf   |d7 }Y q)w |dkrut| d| d |dkrt| | d tdS )NrQ   employee_idsr   default_statusNo employees selected.r   r   rY   r,   )r    r   defaultsr   z#Successfully marked attendance for  employees.z7 employees already had attendance marked for this date.)rR   rQ   getlistrz   r
   r   r   r   r:   r   get_or_createDoesNotExistr   rU   warning)
rB   r   attendance_dater   success_counterror_countrN   r    
attendancecreatedrE   rE   rF   attendance_bulk_add  s>   


r   c                 C   s  t j d}t|d}| jd}||}t	 
 }t jj|dd }t jj|dd }t jj|dd }|tjdd	 }	tjjd
d d }
t jj|	ddgd }|
dkre||
 d nd}tjjd
ddd}||||t|d|d}t| d|S )Nr.   rq   rr   Present)r   r,   LateAbsentr(   r)   T	is_active)r+   
status__inr   d   rH   rh   r   )attendance_recordspresent_today_countlate_today_countabsent_today_countattendance_raterI   zhr/attendance_list.html)r   r:   rA   r>   r   ry   rz   r{   r   r?   r   r;   r%   r@   r   roundr   )rB   r   r|   r}   r~   todaypresent_today
late_todayabsent_todayweek_agototal_possible_attendanceactual_attendancer   rI   rD   rE   rE   rF   r     s4   

	r   c                 C   sD   t j d}tjjdddd}t }|||d}t| d|S )Nr.   Tr   rH   rh   )
deductionsrI   rJ   hr/deduction_list.html)r   r:   rA   r>   r   r;   r   r   )rB   r   rI   rJ   rD   rE   rE   rF   deduction_list  s   r   c                 C   rP   )NrQ   zDeduction added successfully.r   )rR   r   rQ   rS   rT   r
   rU   r   rV   rE   rE   rF   deduction_add  rX   r   c                 C   sP   t t|d}| jdkr$t| j|d}| r$|  t| d t	dS t	dS )NrY   rQ   rZ   zDeduction updated successfully.r   )
r   r   rR   r   rQ   rS   rT   r
   rU   r   )rB   deduction_id	deductionrJ   rE   rE   rF   deduction_edit  s   
r   c                 C   sB   t t|d}| jdkr|  t| d tdS t| dd|iS )NrY   rQ   zDeduction deleted successfully.r   r   r   )r   r   rR   r]   r
   rU   r   r   )rB   r   r   rE   rE   rF   deduction_delete  s   
r   c           
      C   s   | j dkrO| jd}|st| d tdS tjj|d}t	jj|d}d|i}d}t
d	d
}d|d< t|}||}tj||d}	|	jrMt
dddS |S tdS )NrQ   r   r   rL   )id__in)employee__inrv   zhr/payslip_template.htmlr_   r`   z#attachment; filename="payslips.pdf"rc   rd   zError generating PDF payslipsrf   rg   )rR   rQ   r   r
   r   r   r   r:   r;   r   r   r   r   r   ri   rj   )
rB   r   rI   rv   rD   rk   rl   rm   rn   ro   rE   rE   rF   generate_payslips	  s&   


r   c           	      C   s   | j dkrq| jd}|st| d tdS tjj|dd}d}|D ]?}t	
  }tjj||j|jd }|sbtjj|||jdd	}tjj|d
}| r^|j| |  |  |d7 }q#t| d| d tdS tjjdd}t| dd|iS )z(Process payroll for all active employeesrQ   r   z-No employees selected for payroll processing.r   T)r   r   r   )r    date__month
date__year)r    r   basic_salarybonus)r    r   z#Successfully processed payroll for r   r   zhr/payroll_bulk_process.htmlrI   )rR   rQ   r   r
   r   r   r   r:   r;   r   r?   r   r   monthyearfirstcreatesalaryr   existsr   setr   rT   rU   r   )	rB   selected_employeesrI   processed_countr    current_dateexisting_payrollrt   employee_deductionsrE   rE   rF   payroll_bulk_process+  sD   
r   c                 C   sV   | j dd }tjt|dt|dB t|dB t|dB }tdt|	 iS )Nq )first_name__icontains)last_name__icontains)department__name__icontains)job_title__icontainsrI   )
ry   rz   lowerr   r:   r;   r   r	   listr=   )rB   queryrI   rE   rE   rF   employee_live_searchV  s   r   N)Gdjango.utilsr   django.core.exceptionsr   django.db.modelsr   django.shortcutsr   r   r   django.httpr   r	   django.contribr
   django.contrib.auth.decoratorsr   modelsr   r   r   r   r   r   formsr   r   r   r   r   r   django.core.paginatorr   django.template.loaderr   	xhtml2pdfr   r   datetimer   rG   rL   rO   rW   r\   r^   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   rE   rE   rF   <module>   s   $ 
3


	

















&
&




	
!
*