o
    8h                     @   s:	  d dl mZmZmZ d dl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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 d dlZd dlZd dlZd dlZd dlmZ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/m0Z0 ddl1m2Z2 dd Z3dd Z4dd Z5dd Z6e	e0e#j7dd Z8ddl(m9Z9 ddl m$Z$m%Z% ddl1m2Z2 d dlmZ d dlmZ dgd d d!gd d d"gd d d#gd d d$gd d d%gdd d&gd d d'gd(d d)gd d d%gd d d*
Z:dd+l(m9Z9m;Z; d d,l<m=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 d,l<m=Z= e	e0e#j7e#j@d/d0 ZAe	d1d2 ZBe	e0e#j@d3d4 ZCe	e0e#j@d5d6 ZDe	e0e#jEd7d8 ZFe	e0e#j@d9d: ZGd d;lHmIZI d d<lmJZJ d d;lHmIZI d d=lmJZJmZ d dlm	Z	 d dlmZ d d;lHmIZI d d=lmJZJmZ d dlmZ d d>l mZ d d?lKm$Z$m#Z#m!Z!m"Z" d dlLm0Z0 e	e0e#jEd@dA ZMe	e0e#jEdBdC ZNe	e0e#jEdDdE ZOe	e0e#jEdFdG ZPe	e0e#jEdHdI ZQe	e0e#jEdJdK ZRe	e0e#jEdLdM ZSe	e0e#jEdNdO ZTddPdQZUddRdSZVddTdUZWe	e0e#jEdVdW ZXd dXlm	Z	mYZY d d-l mZmZ ddYl(m.Z. dZd[ ZZe	eYeZd\d] Z[e	e0e#jEd^d_ Z\e	e0e#jEd`da Z]d d-l mZmZ d dlm	Z	 d dl
mZ d dlmZ ddbl m&Z& e	dcdd Z^ddel m'Z' d dXlm	Z	mYZY d dl mZmZmZ d dl
mZ d dlmZ d dXlm	Z	mYZY d dflmZm_Z_ ddgl m#Z#m&Z&m'Z' d dXlm	Z	mYZY d dhl mZmZmZ d dl
mZ d dlmZ d dflmZm_Z_ d dl`Z`d dlZd dlmZ d dlmZmZ d dlZddil(maZa d djlbmcZc d dkldmeZe d dl mZmZmZ d dl
mZ d dXlm	Z	mYZY d dlmZ d dflmZm_Z_ d dl`Z`d dlZddgl m#Z#m&Z&m'Z' ddll(maZamfZf dmdn Zge	eYegdodp Zhe	e0e#j@dqdr Zid dslmZ d dlZddbl m&Z& d dlmZ e	e0e#jjdtdu Zkd dslmZ d d	lmZ d dvllmmZm d dwlnmoZo d dxl`mpZp d dylmZ d dlZe	dzd{ Zqd d|lrmsZs d dlm	Z	 d d}l mZmZ d dl
mZ e	d~d Zte	dd Zud dlmZ d d-l mZmZ d dl
mZ ddl m$Z$ ddl(m9Z9 d dlm	Z	 d)gd d d'gd(d dgdd dgdd d'd(gd d d$dgd d d%d(gdd g dd d g dd d g dd d d
Z:e	e0e#j@e#jEdd Zve	e0e#jEdd Zwe	e0e#jEdd Zxddl(myZy d dlmZ d d
lmZ e	dd ZzdS )    )renderredirectget_object_or_404)authenticateloginlogout)login_required)messages)timezone)HttpResponseJsonResponse)Q)	send_mail)render_to_string)settingsN)	timedeltadate   )Company
CostCenterEmployeeProfileVacationRequestVacationLogClockRecordClockReportApproval)	LoginFormEmployeeFormVacationRequestFormApprovalForm
ReportFormManualVacationForm)role_required)calculate_vacation_balancec                 C   s   | j jrtdS d}| jdkr8| jd}| jd}t| ||d}|dur6t| | | jdd}t|S d}t	| d	d
|iS )zView for user login	dashboardNPOSTusernamepassword)r%   r&   nextu%   Nome de usuário ou senha inválidos.zlogin_standalone.htmlerror_message)
useris_authenticatedr   methodr$   getr   r   GETr   )requestr(   r%   r&   r)   next_url r0   #/var/www/html/rh/vacations/views.py
login_view!   s   

