
    vgmG                        d dl Z d dlZd dl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 Zd Zd Zd	 Zd
 Zd Z ej$                         fdZ ej$                         fdZ ej$                         fdZd Zd Zd Zd Zd Zd Z ed dD              s e       Z	 ej=                  eddd       	 ej=                  eddd       	 ej=                  eddd       	 ej=                  eddd       	 ej=                  eddd       	 ej=                  eddd       ej=                  edd !       ej?                          yy#  Y xY w#  Y xY w#  Y zxY w#  Y kxY w#  Y \xY w#  Y MxY w)"    N)datedatetime	timedelta)BackgroundScheduler)reverse)notifyc                    ddl m} | j                  }|j                  }| j                  j
                  }| j                  j                  }| j                  j                         }|||g}n||gt        |      z   }| j                  j                  dd      }	||	   }
|	t        |      dz
  k  r|	dz  }	nd}	|	| j                  d<   | j                  |_        |j                          || _        | j                  | _        |
| _        | j                          |j"                  j%                  d      j'                         }|=| j                  }t)        j*                  ||j,                  dd	d
dddt/        d      	       y)zV
    Here will update the employee work information details and send notification
    r   UserNnext_work_type_index   Horilla Botusernamez Your Work Type has been changed.u    لقد تغير نوع عملك.u'   Ihre Art der Arbeit hat sich geändert.z$Su tipo de trabajo ha sido cambiado.u'   Votre type de travail a été modifié.infiniteemployee-profile	recipientverbverb_arverb_deverb_esverb_friconredirect)django.contrib.auth.modelsr   employee_idemployee_work_inforotating_work_type_id
work_type1
work_type2additional_work_typeslistadditional_datagetlennext_work_typework_type_idsavenext_change_datecurrent_work_typeobjectsfilterfirstr   sendemployee_user_idr   )rotating_work_typenew_dater   employeer   r    r!   r"   total_rotate_work_typesr   r'   bots               "/var/www/horilla/base/scheduler.py update_rotating_work_type_assignr7      s    0!--H!44#99DDJ#99DDJ00FFH  $#-z":#-z":TBW=X"X-==AA --ABNc"9:Q>>! AU&&'=>&8&G&G#*2'+=+L+L((6%
,,

}

5
;
;
=C
%11//36=:=/0
	
     c                     t        j                         }| j                  }|j                  d      |j                  d      k(  r%|t	        | j
                        z   }t        | |       y)z=
    This method for rotate work type based on after day
    %Y-%m-%ddaysN)r   nowr*   strftimer   rotate_after_dayr7   )rotating_work_work_type
date_todayswitch_dater2   s       r6   work_type_rotate_afterrC   >   s\     J)::KJ':+>+>z+JJ	/F/W/W XX()@(K
r8   c                 D   t        j                         }| j                  }|j                  d      |j                  d      k(  r]t        j                         j                  d      j	                         }| j
                  }||k(  r|t        d      z   }t        | |       y)z;
    This method for rotate work type based on weekend
    r:   %A   r;   N)r   r=   r*   r>   lowerrotate_every_weekendr   r7   )r1   rA   rB   day
switch_dayr2   s         r6   work_type_rotate_weekendrK   K   s     J$55KJ':+>+>z+JJlln%%d+113'<<
*!I1$55H,-?J
r8   c                 F   t        j                         }| j                  }| j                  }|j	                  d      |j	                  d      k(  r||j	                  d      j                  d      k(  r,|j                  |j                  dz         }t        | |       y	|dk(  r~|j	                  d      }|j	                  d      }t        j                  t        |      t        |      dz         d   }t        t        |      t        |      dz   |      }t        | |       y	)
z?
    This method for rotate work type based on every month
    r:   %d0r   monthlast%Y%mN)r   r=   r*   rotate_everyr>   lstripreplacerP   r7   calendar
monthrangeint)r1   rA   rB   day_dater2   yearrP   last_days           r6   work_type_rotate_everyr]   [   s    J$55K!..HJ':+>+>z+JJ{++D188==!))
0@0@10D)EH,-?J  &&t,D''-E**3t9c%j1nEaHHD	3u:>8DH,-?J
r8   c                      ddl m}  | j                  j                  d      }|D ]A  }|j                  }|dk(  rt        |        |dk(  rt        |       1|dk(  s7t        |       C y)	
    This method will identify the based on condition to the rotating shift assign
    and redirect to the chunk method to execute.
    r   )RotatingWorkTypeAssignT	is_activeafterweeklymonthlyN)base.modelsr`   r,   r-   based_onrC   rK   r]   )r`   rotating_work_typesr1   rg   s       r6   rotate_work_typeri   p   st    
 3088??$?O1 7%..w"#56!$%78""#567 r8   c                    ddl m} | j                  }|j                  }| j                  }|j
                  }|j                  }|j                         }|||g}	n||gt        |      z   }	| j                  j                  d      }