r2   c                 C   s   t |  tdS )zView for user logoutr   )r   r   r.   r0   r0   r1   logout_view9   s   r4   c                 C   s   | j jrtdS t| dS )z6Home page view that shows information about the systemr#   z
index.html)r)   r*   r   r   r3   r0   r0   r1   home?   s   
r5   c                 C   s   t | jdst| d tdS | jjj}|tjkrtdS |tj	kr'tdS |tj
kr0tdS |tjkr9tdS t| d tdS )	z5Main dashboard view that redirects based on user roleprofileu0   Perfil não encontrado. Contate o administrador.r   employee_dashboardmanager_dashboardadmin_dashboardintern_dashboardu   Papel de usuário inválido.)hasattrr)   r	   errorr   r6   roler   USER_ROLE_EMPLOYEEUSER_ROLE_MANAGERUSER_ROLE_ADMINUSER_ROLE_INTERN)r.   	user_roler0   r0   r1   r#   F   s   




r#   c              	   C   s   | j j}t|}tjj|tjdd}tjj|tjdd}tjj|dj	tjdd}g }|j
r=tjjd|dd}|||||t  td	d
 |d}t| d|S )zDashboard for regular employeesemployeestatus
start_date-start_daterD   rE   internTr=   tutor	is_active   days)rD   vacation_balancemy_pending_requestsmy_approved_requestsmy_vacation_historytoday_plus_15internszemployee/dashboard.html)r)   r6   r"   r   objectsfilterSTATUS_PENDINGorder_bySTATUS_APPROVEDexcludeis_tutorr   r
   nowr   r   r   )r.   rD   rQ   pending_requestsapproved_requestsvacation_historyrV   contextr0   r0   r1   r7   [   sD   
r7   )VacationChoiceForm)r   r   )r      )periods	sold_days            rN         
      )
zGozo 5 diaszGozo 6 diaszGozo 7 diaszGozo 12 diaszGozo 14 diaszGozo 15 + venda 5zGozo 18 diaszGozo 20 + venda 10zGozo 30 diaszGozo 15 dias)rc   VACATION_RULES)
parse_date)r   r   )ValidationErrorc              
   C   s  | j j}| jdkrBd| jv r| jd}| jd}t|}|r$|s.t| d tdS zt	|}|s9t
dW n tyM   t| d td Y S w |tt|d	 d
 d }t|d	 |dd }t|}||kr}t| d| d tdS z0t||||ddtjd}|  |  tjj|tj| j d| d t| d tdW S  ty }	 z|	j D ]\}
}|D ]}t| | qqtdW  Y d }	~	S d }	~	ww t| j}| r5|jd }|jd }t|}|s|dd n:|d	 }|d }|}g }|D ]}|t|d
 d }|||d |td
d }q	t | d|||t|| |dS t|}t | d||dS t }t|}t | d||dS )Nr$   confirmrF   vacation_optionu3   Erro ao confirmar solicitação: dados incompletos.request_vacationu   Data inválidau   Data de início inválida.re   r   rO   rf   r   u!   Saldo insuficiente. Você possui u    dias disponíveis.)rD   rF   end_dateselling_daysrE   u   Solicitação via opção: vacation_requestactionperformed_bydetailsu-   Solicitação de férias enviada com sucesso.r7   u   Opção de férias inválida.)startendzemployee/confirm_vacation.html)formre   rf   
total_daysreturn_datezemployee/request_vacation.html)r~   rQ   )!r)   r6   r+   r$   r,   ro   r	   r<   r   rp   
ValueError	Exceptionr   sumr"   r   rY   
full_cleansaver   rW   createACTION_REQUESTsuccessrq   message_dictitemsrc   is_validcleaned_data	add_errorappendr   )r.   rD   rF   optionruleru   total_solicitadosaldovacationefielderrorsr<   r~   re   rf   current_dateperiod_datesrP   balancer0   r0   r1   rt      s   









	rt   c                 C   s@   t jj| jjdd}|t  t	dd d}t
| d|S )NrH   rG   rN   rO   )ra   rU   zemployee/history.html)r   rW   rX   r)   r6   rZ   r
   r^   r   r   r   )r.   	vacationsrb   r0   r0   r1   view_history  s
   r   c                 C   s8  | j j}tjj|j tjdj|djt	j
d }tjj|j tjt  dd}tjj|j tjt  t  dd}t|}tjj|tjdd}tjj|tjdd	}tjj|djtjd
d	}g }	|jrt	jjd|dd}	|||||||t  tdd |	d	}
t| d|
S )Nemployee__cost_centers__inrE   rH   employee__role)r   rE   start_date__gterF   )r   rE   start_date__lteend_date__gteru   rC   rG   rI   rJ   TrK   rN   rO   )	r_   upcoming_vacationscurrent_vacationsrQ   rR   rS   rT   rU   intern_reportszmanager/dashboard.html)r)   r6   r   rW   rX   cost_centersallrY   r\   r   r?   distinctr[   r
   r^   r   rZ   r"   r]   r   r   )r.   managerr_   r   r   my_vacation_balancerR   rS   rT   r   rb   r0   r0   r1   r8     sz   


r8   c                 C   sZ   | j j}tjj|j tjdj|djt	j
dddd d}t| dd	|iS )
Nr   rH   r   rD   employee__useremployee__cost_centersrF   zmanager/pending_requests.htmlr_   )r)   r6   r   rW   rX   r   r   rY   r\   r   r?   select_relatedprefetch_relatedr   rZ   r   )r.   r   r_   r0   r0   r1   r_   a  s$   r_   c              
   C   s  t t|tjd}| jdkrt| j}| r|jd }|dkrtj|_	| j
j|_t |_|  tjj|tj| j
dd z$|jj
jr`tdd|jd	 d
|jd	 dtj|jj
jgdd W n tyz } ztd|  W Y d}~nd}~ww t | d t!dS |dkr|jd }tj"|_	||_#|  tjj|tj$| j
d| d z&|jj
jrtdd|jd	 d
|jd	 d| tj|jj
jgdd W n ty } ztd|  W Y d}~nd}~ww t | d t!dS nt }||d}t%| d|S )zBView for HR (admin) to review and approve/reject vacation requestsidrE   r$   ry   approveu!   Solicitação de férias aprovadarw   u!   Solicitação de Férias Aprovadau    Sua solicitação de férias de %d/%m/%Y a z foi aprovada.Tfail_silentlyzErro ao enviar e-mail: N#   Solicitação aprovada com sucesso.r_   rejectrejection_reasonzRejeitado. Motivo: u"   Solicitação de Férias Rejeitadaz foi rejeitada. Motivo:    Solicitação rejeitada.rx   r~   zadmin/review_request.html)&r   r   rY   r+   r   r$   r   r   r[   rE   r)   r6   approved_byr
   r^   approval_dater   r   rW   r   ACTION_APPROVErD   emailr   rF   strftimeru   r   DEFAULT_FROM_EMAILr   printr	   r   r   STATUS_REJECTEDr   ACTION_REJECTr   )r.   vacation_idrx   r~   ry   r   r   rb   r0   r0   r1   review_request{  s   





 


$
r   c                 C   s.  | j j}|j }tjj|ddj|jd	dd
ddd }tjj|tjd	d
}| jd
}| jd}|rVzt|}|j|d}W n tyU   d }Y nw |rqzt|}|j|d}W n typ   d }Y nw i }|D ]}|j D ]}	||	jg | q|qu||||d}
t| d|
S )NT)cost_centers__inrM   r   r)   companyr   cost_centers__nameuser__first_name)employee__inrE   rF   ru   r   end_date__lte)grouped_membersr   rF   ru   zmanager/team_calendar.html)r)   r6   r   r   r   rW   rX   r\   r   r   r   rZ   r   r   r[   r-   r,   r   fromisoformatr   
setdefaultnamer   r   )r.   r   r   team_membersr   rF   ru   r   memberccrb   r0   r0   r1   team_calendar  sZ   


r   )
TruncMonth)Count)r   r   )r   )r   r   r   r   c                 C   s  t   }|tdd }|tdd }| jd}| jd}tjjtj	||d}|r2|j|d}|r:|j|d}|j
td	d
dj
tddd}dd |D dd |D d}tjjddj
tdttjddtdttj	|ddtdttj|ddddd}	|	D ]}
|
jjddd}| r| nd |
_qtjjdd tjjtjd | tjjtj	||ddtjjtj	||tdd dd	|tjjddd tjjddd |	d!	}t| d"|S )#NZ   rO   rn   r   cost_center)rE   r   r   )employee__company__name)employee__cost_centers__namerF   )monthr   r   countc                 S   s   g | ]	}|d   dqS )r   z%b/%Y)r   .0vr0   r0   r1   
<listcomp>8  s    z#admin_dashboard.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r   r0   r   r0   r0   r1   r   9  s    )labelsdataTrM   employees__vacation_requests)$employees__vacation_requests__status)rX   )r   0employees__vacation_requests__approval_date__gte)pending_countapproved_countrejected_countemployees__userr   )r=   r   rI   )rE   r   r   employee__user__first_namer   )	total_employeesr_   approved_vacationsr   vacations_requiring_notice
chart_data	companiesr   status_por_departamentozadmin/dashboard.html)r
   r^   r   r   r-   r,   r   rW   rX   r[   annotater   valuesr   rZ   r   r   rY   r   r   	employeesexistsfirstr   r   r   r   r   )r.   today
in_90_days
last_monthcompany_filtercost_center_filterupcoming_qsr   r   r   centrogestoresrb   r0   r0   r1   r9     sz   r9   c                 C   s  | j dkrt| j}| rtjj|jd d r$t	
| d tdS tjj|jd d r:t	
| d tdS |jd	d
}||jd  |  tjj||jd |jd |jd |jd d|jdd	d}|jd}|ry|j| nt	| d |jd dkr|jd|_|  t	| d tdS td|j nt }tj dd}||tjjddtjjddd}t| d|S )Nr$   r%   )r%   u1   Já existe um usuário com este nome de usuário.manage_employeesemployee_id)r  u.   Já existe um colaborador com esta matrícula.F)commit	password1r   	hire_dater=   Tr]   )r)   r   r  r  r=   rM   r]   r   u9   Nenhum centro de custo foi atribuído a este colaborador.rJ   rL   z#Colaborador cadastrado com sucesso!u   Formulário inválido:
-is_activer   r   )r~   r   r   r   zadmin/manage_employees.html)r+   r   r$   r   UserrW   rX   r   r   r	   r<   r   r   r   set_passwordr   r,   r   setwarningrL   r   r   r   r   rZ   r   r   r   )r.   r~   r)   r6   r   r   rb   r0   r0   r1   r  f  sN   

r  c                 C   sj  t t|d}|j}| jdkrt| j|d}| r|jd |_|jd |_	|jd |_
|jd |_|  |jd |_|jd	 |_|jd
 |_|jd |_d| jv |_|jdd|_|jd dkrh|jdnd |_|j|jd  |  t| d tdS t| d n!|j|j|j	|j
|j|j|j|j|j |j|jd}t||d}||d}t| d|S )Nr   r$   instance
first_name	last_namer   r%   r   r  r  r=   rM   r]   FrJ   rL   r   z#Colaborador atualizado com sucesso!r  zErro ao atualizar colaborador.)r%   r  r  r   r   r  r  r=   r   r]   rL   )r  initial)r~   employee_profilezadmin/edit_employee.html)r   r   r)   r+   r   r$   r   r   r  r  r   r%   r   r   r  r  r=   rM   r,   r]   rL   r   r
  r	   r   r   r<   r   r   )r.   r  r  r)   r~   initial_datarb   r0   r0   r1   edit_employee  sN   
 r  c                 C   s   | j dkr5| jd}| jd}| jd}|r/|r/tjj|||dd t| d tdS t	| d	 tj
 d
d}d|i}t| d|S )zView for HR to manage companiesr$   r   cnpjaddressT)r   r  r  rM   zEmpresa cadastrada com sucesso!manage_companiesu   Nome e CNPJ são obrigatórios.r  r   zadmin/manage_companies.html)r+   r$   r,   r   rW   r   r	   r   r   r<   r   rZ   r   )r.   r   r  r  r   rb   r0   r0   r1   r    s$   
r  c                 C   s|   t t|d}| jdkr4| jd|_| jd|_| jd|_d| jv |_|	  t
| d tdS d	|i}t| d
|S )zView for HR to edit a companyr   r$   r   r  r  rM   zEmpresa atualizada com sucesso!r  r   zadmin/edit_company.html)r   r   r+   r$   r,   r   r  r  rM   r   r	   r   r   r   )r.   
company_idr   rb   r0   r0   r1   edit_company  s   
r  c                 C   s   | j dkr7| jd}| jd}| jd}|r1|r1|r1tjj|||dd t| d tdS t	| d	 tj
d d
dd}tjjddd}| jd}|r\|j|d}|||d}t| d|S )z"View for HR to manage cost centersr$   r   coder   T)r  r  r   rM   z'Centro de custo cadastrado com sucesso!manage_cost_centersu+   Empresa, código e nome são obrigatórios.r  company__namer   )r  )r   r   r   zadmin/manage_cost_centers.html)r+   r$   r,   r   rW   r   r	   r   r   r<   r   r   rZ   r   rX   r-   r   )r.   r  r  r   r   r   r   rb   r0   r0   r1   r    s0   
r  c                 C   s   t t|d}| jdkr4| jd|_| jd|_| jd|_d| jv |_|	  t
| d tdS tjjd	d
d}||d}t| d|S )z!View for HR to edit a cost centerr   r$   r   r  r   rM   z'Centro de custo atualizado com sucesso!r  Tr   )r   r   zadmin/edit_cost_center.html)r   r   r+   r$   r,   r  r  r   rM   r   r	   r   r   r   rW   rX   rZ   r   )r.   cost_center_idr   r   rb   r0   r0   r1   edit_cost_center:  s   
r  c                 C   s   | j dkrIt| j}| rH|jd }|jd}|jd}|jd}|jd}|dkr4t||S |dkr?t||||S |d	krHt||S nt }d
|i}t	| d|S )zView for HR to generate reportsr$   report_typer   r   rF   ru   rQ   vacation_scheduler_   r~   zadmin/reports.html)
r+   r   r$   r   r   r,    generate_vacation_balance_report!generate_vacation_schedule_report generate_pending_requests_reportr   )r.   r~   r  r   r   rF   ru   rb   r0   r0   r1   reportsU  s&   




r#  c                 C   s  ddl }ddl}| }||}|d}g d}t|D ]\}}	|d||	 qtjj	dd}
| r9|
j	| d}
|rA|
j	|d}
|

d	d
ddd}
t|
dD ]V\}}t|}|jj d|jj }ddd |j D }||d|j ||d| ||d|jj ||d| ||d|jr|jdnd ||d| qS|  |d t| dd}d|d< |S )z3Generate Excel report of employee vacation balancesr   Nu   Saldo de Férias)
   MatrículaNomeEmpresaCentro(s) de Custou   Data de Admissãou   Saldo de Férias (dias)Tr   )r   )r   r)   r   r   r  r   r    , c                 S   s   g | ]}|j qS r0   r   r   r   r0   r0   r1   r     s    z4generate_vacation_balance_report.<locals>.<listcomp>         r    rd   Aapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetcontent_typez&attachment; filename=saldo_ferias.xlsxContent-Disposition)io
xlsxwriterBytesIOWorkbookadd_worksheet	enumeratewriter   rW   rX   r   r   rZ   r"   r)   r  r  joinr   r   r  r   r   r  r   closeseekr   read)r   r   r4  r5  bufferworkbook	worksheetheaderscol_numheaderr   row_numrD   rQ   	full_namecost_centers_namesresponser0   r0   r1   r   s  sD   

 
r   c              
   C   s  t  }t|}|d}g d}t|D ]\}}	|d||	 qtjj	tj
d}
| r2|
j	| d}
|r:|
j	|d}
|rB|
j	|d}
|rJ|
j	|d}
|
d	d
dd}
t|
dD ]g\}}|j}|jj d|jj }|j|j }||d|j ||d| ||d|jj ||dddd |j D  ||d|jd ||d|jd ||d| ||d|j qY|  |d t| dd}d|d< |S )z4Generate Excel report of approved vacation schedulesu   Programação de Férias)r$  r%  r&  zCentro de Custo   Data InícioData Fim
Total DiasDias Vendidosr   rI   employee__companyr   r   r   rD   r   rN  r   r   r(  r,  r-  r)  c                 s       | ]}|j V  qd S Nr*  r+  r0   r0   r1   	<genexpr>      z4generate_vacation_schedule_report.<locals>.<genexpr>r.  r   rd   rg   rh   r0  r1  z,attachment; filename=programacao_ferias.xlsxr3  ) r4  r6  r5  r7  r8  r9  r:  r   rW   rX   r[   r   r   rD   r)   r  r  r   rv   r  r   r   r;  r   r   rF   r   ru   r<  r=  r   r>  )r   r   rF   ru   r?  r@  rA  rB  rC  rD  r   rE  r   rD   rF  r   rH  r0   r0   r1   r!    sJ   

$
r!  c                 C   s  t  }t|}|d}g d}t|D ]\}}|d|| qtjj	tj
d}| r2|j	| d}|r:|j	|d}|ddd	d
d}t|dD ]\}	}
|
j}|jj d|jj }ddd |j D }tjj	|j tjdd }| rddd |D nd}|
j|
j }||	d|j ||	d| ||	d|jj ||	d| ||	d| ||	d|
jd ||	d|
j d ||	d|
j!d ||	d| ||	d|
j qL|"  |#d t$|% dd}d |d!< |S )"z2Generate Excel report of pending vacation requestsu   Solicitações Pendentes)
r$  r%  r&  r'  z
Gestor(es)u   Data SolicitaçãorI  rJ  rK  rL  r   rI   rM  rO  rD   r   rN  r   rF   r   r(  r)  c                 s   rP  rQ  r*  r+  r0   r0   r1   rR    rS  z3generate_pending_requests_report.<locals>.<genexpr>T)r   r=   rM   c                 s   s    | ]}|j  V  qd S rQ  )r)   get_full_name)r   gr0   r0   r1   rR    s    u   Não definidor,  r-  r.  rd   r   rg   rh      	   r0  r1  z0attachment; filename=solicitacoes_pendentes.xlsxr3  )&r4  r6  r5  r7  r8  r9  r:  r   rW   rX   rY   r   r   rZ   rD   r)   r  r  r;  r   r   r   r?   r   r   r   rv   r  r   r   
created_atr   rF   ru   r<  r=  r   r>  )r   r   r?  r@  rA  rB  rC  rD  pendingrE  r.   rD   rF  rG  r  manager_namesr   rH  r0   r0   r1   r"    sd   

 
r"  c                 C   sH   | j d}|stddiddS tjj|dddd	}tt|d
dS )z+AJAX view to get cost centers for a companyr  r<   zCompany ID is requiredi  rI   T)r  rM   r   r   F)safe)r-   r,   r   r   rW   rX   r   list)r.   r  r   r0   r0   r1   get_cost_centers_json  s
   r]  )r   user_passes_test)r    c                 C   s   t | do
| jjdkS )Nr6   admin)r;   r6   r=   r)   r0   r0   r1   is_admin,  s   ra  c                 C   sD   | j dkrt| j}| r|  tdS nt }t| dd|iS )Nr$   r9   z'vacations/register_manual_vacation.htmlr~   )r+   r    r$   r   r   r   r   )r.   r~   r0   r0   r1   register_manual_vacation/  s   

rb  c                 C   s@   t t|d}|j}| jdkr|  t| d tdS tdS )Nr   r$   u"   Colaborador excluído com sucesso.r  )r   r   r)   r+   deleter	   r   r   )r.   r  rD   r)   r0   r0   r1   delete_employee;  s   
rd  c                 C   s2   t t|d}| jdkr|  t| d tdS )Nr   r$   u&   Centro de custo excluído com sucesso.r  )r   r   r+   rc  r	   r   r   )r.   r  r   r0   r0   r1   delete_cost_centerF  s
   
re  )r   c                 C   s  | j j}|jdkrt| d tdS | jdkrd| jv rg| jd}| jd}z-t	j
j||d}|j }tj|tj|d	 }t||_|  t| d
 W nE t	jyf   t| d Y n6w | jd}|rt  }t	j
j|||d st	j
j||d t| d nt| d nt| d | jd}	z|	rtj|	d nt  }
W n ty   t  }
Y nw t	j
j||
d}t| d||
dS )NrJ   zAcesso negado.r#   r$   update_time	record_idnew_timer   rD   %H:%Mu    Horário atualizado com sucesso.u   Registro não encontrado.type)rD   rk  timestamp__date)rD   rk  zPonto registrado com sucesso.u,   Você já registrou esse tipo de ponto hoje.u   Tipo de ponto não informado.r   z%Y-%m-%drD   rl  zintern/dashboard.html)recordsselected_date)r)   r6   r=   r	   r<   r   r+   r$   r,   r   rW   	timestampr   r
   datetimecombinestrptimetime
make_awarer   r   DoesNotExistr^   rX   r   r   r  r-   r   r   )r.   rJ   rg  rh  recordr   new_datetime
point_typer   date_strro  rn  r0   r0   r1   r:   U  sD   



&r:   )r   )rq  rt  )r   r   r   )r   r   r   )InternProfileExtraForm)default_storage)ContentFile)r{  LogoUploadFormc                 C   s   t | do| jjdkp| jjS )Nr6   r   )r;   r6   r=   r]   r`  r0   r0   r1   is_manager_or_tutor  s   r  c                 C   s&  t  }|j}|j}| jj}tjjd|dd}d }t	 }| j
dkrd| jv rb| jd}tt|dd}	t	| j| j}| rXd| jv rX| jd |	_|	  t| d	 tdS t| d
 tdS d| jv r| jd}