|	|
   }|
t        |	      dz
  k  r|
dz  }
nd}
|
| j                  d<   | j                  |_        |j                          || _        | j                  | _        || _        | j                          |j"                  j%                  d      j'                         }|=| j                  }t)        j*                  ||j,                  dd	d
dddt/        d      	       y)zN
    Here will update the employee work information and send notification
    r   r
   Nnext_shift_indexr   r   r   zYour shift has been changed.u-   تم تغيير التحول الخاص بك.u   Ihre Schicht wurde geändert.zTu turno ha sido cambiado.u(   Votre quart de travail a été modifié.r   r   r   )r   r   r   r   rotating_shift_idshift1shift2additional_shiftsr#   r$   r%   r&   
next_shiftshift_idr)   r*   current_shiftr,   r-   r.   r   r/   r0   r   )rotating_shiftr2   r   r3   r   rl   rm   rn   ro   total_rotate_shiftsrk   rp   r5   s                r6   update_rotating_shift_assignru      s{    0))H!44&88%%F%%F);;= %v.%v.6G1HH%5599:LM$%56J#12Q66A9IN""#56"0";";&.N##1#<#<N  *N
,,

}

5
;
;
=C
!--///C30>/0
	
 r8   c                     | j                   }|j                  d      |j                  d      k(  r%|t        | j                        z   }t	        | |       y)z9
    This method for rotate shift based on after day
    r:   r;   N)r*   r>   r   r?   ru   )rs   todayrB   r2   s       r6   shift_rotate_after_dayrx      sM     !11KJ'5>>*+EE9.*I*IJJ$^X>
r8   c                     | j                   }|j                  d      |j                  d      k(  rK|j                  d      j                         }| j                  }||k(  r|t	        d      z   }t        | |       y)z7
    This method for rotate shift based on weekend
    r:   rE   rF   r;   N)r*   r>   rG   rH   r   ru   )rs   rw   rB   rI   rJ   r2   s         r6   shift_rotate_weekendrz      sq     !11KJ'5>>*+EEnnT"((*#88
*ya00H(B
r8   c                    | j                   }| j                  }|j                  d      |j                  d      k(  r||j                  d      j                  d      k(  r,|j	                  |j
                  dz         }t        | |       y	|dk(  r~|j                  d      }|j                  d      }t        j                  t        |      t        |      dz         d   }t        t        |      t        |      dz   |      }t        | |       y	)
z;
    This method for rotate shift based on every month
    r:   rM   rN   r   rO   rQ   rR   rS   N)r*   rT   r>   rU   rV   rP   ru   rW   rX   rY   r   )rs   rw   rB   rZ   r2   r[   rP   r\   s           r6   shift_rotate_everyr|      s     !11K**HJ'5>>*+EE{++D188==}}5;;?};H(B  >>$'DNN4(E**3t9c%j1nEaHHD	3u:>8DH(B
r8   c                      ddl m}  | j                  j                  d      }t        j
                  }|D ]A  }|j                  }|dk(  rt        |        |dk(  rt        |       1|dk(  s7t        |       C y)	r_   r   )RotatingShiftAssignTra   rc   rd   re   N)
rf   r~   r,   r-   r   r   rg   rx   rz   r|   )r~   rotating_shiftsrw   rs   rg   s        r6   rotate_shiftr      sx    
 0)118848HOMME) 
/!**w">2! 0"~.
/ r8   c                     ddl m}  ddlm} t	        j
                         }|j                  j                  dd|d      }|r|D ]  }|j                  j                  }|j                  |_
        |j                          d|_        d|_        |j                          | j                  j                  d      j                         }||j                  }t        j                   ||j"                  d
dddddt%        d      	        y	)zU
    This method change employees shift information regards to the shift request
    r   r
   ShiftRequestFT)canceledapprovedrequested_date__exactshift_changedr   r   NzShift Changes notificationu&   التحول تغيير الإخطارu)   Benachrichtigung über Schichtänderungenu!   Notificación de cambios de turnoz0Notification des changements de quart de travailrefreshr   r   )r   r   rf   r   r   rw   r,   r-   r   r   rq   r)   r   r   r.   r   r/   r0   r   r   r   rw   shift_requestsrequest	work_infor5   r3   s           r6   switch_shiftr      s     0(JJLE!))00URW 1 N % 	G++>>I!(!1!1INN#G$(G!LLN,,%%}%=CCEC"..&775DG?N"$%78
	, r8   c                     ddl m}  ddlm} t	        j
                         }|j                  j                  dd|dd      }|r|D ]  }|j                  j                  }|j                  |_        |j                          d|_        |j                          | j                  j                  d      j                         }|~|j                  }t        j                   ||j"                  d