| jd}| jd}z'tjj|
d}t t|j t||_||_|  t| d W n ty } zt| d|  W Y d }~nd }~ww d| jv r| jd}tt|dd}	t | j| j|	d}| r|  t| d|	j!  d tdS t| d nd| jv r| jd}tt|dd}	| jd}|rGzt"|}W n7 t#yF   zt$t%j&'|( }W n t#yC   t| d td Y  Y S w Y nw t| d tdS | jjj)dkrk|	j*| jjkrkt| d tdS | jdd}|dkrt+jj,||	||dt  dd  t| d!|	j!  d" n|d#krt+jj||	||d$-  t| d%|	j!  d& g }|D ]M}	tjj|	||d'.d}i }|D ]}|j }|/|g 0| qt+jj|	|||d(1 }|r|j2|	kr|nt |	d}|0|	|	j3|||d) q|| |d*}t4| d+|S ),NrJ   TrK   r$   upload_logo	intern_id)r   r=   imagemzLogomarca enviada com sucesso.zErro ao enviar logomarca.approve_intern_reportrg  rp  rk  r   )Registro de ponto atualizado com sucesso.zErro ao atualizar registro: save_profiler  u   Dados do estagiário z atualizados com sucesso.u'   Erro ao atualizar dados do estagiário.ry   r   u   Mês inválido.u   Mês não especificado.rL   u&   Você não é tutor deste estagiário.r8   r   )signedapproved_at)rL   rJ   r   yeardefaultsu   Relatório do estagiário z aprovado com sucesso.cancel)rL   rJ   r   r  u   Aprovação do estagiário z foi cancelada.rD   timestamp__yeartimestamp__month)rJ   rL   r   r  )
estagiario	matriculadiasaprovador~   )
relatorios	mes_atual	logo_formz"manager/approve_intern_report.html)5r
   r^   r   r  r)   r6   r   rW   rX   r~  r+   r$   r,   r   FILESr   	logo_filer   r	   r   r<   r   r   ru  rq  rr  rp  r   rt  r   rk  r   r{  rT  intr   r\  calendar
month_nameindex
capitalizer=   rL   r   update_or_createrc  rZ   r   r   r   r  r  r   )r.   r   r   r  rL   rV   r~   r  r  rJ   rg  rh  new_typerw  r   	month_strry   r  	registrosr  rdiar  	form_instrb   r0   r0   r1   r    s   


 


 	r  c                 C   s   | j dkrq| jd}| jd}| jd}zFtjj|d}|jj| jjkr2t	
| d tdW S |j }tj|d }tt||}||_||_|  t	| d	 W tdS  tjyp   t	
| d
 Y tdS w tdS )Nr$   rg  rp  rk  r   u4   Você não tem permissão para editar este registro.r  rj  r  u"   Registro de ponto não encontrado.)r+   r$   r,   r   rW   rD   rL   r)   r6   r	   r<   r   rp  r   r
   rq  rs  rt  ru  rr  rk  r   r   rv  )r.   rg  rp  tiporegistrodata_original	nova_horanova_datahorar0   r0   r1   editar_registro_ponto<  s,   


r  )r   c                 C   s   | j j}| jd}|rtjj||d}ntjj|t 	 d}t
dd}d|d< t|}|g d |D ]}||j	 d|j d	| g q8|S )
Nr   rm  ztext/csvr1  z*attachment; filename="registros_ponto.csv"r3  )DataHoraTipor   rj  )r)   r6   r-   r,   r   rW   rX   r
   r^   r   r   csvwriterwriterowrp  r   rt  get_type_display)r.   rJ   ro  rn  rH  r  rw  r0   r0   r1   export_clock_recordsb  s    

r  )HTML)	localtime)
monthrange)r   c                    sV  t t|d}ttjj|||dd}t||d }g }td|d D ]}t	|||  fdd|D }	t
d  dt|	 d	tjd
 |	D ]}