dddddt%        d      	        y	)z\
    This method undo previous employees shift information regards to the shift request
    r   r
   r   FT)r   r   requested_till__ltrb   r   r   r   Nz3Shift changes notification, Requested date expired.u`   التحول يغير الإخطار ، التاريخ المطلوب انتهت صلاحيته.uI   Benachrichtigung über Schichtänderungen, gewünschtes Datum abgelaufen.u<   Notificación de cambios de turno, Fecha solicitada vencida.uB   Notification de changement d'équipe, la date demandée a expiré.r   r   r   )r   r   rf   r   r   rw   r,   r-   r   r   previous_shift_idrq   r)   rb   r.   r   r/   r0   r   r   s           r6   
undo_shiftr     s     0(JJLE!))00  1 N % 	G++>>I!(!:!:INN %GLLN,,%%}%=CCEC"..&77N~gZ`"$%78
	* r8   c                     ddl m}  ddlm} t	        j
                         }|j                  j                  dd|d      }|D ]  }|j                  j                  }|j                  |_
        |j                          d|_        d|_        |j                          | j                  j                  d      j                         }||j                  }t        j                   ||j"                  d
dddddt%        d      	        y	)z]
    This method change employees work type information regards to the work type request
    r   r
   WorkTypeRequestFT)r   r   r   work_type_changedr   r   NzWork Type Changes notificationu+   إخطار تغييرات نوع العملu2   Benachrichtigung über Änderungen des Arbeitstypsu+   Notificación de cambios de tipo de trabajoz-Notification de changement de type de travailswap-horizontalr   r   )r   r   rf   r   r   rw   r,   r-   r   r   r(   r)   r   r   r.   r   r/   r0   r   r   r   rw   work_type_requestsr   r   r5   r3   s           r6   switch_work_typer   I  s     0+JJLE(0077#	 8  & ''::	!(!5!5	$(!ll!!=!9??A?**HKK"335ELEG& !34
, r8   c                     ddl m}  ddlm} t	        j
                         }|j                  j                  dd|dd      }|D ]  }|j                  j                  }|j                  |_        |j                          d|_        |j                          | j                  j                  d      j                         }|~|j                  }t        j                   ||j"                  d
dddddt%        d      	        y	)zd
    This method undo previous employees work type information regards to the work type request
    r   r
   r   FT)r   r   r   rb   r   r   r   Nz7Work type changes notification, Requested date expired.ue   إعلام بتغيير نوع العمل ، انتهاء صلاحية التاريخ المطلوب.uS   Benachrichtigung über Änderungen des Arbeitstyps, angefordertes Datum abgelaufen.uF   Notificación de cambios de tipo de trabajo, fecha solicitada vencida.uK   Notification de changement de type de travail, la date demandée a expiré.r   r   r   )r   r   rf   r   r   rw   r,   r-   r   r   previous_work_type_idr(   r)   rb   r.   r   r/   r0   r   r   s           r6   undo_work_typer   q  s     0+JJLE(0077  8  & ''::	!(!>!>	!ll!!=!9??A?**HKK"33Nm`e& !34
, r8   c                  ^   ddl m}  | j                  j                  d      }t	        j
                         }|D ]  }|j                  }|j                  }t        j                  |j                  dz   |j                  |j                        }t        j                  |j                  dz   |j                  |j                        }|(||t        d      z
  j                         k(  r6||_        n.||t        d      z
  j                         k(  r||_        ||_        |j                           y )Nr   )HolidaysT)	recurringr;   )modelsr   r,   r-   r   r=   
start_dateend_datedtr   r[   rP   rI   r   r)   )r   recurring_holidaysrw   recurring_holidayr   r   new_start_datenew_end_dates           r6   r   r     s     !))0040@LLNE/ !&11
$--1!4j6F6F
Wwwx}}q0(..(,,OeiQ&77==??/=!,%)"3399;;+9()5& !r8   c              #   @   K   | ]  }|t         j                  v   y w)N)sysargv).0cmds     r6   	<genexpr>r     s        388Os   )makemigrationsmigratecompilemessagesflushshellinterval   job1)minutesidjob2job3job4job6job5   )hours) rW   r   r   r   r   r   !apscheduler.schedulers.backgroundr   django.urlsr   notifications.signalsr   r7   rC   rK   r]   ri   ru   r=   rx   rz   r|   r   r   r   r   r   r   any	scheduleradd_jobstart r8   r6   <module>r      s     
 . . A  (/d
 *&+\ 2> 	 0<x||~  .:X\\^ (0$N'T%P'T!,  Q  $%I,
A&I	 	 	
	 	 	
	 	 	
	 	 	
	 	 	
 '1=OOsH    E	 6E E "E 8E% E, 	EEEE"%E),E0