t
d|
jd d|
j dtjd
 qGddddd}|	D ]2}
|
j }t|
jd}|dv r~||d< qf|dv r||d< qf|dv r||d< qf|dv r||d< qf|| d  dk|t| d q$dddd d!d"d#d$d%d&d'd(d)}d }|jr| |jj}td*|||| |t|d+r|jndt|d,r|jnd|jpd|jr|jd-nd|j r|j dnd.|j!r|j!dnd.|d/}t"|d0# }t$|d1d2}d3|j% d4| d4| d5|d6< |S )7Nr   r  rp  r   c                    s   g | ]}|j   kr|qS r0   )rp  r   )r   r  dia_datar0   r1   r     s    z+gerar_espelho_ponto_pdf.<locals>.<listcomp>z[DEBUG] z - z registro(s))filez  -> z%Y-%m-%d %H:%Mz []r/  )entradasaida_almocoretorno_almocosaida_finalrj  )r  inr  )r  	lunch_outr  )r  lunch_inr  )r  outr  z%Ard   )r  nome_dia
is_weekendhorariostem_registrojaneiro	fevereirou   marçoabrilmaiojunhojulhoagostosetembrooutubronovembrodezembro)r   r,  r-  r.  rd   rg   rh   rV  rW  rm      ri   zrelatorios/espelho_ponto.htmlcarga_horariaturmar   z--:--)rJ   dias_do_mesmes_nomeanor  r  funcaodata_admissaoinicio_turno	fim_turnologo_url)stringzapplication/pdfr1  zinline; filename="espelho__z.pdf"r3  )&r   r   r\  r   rW   rX   rZ   r  ranger   r   lensysstderrrp  r   rk  lowerr  r   weekdayanyr   r  build_absolute_uriurlr   r;   r  r  r  r  horario_trabalho_iniciohorario_trabalho_fimr  	write_pdfr   r  )r.   r  r  r   rJ   r  num_diasr  dia_numregistros_diar  r  r  horario_local	MES_NOMESr  html_stringpdf_filerH  r0   r  r1   gerar_espelho_ponto_pdf  s    (






	r  )r  )r   r   c                 C   8   t t|d}d|_|  t| |  d tdS )NpkTz foi ativado com sucesso.r  r   r  rM   r   r	   r   rT  r   r.   user_idr)   r0   r0   r1   activate_employee  
   r  c                 C   r  )Nr  Fz foi desativado com sucesso.r  r  r  r0   r0   r1   deactivate_employee  r  r  )r         r-     )rj   rd   rg   )rj   rV  rV  )r  rW  rd   )
u&   Férias integrais (30 dias, sem venda)u   Férias com venda de 10 diasu   Férias com venda de 5 diasu   Férias com venda de 3 diaszParcelamento 20 + 10zParcelamento 14 + 16z%Parcelamento 15 + 10 (com venda de 5)zParcelamento 14 + 5 + 6zParcelamento 14 + 8 + 8zParcelamento 16 + 9 + 5c                 C   s^  t t|tjd}| jj}|jtjkr8|j|ks.|jjtjks.|jj	j
|j	jdddd s8t| d tdS | jdkrt| j}| r|jd	 }|d
krutj|_||_t |_|  tjj|tj| jdd t | d tdS |dkr|jd }tj!|_||_"|  tjj|tj#| jd| d t$| d tdS nt }t%| d||dS )Nr   r   T)flat)id__inu:   Você não tem permissão para revisar essa solicitação.r_   r$   ry   r   u"   Solicitação aprovada pelo gestorrw   r   r   r   zRejeitada pelo gestor: r   zmanager/review_request.htmlr   )&r   r   rY   r)   r6   r=   r   r?   rD   r   rX   values_listr   r	   r<   r   r+   r   r$   r   r   r[   rE   r   r
   r^   r   r   r   rW   r   r   r   r   r   r   r  r   )r.   r   rx   gestorr~   ry   reasonr0   r0   r1   manager_review_request  sb   





r  c                 C   6   t jjt jdddddd}t| dd|iS )	NrI   rD   r   rN  r   rF   zadmin/all_pending_requests.htmlr_   )r   rW   rX   rY   r   r   rZ   r   )r.   r_   r0   r0   r1   all_pending_requestsT     
r  c                 C   r  )	NrI   rD   r   rN  r   rF   z"admin/approved_vacations_list.htmlr   )r   rW   rX   r[   r   r   rZ   r   )r.   r   r0   r0   r1   approved_vacations_listb  r  r  )CancelVacationFormc              
   C   sl  t t|| jjd}|jtjkrt| d tdS |j	t
   j}|dk r1t| d tdS | jdkrt| j}| r|jd }tj|_t
 |_||_|  tjj|tj| jd| d	 z$td
d| j  d|j	d d|jd d| tj dgdd W n t!y } zt"d| W Y d }~nd }~ww t#| d tdS nt }t$| d||dS )Nri  u.   Apenas férias aprovadas podem ser canceladas.r   rN   uF   O cancelamento só é permitido até 15 dias antes da data de início.r$   r   zMotivo: rw   u(   Solicitação de Cancelamento de FériaszO colaborador u)    solicitou o cancelamento das férias de r   r   z.

Motivo informado:
zrh@kuttner.com.brTr   z%Erro ao enviar email de cancelamento:u2   Solicitação de cancelamento enviada com sucesso.zemployee/cancel_vacation.html)r   r~   )%r   r   r)   r6   rE   r[   r	   r<   r   rF   r
   r^   r   rP   r+   r  r$   r   r   STATUS_CANCELLEDcancellation_datecancellation_reasonr   r   rW   r   ACTION_CANCELr   rT  r   ru   r   r   r   r   r   r   )r.   r   r   dias_ate_inicior~   motivor   r0   r0   r1   cancelar_feriass  s`   







 r  )NN)NNNN){django.shortcutsr   r   r   django.contrib.authr   r   r   django.contrib.auth.decoratorsr   django.contribr	   django.utilsr
   django.httpr   r   django.db.modelsr   django.core.mailr   django.template.loaderr   django.confr   r  r  r4  r5  rq  r   r   modelsr   r   r   r   r   r   r   formsr   r   r   r   r   r    
decoratorsr!   utilsr"   r2   r4   r5   r#   r>   r7   rc   FLEXIBLE_VACATION_RULESro   django.utils.dateparserp   django.core.exceptionsrq   r?   rt   r   r8   r_   r@   r   r   django.db.models.functionsr   r   vacations.modelsvacations.decoratorsr9   r  r  r  r  r  r  r#  r   r!  r"  r]  r^  ra  rb  rd  re  r:   rt  r  r{  django.core.files.storager|  django.core.files.baser}  r~  r  r  r  rA   r  
weasyprintr  django.utils.timezoner  r  r  django.contrib.auth.modelsr  r  r  r  r  r  r  r  r0   r0   r0   r1   <module>   s   $ ,









g
	EQ:I;2)

2
7@

	
+ 
N

!B