
    vg                    !   d 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 ddlm	Z	 ddl
mZ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mZ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( ddl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZD ddlEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZNmOZO dd lPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ dd!l\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZ dd"lmZmZmZmZmZmZmZmZmZmZmZmZmZ dd#lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd$lmZ dd%lmZmZ dd&lmZmZmZmZmZmZ dd'lmZmZmZmZmZmZ dd(lmZ dd)lmZmZmZmZmZ dd*lmZmZ dd+lmZ dd,lmZmZmZ dd-lmZ dd.lmZ d/ Zd0 Zd1 Zd2 Zd3 Zed4        Zed5        Zed6        Zed7        Zed8        Zed9        Zed:        Zed;        Zd< Zd= Zd> Z G d? d@e"      Z G dA dBe"      Z ee!dCdD        ee!dEeu        ee!dFdG       edH        ZdI Z G dJ dK      ZedL        Ze edM      dN               ZedO        Zee edP      dQ                      Ze eHdRg       edS      dT                      Ze edU      dV               Ze edU      dW               Zee edP      dX                      Ze edU      dY               Ze edU      dZ               Ze ed[       eHdRg      d\                      Z e ed[       eHdRg      d]                      Ze eū        eHdRd^g      d_                      Zee eƫ       d`                      Zee eƫ       da                      Ze edb      dc               Ze edb      dd               Ze ede      df               Zdg Zee edh      di                      Z	e edj      dk               Z
ee edl      dm                      Ze eHdRg       edn      do                      Ze edp      dq               Zee edr      ds                      Ze edt      du               Zee edv      dw                      Zee edx      dy                      Ze edz      d{               Zee ed|      d}                      Ze ed~      d               Zee ed      d                      Zee ed      d                      Zee ed      d                      Ze ed      d               Zee ed      d                      Zee ed      d                      Ze ed      d               Zee ed      d                      Zee ed      d                      Ze ed      d               Zee ed      d                      Ze ed      d               Z ee ed      d                      Z!ee ed      d                      Z"eed               Z#ee ed      d                      Z$e ed      d               Z%dedZ&ee ed      d                      Z'e ed      d               Z(e ed      d               Z)ee ed       eHdRg      d                             Z*e ed      d               Z+ee ed      d                      Z,ee ed      d                      Z-e ed      d               Z.ee ed      d                      Z/ee ed      d                      Z0e ed      d               Z1ee ed      d                      Z2ee ed      d                      Z3e ed      d               Z4ee ed      d                      Z5ee ed      d                      Z6e ed      d               Z7ee ed      d                      Z8ee ed      d                      Z9eed               Z:ee edë      dĄ                      Z;e edë      dń               Z<dƄ Z=ee edë      dǄ                      Z>e edë      dȄ               Z?e edɫ      dʄ               Z@ee edɫ       eHdRg      d˄                             ZAd̄ ZBe edͫ      d΄               ZCe edϫ      dedЄ              ZDe eHdRg       edS      dф                      ZEee edS      d҄                      ZFedӄ        ZGe edԫ      dՄ               ZHeedք               ZIdׄ ZJeed؄               ZKdل ZLedڄ        ZMe ed۫      d܄               ZNed݄        ZOedބ        ZPee eO       d߄                      ZQee eHdRg      d                      ZRed        ZSe ed       eHdRg      d                      ZTeed               ZUed        ZVeed               ZWed        ZXe ed      d               ZYed        ZZeed               Z[eed               Z\ee eN       d                      Z]ed        Z^ed        Z_ed        Z`e ed       eHdRg      d                      Zae ed      d               Zbed        Zce eHdRg       ed      d                      Zde eHdRg      d               Zee ed       eHdRg      d                      Zfed        Zged        Zhed        Zied        Zjed        Zked        Zled        ZmeȐd         ZneȐd        Zoe edt      d               Zp edv      eFd               ZqeȐd        Zr edv      eFd               ZseȐd        ZteȐd        Zue eʐd      d	               Zvdd
lwmxZx e eʐd      d               ZyeȐd        ZzeȐd        Z{eȐd        Z|eȐd        Z}eȐd        Z~eȐd        ZeȐd        ZeȐd        Ze eʐd      d               Ze eʐd      d               Zee eʐd      d                      Zee eʐd      d                      Zee eʐd      d                      Zee eʐd      d                       Ze eʐd!      d"               Zee eʐd!      d#                      Zee eʐd$      d%                      Zee eʐd$      d&                      Zee eʐd$      d'                      Zee eʐd$      d(                      Zd) Zee eʐd*      d+                      Ze eʐd,      d-               Zeeǐd.               Zeeǐd/               Zeeǐd0               Zeeǐd1               Zeeǐd2               Zeeǐd3               Zeeǐd4               Zeeǐd5               ZeȐd6        Ze eʐd7      d8               Zee eʐd9      d:                      Zee eʐd;      d<                      Zee eʐd=      d>                      ZeȐd?        ZeȐd@        ZdA ZeȐdB        Ze eʐdC      dD               Ze eʐdE      dF               ZeȐdG        ZdH ZeeǐdI               Zee eʐdJ      dK                      ZdL ZdM ZdN Ze eʐdO      dP               ZeȐdQ        ZeȐdR        ZeeǐdS               Zee eʐdT      dU                      Zee eʐdV      dW                      Ze eHdRg       eʐdX      dY                      ZeȐdZ        ZeȐd[        Zee eʐd\      d]                      ZeȐd^        Zeeǐd_               Zee eʐd`      da                      Zee eʐdb      dc                      Zeeǐdd               Zy(f  zO
views.py

This module is used to map url pattens with django views or methods
    N)datetime	timedelta)	MIMEImage)path)parse_qsunquote	urlencode)forms)apps)settings)messages)authenticateloginlogout)Group
PermissionUser)PasswordResetConfirmViewPasswordResetView)ContentFile)EmailMultiAlternatives)call_command)	Paginator)ProtectedErrorQ)Http404HttpResponseHttpResponseRedirectJsonResponse)get_object_or_404redirectrender)render_to_string)reversereverse_lazy)timezone)
strip_tags)	localdate)gettext)csrf_exempt)require_http_methods)DefaultAccessibility)ConfiguredEmailBackend)shift_request_change_permission#work_type_request_change_permission)CompanyLeaveFilterHolidayFilterPenaltyFilterRotatingShiftAssignFiltersRotatingShiftRequestReGroupRotatingWorkTypeAssignFilterRotatingWorkTypeRequestReGroupShiftRequestFilterShiftRequestReGroupWorkTypeRequestFilterWorkTypeRequestReGroup),AnnouncementExpireFormAssignPermissionAssignUserGroupAuditTagFormChangePasswordFormCompanyFormCompanyLeaveFormDepartmentForm
DriverFormDynamicMailConfFormDynamicMailTestFormDynamicPaginationFormEmployeeShiftFormEmployeeShiftScheduleFormEmployeeShiftScheduleUpdateFormEmployeeTypeFormHolidayFormHolidaysColumnExportFormJobPositionFormJobPositionMultiFormJobRoleFormMailTemplateFormMultipleApproveConditionFormPassWordResetFormResetPasswordFormRotatingShiftAssignRotatingShiftAssignExportFormRotatingShiftAssignFormRotatingShiftAssignUpdateFormRotatingShiftForm RotatingWorkTypeAssignExportFormRotatingWorkTypeAssignForm RotatingWorkTypeAssignUpdateFormRotatingWorkTypeFormShiftAllocationFormShiftRequestColumnFormShiftRequestCommentFormShiftRequestFormTagsFormUserGroupFormWorkTypeFormWorkTypeRequestColumnFormWorkTypeRequestCommentFormWorkTypeRequestForm)choosesubordinatesclosest_numbersexport_datafiltersubordinatesfiltersubordinatesemployeemodelformat_dategenerate_colorsget_key_instancesget_paginationis_reportingmanagerpaginator_qryrandom_color_generatorsortby) 	WEEK_DAYSWEEKSAnnouncementAnnouncementExpireAnnouncementViewBaserequestFileBiometricAttendanceCompanyCompanyLeavesDashboardEmployeeCharts
DepartmentDynamicEmailConfigurationDynamicPaginationEmployeeShiftEmployeeShiftDayEmployeeShiftScheduleEmployeeTypeHolidaysHorillaMailTemplateJobPositionJobRoleMultipleApprovalConditionMultipleApprovalManagersRotatingShiftRotatingWorkTypeRotatingWorkTypeAssignShiftRequestShiftRequestCommentTagsWorkTypeWorkTypeRequestWorkTypeRequestComment)EmployeeFilter)ActiontypeForm EmployeeGeneralSettingPrefixForm)
ActiontypeDisciplinaryActionEmployeeEmployeeGeneralSettingEmployeeWorkInformationProfileEditFeature)delete_permissionduplicate_permissionhx_request_requiredlogin_requiredmanager_can_enterpermission_required)group_by_queryset)APPSDB_INIT_PASSWORDDYNAMIC_URL_PATTERNSFILE_STORAGENO_PERMISSION_MODALS)get_horilla_model_classremove_dynamic_url)HistoryTrackingFieldsForm)AccountBlockUnblockAuditTagHistoryTrackingFields)Notification)notifyc                     t        | d      S )z
    Custom 404 method
    z404.htmlr"   requests    /var/www/horilla/base/views.py	custom404r      s     ':&&    c                     | j                   j                  }	 |j                  j                  j                  }||k(  S # t
        $ r t        d      cY S w xY w)z
    If the instance have employee id field then you can use this method to know the request
    user employee is the reporting manager of the instance
    z,This Employee Dont Have any work information)useremployee_getemployee_idemployee_work_inforeporting_manager_id	Exceptionr   )r   instancemanageremployee_work_info_managers       r   is_reportingmangerr      s`    
 ll''GL  33HH 	#
 000  LJKKLs    = AAc                      t         j                  j                          } | s:d} t         j                  j                  d      }|D ]  }t	        |d      sd}  | S  | S )a  
    Determines if the database initialization process should be triggered.

    This function checks whether there are any users in the database. If there are no users,
    or if there are superusers without associated employees, it indicates that the database
    needs to be initialized.

    Returns:
        bool: True if the database needs to be initialized, False otherwise.
    T)is_superuserr   F)r   objectsexistsfilterhasattr)initialize_database
superusersr   s      r   initialize_database_conditionr      sj     #ll1133"\\((d(;
 	Dt^,&+#		 r   c           	      X   t               r| j                  dk(  r| j                  j                  d      t        k(  rg d}dddddd	d
dd}||j                         D cg c]  \  }}t        j                  |      r| c}}z  }|D ]3  }t        j                  t        j                  d|      }t        d|       5 t        j                  | t        d             t#        t$              S t        j                   | t        d             t#        t$              S t#        d      S c c}}w )NPOSTload_data_password)zuser_data.jsonzemployee_info_data.jsonzbase_data.jsonzwork_info_data.jsonzattendance_data.jsonzleave_data.jsonzasset_data.jsonzrecruitment_data.jsonzonboarding_data.jsonzoffboarding_data.jsonzpms_data.jsonzpayroll_data.json)
attendanceleaveassetrecruitment
onboardingoffboardingpmspayroll	load_dataloaddatazDatabase loaded successfully.zDatabase Authentication Failed/)r   methodr   getr   itemsr   is_installedr   joinr   BASE_DIRr   r   success_errorr!   home)r   
data_filesoptional_appsappfile	file_paths         r   load_demo_databaser      s   $&>>V#|| 459II
 #9..#:"8#:*2	! %2%8%8%:!T((-  
 ' 8D $		(*;*;[$ OI Y78   !,K*LM ~ w*J(KL~C=s    !D&c                     t               rz| j                  dk(  r_| j                  j                  d      }ddlm} ||k(  rt        t              S t        j                  | t        d             t        d      S t        | d      S t        d      S )	z
    Handles the database initialization process via a user interface.

    Parameters:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: The rendered HTML template or a redirect response.
    r   passwordr   )r   z8The password you entered is incorrect. Please try again.)<script>window.location.reload()</script>z%initialize_database/horilla_user.htmlr   )r   r   _postr   horilla.horilla_settingsr   r!   initialize_database_userr   warningr   r   r"   )r   r   db_passwords      r   r   r     s     %&>>V#}}((4HPh& 899  PQ $$OPPgFGG}r   c           	      p   | j                   dk(  r| j                  j                  d      }|j                  d      }|j                  d      }|j                  d      }||k7  rt        | d      S |j                  d      }|j                  d      }|j                  d	      }|j                  d
      }|j                  d      }	t        j
                  j                  |      j                         }
|
rt        |
d      s|
j                          t        j
                  j                  |||      }
t               }|
|_        ||_        ||_        ||_        ||_        |	|_        |j%                          t'        | ||      }
t)        | |
       t        | ddt+        ddi      i      S t        | d      S )z
    Handles the user creation step during database initialization.

    Parameters:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: The rendered HTML template for company creation or user signup.
    r   r   usernamer   confirm_passwordz,initialize_database/horilla_user_signup.html	firstnamelastnamebadge_idemailphoner   r   )r   r   r   r   r   (initialize_database/horilla_company.htmlformhqTinitial)r   __dict__r   r"   r   r   r   firstr   deletecreate_superuserr   employee_user_idr   employee_first_nameemployee_last_namer   r   saver   r   r@   )r   	form_datar   r   r   
first_name	last_namer   r   r   r   employees               r   r   r   ,  s    ~~$$((1	==,==,$==);<'''#QRR]];/
MM*-	==,g&g&||""H"5;;=n5KKM||,,UX - 
 :$(!$'1$&/#GhJgt6[$67
 	

 'IJJr   c           	         t               }| j                  dk(  rt        | j                  | j                        }|j	                         rm|j                         }	 | j                  j                  }||j                  _	        |j                  j                          t        | ddt        d|i      i      S t        | dd|i      S #  Y .xY w)z
    Handles the company creation step during database initialization.

    Parameters:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: The rendered HTML template for department creation or company creation.
    r   z+initialize_database/horilla_department.htmlr   
company_idr   r   )r@   r   r   FILESis_validr  r   r   r   r  r"   rB   )r   r   companyr  s       r   initialize_database_companyr  [  s     =D~~7<<7==?iikG"<<449@++6++002 =w0GHI 
 'EPT~VVs   AC C
c                    t         j                  j                         }t        dt        j                  j                         i      }| j                  dk(  r^t        | j                        }|j                         r9|j                  j                  d      }|j                          t        d|i      }t        | d||d      S )z
    Handles the department creation step during database initialization.

    Parameters:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: The rendered HTML template for department creation.
    r  r   r   0initialize_database/horilla_department_form.htmlr   departments)r~   r   allrB   r{   r  r   r   r  cleaned_datar   r  r"   )r   r  r   r  s       r   initialize_database_departmentr  y  s     $$((*K<1F1F1H"IJD~~gll+==?''++L9GIIK!<*ABD:k2 r   c                    t        j                  |      }t        |      }| j                  dk(  rt        | j                  |      }|j                         rc|j                  j                  d      }|j                          t        | dt        d|i      t         j                  j                         d      S t        | d||t         j                  j                         d      S )a+  
    Handles editing of an existing department during database initialization.

    Parameters:
        request (HttpRequest): The request object.
        obj_id (int): The ID of the department to be edited.

    Returns:
        HttpResponse: The rendered HTML template for department editing.
    r   r   r  r  r   r  )r   
departmentr  )r~   findrB   r   r   r  r  r   r  r"   r   r  )r   obj_idr  r   r  s        r   initialize_department_editr    s     (J:.D~~gllZ@==?''++L9GIIKB*L'3JK#-#5#5#9#9#;  :$%--113	
 r   c                 r    t        j                  |      }|r|j                         nd t        t              S )a3  
    Handles the deletion of an existing department during database initialization.

    Parameters:
        request (HttpRequest): The request object.
        obj_id (int): The ID of the department to be deleted.

    Returns:
        HttpResponse: A redirect response to the department creation page.
    N)r~   r  r  r!   r  )r   r  r  s      r   initialize_department_deleter!    s/     (J%J4233r   c                    t         j                  j                         }t        d|i      }| j                  dk(  rt        | j
                        }|j                         r:|j                          t        dt         j                  j                         i      }t        | d|t        j                  j                         |d      S t        | d|t        j                  j                         |d      S )z
    Handles the job position creation step during database initialization.

    Parameters:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: The rendered HTML template for job position creation.
    r  r   r   2initialize_database/horilla_job_position_form.htmlr   job_positionsr  z-initialize_database/horilla_job_position.html)r{   r   r  rN   r   r   r  r  r"   r   r  )r   r  r   s      r    initialize_database_job_positionr&    s     oo##%Gw(?@D~~#GLL1==?IIK'w?T?T?V0WXD@!,!4!4!8!8!:"
 	
 7(;(;(?(?(AgV r   c           	         t         j                  j                         }t        j                  |      }t        |      }| j                  dk(  rpt        | j                  |      }|j                         rI|j                          t        | dt        d|i      t        j                  j                         |d      S t        | d||t        j                  j                         |d      S )a1  
    Handles editing of an existing job position during database initialization.

    Parameters:
        request (HttpRequest): The request object.
        obj_id (int): The ID of the job position to be edited.

    Returns:
        HttpResponse: The rendered HTML template for job position editing.
    r  r   r#  r  r   r$  )r   job_positionr%  r  )r{   r   r  r   r  rM   r   r   r  r  r"   rN   r  )r   r  r  r(  r   s        r   initialize_job_position_editr)    s     oo##%G##F+LL1D~~w||lC==?IIKD0,9PQ%0%8%8%<%<%>&  <((00446		
	 	r   c           	      :   t         j                  j                         }t        j                  |      }|r|j                         nd t        | dt        dt         j                  j                         i      t        j                  j                         |d      S )a9  
    Handles the deletion of an existing job position during database initialization.

    Parameters:
        request (HttpRequest): The request object.
        obj_id (int): The ID of the job position to be deleting.

    Returns:
        HttpResponse: The rendered HTML template for job position creating.
    Nr#  r  r   r$  )	r{   r   r  r   r  r  r"   rN   r  )r   r  r  r(  s       r   initialize_job_position_deleter+    s     oo##%G##F+L)Lt<(%w'<'<'>? )00446	

 
r   c                     | j                   dk(  r| j                  j                  d      }| j                  j                  d      }| j                  j                  dd      }| j                  j	                         }|j                  dd       t        |      }t        | ||      }|st        j                  j                  |      j                         }|r6|j                  s*t        j                  | t        d	             t#        d      S t        j                   | t        d
             t#        d      S t%        |dd      }|*t        j                   | t        d             t#        d      S |j                  s*t        j                  | t        d             t#        d      S t'        | |       t        j(                  | t        d             |r|d| z  }t#        |      S t+        | ddt-               i      S )z0
    Handles user login and authentication.
    r   r   r   nextr   Nr   r   z'Access Denied: Your account is blocked.zInvalid username or password.r   r   z>An employee related to this user's credentials does not exist.zGThis user is archived. Please contact the manager for more information.zLogin successful.?z
login.htmlr   )r   r   r   GETdictpopr	   r   r   r   r   r  	is_activer   r   r   r   r!   getattrr   r   r"   r   )	r   r   r   next_urlquery_paramsparamsr   user_objectr  s	            r   
login_userr8  0  s    ~~<<##J/<<##J/;;??63/{{'')&<(GhJ,,--x-@FFHK;#8#8  !,U*VW G$$ w*I(JKG$$46NNRS G$$!!] G$$gt!$7"89!F8$H!! 57T7VW r   c                 N   |j                   d   j                  }t        j                  j	                  | j
                        }|j                         Q|j	                  |j                         j                        j                         ||z  }||j                   d   _        |S )zx
    This method is used to include the employee instance to the form
    Args:
        form: django forms instance
    r   r  id)fieldsquerysetr   r   r   r   r  r<  )r   r   r>  r  s       r   include_employee_instancer?  b  s     {{=)22H&&&EH~~#??hnn.11?288:B(*H2:DKK&/Kr   c                     t        | d      S )Nzreset_send.htmlr   r   s    r   reset_send_successrA  q  s    ',--r   c                   .    e Zd ZdZdZeZ ed      Zd Z	y)HorillaPasswordResetViewz)
    Horilla View for Reset Password
    forgot_password.htmlreset-send-successc           	         t               }d}d}t        t        dd      }|r||k7  rd}|r@|j                  s4t	        j
                  | j                  t        d             t        d      S |j                  d   }t        j                  j                  |	      j                         }|r| j                  j                         | j                  |j                   | j"                  | j$                  | j                  | j&                  | j(                  d
} |j*                  di | | j                  j,                  j.                  rXt	        j0                  | j                  t        d             t3        | j                  j4                  j7                  dd            S t        t9        d            S t	        j:                  | j                  t        d             t        d      S )N$base.backends.ConfiguredEmailBackendTEMAIL_BACKEND F%Primary mail server is not configuredzforgot-passwordr   r   	use_httpstoken_generator
from_emailemail_template_namesubject_template_namer   html_email_template_nameextra_email_context%Password reset link sent successfullyHTTP_REFERERr   rE  zNo user found with the username )r-   r3  r   configurationr   r   r   r   r!   r  r   r   r   r  	is_securerM  $dynamic_from_email_with_display_namerO  rP  rQ  rR  r  r   is_authenticatedr   r   METAr   r%   info)	selfr   email_backenddefaultis_default_backendrH  r   r   optss	            r   
form_validz#HorillaPasswordResetView.form_valid~  s   .08!/2>W5!&m&A&ANN4<<+R)ST-..$$W-||""H"5;;=!\\335#'#7#7+PP'+'?'?)-)C)C<<,0,I,I'+'?'?	D DII||  11  LL!$K"L ,DLL,=,=,A,A.RU,VWWL)=>??dllA&G$HI)**r   N)
__name__
__module____qualname____doc__template_namerR   
form_classr%   success_urlra  rU  r   r   rC  rC  u  s#     +M"J34K"+r   rC  c                       e Zd ZdZdZeZd Zy)EmployeePasswordResetViewz2
    Horilla View for Employee Reset Password
    rD  c           	      b   	 t               }d}d}t        t        dd      }|r||k7  rd}|rd|j                  sXt	        j
                  | j                  t        d             t        | j                  j                  j                  dd            S |j                  d	   }t        j                  j                  |
      j                         }|r| j                  j!                         | j"                  |j$                  | j&                  | j(                  | j                  | j*                  | j,                  d} |j.                  di | t	        j0                  | j                  t        d             n)t	        j
                  | j                  t        d             t        | j                  j                  j                  dd            S # t2        $ rY}	t	        j
                  | j                  d       t        | j                  j                  j                  dd            cY d }	~	S d }	~	ww xY w)NrG  TrH  rI  FrJ  rT  r   r   r   rK  rS  zNo user with the given usernamezSomething went wrong.....rU  )r-   r3  r   rV  r   r   r   r   r   rZ  r   r  r   r   r   r  rW  rM  rX  rO  rP  rQ  rR  r  r   r   )
r\  r   r]  r^  r_  rH  r   r   r`  es
             r   ra  z$EmployeePasswordResetView.form_valid  s   "	T24M<G!%#HorBMM!9%*"!-*E*Et||Q/V-WX+DLL,=,=,A,A.RU,VWW((1H<<&&&9??AD!%!7!7!9'+';';"/"T"T+/+C+C-1-G-G#||040M0M+/+C+C	 		!D!  LL!$K"L t||Q/P-QR'(9(9(=(=nc(RSS 	TNN4<<+DF'(9(9(=(=nc(RSS	Ts&   BG D;G 	H.AH)#H.)H.N)rb  rc  rd  re  rf  rR   rg  ra  rU  r   r   rj  rj    s     +M"J#Tr   rj  rf  zreset_password.htmlrg  rh  r   c                    | j                   }t        |      }| j                  dk(  rt        || j                        }|j	                         r|j
                  d   }|j                  |       |j                          t        | |j                  |      }t        |d      rd|_        |j                          t        | |       t        j                  | t        d             t!        d      S t#        | d	d
|i      S t#        | dd
|i      S )a  
    Handles the password change process for a logged-in user.

    Args:
        request (HttpRequest): The HTTP request object containing metadata about
                               the request and user.

    Returns:
        HttpResponse: Renders the password change form if the request method is GET or
                      the form is invalid. If the form is valid and the password is changed
                      successfully, the page reloads with a success message.
    )r   r   new_passwordr   is_new_employeeFzPassword changed successfullyz*<script>window.location.href='/';</script>z#base/auth/password_change_form.htmlr   zbase/auth/password_change.html)r   r?   r   r   r  r  set_passwordr  r   r   r   ro  r   r   r   r   r   r"   )r   r   r   rn  s       r   change_passwordrq    s     <<D4(D~~!$5==?,,^<Ll+IIK$--,WDt./',$		'4 Wa(G&HI LMMgDvtnUU';fd^LLr   c                 V    | j                   rt        |        t               }d|_        |S )z-
    This method used to logout the user
    z
        <script>
            localStorage.clear();
        </script>
        <meta http-equiv="refresh" content="0;url=/login">
    )r   r   r   content)r   responses     r   logout_userru    s*     ||w~HH Or   c                       e Zd ZddZy)WorkinfoNc                 B    || _         || _        |j                  | _        y N)r   r   r<  )r\  r  s     r   __init__zWorkinfo.__init__
  s     "*#++r   )returnN)rb  rc  rd  rz  rU  r   r   rw  rw  	  s    r   rw  c                    t        j                         }|j                         }|t        |      z
  }|t        d      z   }t        j
                  j                  | j                  j                        d   }| j                  }t        j                         j                         }d}|j                  j                  dk7  r\|j                  j                  j                  |j                  k(  xr- |j                  j                  j                  |j                  k(  }|j                  d      |j                  d      |j                   |d}t#        | d|      S )	z2
    This method is used to render index page
    )days   r  r   Nz%Y-%m-%d)first_day_of_weeklast_day_of_weekchartsis_birthdayz
index.html)r   todayweekdayr   r}   r   get_or_creater   r   r&   nowdatedobmonthdaystrftimer  r"   )	r   r  today_weekdayr  r  employee_chartsr   r  contexts	            r   r   r     s,    NNEMMOM	} ==(9!+<<-55CC** D 	O <<DLLN!EK$!!''5;;6 7!!%%))UYY6 	 /77
C,55jA!(("	G '<11r   %employee.view_employeeworkinformationc                 V  
 g }g d}| j                   j                  dd      }t        | t        j                  j                  |d      d      }|D ]<  
t        
fd|D              }|d	k  r!|d	z  d
z  d}
|d}|j                  |       => t        | t        j                  j                  d      d      }|D ]!  }	|j                  dt        |	      dd       # |j                  d        t        || j                   j                  d            }t        | dd|i      S )N)job_position_iddepartment_idwork_type_idemployee_type_idjob_role_idr   r  locationr   mobileshift_iddate_joiningcontract_end_datebasic_salarysalary_hoursearchrI  T)+employee_id__employee_first_name__icontainsemployee_id__is_activer  )r>  permc              3   :   K   | ]  }t        |      d  y w)N   )r3  ).0
field_namer  s     r   	<genexpr>z-employee_workinfo_complete.<locals>.<genexpr>V  s&      $
x,8 $
s      d   z.1f)r  completed_field_count)employee_work_info__isnull)r  r   r  0c                     t        | d         S )Nr  )floatxs    r   <lambda>z,employee_workinfo_complete.<locals>.<lambda>t  s    eA6M4N.O r   )keypagezwork_info_complete.htmlemployees_with_pending)r/  r   rj   r   r   r   sumappendrk   r   insertrw  sortrq   r"   )r   r  fields_to_focusr  employees_workinfosr  percentemployee_infoempsempr  s             @r   employee_workinfo_completer  4  sk     O" [[__Xr*F,(00778>#' 8 
 5 (  # $
-$
 !

 !2%025<cBG$)0M #))-8" +4@4D
  
%%$c2),	

 $OP* 7 !	!#9: r   c                     t        | d      S )z=
    This method is used to render setting page template
    zsettings.htmlr   r   s    r   common_settingsr    s    
 '?++r   zauth.add_groupc                 :   g }t         }t        }t               }|D ]  }g }t        |      D ]L  }|j	                  |j
                  j                  j                         |j
                  j                  d       N |j	                  |j                         |d        | j                  dk(  r_t        | j                        }|j                         r:|j                          t        j                  | t        d             t!        d      S t#        | d|||d      S )z 
    Group assign htmx view
    verbose_name
model_namer   
app_modelsr   zUser group created.r   base/auth/group_assign.htmlpermissionsr   no_permission_models)r   r   rb   get_models_in_appr  _metar  
capitalizer  r   r   r  r  r   r   r   r   r"   )r   r  r   r  r   app_namer  models           r   user_group_tabler    s
    KD/?D 	U
&x0 	E$)KK$<$<$G$G$I"'++"8"8	 	8#6#6#8
ST	U ~~W\\*==?IIKWa(=&>? KLL%&$8	
 r   r   zauth.add_permissionc                 f   | j                   d   }t        j                  j                  |      }t	        | j                   |      }|j                         r|j                          t        ddd      S | j                   j                  d      rP| j                   d   }t        |      d	kD  r%||_	        |j                          t        d
dd      S t        ddd      S |j                  j                  d      }|s(|j                  j                          t        ddd      S t        ddd      S )8
    This method is used to remove user permission.
    r<  r;  r  Updated the permissionsr   messagetypename_updatename   zName updatedzAt least 4 characters requiredr  All permission clearedr[  Something went wrongdanger)r   r   r   r   rb   r  r  r   lenr  r  r  clear)r   group_idr   r   r  permss         r   update_group_permissionr    s    ||D!H}}  H -H9D}}		(A9UVV||&||F#t9q= HMMMONI NOO8)L
 	
 !!-0E""$(@&QRR$:HMNNr   zauth.view_groupc                    g }t         }t        }t               }|D ]  }g }t        |      D ]L  }|j	                  |j
                  j                  j                         |j
                  j                  d       N |j	                  |j                         |d        t        j                  j                         }t        | d||t        || j                  j                  d            |d      S )=
    This method is used to create user permission group
    r  r  zbase/auth/group.htmlr  r  r   groupsr  )r   r   rb   r  r  r  r  r  r  r   r   r  r"   rq   r/  r   )	r   r  r   r  r   r  r  r  r  s	            r   
user_groupr    s     KD/?D 	U
&x0 	E$)KK$<$<$G$G$I"'++"8"8	 	8#6#6#8
ST	U ]] F&#FGKKOOF,CD$8		
	 	r   c                 P   g }t         }t        }t               }|D ]  }g }t        |      D ]L  }|j	                  |j
                  j                  j                         |j
                  j                  d       N |j	                  |j                         |d        d}| j                  j                  d      rt        | j                  d         }t        j                  j                  |      }	t        | d||t!        |	| j                  j                  d            |d      S )	r  r  r  rI  r  name__icontainszbase/auth/group_lines.htmlr  r  )r   r   rb   r  r  r  r  r  r  r/  r   strr   r   r   r"   rq   )
r   r  r   r  r   r  r  r  r  r  s
             r   user_group_searchr    s    KD/?D 	U
&x0 	E$)KK$<$<$G$G$I"'++"8"8	 	8#6#6#8
ST	U F{{x W[[*+]]!!&!9F$&#FGKKOOF,CD$8		
	 	r   c                    | j                   j                  d      }t        |t        j                  j                  |      j                  dd      d      }| j                  r| j                  d   }t        || j                  j                  d      d      }|j                         r:|j                          t        j                  | t        d	             t        d
      S t        | d||d      S )z@
    This method is used to assign user group to the users.
    group)employee_user_id__groups__idr<  Tflat)r  r  r   r  zUser group assigned.r   z base/auth/group_user_assign.html)r   r  )r/  r   r=   r   r   r   values_listr   getlistr  r  r   r   r   r   r"   )r   r  r   s      r   group_assignr    s     {{w'H ((//-5 0 k$Tk*	
D ||<<(GLL,@,@,LM
 ==?IIKWa(>&?@ KLL*8, r   c           
      L   d}| j                   j                  d      | j                   j                  d      }t        j                  j	                  |      }| j                   j                         }t        | dt        || j                   j                  d            |d      S )z7
    This method is used to search the user groups
    rI  r  r  z base/auth/group_assign_view.htmlr  )r  pd)r/  r   r   r   r   r	   r"   rq   )r   r  r  previous_datas       r   group_assign_viewr  5  s     F{{x ,*]]!!&!9FKK))+M* )@AW r   c                     d}| j                   j                  d      | j                   d   }t        j                  j	                         }t        | dd|i      S )zD
    This method is used to render template for view all groups
    rI  r  r  data)r/  r   r   r   r   r"   )r   r  r  s      r   user_group_viewr  G  sQ     F{{x ,X&%%'J'86::NOOr   change_groupc                    t         j                  j                  d      }t        j                  j                  d      }|j                  j                  |       t        | j                  j                  dd            S )zy
    This method is used to remove permission from group.
    args:
        pid: permission id
        gid: group id
    r  r;     rT  r   )r   r   r   r   r  remover   rZ  )r   pidgidr  
permissions        r   user_group_permission_remover  T  sd     MM#E##''1'-J	Z( 0 0 EFFr   c                    t         j                  j                  |      }t        j                  j                  |      }|j                  j                  |       t        | j                  j                  dd            S )z
    This method is used to remove an user from group permission.
    args:
        uid: user instance id
        gid: group instance id
    r;  rT  r   )r   r   r   r   user_setr  r   rZ  )r   uidr   r  r   s        r   group_remove_userr  d  s`     MM%E<<s#D	NN$ 0 0 EFFr   DELETEc                 X   |j                  d      }|j                  d      }d}	 |j                  j                  |      }|j                          t        j                  | t        d      j                  |             t#        j$                  d      rt|dk(  rot'        dd      }|j                  j)                         }|j+                         r-| j,                  j/                         }|dz   |z   }t1        |      S t3        d      S |r-| j,                  j/                         }|dz   |z   }t1        |      S |j                  d      r8|rd}n'|j                  d      du rd}n|j                  d      }t3        |       S t5        | j6                  j                  dd            S # |j                  $ rH d}t        j                  | t        d      j                  |j                  j                               Y |t        $ r}t               }|j                  D ]>  }	|j                  t        |	j                  j                  j                                      @ dj!                  |      }
d}t        j                  | t        d	      j                  |
            f Y d
}~$d
}~ww xY w)a  
    Handles the deletion of an object instance from the database.

    Args:
        request (HttpRequest): The HTTP request object containing metadata about
                               the request and user.
        obj_id (int): The ID of the object to be deleted.
        **kwargs: Additional keyword arguments including:
            - model (Model): The Django model class to which the object belongs.
            - redirect_path (str): The URL path to redirect to after deletion.
    Returns:
        HttpResponse: Redirects to the specified `redirect_path` or reloads the
                      previous page. In case of a ProtectedError, it shows an error
                      message indicating that the object is in use.
    r  redirect_pathFr;  z%The {} has been deleted successfully.Tz{} not found.z, z!This {} is already in use for {}.Nr   z/pms/filter-key-result/	keyresult	app_labelr  r.  r   r   rI  rT  r   )r   r   r  r   r   r   formatDoesNotExistr   r  r  r   setprotected_objectsaddr  r   r   r   r   r  r   r/  r	   r!   r   r   rZ  )r   r  kwargsr  r	  delete_errorr   rl  model_verbose_names_setobjmodel_names_str	KeyResultkey_resultsr  return_parts                  r   object_deleter  t  sO   & JJwEJJ/ML==$$$/Q>?FFxP	
$ M5N$N+e;O	''++-#KK113M)C/-?MM** KLL--/%+m;&&	N	#EKZZ'4/K **^4K{m--#GLL$4$4^S$IJJM  Uw/ 2 9 9%++:R:R ST 
"%%&& 	PC#''#))*@*@*K*K*M(NO	P ))$;<1299(OT	
 	
s    AF& &AJ)<J)BJ$$J)c                 >   |d   }|d   }|d   }|j                   j                  |      } ||      }|j                         }| j                  dk(  r|j                  j                         D ]{  \  }	}
t        |
t        j                        s!|
j                  r|
j                  }n|j                  j                  |	d       d}||j                  |	<   ||j                  |	   _	        } t        |j                  d	      rd
|j                  _        | j                  dk(  rV || j                        }|j                         r4|j                  d      }d
|_        |j                          t!        d      S |j                  dd      |d|ddd|i}t#        | ||      S )aX  
    Handles the duplication of an object instance in the database.

    Args:
        request (HttpRequest): The HTTP request object containing metadata about
                               the request and user.
        obj_id (int): The ID of the object to be duplicated.
        **kwargs: Additional keyword arguments including:
            - model (Model): The Django model class to which the object belongs.
            - form (Form): The Django form class used to handle the object data.
            - template (str): The template to render for the duplication process.
            - form_name (str, optional): The name to use for the form in the template context.

    Returns:
        HttpResponse: Renders the duplication form on GET requests and, on successful
                      POST, reloads the page after saving the duplicated object.
    r  r   templater;  r  r/  rI  z (copy)r<  Nr   Fcommitr   	form_namer  	duplicateTsearchWords)r   r   get_template_languager   r=  r   
isinstancer
   	CharFieldr   r   r   r<  r   r  r  r   r"   )r   r  r  r  rg  r  original_objectr   r!  r  fieldinitial_value
new_objectr  s                 r   object_duplicater)    s|   * 7OEJj!Hmm''6'2O/D,,.K~~!%!2!2!4 	@J%1==$)MMM'+||'7'7
B'G&H$PM+8Z(2?J'/	@ 4==$'#DMM~~',,'==?%0J JMOO KLL

;'&T{	G '8W--r   c           	      
   | j                   dk(  rj|d   }|d   }|d   }|j                  d      }|d   }|j                  d      }| j                  j                  d      }|rt        |j	                  d	      d
         dz   }	|j                  d	d      d    d	|	 }
 |       }| |	 }|rE|dk(  r@t        j                  t        j                  d|d| d      d      |j                  |<   nYt        j                  |j                  j                         t        j                  d|d| d      d|      |j                  |<   |	||   j                         ||
d}t        ||      }t!        |      S t!               S )a_  
    Handles the dynamic addition and removal of form fields in a Django form.

    Args:
        request (HttpRequest): The HTTP request object containing metadata about
                               the request and user.
        **kwargs: Additional keyword arguments including:
            - model (Model): The Django model class used for `ModelChoiceField`.
            - form_class (Form): The Django form class to which dynamic fields will be added.
            - template (str): The template used to render the newly added field.
            - empty_label (str, optional): The label to show for empty choices in a `ModelChoiceField`.
            - field_name_pre (str): The prefix for the dynamically generated field names.
            - field_type (str, optional): The type of field to add, either "character" or "model_choice".

    Returns:
        HttpResponse: Returns the HTML for the newly added field, rendered in the context of the
                      specified template. If the request is not POST or if no valid HTMX target
                      is provided, it returns an empty HTTP response.
    r   r  rg  r  empty_labelfield_name_pre
field_typeHTTP_HX_TARGETr   r  r   	characterzoh-input w-100id_classr  r<  attrsF)widgetrequiredoh-select oh-select-2 mb-3)r>  r6  r7  r+  )field_counts
field_htmlcurrent_hx_targetnext_hx_target)r   r   rZ  intsplitrsplitr
   r$  	TextInputr=  ModelChoiceFieldr   r  Select	as_widgetr#   r   )r   r  r  rg  r  r+  r,  r-  	hx_targetr9  r<  r   r  r  r:  s                  r   add_remove_dynamic_fieldsrE    s   . ~~wL)
*%jj/ 01ZZ-
LL$$%56	ys3B781<L ) 0 0a 8 ;<Al^LN<D*+L>:JjK7*/// ??%5$.$'
|"4 #	+J' +0*@*@"]]..0 <<%A$.$'
|"4 # ++J' !-":.88:%."0	G *(G<J
++>r   z#base.view_dynamicemailconfigurationc                     t         j                  j                         }d}t         j                  j                  d      j	                         rd}t        | d||d      S )NT
is_primaryFz!base/mail_server/mail_server.html)mail_serversprimary_mail_not_exist)r   r   r  r   r   r"   )r   rI  rJ  s      r   mail_server_confrK  7  sb     -4488:L! ((//4/@GGI!&+(&<	
 r   c           
      *   | j                   j                  d      }t               }| j                  dk(  rit        | j                        }|j                         rC|j                  d   }t        d      }d}t        |      }t               }t        j                  j                  |      j                         }||_        	 t        |||j                   |g|      }	|	j#                  |d       t%        j&                  t(        j*                  d	      }
t-        |
d
      5 }t/        |j1                               }|j3                  dd       |	j5                  |       d d d        |	j7                          t;        jB                  | t        d             tA        d      S tE        | d||d      S # 1 sw Y   SxY w# t8        $ rN}t;        j<                  | dj'                  t        d      t?        |      g             tA        d      cY d }~S d }~ww xY w)Ninstance_idr   to_emailzTest mail from Horillaa  
            <html>
                <body style="font-family: Arial, sans-serif; margin: 0; padding: 0;">
                    <table align="center" width="600" cellpadding="0" cellspacing="0" border="0" style="border: 1px solid #e0e0e0; border-radius: 10px; overflow: hidden;">
                        <tr>
                            <td align="center" bgcolor="#4CAF50" style="padding: 20px 0;">
                                <h1 style="color: #ffffff; margin: 0;">Horilla</h1>
                            </td>
                        </tr>
                        <tr>
                            <td style="padding: 20px;">
                                <h3 style="color: #4CAF50;">Email tested successfully</h3>
                                <b><p style="font-size: 14px;">Hi,<br>
                                    This email is being sent as part of mail sever testing from Horilla.</p></b>
                                <img src="cid:unique_image_id" alt="Test Image" style="width: 200px; height: auto; margin: 20px 0;">
                            </td>
                        </tr>
                        <tr>
                            <td bgcolor="#f0f0f0" style="padding: 10px; text-align: center;">
                                <p style="font-size: 12px; color: black;">&copy; 2024 Horilla, Inc.</p>
                            </td>
                        </tr>
                    </table>
                </body>
            </html>
            r;  )
connectionz	text/htmlzimages/ui/horilla-logo.pngrbz
Content-IDz<unique_image_id> zSomething went wrong :r   zMail sent successfullyz%base/mail_server/form_email_test.html)r   rM  )#r/  r   rE   r   r   r  r  r   r'   r-   r   r   r   r  rV  r   rX  attach_alternativer   r   r   STATIC_ROOTopenr   read
add_headerattachsendr   r   r   r  r   r   r"   )r   rM  r   email_tosubjecthtml_contenttext_contentr]  emailconfigmsg
image_pathimgmsg_imgrl  s                 r   mail_server_test_emailrb  H  s    ++//-0K D~~"7<<0==?((4H01GL8 &l3L24M3;;BB C eg  +6M'Q, !FFJ, &&|[A "YY((*F
 *d+ (s'
3G&&|5HIJJw'(
 
 Wa(@&AB KLL/k2 ( (  Qw!4L2MsSTv1V(WX#$OPPQs8   AF;  =F/F; /F84F; ;	HAHHHz%base.delete_dynamicemailconfigurationc                    | j                   j                  d      }d}|D ]?  }t        j                  j	                  |      j                         }|j                  s>d}A |rOt        j                  j	                  |      j                          t        j                  | d       t        d      S t        j                  j                         j                         dk(  r!t        j                  | d	       t        d      S t        j                  j                         j                  d
      }t        | d|t!        d      d      S )z3
    This method is used to delete mail server
    idsTr;  Fid__inz!Mail server configuration deletedr   r  z?You have only 1 Mail server configuration that can't be deletedrG  z"base/mail_server/replace_mail.htmlzCan't Delete)mailstitle)r/  r  r   r   r   r  rH  r  r   r   r   r  countr   excluder"   r   )r   rd  r  r<  r]  rg  s         r   mail_server_deleterk    s%    ++

e
$CF /77>>">EKKM!!F !))000<CCE"EFGHH$,,00288:a?Q   KLL-5599;CCtCTE4"~. r   c                 `   | j                   j                  d      }t        j                  j                  |      }d|_        |j                          t        j                  j                  d      j                         j                          t        j                  | d       t        d      S )z<
    This method is used to replace primary mail server
    replace_mailr;  TrG  z*Primary Mail server configuration replacedzmail-server-conf)r   r   r   r   rH  r  r   r  r  r   r   r!   )r   emailconfig_idemail_configs      r   replace_primary_mailrp    s     \\%%n5N,4488N8KL"L%%,,,=CCELLNWJK&''r   z"base.add_dynamicemailconfigurationc                 v   | j                   j                  d      }d }|r.t        j                  j	                  |      j                         }t        |      }| j                  dk(  rBt        | j                  |      }|j                         r|j                          t        d      S t        | d||d      S )NrM  r;  r  r   r   zbase/mail_server/form.html)r   r   )r/  r   r   r   r   r  rD   r   r   r  r  r   r"   )r   rM  r   r   s       r   mail_server_create_or_updaterr    s     ++//-0KH,44;;{;KQQS1D~~"7<<(C==?IIK KLL-(/S r   zbase.view_horillamailtemplatec                     t         j                  j                         }t               }|j	                         rd}nd}|j                         }t        | ||||d      S )zN
    This method will render template to disply the offerletter templates
    zmail/view_templates.htmlzmail/empty_mail_template.html)	templatesr   r!  )r   r   r  rP   r   r"  r"   )r   rt  r   r  r!  s        r   view_mail_templatesru    sa     $++//1ID-2,,.KkJ r   zbase.change_horillamailtemplatec                 j   t         j                  j                  |      }t        |      }|j	                         }| j
                  dk(  rXt        | j                  |      }|j                         r1|j                          t        j                  | d       t        d      S t        | d|d|d      S )	zB
    This method is used to display the template/form to edit
    r;  r  r   zTemplate updatedr   zmail/htmx/form.htmlF)r   r   r!  )r   r   r   rP   r"  r   r   r  r  r   r   r   r"   )r   r  r  r   r!  s        r   view_mail_templaterw    s     #**..&.9HX.D,,.K~~x@==?IIKW&89 KLLE+F r   zbase.add_horillamailtemplatec                 
   | j                   dk(  rft        | j                        }|j                         rA|j	                         }|j	                          t        j                  | d       t        d      S t        t              S )z<
    This method is used to create offerletter template
    r   zTemplate createdr   )
r   rP   r   r  r  r   r   r   r!   ru  )r   r   r   s      r   create_mail_templatesry    sd     ~~-==?yy{HMMOW&89 KLL'((r   zbase.delete_horillamailtemplatec                     | j                   j                  d      }t        j                  j	                  |      j                         }t        j                  | d       t        t              S )Nrd  re  zTemplate deleted)
r/  r  r   r   r   r  r   r   r!   ru  )r   rd  results      r   delete_mail_templatesr|    sW     ++

e
$C ((//s/;BBDFW01'((r   zbase.add_companyc                 d   t               }t        j                  j                         }| j                  dk(  rjt        | j
                  | j                        }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )z^
    This method render template and form to create company and save if the form is valid
    r   z&Company has been created successfully!r   base/company/company_form.html)r   	companies)r@   r{   r   r  r   r   r  r  r  r   r   r   r   r"   )r   r   r  s      r   company_creater  %  s     =D##%I~~7<<7==?IIKWa(P&QR KLL(I. r   zbase.view_companyc                 \    t         j                  j                         }t        | dd|i      S )z4
    This method used to view created companies
    zbase/company/company.htmlr  )r{   r   r  r"   )r   r  s     r   company_viewr  ?  s+     ##%I'6i8PQQr   zbase.change_companyc                 p   t         j                  j                  |      }t        |      }| j                  dk(  rlt        | j
                  | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )z[
    This method is used to update company
    args:
        id : company instance id

    r;  r  r   zCompany updatedr   r~  )r   r  )r{   r   r   r@   r   r   r  r  r  r   r   r   r   r"   )r   r<  r  r  r   s        r   company_updater  J  s     oo!!R!(G(D~~7<<I==?IIKWa(9&:; KLL1DW3U r   zbase.add_departmentc                 $   t               }| j                  dk(  rit        | j                        }|j                         rD|j	                          t               }t        j                  | t        d             t        d      S t        | dd|i      S )zD
    This method renders form and template to create department
    r   z)Department has been created successfully!r   $base/department/department_form.htmlr   )
rB   r   r   r  r  r   r   r   r   r"   r   r   s     r   department_creater  a  s     D~~gll+==?IIK!#DWa(S&TU KLL.D	
 r   zbase.view_departmentc                 \    t         j                  j                         }t        | dd|i      S )z%
    This method view department
    zbase/department/department.htmlr  )r~   r   r  r"   )r   r  s     r   department_viewr  z  s5     $$((*K);	
 r   zbase.change_departmentc                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )z`
    This method is used to update department
    args:
        id : department instance id
    r  r   zDepartment updated.r   r  )r   r  )r~   r  rB   r   r   r  r  r   r   r   r   r"   )r   r<  r  r  r   s        r   department_updater    s     $J:.D~~gllZ@==?IIKWa(=&>? KLL.Z0 r   zbase.view_jobpositionc                 ~   t         j                  j                         }d}t        j                  j	                         rd}t               }| j                  dk(  rTt        | j                        }|j                         r/|j                          t        j                  | t        d             t        | d|||d      S )z2
    This method is used to view job position
    FTr   +Job Position has been created successfully!z#base/job_position/job_position.html)r   r  jobs)r~   r   r  r   r   rM   r   r   r  r  r   r   r   r"   )r   r  r  r   s       r   r(  r(    s     $$((*KD!!#D~~w||,==?IIKWa(U&VW-k4@ r   zbase.add_jobpositionc                    | j                   j                  d      r| j                   j                  d      nd}t               }| j                  dk(  r_t        | j                        }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )z4
    This method is used to create job position
    dynamicrI  r   r  r   (base/job_position/job_position_form.htmlr   r  )r/  r   rN   r   r   r  r  r   r   r   r   r"   r   r  r   s      r   job_position_creationr    s     -4KKOOI,Fgkkooi(BG!D~~#GLL1==?IIKWa(U&VW KLL2	
 r   zbase.change_jobpositionc                 H   t        j                  |      }t        |      }| j                  dk(  rct        | j                  |      }|j                         r<|j                  d       t        j                  | t        d             t        d      S t        | d||d      S )	ze
    This method is used to update job position
    args:
        id : job position instance id

    r  r   Tr  zJob position updated.r   r  )r   r(  )r   r  rM   r   r   r  r  r   r   r   r   r"   )r   r<  r  r(  r   s        r   job_position_updater    s     ##B'LL1D~~w||lC==?IITI"Wa(?&@A KLL2|4 r   zbase.add_jobrolec                 t   | j                   j                  d      }t               }| j                  dk(  rt        | j                        }|j
                  j                  rB|j                         r2|j                  d       t        j                  | t        d             n|j
                  j                  sr|j                  j                  d      rW|j                  j                  d      r<|j                  d       t        j                  | t        d             t        d      S t        | d	||d
      S )z1
    This method is used to create job role.
    r  r   Tr  z'Job role has been created successfully!r  job_roler    base/job_role/job_role_form.htmlr  )r/  r   rO   r   r   r   pkr  r  r   r   r   r  r  r   r"   r  s      r   job_role_creater    s     kkooi(G=D~~7<<(==IITI"Wa(Q&RS  		!!"34		j)IITI"Wa(Q&RS KLL*	
 r   zbase.view_jobrolec                     t         j                  j                         }d}t        j                  j	                         rd}t        | d||d      S )z/
    This method is used to view job role.
    FTzbase/job_role/job_role.html)r%  r  )r   r   r  r   r   r"   )r   r  r  s      r   job_role_viewr    sM     ""$DH%H5 r   zbase.change_jobrolec                 H   t        j                  |      }t        |      }| j                  dk(  rct        | j                  |      }|j                         r<|j                  d       t        j                  | t        d             t        d      S t        | d||d      S )	zg
    This method is used to update job role instance
    args:
        id  : job role instance id

    r  r   Tr  zJob role updated.r   r  )r   r  )r   r  rO   r   r   r  r  r   r   r   r   r"   )r   r<  r  r  r   s        r   job_role_updater     s     ||BH)D~~7<<(;==?IITI"Wa(;&<= KLL* 	
 r   zbase.add_worktypec                    | j                   j                  d      }t               }t        j                  j                         }| j                  dk(  rit        | j                        }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d|||d      S )z1
    This method is used to create work type
    r  r   z(Work Type has been created successfully!r   "base/work_type/work_type_form.html)r   
work_typesr  )r/  r   rc   r   r   r  r   r   r  r  r   r   r   r   r"   )r   r  r   r  s       r   work_type_creater  >  s     kkooi(G>D!!%%'J~~GLL)==?IIK>DWa(R&ST KLL,ZGD r   zbase.view_worktypec                 \    t         j                  j                         }t        | dd|i      S )z/
    This method is used to view work type
    zbase/work_type/work_type.htmlr  )r   r   r  r"   )r   r  s     r   work_type_viewr  X  s3     !!%%'J'	z" r   zbase.change_worktypec                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )zh
    This method is used to update work type instance
    args:
        id : work type instance id

    r  r   zWork type updated.r   r  )r   	work_type)r   r  rc   r   r   r  r  r   r   r   r   r"   )r   r<  r  r  r   s        r   work_type_updater  g  s     b!I+D~~GLL9===?IIKWa(<&=> KLL,I. r   zbase.add_rotatingworktypec                 ^   t               }| j                  dk(  rit        | j                        }|j                         rD|j	                          t               }t        j                  | t        d             t        d      S t        | d|t        j                  j                         d      S )z>
    This method is used to create rotating work type   .
    r   zRotating work type created.r   9base/rotating_work_type/htmx/rotating_work_type_form.html)r   
rwork_type)r\   r   r   r  r  r   r   r   r   r"   r   r   r  r  s     r   rotating_work_type_creater    s      !D~~#GLL1==?IIK')DWa(E&FG KLLC%5%=%=%A%A%CD r   zbase.view_rotatingworktypec                 X    t        | ddt        j                  j                         i      S )z<
    This method is used to view rotating work type   .
    z/base/rotating_work_type/rotating_work_type.htmlr  )r"   r   r   r  r   s    r   rotating_work_type_viewr    s/     9	'//3356 r   zbase.change_rotatingworktypec                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )z{
    This method is used to update rotating work type instance.
    args:
        id : rotating work type instance id

    r  r   zRotating work type updated.r   r  )r   r_type)r   r  r\   r   r   r  r  r   r   r   r   r"   )r   r<  r  rotating_work_typer   s        r   rotating_work_type_updater    s     *..r2);<D~~#GLL;MN==?IIKWa(E&FG KLLC!34 r    base.view_rotatingworktypeassignc                 L   t        t        j                  j                  d            }t        j                  j	                         }|j
                  j                  d      }t        | |d      }|j                  d      }t        j                  t        || j                  j                  d            j                  D cg c]  }|j                   c}      }t        | d|t        || j                  j                  d            ||t         j"                  d	      S c c}w )
zL
    This method is used to assign rotating work type to employee users
    Tr2  r>  -idr  r  r  z6base/rotating_work_type/rotating_work_type_assign.html)frwork_type_assign
assign_ids	rwork_all	gp_fields)r5   r   r   r   r  qsorder_byrj   jsondumpsrq   r/  r   object_listr<  r"   r6   r=  )r   r   r  r  r   r  s         r   rotating_work_type_assignr    s    *'//666FF '..224I		**51*"$F *000M *!7;;??6#:k		
 KK	
J @!.!7;;??6#:" %"7>>	
 	
s   D!base.add_rotatingworktypeassignc                 l   t               }| j                  j                  d      r)| j                  j                  d      }t        d|i      }t	        | |d      }| j
                  dk(  r6t        | j                        }t	        | |d      }|j                         r|j                          | j                  j                  d      }t        j                  j                  |      j                  d      }|D cg c]  }|j                   }}t        j                   | j"                  j$                  |dd	d
dddt'        d      	       t)        j*                  | t-        d             t/        | dd|i      }t1        |j2                  j5                  d      dz         S t/        | dd|i      S c c}w )z:
    This method is used to assign rotating work type
    emp_idr   r   r  r   re  r  z#You are added to rotating work typeu=   تمت إضافتك إلى نوع العمل المتناوبu2   Sie werden zum rotierenden Arbeitstyp hinzugefügtz(Se le agrega al tipo de trabajo rotativou-   Vous êtes ajouté au type de travail rotatifinfiniteemployee-profile	recipientverbverb_arverb_deverb_esverb_friconr!   zRotating work type assigned.z@base/rotating_work_type/htmx/rotating_work_type_assign_form.htmlr   utf-8#<script>location.reload();</script>)rZ   r/  r   r[   rg   r   r   r  r  r  r   r   r   select_relatedr  r   rX  r   r   r$   r   r   r   r"   r   rs  decoder   r   r  employee_ids	employeesusersrt  s          r   rotating_work_type_assign_addr    s    &'D{{x ;;??8,/8QRgt-NOD~~)',,7!'41RS==?IIK"<<//>L ((//|/DSS"I @II8X..IEIKK)):WLBG !34
 Wa(F&GHRH
    ''03XX  J	 - J   =F1c           
      ~   | j                   j                         }t        | j                         j                  j	                  d      }| j                   j                  d      }| j                   j                  d      r| j                   j                  d      dv r|j                  d      }| j                   j                  d      dk(  r|j                  d      }t        | |d	      }| j                   j                  d
      rt        | |d
      }d}t        |      }t        t        |       |dk7  r|t        ||| j                   j                  d      d      }|D cg c]  }|d   	 }}g }|D ].  }	|	j                  D ]  }
|j                  |
j                          0 t!        j"                  t%        |            }d}n\t'        || j                   j                  d            }t!        j"                  |j                  D 
cg c]  }
|
j                   c}
      }t)        | ||||||d      S c c}w c c}
w )zI
    This method renders template to view rotating work type objects
    r  r&  r2  )trueunknownTr  falseFr  orderbyz;base/rotating_work_type/rotating_work_type_assign_view.htmlrI  r  listz*base/rotating_work_type/htmx/group_by.html)r  r  filter_dictr  r&  )r/  r	   r5   r  r  r   r   rj   rs   r   rn   r   r   r  r  r<  r  r  r  rq   r"   )r   r  r  r&  r  	data_dictentrylist_valuesid_listvaluer   r  s               r   rotating_work_type_assign_viewr    s    KK))+M4W[[ADDMMeTKKOOG$E;;??;'7;;??;+G L , .44t4D{{{#w.-44u4E*"$F {{y!"7,=yILH'I,i8{u(-ugkkoof&=v
 3DDuV}DD  	,E!-- ,x{{+,	, ZZW.
? **;W[[__V=TUZZ):)F)FGXX[[G

 !2$$	

 
 E Hs   "H5H:c                    | j                   j                         }|j                  dd       |j                         }t        j
                  j                  |      j                         }||d}| j                   j                  d      }|r3t        j                  |      }t        ||      \  }}	||d<   |	|d<   ||d<   | j                  j                  dd      }
d	|d
<   d	|d<   |
r|
j                  d      rd|d
<   d|d<   n?|
r=|
j                  d      D cg c]  }|s|	 }}	 t        |d         }d| |d
<   d|d<   t#        | d|      S c c}w # t         $ r Y w xY w)zQ
    This view is used render detailed view of the rotating work type assign
    instances_idsNr;  r   r  previousr-  r  rT  rI  close_hx_urlclose_hx_targetzrotating-work-type-assign/z/rotating-work-type-assign-view#view-containerr   r/  /employee/shift-tab/#shift_targetz,base/rotating_work_type/individual_view.html)r/  copyr1  r	   r   r   r   r  r   r  loadsrh   rZ  endswithr>  r=  
ValueErrorr"   )r   rM  request_copyr  r   r  assign_ids_jsonr  previous_idnext_idrT  partHTTP_REFERERSr   s                 r   rotating_work_individual_viewr  U  s    ;;##%L_d+ **,M%--444DJJLH#=9Gkkooo6OZZ0
.z;GW)
! /<<##ND9L GN!#G--.JK"C%6!"	*6*<*<S*AJ$TJJ	mB/0K(<[M&JGN#)8G%& 'I7SS K
  		s   E!E(E 	E! E!"base.change_rotatingworktypeassignc                    t         j                  j                  |      }t        |      }t	        | |d      }| j
                  dk(  rt        | j                  |      }t	        | |d      }|j                         re|j                          t        j                  | t        d             t        | dd|i      }t        |j                  j                  d      d	z         S t        | dd|i      S )
zC
    This method is used to update rotating work type instance
    r;  r  r  r   z"Rotating work type assign updated.zGbase/rotating_work_type/htmx/rotating_work_type_assign_update_form.htmlupdate_formr  r  )r   r   r   r[   rg   r   r   r  r  r   r   r   r"   r   rs  r  )r   r<  rotating_work_type_assign_objr   rt  s        r    rotating_work_type_assign_updater  x  s     %;$B$B$F$F"$F$M!+5RSDgt-QRD~~/LL#@
 "'41UV==?IIKWa(L&MNY%H
    ''03XX  Q	 r   c                     | j                   j                  d      dk(  r#t               t               d}t	        | d|      S t        | t        t        t        d      S )NHTTP_HX_REQUESTr  export_filterexport_columnsz=base/rotating_work_type/rotating_work_type_assign_export.htmlr  Rotating_work_type_assignr   r  filter_classrg  	file_name)rZ  r   r5   rY   r"   ri   r   r   r  s     r    rotating_work_type_assign_exportr    se     ||)*f49;>@
 K
 	
 $13- r   c                    | j                   j                         }|j                  dd        |j                         }| j                  j                  dd       }|r|dk(  rt        d|       S |r|dk(  r| j                   j                  d      }t        j                  |      }||v r|j                  |       t        t        j                  |      |      \  }}	d|	 d}
d| d	| }t        |
|z         S |r|d
k(  r|rt        d|       S |rt        d      S t        | j                  j                  dd            S )Nr  r.  view-containerz /rotating-work-type-assign-view?objectDetailsModalTargetz/rwork-individual-view/r   r.  &instances_ids=shift_targetr  r   rT  r/  r  r1  r	   rZ  r   r!   r  r  r  rh   r   r   r   r  r   r  r  rD  r  instances_listprevious_instancenext_instanceurlr6  s               r   "rotating_work_type_assign_redirectr    sB   ;;##%L_d+ **,M  !148IY"22:=/JKK	y$>>8M2^#!!&)+:JJ}%v,
(= (a8]O?>2BCf%%	yN2{.{m<==	GHH#GLL$4$4^S$IJJr   c                 f   	 t        t        |      }|j                  j                  }t        j                  j                  d|j                        }|j                   |_        |j                  r|rt        j                  | d       n`|j                          |j                  rt        d      n
t        d      }t        j                  | t        d      j                  |             t        | ||      S # t        $ r" t        j                  | t        d             Y nw xY wt        | |      S )	z:
    Archive or un-archive rotating work type assigns
    r;  Tr2  r   Already on record is activeun-archivedarchivedzRotating work type assign is {}$Rotating work type assign not found.)r    r   r   r<  r   r   r2  r   r   r  r   r   r  r  r   )r   r  r  r   employees_rwork_typesr  s         r   !rotating_work_type_assign_archiver!    s   K&'=&I
 ,,// 6 > > E E
(>(> !F !
 $.#7#77
$9NN7$ABOO*4*>*>a&AjMG<=DDWM 2'6;OO Kw"H IJK-gv{KKs   C5C8 8(D#"D#c                    t        j                  | j                  d         }| j                  j                  d      dk7  }|rt	        d      n
t	        d      }d}|D ]  }t
        j                  j                  |      }t
        j                  j                  d|j                  	      }|rJ|j                         r:t        j                  | t	        d
      j                  |j                               ||_        |j                          |dz  } |dkD  r0t        j                  | t	        d      j                  ||             t!        |       S )zT
    This method is used to archive/un-archive bulk rotating work type assigns.
    rd  r2  r  r  r  r   r;  Tr  z3Rotating work type for {employee_id} already existsr   r  z5Rotating work type for {count} employees is {message})ri  r  )r  r  r   r   r   r   r   r   r   r   r   r   r  r2  r  r   r  )r   rd  r2  r  ri  r<  r  employees_rwork_type_assigns           r   &rotating_work_type_assign_bulk_archiver%    sF    **W\\%(
)C  -8I"+a:GE 2::>>">E&<&D&D&K&K(9(E(E 'L '
# 4;;=NNGHOO 1 = = P  +4'""$QJE!$ qyEFMMW N 	
 .g66r   z"base.delete_rotatingworktypeassignc                 (   | j                   d   }t        j                  |      }|D ]l  }	 t        j                  j                  |      }|j                          t        j                  | t        d      j                  |j                               n t        dd	i      S # t        j                  $ r" t        j                  | t        d             Y t        $ r2 t        j                  | t        d      j                               Y w xY w)
zS
    This method is used to archive/un-archive bulk rotating work type assigns
    rd  r;  z{employee} deleted.r  z{rwork_type_assign} not found.z%You cannot delete {rwork_type_assign})r  r  Success)r   r  r  r   r   r   r  r   r   r   r  r   r  r   r   r   )r   rd  r<  r  s       r   %rotating_work_type_assign_bulk_deleter(  	  s     ,,u
C
**S/C 	 6 > > B Bb B I$$&'(//9J9V9V/W	" I.// &22 	INN7A&F$GH 	NN9:AA&7 B 	   A)B##2D7DDc                    	 t         j                  j                  |      }|j                  j                  }|j                          t        j                  | t        d             t        | |      S # t         j                  $ r" t        j                  | t        d             Y At        $ r" t        j                  | t        d             Y jw xY w)z:
    This method is used to delete rotating work type
    r;  z"Rotating work type assign deleted.r  z*You cannot delete this rotating work type.)r   r   r   r   r<  r  r   r   r   r  r   r   r  )r   r  r   r   s       r    rotating_work_type_assign_deleter+  ,	  s    Q(>(F(F(J(Jf(J(U%3??BB%,,.!$H"IJ .gv{KK ".. Kw"H IJ Qw"N OPQs   A%A4 42C('CCzbase.view_employeetypec                 \    t         j                  j                         }t        | dd|i      S )z3
    This method is used to view employee type
    z%base/employee_type/employee_type.htmlemployee_types)r   r   r  r"   )r   typess     r   employee_type_viewr/  A	  s5       $$&E/e	
 r   zbase.add_employeetypec                    | j                   j                  d      }t               }t        j                  j                         }| j                  dk(  rit        | j                        }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d|||d      S )z5
    This method is used to create employee type
    r  r   zEmployee type created.*<script>window.location.reload();</script>*base/employee_type/employee_type_form.html)r   r-  r  )r/  r   rJ   r   r   r  r   r   r  r  r   r   r   r   r"   )r   r  r   r.  s       r   employee_type_creater3  R	  s     kkooi(GD  $$&E~~-==?IIK#%DWa(@&AB LMM47C r   zbase.change_employeetypec                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )zp
    This method is used to update employee type instance
    args:
        id : employee type instance id

    r  r   zEmployee type updated.r1  r2  )r   employee_type)r   r  rJ   r   r   r  r  r   r   r   r   r"   )r   r<  r  r5  r   s        r   employee_type_updater6  j	  s     !%%b)M]3D~~}E==?IIKWa(@&AB LMM46 r   zbase.view_employeeshiftc                     t         j                  j                         }t        j                  d      r8t        dd      }|j                  j                         j                  d      }nd}t        | d||d      S )	z4
    This method is used to view employee shift
    r   	gracetimer  T)
is_defaultNzbase/shift/shift.html)shiftsgrace_times)r   r   r  r   r   r   rj  r"   )r   r:  	GraceTimer;  s       r   employee_shift_viewr=  	  ss     ""&&(F&+l+V	''++-555F(VK*X r   zbase.add_employeeshiftc                    | j                   j                  d      }t               }t        j                  j                         }| j                  dk(  rit        | j                        }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d|||d      S )z6
    This method is used to create employee shift
    r  r   z-Employee Shift has been created successfully!r1  base/shift/shift_form.html)r   r:  r  )r/  r   rG   r   r   r  r   r   r  r  r   r   r   r   r"   )r   r  r   r:  s       r   employee_shift_creater@  	  s     kkooi(GD""&&(F~~ .==?IIK$&DJK   LMM$G< r   zbase.change_employeeshiftc                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )zj
    This method is used to update employee shift instance
    args:
        id  : employee shift id

    r  r   zShift updatedr1  r?  )r   shift)r   r  rG   r   r   r  r  r   r   r   r   r"   )r   r<  r  employee_shiftr   s        r   employee_shift_updaterD  	  s     #''+Nn5D~~ G==?IIKWa&89 LMM-~/V r   zbase.view_employeeshiftschedulec                     d}t         j                  j                         rd}t        j                  j	                         }t        | d||d      S )z8
    This method is used to view schedule for shift
    FTzbase/shift/schedule.html)r:  shift_schedule)r   r   r   r   r  r"   )r   rF  r:  s      r   employee_shift_schedule_viewrG  	  sO     N$$++-""&&(F"^< r   zbase.add_employeeshiftschedulec                 b   t               }t        j                  j                         }| j                  dk(  rit        | j
                        }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d||d      S )z:
    This method is used to create schedule for shift
    r   z6Employee Shift Schedule has been created successfully!r1  base/shift/schedule_form.html)r   r:  )rH   r   r   r  r   r   r  r  r   r   r   r   r"   )r   r   r:  s      r   employee_shift_schedule_createrJ  	  s     %&D""&&(F~~(6==?IIK,.DST   LMM0462R r   z!base.change_employeeshiftschedulec                 D   t        j                  |      }t        |      }| j                  dk(  rat        | j                  |      }|j                         r:|j                          t        j                  | t        d             t        d      S t        | d||d      S )zq
    This method is used to update employee shift instance
    args:
        id : employee shift instance id
    r  r   zShift schedule created.r1  rI  )r   rF  )r   r  rI   r   r   r  r  r   r   r   r   r"   )r   r<  r  employee_shift_scheduler   s        r   employee_shift_schedule_updaterM  	  s     488<*4KLD~~.LL#:
 ==?IIKWa(A&BC LMM')@A r   zbase.view_rotatingshiftc                 X    t        | ddt        j                  j                         i      S )z4
    This method is used to view rotating shift
    z'base/rotating_shift/rotating_shift.htmlrshifts)r"   r   r   r  r   s    r   rotating_shift_viewrP  
  s.     1	M))--/0 r   zbase.add_rotatingshiftc                 r   t               }| j                  dk(  rit        | j                        }|j                         rN|j	                          t               }t        j                  | t        d             t        d      S t               }t        | d|t        j                  j                         d      S )z6
    This method is used to create rotating shift
    r   zRotating shift created.r1  1base/rotating_shift/htmx/rotating_shift_form.html)r   rO  )rX   r   r   r  r  r   r   r   r   r"   r   r   r  r  s     r   rotating_shift_createrS  
  s     D~~ .==?IIK$&DWa(A&BC LMM ";-"7"7";";"=> r   zbase.change_rotatingshiftc                 X   t        j                  |      }t        |      }| j                  dk(  rkt        | j                  |      }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d||d      S )zq
    This method is used to update rotating shift instance
    args:
        id : rotating shift instance id
    r  r   zRotating shift updated.r1  rR  )r   rshift)r   r  rX   r   r   r  r  r   r   r   r   r"   )r   r<  r  rotating_shiftr   s        r   rotating_shift_updaterW  4
  s     #''+Nn5D~~ G==?IIK$&DWa(A&BC LMM;$	
 r   base.view_rotatingshiftassignc                    t               }t        | |d      }t        t        j                  j                  d            }|j                  }t        j                  j                         }t        | |d      }|j                  d      }t        j                  t        || j                  j                  d            j                  D cg c]  }|j                   c}      }t!        | d||t               t#               t        || j                  j                  d            ||t$        j&                  d	      S c c}w )
z6
    This method is used to assign rotating shift
    base.add_rotatingshiftassignTr  r  rX  r  r  z.base/rotating_shift/rotating_shift_assign.html)r   r  r  r  rshift_assignr  
rshift_allr  )rV   rg   r3   rT   r   r   r  r  rj   r  r  rq   r/  r   r  r<  r"   rU   r4   r=  )r   r   r   r[  r\  r   r  s          r   rotating_shift_assignr]  Q
  s    #$Dgt-KLD'$,,33d3CF IIM$,,002J& ?M "(((EM *w{{v6k		
 KK	
J 879;=*='++//&:QR$$4;;		
 	
s   D<rZ  c                 l   t               }| j                  j                  d      r)| j                  j                  d      }t        d|i      }t	        | |d      }| j
                  dk(  r6t        | j                        }t	        | |d      }|j                         r|j                          | j                  j                  d      }t        j                  j                  |      j                  d      }|D cg c]  }|j                   }}t        j                   | j"                  j$                  |dd	d
dddt'        d      	       t)        j*                  | t-        d             t/        | dd|i      }t1        |j2                  j5                  d      dz         S t/        | dd|i      S c c}w )z:
    This method is used to add rotating shift assign
    r  r   r   rZ  r   re  r  zYou are added to rotating shiftu4   تمت إضافتك إلى وردية الدوريةu6   Sie werden der rotierenden Arbeitsschicht hinzugefügtu    Estás agregado a turno rotativou.   Vous êtes ajouté au quart de travail rotatifr  r  r  zRotating shift assigned.z8base/rotating_shift/htmx/rotating_shift_assign_form.htmlr   r  r  )rV   r/  r   rW   rg   r   r   r  r  r  r   r   r   r  r  r   rX  r   r   r$   r   r   r   r"   r   rs  r  r  s          r   rotating_shift_assign_addr_  |
  s    #$D{{x ;;??8,,mX5NOgt-KLD~~&w||4!'41OP==?IIK"<<//>L ((//|/DSS"I @II8X..IEIKK))6NP:H !34
 Wa(B&CDJH
    ''03XX  B	 - Jr  c           
         | j                   j                         }t        | j                         j                  j	                  d      }| j                   j                  d      }| j                   j                  d      | j                   j                  d      dk(  r|j                  d      }t        | |d      }t        | |d      }t        |      }t        t        |       d	}|d
k7  r|t        ||| j                   j                  d      d      }|D cg c]  }|d   	 }}g }|D ].  }	|	j                  D ]  }
|j                  |
j                          0 t!        j"                  t%        |            }d}n\t'        || j                   j                  d            }t!        j"                  |j                  D 
cg c]  }
|
j                   c}
      }t)        | ||||||d      S c c}w c c}
w )zQ
    This method renders all instance of rotating shift assign to a template
    r  r&  r2  r  Tr  rX  r  z3base/rotating_shift/rotating_shift_assign_view.htmlrI  r  r  z&base/rotating_shift/htmx/group_by.html)r[  r  r  r  r&  )r/  r	   r3   r  r  r   r   rj   rs   r   rn   rT   r   r  r  r<  r  r  r  rq   r"   )r   r  r[  r&  r  r  r  r  r  r  r   r  s               r   rotating_shift_assign_viewra  
  s    KK))+M.w{{;>>GGNMKKOOG$E$,;;??;'94%,,t,<& ?M 7M9=M'I)95DH{u()5'++//&"96
 3@@uV}@@  	,E!-- ,x{{+,	, ZZW.
; &mW[[__V5LMZZ]=V=V W WX
*$$	

 
 A !Xs   G+>G0c                    | j                   j                         }|j                  dd       |j                         }t        j
                  j                  |      j                         }||d}| j                   j                  d      }| j                  j                  dd      }d|d<   d|d<   |r|j                  d	      rd
|d<   d|d<   n?|r=|j                  d      D cg c]  }|s|	 }	}	 t        |	d         }
d|
 |d<   d|d<   |r3t        j                  |      }t!        ||      \  }}||d<   ||d<   ||d<   t#        | d|      S c c}w # t        $ r Y Rw xY w)zL
    This view is used render detailed view of the rotating shit assign
    r  Nr;  r  rT  rI  r  r  zrotating-shift-assign/z/rotating-shift-assign-viewr  r   r/  r  r  r  r-  r  z(base/rotating_shift/individual_view.html)r/  r  r1  r	   rT   r   r   r  r   rZ  r  r>  r=  r  r  r  rh   r"   )r   rM  r  r  r   r  r  rT  r  r  r   r  r  r  s                 r   rotating_shift_individual_viewrc  
  s    ;;##%L_d+ **,M"**11[1AGGIH#=9Gkkooo6O<<##ND9L GN!#G--.FG"?%6!"	*6*<*<S*AJ$TJJ	mB/0K(<[M&JGN#)8G%& ZZ0
.z;GW)
! *'EwOO K
  		s   $E,E3E 	E! E!base.change_rotatingshiftassignc                    t        j                  |      }t        |      }t        | |d      }| j                  dk(  rt        | j
                  |      }t        | |d      }|j                         re|j                          t        j                  | t        d             t        | dd|i      }t        |j                  j                  d      dz         S t        | dd|i      S )	z
    This method is used to update rotating shift assign instance
    args:
        id : rotating shift assign instance id

    r  rd  r   zRotating shift assign updated.z?base/rotating_shift/htmx/rotating_shift_assign_update_form.htmlr  r  r  )rT   r  rW   rg   r   r   r  r  r   r   r   r"   r   rs  r  )r   r<  rotating_shift_assign_objr   rt  s        r   rotating_shift_assign_updaterg    s     !4 8 8 <(2KLDgt-NOD~~,LL#<
 "'41RS==?IIKWa(H&IJQ!4H    ''03XX  I4	
 r   c                     | j                   j                  d      r#t               t               d}t	        | d|      S t        | t        t        t        d      S )Nr  r  z5base/rotating_shift/rotating_shift_assign_export.htmlr  Rotating_shift_assign_exportr	  )rZ  r   r3   rU   r"   ri   rT   r  s     r   rotating_shift_assign_exportrj  -  s`     ||)*79;=
 C
 	

 !/00 r   c                    | j                   j                         }|j                  dd        |j                         }| j                  j                  dd       }|r|dk(  rt        d|       S |r|dk(  r| j                   j                  d      }t        j                  |      }||v r|j                  |       t        t        j                  |      |      \  }}	d|	 d}
d| d	| }t        |
|z         S |r|d
k(  r|rt        d|       S |rt        d      S t        | j                  j                  dd            S )Nr  r.  r  z/rotating-shift-assign-view?r  z/rshit-individual-view/r   r.  r  r  r  r   rT  r  r  s               r   rotating_shift_assign_redirectrl  C  sB   ;;##%L_d+ **,M  !148IY"226}oFGG	y$>>8M2^#!!&)+:JJ}%v,
(= (a8]O?>2BCf%%	yN2{.{m<==	GHH#GLL$4$4^S$IJJr   c                 L   	 t        t        |      }|j                  j                  }t        j                  j                  d|j                        }|j                   |_        |j                  r|rt        j                  | d       n`|j                          |j                  rt        d      n
t        d      }t        j                  | t        d      j                  |             t        | |      S # t        $ r" t        j                  | t        d             Y 7w xY w)	zT
    This method is used to archive and unarchive rotating shift assign records
    r;  Tr  r  r  r  zRotating shift assign is {} Rotating shift assign not found.)r    rT   r   r<  r   r   r2  r   r   r  r   r   r  r   rl  )r   r  rU  r   employees_rshift_assignsr  s         r   rotating_shift_assign_archiverp  ]  s    G"#66B((++#6#>#>#E#E(:(: $F $
   &/// 8NN7$ABKKM*0*:*:a&*GWa(E&F&M&Mg&VW *'6;GG  Gw"D EFGs   C)C8 8(D#"D#c                    | j                   d   }t        j                  |      }d}t        d      }| j                  j                  d      dk(  rd}t        d      }|D ]  }t        j                  j                  |      }t        j                  j                  d|j                  	      }d}|rt        |      d
k  rd}||_        n	d}||_        |j                          |s;t        j                  | t        d      j                  |j                  |             t        j                   | t        d      j                  |j                                t#        ddi      S )zO
    This method is used to archive/un-archive bulk rotating shift assigns
    rd  Tr  r2  FalseFr  r;  r  r  z*Rotating shift for {employee} is {message})r  r  z/Rotating shift for {employee} is already existsr  r  r'  )r   r  r  r   r/  r   rT   r   r   r   r  r2  r  r   r   r  r   r   )r   rd  r2  r  r<  r[  employees_rshift_assignflags           r   "rotating_shift_assign_bulk_archiveru  w  s^    ,,u
C
**S/CIG{{{#w.	J- +337727>"5"="="D"D(A(A #E #
 *+a/*3'D&/M#>?FF*66 G  NNCDKK*66 L /: I.//r   zbase.delete_rotatingshiftassignc                 (   | j                   d   }t        j                  |      }|D ]l  }	 t        j                  j                  |      }|j                          t        j                  | t        d      j                  |j                               n t        dd	i      S # t        j                  $ r" t        j                  | t        d             Y t        $ r2 t        j                  | t        d      j                               Y w xY w)
zF
    This method is used to bulk delete for rotating shift assign
    rd  r;  z{employee} assign deleted.r  z{rshift_assign} not found.z!You cannot delete {rshift_assign})r[  r  r'  )r   r  r  rT   r   r   r  r   r   r   r  r   r  r   r   r   )r   rd  r<  r[  s       r   !rotating_shift_assign_bulk_deleterw    s     ,,u
C
**S/C 	/77;;r;BM  "./66*66 7 	& I.// #// 	ENN7A&B$CD 	NN56=="/ > 	r)  c                    	 t         j                  j                  |      }|j                  j                  }|j                          t        j                  | t        d             t        | |      S # t         j                  $ r$ d}t        j                  | t        d             Y Ct        $ r" t        j                  | t        d             Y lw xY w)z
    This method is used to delete rotating shift assign instance
    args:
        id : rotating shift assign instance id
    r;  zRotating shift assign deleted.Nrn  z-You cannot delete this rotating shift assign.)rT   r   r   r   r<  r  r   r   r   r  r   r   rl  )r   r  rf  r   s       r   rotating_shift_assign_deletery    s    	T$7$?$?$C$Cv$C$N!/;;>>!((*!$D"EF *'6;GG ++ Gw"D EF Tw"Q RSTs   A%A4 44C*'CCc                 t    	 t        j                  |       }|j                         }|S # t        $ r g cY S w xY w)z
    get app models
    )r   get_app_config
get_modelsLookupError)r  
app_configmodelss      r   r  r    s>    ((2
&&( 	s   &) 77zauth.view_permissionc                    i }d}| j                   j                  d      rSd}t        j                  j	                  | j                   d         j                         }|j                         }||d<   n3t        j                  j	                  d      j                         }d	|d
<   g }g d}t        j                  D cg c]	  }||v s| }}t        }	|D ]  }
g }t        |
      D ]e  }|j                  j                  |	vs|j                  |j                  j                  j                         |j                  j                  d       g |j                  |
j                         j!                  dd      |d        ||d<   |	|d<   t#        || j                   j                  d            |d<   t%        | ||      S c c}w )zD
    This method is used to assign permissions to employee user
    zbase/auth/permission.htmlprofile_tabztabs/group_permissions.htmlr   r;  r  F*employee_user_id__user_permissions__isnullTshow_assign)baser   r  r   r   r   r   r   r   authr   horilla_documentshelpdeskr  r   rQ  r  r  r  r  r  )r/  r   r   r   r   distinctr  r   INSTALLED_APPSr   r  r  r  r  r  r  replacerq   r"   )r   r  r  r  emoloyeer  horilla_appsr   installed_appsr  r  r  r  s                r   employee_permission_assignr    s    G*H{{}%0$$++w{{=/I+JSSU	??$&
$$++7< , 

(* 	 "&KL &.%<%<Tc|@ScTNT/" 

&x0 	E{{%%-AA!!(-(@(@(K(K(M&+kk&<&<	 	'')11#s;:V	

 )GM&:G"#(GKKOOF4KLGK ' Us   >	GGview_permissionsc                    i }d}t        | j                        j                  }| j                  j                  d      r0d}|j	                  | j                  d         j                         }n%|j	                  d      j                         }d|d	<   g }t        }|D ]  }g }	t        |      D ]L  }
|	j                  |
j                  j                  j                         |
j                  j                  d
       N |j                  |j                         |	d        ||d<   t        || j                  j                  d            |d<   t        | ||      S )zP
    This method renders template to view all instances of user permissions
    zbase/auth/permission_lines.htmlr  z#base/auth/permission_accordion.htmlr   r;  Fr  Tr  r  r  r  r  r  )r   r/  r  r   r   r  r   r  r  r  r  r  r  rq   r"   )r   codenamer  r  r  r  r  r   r  r  r  s              r   employee_permission_searchr  "  sR    G0Hw{{+..I{{}%8$$M(B$CLLN	$$7< % 

(* 	 "&KD 	U
&x0 	E$)KK$<$<$G$G$I"'++"8"8	 	8#6#6#8
ST	U )GM(GKKOOF4KLGK r   c                 &   t        | j                        }|j                         r|j                          t	        ddd      S |j
                  j                  d      rt        j                  j                  |j
                  d         j                         rkt        j                  j                  |j
                  d         j                         j                  j                  j                          t	        ddd      S t	        dd	d      S )
r  r  r   r  r  r;  r  r[  r  r  )r<   r   r  r  r   r  r   r   r   r   r  r  user_permissionsr  r  s     r   update_permissionr  H  s     GLL)D}}		(A9UVV		j!##tyy'<#=CCEyy$ 	  	

%'""#3#3EEG(@&QRR$:HMNNr   c                 D   g }t         }t               }t        }|D ]  }g }t        |      D ]Q  }||vs|j	                  |j
                  j                  j                         |j
                  j                  d       S |j	                  |j                         |d        | j                  dk(  r_t        | j                        }|j                         r:|j                          t        j                  | t        d             t!        d      S t#        | d|||d      S )z<
    This method is used to render the permission table
    r  r  r   zEmployee permission assigned.r   z base/auth/permission_assign.htmlr  )r   r<   r   r  r  r  r  r  r  r   r   r  r  r   r   r   r   r"   )r   r  r   r   r  r  r  r  s           r   permission_tabler  `  s    KDD/ 
U
&x0 	E00!!(-(@(@(K(K(M&+kk&<&<	 	8#6#6#8
ST
U ~~-==?IIKWa(G&HI KLL*&$8	
 r   c                    | j                   j                         }t        j                  j	                  | j
                        j                         }| j
                  j                  d      rt        j                  j                         }n^t        | t        j                  j                         d      }|t        j                  j	                  |      z  }|j	                  d      }t        j                  t        || j                   j                  d            j                  D cg c]  }|j                    c}      }t#        | j                   |      }t%        |      }t'        t        |       t)               }t+        | |d	      }t-        | |      }t/        | d
t        |j0                  | j                   j                  d            ||||t2        j4                  d      S c c}w )zF
    This method renders template to  view all work type requests
    r:  base.view_worktyperequestbase.add_worktyperequestr#  Tr  r  r  zbase.add_worktypereqeustz-work_type_request/work_type_request_view.html)r  r  r   r  requests_idsr  )r/  r	   r   r   r   r   r  has_permr   r  rj   r  r  rq   r   r  r<  r9   r   rn   rf   rg   r?  r"   r  r:   r=  )	r   r  r  work_type_requestsr   r  r  r  r   s	            r   work_type_request_viewr    s   
 KK))+M&&&EKKMH||89,4488:/_,,0024N
 0/2I2I2P2P  3Q 3
 
 066d6S:: *"GKKOOF$;k		
 KK	
L 	gkk4FGA'Ioy1 D"D
 %Wd3D7!!$$(?@$(/66	
 #	
s   +G)r  c                     | j                   j                  d      dk(  r't               }t               }||d}t	        | d|      S t        | t        t        t        d      S )Nr  r  export_fieldsr  z/work_type_request/work_type_request_export.htmlr  Work_type_request)rZ  r   r9   rd   r"   ri   r   )r   r  r  r  s       r   work_type_request_exportr    so     ||)*f4-/13**
 FPW
 	
 ! r   c           
         t         j                  j                  | j                        j	                         }| j
                  j                         }| j
                  j                  d      }t        | j
                        }| j                  j                  d      st        | |j                  d      n|j                  }t        t        j                  j                  |            }t        |      }t        t        ||z               }t        j                  j                  |D 	cg c]  }	|	j                   c}	      }
t!        | |
d      }d}|d	k7  r|t#        ||| j
                  j                  d
      d
      }|D cg c]  }|d   	 }}g }|D ].  }|j$                  D ]  }|j'                  |j                          0 t)        j*                  t        |            }d}n\t-        || j
                  j                  d
            }t)        j*                  |j$                  D cg c]  }|j                   c}      }t/        |      }t1        t        |       t3        | ||||||d      S c c}	w c c}w c c}w )z:
    This method is used to search work type request.
    r:  r&  r  r  r#  re  r  z$work_type_request/htmx/requests.htmlrI  r  r  z$work_type_request/htmx/group_by.html)r  r  r  r  r&  )r   r   r   r   r  r/  r	   r   r9   r  rj   r  r  r   r  r<  rs   r   r  r  r  r  rq   r   rn   r"   )r   r  r  r&  r  work_typ_requestsemployee_work_requestssubordinates_work_requestscombined_requestsreqcombined_requests_qsr  r  r  r  r  r   r  r  s                      r   work_type_request_searchr    sC    &&&EKKMHKK))+MKKOOG$Egkk*A ||$$%@A 	7ADD*DETT 
 "/"9"9"@"@X"@"VW!%&7!8S!;>T!TUV*2299"3434 :  w(<iH5H{u(-ugkkoof&=v
 3DDuV}DD  	,E!-- ,x{{+,	, zz$w-09 **;W[[__V=TUzz):)F)FGXX[[G
 'Ioy1%$(	

 
5 5 E Hs   )I3I8+I=c                    | j                   j                  j                  }| j                  j	                  dd      }t        | j                  j                         j                  dd            }d}d}|r:ddj                  |j                  d      dd        z   dk(  rt        d      }d}||fS |r|j                  d      rd	| }d
}||fS |r|j                  d      rd| d}d}||fS |r;|j                  d      D cg c]  }|s|	 }}	 t        |d         }d| }d}||fS ||fS c c}w # t        $ r Y ||fS w xY w)NrT  rI  pd=r   r  dashboard-work-type-requestz#WorkTypeRequestApproveBodyzwork-type-request-view//work-type-request-search?r  zemployee-profile/r  z?profile=truer  r/  )r   r   r<  rZ  r   r   r/  r	   r  r   r>  r$   r  r=  r  )	r   r  rT  r  r  r  r  r  r   s	            r   handle_wtr_close_hx_urlr  
  s   ||((++H<<##NB7LGKK113;;E2FGMLOchh|'9'9#'>qr'BCCsJ<=7 (( 
,//0IJ3M?C+ (( 
,//0CD-hZ}E) (( 
*6*<*<S*AJ$TJJ	mB/0K1+?L-O ((<(( K
  	((	s   D.
D.D3 3	EEc                    | j                   j                         }t        |j                  dd            }t	               }| j
                  j                  j                  }| j                   j                  d      r| j                   j                  d      }t	        d|i      }t        | |d      }t        | |      }t               }||d}t        |       \  |d<   |d	<   | j                  d
k(  rZt	        | j                        }t        | |d      }t        | |      }|j                         r|j!                         }	 t#        j$                  |j&                  |j&                  j(                  j*                  j,                  d|j&                   d|j&                   d|j&                   d|j&                   d|j&                   dt/        d      d|j                   z   	       t3        j4                  | t7        d             t8        j:                  j=                         }	t?        |	      dk(  rtA        d      S t	               }||d<   tC        | d|      S # t0        $ r
}Y d}~d}~ww xY w)z@
    This method is used to create request for work type  .
    r  rI  r  r   r   r  )r  r  r  r  r   zKYou have new work type request to                             validate for uY   لديك طلب نوع وظيفة جديد للتحقق من                             uW   Sie haben eine neue Arbeitstypanfrage zur                             Validierung für z[Tiene una nueva solicitud de tipo de trabajo para                             validar para u]   Vous avez une nouvelle demande de type de travail                            à valider pour informationwork-type-request-view?id=r  NzWork type request added.r  r   r   z#work_type_request/request_form.htmlr  )"r/  r	   r   r  rf   r   r   r<  r   rg   r?  r9   r  r   r   r  r  r   rX  r   r   r   r  r$   r   r   r   r   r   r   r  r  r   r"   )
r   encoded_datar  r   r  r  r  r   r   r  s
             r   work_type_requestr  %  s\    ;;((*LL00;<M D||((++H{{x ;;??8,x'@AD"D
 %Wd3DA]+G:Q;7GNW%67 ~~"7<<0!&

 )$7==?yy{H(( ,,??TTee**2*>*>)?A%1124..6.B.B-CE**2*>*>)?A--5-A-A,BD&$%=>4}AUU!( Wa(B&CD!0!8!8!<!<!>%&!+#$OPP&(DGFO'@'RR  s    B*I 	I0+I0c                    | j                   j                  d      dk(  }|s%t        | j                   j                  dd            S ddj                  | j                   j                  dd      j	                  d      dd        z   }| j                   j                  d      }|st        d	      S |d
k(  rb| j                  j                  d      }| j                  j                  d      }t        dd|j                  i      }t        | d| d|       S |dk(  rt        t        d            S d|v r&t        d| j                  j                                S d|v r"t        d|j                  j                         S t        d	      S )Nr  r  rT  r   HTTP_HX_CURRENT_URLrI  r  r.  r   r  r  	dashboardzwork-type-request-single-viewr  )r  z?instances_ids=z&dashboard=r  z/work-type-request-view/r  z/employee-view/r  )rZ  r   r   r   r>  r   r/  r$   r<  r!   r	   r   )r   r  
hx_requestcurrent_urlrD  r  r  r  s           r   handle_wtr_redirectr  f  s{   !!"34>J#GLL$4$4^S$IJJ.399#>qrB K   !12IGHH..8KKOOK0	+/223
 3%}o[TUUc =>??![04W[[5J5J5L4MNOOK'./@/L/L/O/O.PQRRCDDr   c                 H   t        j                  |      }|sDt        j                  | t	        d             t        | j                  j                  dd            S t        | |      s| j                  j                  d      sv|j                  | j                  j                  k(  r|j                  dk(  sDt        j                  | t	        d             t        | j                  j                  dd            S d|_        d|_        t        j                   j#                  |j                        }|j%                         rI|j&                  |j                  j(                  _        |j                  j(                  j-                          |j-                          t        j.                  | t	        d	             t1        j2                  | j                  j                  |j                  j4                  d
ddddt7        d      d|j8                   z   d	       t;        | |      S )zg
    This method is used to cancel work type request
    args:
        id  : work type request id

    Work type request not found.rT  r   base.cancel_worktyperequestFYou don't have permissionTr#  z$Work type request has been rejected.z)Your work type request has been rejected.u*   تم إلغاء طلب نوع وظيفتكz&Ihre Arbeitstypanfrage wurde storniertz1Su solicitud de tipo de trabajo ha sido canceladau1   Votre demande de type de travail a été annuléer  r  closer  r  r  r  r  r  r!   r  )r   r  r   r   r   r   rZ  r   r   r   r  r   r   approvedcanceledr   r   r   r   previous_work_type_idr   r  r  r   r   rX  r  r$   r<  r  )r   r<  r  	work_infos       r   work_type_request_cancelr    s    (,,R0w"@ AB#GLL$4$4^S$IJJ 	7$56<<  !>?((GLL,E,EE&&%/w"= >?#GLL$4$4^S$IJJ!%!&'//66%11 7 I 33 	%%88E 	%%88==?Wa FGH
KK!!#//@@8<8CC12t<M<P<P;Q5RR
 w(9::r   base.change_worktyperequestc                 >   | j                   d   }t        j                  |      }d}|D ]e  }t        j                  j                  |      }t        | |      sO| j                  j                  d      s4|j                  | j                  j                  k(  so|j                  dk(  sd|_        d|_        |j                  |j                  j                  _        |j                  j                  j!                          |j!                          t#        j$                  | t'        d             t)        j*                  | j                  j                  |j                  j,                  ddd	d
dt/        d      d|j0                   z   d	       d}h t3        d|i      S )zA
    This method is used to cancel a bunch work type request
    rd  Fr;  r  Tz$Work type request has been canceled.z)Your work type request has been canceled.u+   تم إلغاء طلب نوع وظيفتك.z'Ihre Arbeitstypanfrage wurde storniert.z2Su solicitud de tipo de trabajo ha sido cancelada.u2   Votre demande de type de travail a été annulée.r  r  r  r  r{  )r   r  r  r   r   r   r   r   r  r   r   r  r  r  r   r  r  r   r   r   r   rX  r  r$   r<  r   )r   rd  r{  r<  r  s        r   work_type_request_bulk_cancelr    so    ,,u
C
**S/CF +337727>w(9:||$$%BC ,,0I0II!**e3)-&).&!77 ))<<I ))<<AAC""$Wa(N&OPKK))+77HH@EALL !9:*--./0 F9: 6*++r   c                    t        j                  |      }|sDt        j                  | t	        d             t        | j                  j                  dd            S t        | |      s| j                  j                  d      sk| j                  j                  d      r|j                  rDt        j                  | t	        d             t        | j                  j                  dd            S 	 |j                         sd|_        d|_        |j                          t        j                  | t	        d	             t!        j"                  | j                  j$                  |j&                  j(                  d
ddddt+        d      d|j,                   z   d	       nt        j                  | t	        d             t/        | |      S )z<
    This method is used to approve requested work type
    r  rT  r   approve_worktyperequestchange_worktyperequestr  TF$Work type request has been approved.)Your work type request has been approved.:   تمت الموافقة على طلب نوع وظيفتك.'Ihre Arbeitstypanfrage wurde genehmigt.1Su solicitud de tipo de trabajo ha sido aprobada.4   Votre demande de type de travail a été approuvée.r  r  	checkmarkr  zEAn approved work type request already exists during this time period.)r   r  r   r   r   r   rZ  r   r   r   r  r  is_any_work_type_request_existsr  r  r   r   rX  r   r   r  r$   r<  r  )r   r<  r  s      r   work_type_request_approver    sz    (,,R0w"@ AB#GLL$4$4^S$IJJ7$56<<  !:;<<  !9:!**w"= >?#GLL$4$4^S$IJJ <<>%)"%*" !$J"KLLL%%'33DD<P=GJ564@Q@T@T?U9VV
	
 	UV	
 w(9::r   c                    | j                   d   }t        j                  |      }d}|D ]H  }t        j                  j                  |      }t        | |      sD| j                  j                  d      s)| j                  j                  d      sg|j                  rtd|_	        d|_
        |j                  j                  }|j                  |_        |j                          |j                          t        j                   | t#        d             t%        j&                  | j                  j(                  |j                  j*                  dd	d
ddt-        d      d|j.                   z   d	       d}K t1        d|i      S )zD
    This method is used to approve bulk of requested work type
    rd  Fr;  r  r  Tr  r  r  r  r  r  r  r  r  r  r{  )r   r  r  r   r   r   r   r   r  r  r  r   r   r  r  r   r   r   r   rX  r   r  r$   r<  r   )r   rd  r{  r<  r  r   s         r   work_type_request_bulk_approver    s]   
 ,,u
C
**S/CF +337727>w(9:||$$%>?||$$%=>%..
 *.&).&!2!>!>!Q!Q.?.L.L+##%""$Wa(N&OPKK))+77HH@TAKN !9:*--./0  F=> 6*++r   c                    t         j                  j                  |      }t        |      }t	        | |d      }t        | |      }| j                  dk(  rt        | dd|i      }t        | j                  |      }t	        | |d      }t        | |      }|j                         rV|j                          t        j                  | t        d             t        |j                  j!                  d      d	z         S t        | dd|i      S )
zx
    This method is used to update work type request instance
    args:
        id : work type request instance id

    r;  r  r  r   z*work_type_request/request_update_form.htmlr   Request Updated Successfullyr  r  )r   r   r   rf   rg   r?  r   r"   r   r  r  r   r   r   r   rs  r  )r   work_type_request_idr  r   rt  s        r   work_type_request_updater  7  s     (//337K3L(9:Dgt-JKD$Wd3D~~8
 #7<<:KL!'41NO($7==?IIKWa(F&GH  ''03XX  'G&RVXXr   c                 Z   	 t         j                  j                  |      }|j                  }t	        j
                  | t        d             |j                          t        j                  | j                  j                  |j                  ddddddd	
	       | j                   j                  dd      }|r}|dk(  rx| j"                  j                  d      }t%        j&                  |      }||v r|j)                  |       t+        t%        j&                  |      |      \  }}t-        d| d|       S |rf|dk(  ra| j"                  j/                         }	t         j                  j1                         }
|
j3                         rt-        d|	       S t5        d      S |r|dk(  rrt-        d|j6                         S t5        d      S # t         j                  $ r% d}t	        j                  | t        d             Y ft        $ r# t	        j                  | t        d             Y w xY w)o
    This method is used to delete work type request
    args:
        id : work type request instance id

    r;  Work type request deleted.(Your work type request has been deleted.'   تم حذف طلب نوع وظيفتك.'   Ihre Arbeitstypanfrage wurde gelöscht.2Su solicitud de tipo de trabajo ha sido eliminada.4   Votre demande de type de travail a été supprimée.#trashr  Nr  z)You cannot delete this work type request.r.  r  r  z/work-type-request-single-view/z/?instances_ids=r  r  r   r  r  )r   r   r   r   r   r   r   r  r   rX  r   r   r  r  r   r   rZ  r/  r  r  r  rh   r!   r	   r  r   r   r<  )r   r  r  r  rD  r  r  r  r  r  r  s              r   work_type_request_deleter  Z  s   P+337767B$00!$@"AB  "LL%%//;==HJ
	
    !148IY"<<8M2^#!!&)+:JJ}%v,
(= -m_<L^L\]
 	
 
y$44--/,4488:$$&8HII KLL	yN2x.x{{m<==GHH9 '' Cw"@ AB Pw"M NOPs   BG 4H*?'H*)H*c                 |   t         j                  j                  |      j                         }|| j                  j                  d      d}| j                  j                  d      }|r3t        j                  |      }t        ||      \  }}||d<   ||d<   ||d<   t        |       \  |d<   |d	<   t        | d
|      S )zE
    This method is used to view details of an work type request
    r;  r  )r  r  r  r  r  r-  r  r  z9work_type_request/htmx/work_type_request_single_view.html)r   r   r   r  r/  r   r  r  rh   r  r"   )r   r  r  r  requests_ids_jsonr  r  r  s           r   work_type_request_single_viewr    s    
 (//66&6AGGI.[[__[1G  8zz"34.|VDW"3)
!:Q;7GNW%67 C r   zbase.delete_worktyperequestc                    | j                   d   }t        j                  |      }|D ]  }	 t        j                  j                  |      }|j                  j                  }|j                          t        j                  | t        d             t        j                  | j                  j                  |dddddd	d
	       d} t+        di      S # t        j                   $ r" t        j"                  | t        d             Y Et$        $ rG t        j"                  | t        d      j'                  j                  |j(                               Y w xY w)r  rd  r;  r  r  r  r  r  r  r  r  r  r  zCYou cannot delete {employee} work type request for the date {date}.r  r  Tr{  )r   r  r  r   r   r   r   r  r  r   r   r   r   rX  r   r   r  r   r   r  requested_dater   )r   rd  r<  r  r   r{  s         r   work_type_request_bulk_deleter    s9    ,,u
C
**S/C 	 / 7 7 ; ;r ; B$00AAD$$&Wa(D&EFKK))?AALN
. ;< 6*++ ++ 	GNN7A&D$EF 		NNY&.::*99  			s   BC2EAEEc                 2   t               }| j                  j                  j                  }| j                  j                  d      r| j                  j                  d      }t        d|i      }t        | |d      }t        | |      }t               }| j                  dk(  rQt        | j                        }t        | |d      }t        | |      }t        | d||d      }|j                         r|j                         }	 t        j                  |j                   |j                   j"                  j$                  j&                  d|j                    d	|j                    d
|j                    dd|j                    d|j                    dt)        d      d|j                   z   	       t-        j.                  | t1        d             t3        |j4                  j7                  d      dz         S t        | d||d      S # t*        $ r
}Y d}~dd}~ww xY w)z5
    This method is used to create shift request
    r  r   r   base.add_shiftrequestr   z1shift_request/htmx/shift_request_create_form.htmlr   r  zBYou have new shift request to approve                         for uC   لديك طلب وردية جديد للموافقة عليه لـ uB   Sie müssen eine neue Schichtanfrage                         für z genehmigenzMTiene una nueva solicitud de turno para                         aprobar para u\   Vous avez une nouvelle demande de quart de                        travail à approuver pour r  shift-request-viewr  r  NzShift request addedr  r  )r`   r   r   r<  r/  r   rg   r?  r7   r   r   r"   r  r  r   rX  r   r   r   r  r$   r   r   r   r   r   rs  r  )r   r   r  r  rt  r   rl  s          r   shift_requestr    s    D||((++H{{x ;;??8,]H$=>DD
 %Wd3DA~~-!'41HI($7?"

 ==?yy{H(( ,,??TTee%1124abjbvbvawx&223;@&&.&:&:%;=33;3G3G2HJ&$%9:tHKK==QQ& Wa(=&>?  ''03XX  ;A   s   B+H 	HHc                    | j                   j                  d      }t               }t        j                  j                  |      j                         }|j                  j                  dd      }t        j                  j                  |      }||j                  d   _        d|i}t        d	|      }t        |      S )
Nr  r;  r   Tr  re  reallocate_tor   z2shift_request/htmx/shift_reallocate_employees.html)r/  r   r]   r   r   r   r  employeeworkinformation_setr  r   r=  r>  r#   r   )r   rB  r   r  r  r  html_templates          r   update_employee_allocationr    s     KKOOJ'E D!!((E(288:E44@@D A L   ''|'<I,5DKK )tnG$<gM &&r   c                 T   t               }| j                  j                  d      r)| j                  j                  d      }t        d|i      }t        | |d      }t	        | |      }t               }| j                  dk(  rt        | j                        }t        | |d      }t	        | |      }t        | d||d      }|j                         r|j                         }|j                  d   }	 t        j                  |j                  |j                  j                  j                   j"                  d	|j                   d
d|j                   d
d|j                   d
d|j                   d
d|j                   d
dt%        d      d|j&                   z   	       	 t        j                  |j                  |d|j                   d
d|j                   d
d|j                   d
d|j                   d
d|j                   d
dt%        d      d|j&                   z   	       t+        j,                  | t/        d             t1        |j2                  j5                  d      dz         S t        | d||d      S # t(        $ r
}Y d}~d}~ww xY w# t(        $ r
}Y d}~zd}~ww xY w)zB
    This method is used to create shift request reallocation
    r  r   r   r  r   z-shift_request/htmx/shift_allocation_form.htmlr  r  9You have a new shift reallocation request to approve for .h   لديك طلب تخصيص جديد للورديات يتعين عليك الموافقة عليه لـ W   Sie haben eine neue Anfrage zur Verschiebung der Schichtzuteilung zur Genehmigung für H   Tienes una nueva solicitud de reasignación de turnos para aprobar para L   Vous avez une nouvelle demande de réaffectation de shift à approuver pour r  r  r  r  N/You have a new shift reallocation request from :   لديك طلب تخصيص جديد للورديات من FSie haben eine neue Anfrage zur Verschiebung der Schichtzuteilung von 9   Tienes una nueva solicitud de reasignación de turnos de =   Vous avez une nouvelle demande de réaffectation de shift de zRequest Addedr  r  )r]   r/  r   rg   r?  r7   r   r   r"   r  r  r  r   rX  r   r   r   r  r$   r<  r   r   r   r   r   rs  r  )r   r   r  r  rt  r   reallocate_emprl  s           r   shift_request_allocationr  *  s     D{{x ;;??8,"M8+DED
 %Wd3DA~~"7<<0!'41HI($7;"

 ==?yy{H!..?N(( ,,??TTeeTU]UiUiTjjkl G  HP  H\  H\  G]  ]^  _uv~  wK  wK  vL  LM  Nfgog{g{f||}~jkskk  kA  AB  C&$%9:tHKK==QQ ((,J8K_K_J``abXYaYmYmXnnopdemeyeydzz{|WX`XlXlWmmno[\d\p\p[qqrs&$%9:tHKK==QQ
 Wa&89  ''03XX  7A -    s&   1B/I> !BJ >	JJ	J'"J'c                    | j                   j                         }t        j                  j	                  | j
                        j                         }t        | t        j                  j	                  d      d      }|t        j                  j	                  |      z  }|j	                  d      }t        | t        j                  j	                  d      d      }t        j                  j	                  d      }| j
                  j                  d      s(|j	                  t        |      t        |      z        }||z  }t        j                  t        || j                   j                  d	            j                  D cg c]  }|j                    c}      }t        j                  t        || j                   j                  d	            j                  D cg c]  }|j                    c}      }t#        | j                   |
      }	t%        |      }
t'        t        |
       t)               }t+        | |d      }t-        | |      }t/        | dt        || j                   j                  d	            t        |	j0                  | j                   j                  d	            |	||
||t2        j4                  d      S c c}w c c}w )zG
    This method renders all shift request instances to a template
    r:  Treallocate_to__isnullbase.view_shiftrequestr#  r  Fr  r  r  r  z%shift_request/shift_request_view.html)allocated_datar  r  r   r  r  allocated_idsr  )r/  r	   r   r   r   r   r  rj   r   r  r   r  r  rq   r   r  r<  r7   r   rn   r`   rg   r?  r"   r  r8   r=  )r   r  r  shift_requestsallocated_shift_requestsallocated_requestsr   r  r  r  r  r   s               r   shift_request_viewr  r  sl   
 KK))+M&&&EKKMH'##$#? N
 $l&:&:&A&Ah&A&WWN#**$*GN1##%#@  
 &--4454Q<<  !9:/66H%h(??
  8:LL:: * 7k		
 KK	
L JJ *('++//&*Ak		
 KK	
M 	7;;@A'IlI.DD
 %Wd3D/+('++//&*A "!$$(?@$(*,33	
 5	
	
s   K Kr  c                     | j                   j                  d      dk(  r't               }t               }||d}t	        | d|      S t        | t        t        t        d      S )Nr  r  r  z'shift_request/shift_request_export.htmlr  Shift_requests)rZ  r   r^   r7   r"   ri   r   )r   r  r  r  s       r   shift_request_exportr    sp     ||)*f4.0*, +*
 >
 	
  r   c                 	   t         j                  j                  | j                        j	                         }| j
                  j                         }| j
                  j                  d      }t        | j
                        }t        | |j                  d      }t        | |j                  d      d      }||j                  | j                        z  }t        | |j                  d      d      }| j                  j                  d	      s+||j                  t        |
      t        |      z        z  }t        j                  t!        || j
                  j                  d            j"                  D cg c]  }|j$                   c}      }t        j                  t!        || j
                  j                  d            j"                  D cg c]  }|j$                   c}      }	t'        |      }
d}|dk7  r|t)        ||| j
                  j                  d      d      }t)        ||| j
                  j                  d      d      }|D cg c]  }|d   	 }}|D cg c]  }|d   	 }}g }g }|D ].  }|j"                  D ]  }|j+                  |j$                          0 |D ].  }|j"                  D ]  }|j+                  |j$                          0 t        j                  t-        |            }t        j                  t-        |            }	d}nt!        || j
                  j                  d            }t!        || j
                  j                  d            }t        j                  t!        || j
                  j                  d            j"                  D cg c]  }|j$                   c}      }t        j                  t!        || j
                  j                  d            j"                  D cg c]  }|j$                   c}      }	t/        t0        |
       t3        | ||t!        || j
                  j                  d            ||
||	|d      S c c}w c c}w c c}w c c}w c c}w c c}w )ze
    This method is used search shift request by employee and also used to filter shift request.
    r:  r&  rs   Tr	  r  employee_id__employee_user_idFr  r  r#  r  z shift_request/htmx/requests.htmlrI  r  z shift_request/htmx/group_by.html)r  r  r  r  r  r  r&  )r   r   r   r   r  r/  r	   r   r7   rs   r  rj   r  r   r  r  rq   r  r<  r   r   r  r  rn   r   r"   )r   r  r  r&  r  r  r  r   r  r  r  r  r  shift_list_valuesallocated_list_valuesshift_id_listallocated_id_listr  s                     r   shift_request_searchr    s    &&&EKKMHKK))+MKKOOG$E7;;'Awh'A'57NN $ahh&-ll '/ ' N  268O  <<  !9:#;ahhH%h(???
 $
  :: * 7k		
 KK	
L JJ *('++//&*Ak		
 KK	
M 'I1H{u(*E7;;??6#:F
 $5$eW[[__V-Df$
  9GGuU6]GG<T U5v U U& 	2E!-- 2$$X[[12	2 + 	6E!-- 6!((56	6 zz$}"56

4(9#:;5 '~w{{v7NO#0$gkkoof&=$
  zz !."GKKOOF$;!+	 
 

 !.,gkkoof.E!+	 
 lI.6!.'++//&2IJ$(*	
 G	
	
" H U,s$   9Q$Q)Q.'Q3(Q8Q=c                 "   t        j                  |      }| j                  j                  d      }|| j                  j                  d      d}|r3t	        j
                  |      }t        ||      \  }}||d<   ||d<   ||d<   t        | d|      S )w
    This method is used to show shift request details in a modal
    args:
        id : shift request instance id
    r  r  r  r  r  r-  r  z,shift_request/htmx/shift_request_detail.htmlr   r  r/  r   r  r  rh   r"   r   r<  r  r  r  r  r  r  s           r   shift_request_detailsr#  >  s     !%%b)M8&[[__[1G zz"34.|R@W)
!"36 r   c                 "   t        j                  |      }| j                  j                  d      }|| j                  j                  d      d}|r3t	        j
                  |      }t        ||      \  }}||d<   ||d<   ||d<   t        | d|      S )r  r  r  r   r  r-  allocation_idsz*shift_request/htmx/allocation_details.htmlr!  r"  s           r    shift_allocation_request_detailsr&  Y  s     !%%b)M8&[[__[1G zz"34.|R@W)
!$5 !4 r   c                 ~   t         j                  j                  |      }t        |      }t	        | |d      }t        | |      }| j                  dk(  r|j                  st        | dd|i      }t        | j                  |      }t	        | |d      }t        | |      }|j                         r|j                          t        j                  | t        d             t        |j                   j#                  d      d	z         S t        j$                  | t        d
             t        d	      S t        | dd|i      S )o
    This method is used to update shift request instance
    args:
        id : shift request instance id
    r;  r  base.change_shiftrequestr   &shift_request/request_update_form.htmlr   r  r  r  z!Can't edit approved shift request)r   r   r   r`   rg   r?  r   r  r"   r   r  r  r   r   r   r   rs  r  r[  )r   shift_request_idr  r   rt  s        r   shift_request_updater,  t  s&    !((,,0@,AM]3Dgt-GHD$Wd3D~~%%8DH $GLL=ID%gt5OPD,Wd;D}}		  !,J*KL#$$++G4;< 
 MM'1%H#IJ EFF'Cfd^TTr   c                    t         j                  j                  |      }t        |      }t	        | |d      }t        | |      }| j                  dk(  rt        | dd|i      }t        | j                  |      }t	        | |d      }t        | |      }|j                         r|j                          |j                         }|j                  d   }	 t        j                  |j                  |j                  j                  j                   j"                  d|j                   d	d
|j                   d	d|j                   d	d|j                   d	d|j                   d	dt%        d      d|j&                   z   	       	 t        j                  |j                  |d|j                   d	d|j                   d	d|j                   d	d|j                   d	d|j                   d	dt%        d      d|j&                   z   	       t+        j,                  | t/        d             t1        |j2                  j5                  d      dz         S t        | dd|i      S # t(        $ r
}Y d}~d}~ww xY w# t(        $ r
}Y d}~yd}~ww xY w)r(  r;  r  r)  r   r*  r   r  r  r  r  r  r  r   r  r  r  r  Nr  r  r  r  r  r  r  r  z1shift_request/allocation_request_update_form.html)r   r   r   r]   rg   r?  r   r"   r   r  r  r  r   rX  r   r   r   r  r$   r<  r   r   r   r   r   rs  r  )r   r+  r  r   rt  r   r  rl  s           r   shift_allocation_request_updater.    s    !((,,0@,AM6Dgt-GHD$Wd3D~~4
 #7<<-H!'41KL($7==?IIKyy{H!..?N(( ,,??TTeeTU]UiUiTjjkl G  HP  H\  H\  G]  ]^  _uv~  wK  wK  vL  LM  Nfgog{g{f||}~jkskk  kA  AB  C&$%9:tHKK==QQ ((,J8K_K_J``abXYaYmYmXnnopdemeyeydzz{|WX`XlXlWmmno[\d\p\p[qqrs&$%9:tHKK==QQ
 Wa(F&GH  ''03XX  Dvtn -    s&   B/I" BI8 "	I50I58	JJc                    t        j                  |      }|sDt        j                  | t	        d             t        | j                  j                  dd            S t        | |      s| j                  j                  d      sv|j                  | j                  j                  k(  r|j                  dk(  sDt        j                  | t	        d             t        | j                  j                  dd            S t        j                         j!                         }|j                  rw|j"                  |cxk  r|j$                  k  rXn nU|j&                  sI|j(                  |j                  j*                  _        |j                  j*                  j/                          d|_        d|_        t2        j4                  j7                  |j                        }|j9                         r%|j(                  |j                  j*                  _        |j:                  rY|j9                         rI|j,                  |j:                  j*                  _        |j:                  j*                  j/                          |j9                         r$|j                  j*                  j/                          |j/                          t        j<                  | t	        d	             t?        j@                  | j                  j                  |j                  jB                  d
ddddtE        d      d|jF                   z   d	       |j:                  r_t?        j@                  | j                  j                  |j:                  jB                  dddddtE        d      d|jF                   z   d	       t        | j                  j                  dd            S )h
    This method is used to update or cancel shift request
    args:
        id : shift request id

    Shift request not found.rT  r   base.cancel_shiftrequestFr  Tr#  zShift request rejected%Your shift request has been canceled.(   تم إلغاء طلبك للوردية."Ihr Schichtantrag wurde storniert.&Se ha cancelado su solicitud de turno.(   Votre demande de quart a été annulée.r  r  r  r  z%Your shift request has been rejected.)$r   r  r   r   r   r   rZ  r   r   r   r  r   r   r  r   r  r  r  requested_tillis_permanent_shiftprevious_shift_idr   r  r  r  r   r   r   r   r  r   r   rX  r  r$   r<  )r   r<  r  
today_dater  s        r   shift_request_cancelr<    s    !%%b)Mw"< =>#GLL$4$4^S$IJJ7M2<<  !;<$$(A(AA""e+w"= >?#GLL$4$4^S$IJJ!&&(J((JV-:V:VV00 ++ 	!!44= 	!!4499;!M"M'//66!-- 7 I ++ 	!!44= ""y'7'7'9BOBXBX##66?##66;;=!!4499;Wa 89:
KK!!++<<4:48:-.48H8H7I1JJ
 ""LL%%#11BB8>8<>12tM<L<L;M5NN
	
   0 0 EFFr   c                    t        j                  |      }d|_        d|_        t        j
                  j                  |j                        }|j                         rI|j                  |j                  j                  _        |j                  j                  j                          |j                          t        j                  | t        d             t!        j"                  | j$                  j&                  |j                  j(                  ddddd	t+        d
      d|j,                   z   d	       t/        | j0                  j3                  dd            S )r0  TFr#  Shift request canceledr3  r4  r5  r6  r7  r  r  r  r  rT  r   )r   r  reallocate_canceledreallocate_approvedr   r   r   r   r   r:  r   r  r  r   r   r   r   rX  r   r   r  r$   r<  r   rZ  r   )r   r<  r  r  s       r   shift_allocation_request_cancelrA  '  s#    !%%b)M(,M%(-M%'//66!-- 7 I ++ 	!!44= 	!!4499;Wa 89:
KK!!++<<4:48:-.48H8H7I1JJ
   0 0 EFFr   r)  c                    | j                   d   }t        j                  |      }d}|D ]%  }t        j                  j                  |      }t        | |      sO| j                  j                  d      s4|j                  | j                  j                  k(  so|j                  dk(  sd|_        d|_        |j                  |j                  j                  _        |j                   rI|j                  |j                   j                  _        |j                   j                  j#                          |j                  j                  j#                          |j#                          t%        j&                  | t)        d             t+        j,                  | j                  j                  |j                  j.                  ddd	d
dt1        d      d|j2                   z   d	       |j                   r_t+        j,                  | j                  j                  |j                  j.                  ddd	d
dt1        d      d|j2                   z   d	       d}( t5        d|i      S )zA
    This method is used to cancel a bunch of shift request.
    rd  Fr;  r2  Tr>  r3  r4  r5  r6  r7  r  r  r  r  r{  )r   r  r  r   r   r   r   r   r  r   r   r  r  r:  r   r  r  r  r   r   r   r   rX  r  r$   r<  r   )r   rd  r{  r<  r  s        r   shift_request_bulk_cancelrC  M  s
    ,,u
C
**S/CF .$,,00B07w6||$$%?@((GLL,E,EE&&%/%)M"%*M"// %%88A **!** ++>>G ++>>CCE%%88==? Wa(@&ABKK))'33DD<B<@B !564@P@P?Q9RR
 **LL--+77HH@F@DF$%9:tMDTDTCU=VV 
 F].^ 6*++r   c                 4   t        j                  |      }|sDt        j                  | t	        d             t        | j                  j                  dd            S | j                  }t        | |      sr|j                  d      sa|j                  d      r|j                  rDt        j                  | t	        d             t        | j                  j                  dd            S |j                         rDt        j                  | t	        d             t        | j                  j                  dd            S t        j                         j                         }|j                   sk|j"                  |cxk  r|j$                  k  rLn nI|j&                  |j(                  j*                  _        |j(                  j*                  j-                          d|_        d	|_        |j0                  rI|j2                  |j0                  j*                  _        |j0                  j*                  j-                          |j-                          t        j4                  | t	        d
             |j(                  j6                  g}|j0                  r%|j9                  |j0                  j6                         |D ]C  }t;        j<                  |j>                  |dddddtA        d      d|jB                   z   d	       E t        | j                  j                  dd            S )zP
    Approve shift request
    args:
        id : shift request instance id
    r1  rT  r   approve_shiftrequestchange_shiftrequestr  AAn approved shift request already exists during this time period.TFzShift has been approved.%Your shift request has been approved.7   تمت الموافقة على طلبك للوردية."Ihr Schichtantrag wurde genehmigt.%Se ha aprobado su solicitud de turno.*   Votre demande de quart a été approuvée.r  r  r  r  )"r   r  r   r   r   r   rZ  r   r   r   r  r  is_any_request_existsr   r  r  r9  r  r8  r  r   r   r  r  r  r:  r   r  r  r   rX  r   r$   r<  )r   r<  r  r   r;  
recipientsr  s          r   shift_request_approverO    sy    !%%b)Mw"< =>#GLL$4$4^S$IJJ<<D7M2==/0==./&&w"= >?#GLL$4$4^S$IJJ**,QR	
 $GLL$4$4^S$IJJ!&&(J++'':U9U9UU&& %%88A %%88==?!M"M""++ 	##66? 	##66;;=Wa :;<++<<=J""-55FFG 
	8M8;@12tM<L<L;M5NN
	

   0 0 EFFr   c                 >   t        j                  |      }|j                         s4d|_        d|_        |j                          t        j                  | t        d             t        j                  | j                  j                  |j                  j                  | j                  j                   d| j                  j                   d| j                  j                   d| j                  j                   d| j                  j                   dt        d	      d
|j                    z   d	       t#        | j$                  j'                  dd            S t        j(                  | t        d             t#        | j$                  j'                  dd            S )zg
    This method is used to approve shift request
    args:
        id : shift request instance id
    TFz)You are available for shift reallocation.z% is available for shift reallocation.u3    متاح لإعادة توزيع الورديات.uA    steht für die Verschiebung der Schichtzuteilung zur Verfügung.u2    está disponible para la reasignación de turnos.u0    est disponible pour la réaffectation de shift.r  r  r  r  rT  r   rG  )r   r  rM  r@  r?  r  r   r   r   r   rX  r   r   r   r  r$   r<  r   rZ  r   r   )r   r<  r  s      r    shift_allocation_request_approverQ    s[    !%%b)M..0,0),1)!$O"PQLL%%#//@@LL--..ST||0011de||0011rs||0011cd||0011ab12tM<L<L;M5NN
	
 $GLL$4$4^S$IJJQR	
 $GLL$4$4^S$IJJr   c                    | j                   d   }t        j                  |      }d}|D ]  }t        j                  j                  |      }t        | |      sD| j                  j                  d      s)| j                  j                  d      r6|j                  s)	 d|_	        d|_
        |j                  rI|j                  |j                  j                  _        |j                  j                  j                          |j                   j                  }|j                  |_        |j                          |j                          t#        j$                  | t'        d             t)        j*                  | j                  j,                  |j                   j.                  dd	d
ddt1        d      d|j2                   z   d	       d} t5        d|i      S )zA
    This method is used to approve a bunch of shift request
    rd  Fr;  rE  rF  TzShifts have been approved.rH  rI  rJ  rK  rL  r  r  r  r  r{  )r   r  r  r   r   r   r   r   r  r  r  r  r:  r   r  r  r   r   r   r   r   rX  r   r  r$   r<  r   )r   rd  r{  r<  r  r   s         r   shift_request_bulk_approverS    s    ,,u
C
**S/CF $$,,00B07w6||$$%;<||$$%:;!** &*M"%*M"**!33 ++>>G ++>>CCE!.!:!:!M!M*7*@*@'##% Wa(D&EFKK))'33DD<Q<?D !564@P@P?Q9RR 
 I$J 6*++r   c                    	 t        j                  |      }|j                  j                  }t	        j
                  | d       |j                          t        j                  | j                  j                  |ddddddd		       | j                  j!                  dd      }|r3|dk(  r.j                  r"t#        d|j                  j$                         S t'        | j                  j!                  dd            S # t         j                  $ r" t	        j                  | t        d
             Y t        $ r" t	        j                  | t        d             Y w xY w)p
    This method is used to delete shift request instance
    args:
        id : shift request instance id

    zShift request deleted$Your shift request has been deleted.2   تم حذف طلب الوردية الخاص بك."   Ihr Schichtantrag wurde gelöscht.&Se ha eliminado su solicitud de turno.*   Votre demande de quart a été supprimée.r  r  r  r1  z%You cannot delete this shift request.r.  Nr  r  rT  r   )r   r  r   r  r   r   r  r   rX  r   r   r  r   r   r   rZ  r   r!   r<  r   )r   r<  r  r   rD  s        r   shift_request_deleter[  $  s'   L$))"-((99"9:LL%%7H8<@
	
"   !148IY.0]5N5N.}/H/H/K/K.LMNN 0 0 EFF $$ ?w"< => Lw"I JKLs   BC; ;2E/'EEdelete_shiftrequestc                    | j                   d   }t        j                  |      }d}|D ]  }	 t        j                  j                  |      }|j                  j                  }|j                          t        j                  | t        d             t        j                  | j                  j                  |ddddd	d
d	       d} t+        d|i      S # t        j                   $ r" t        j"                  | t        d             Y Et$        $ rG t        j"                  | t        d      j'                  j                  |j(                               Y w xY w)rU  rd  Fr;  zShift request deleted.rV  rW  rX  rY  rZ  r  r  r  r1  z?You cannot delete {employee} shift request for the date {date}.r  Tr{  )r   r  r  r   r   r   r   r  r  r   r   r   r   rX  r   r   r  r   r   r  r  r   )r   rd  r{  r<  r  r   s         r   shift_request_bulk_deleter^  I  s=    ,,u
C
**S/CF 	(00444;M ,,==D  "Wa(@&ABKK));L<@D
. ;< 6*++ (( 	CNN7A&@$AB 		NNU&*66&55  			s   BC2E	AEEc                 h    | j                   j                  j                         }t        | dd|i      S )z4
    This method will render notification items
    $notification/notification_items.htmlnotifications)r   ra  unreadr"   )r   all_notificationss     r   ra  ra  w  s9    
  2299;.	+, r   c                 d   	 | j                   j                  j                         j                          t	        j
                  | t        d             | j                   j                  j                         }t        | dd|i      S # t        $ r }t	        j                  | |       Y d}~Wd}~ww xY w)z3
    This method is used to clear notification
    zUnread notifications removed.Nr`  ra  )
r   ra  rb  r  r   r   r   r   r   r"   r   rl  ra  s      r   clear_notificationrf    s    
#""))+224!$C"DE LL..557M.	-(   #w""#   AB 	B/B**B/c                    	 | j                   j                  j                         j                          | j                   j                  j	                         j                          t        j                  | t        d             | j                   j                  j                         }t        | dd|i      S # t        $ r }t        j                  | |       Y d }~Wd }~ww xY w)NzAll notifications removed.#notification/all_notifications.htmlra  )r   ra  rU  r  rb  r   r   r   r   r   r  r"   re  s      r   delete_all_notificationsrj    s    #""'')002""))+224!$@"AB LL..224M6-8X   #w""#s   BB8 8	C!CC!c                 h   d}	 | j                   j                  j                  |      j                          t	        j
                  | t        d             | j                   j                  j                         sd}t        |      S # t        $ r }t	        j                  | |       Y d}~Ud}~ww xY w)z4
    This method is used to delete notification
    rI  r;  zNotification deleted.Nz\<span hx-get='/all-notifications' hx-target='#allNotificationBody' hx-trigger='load'></span>)r   ra  r   r  r   r   r   r   r   r  r   )r   r<  scriptrl  s       r   delete_notificationrm    s    
 F#""&&"&-446!$;"<= <<%%))+s	  #w""#s   AB 	B1B,,B1c                     d}t         j                  j                  |      }|j                          | j                  j
                  j                         sd}t        |      S )NrI  r;  zZ<span hx-get='/notifications' hx-target='#notificationContainer' hx-trigger='load'></span>)r   r   r   mark_as_readr   ra  rb  r   )r   notification_idrl  notifications       r   mark_as_read_notificationrr    sR    F''+++?L<<%%,,.qr   c                     	 | j                   d   }t        |      }t        j                  j	                  |      }|j                          t        ddi      S #  t        ddd      cY S xY w)Nrp  r;  r   TFzInvalid request)r   r   )r   r=  r   r   r   ro  r   )r   rp  rq  s      r   mark_as_read_notification_jsonrt    so    L!,,'89o.#++//?/C!!#Y-..L8IJKKs   AA A+c                 d   	 | j                   j                  j                         j                          t	        j
                  | t        d             | j                   j                  j                         }t        | dd|i      S # t        $ r }t	        j                  | |       Y d}~Wd}~ww xY w)z9
    This method is to mark as read the notification
    zNotifications marked as readNr`  ra  )r   ra  r  mark_all_as_readr   r[  r   r   r   rb  r"   re  s      r   read_notificationsrw    s    
#""&&(99;gq!?@A LL..557M.	-( 	  #w""#rg  c                 d    t        | dd| j                  j                  j                         i      S )z=
    This method to render all notifications to template
    ri  ra  )r"   r   ra  r  r   s    r   rc  rc    s2    
 -	',,4488:; r   c                    t        j                  d      rmt        dd      }t        dd      }ddlm} ddlm} |j                  j                         } ||      }|j                  j                         } ||      }nd	}d	}| j                  j                  d
      }	|	dk(  s|	st        j                  j                         }
n t        j                  j                  |	      }
t        j                  j                         }t        |      }t         j                  j                         }t#        |      }t$        j                  j'                         xr( t$        j                  j                         j(                  }t*        j                  j'                         xr( t*        j                  j                         j(                  }t,        j                  j                         }i }|r|j.                  rd|j.                  d   i}t1        |      }t2        j                  j                  | j4                        j'                         rEt2        j                  j                  | j4                        j                         }t7        |      }n
t7               }| j8                  dk(  r{t#        | j:                  |      }|j=                         rT|j?                          tA        jB                  | tE        d             tG        | jH                  j                  dd            S tK        | d||||||||||
|	d      S )z9
    This method is used to render settings template
    r   payrollsettingsr  encashmentgeneralsettingsr   )PayrollSettingsForm)EncashmentGeneralSettingsFormr  Nselected_companyr  r;  tracking_fieldsr   user_idr   Settings updated.rT  r   zbase/general_settings.html)r   currency_formpagination_formencashment_formhistory_fields_formhistory_tracking_instanceenabled_block_unblockenabled_profile_editprefix_formr  selected_company_id)&r   r   r   payroll.forms.component_formsr|  payroll.forms.formsr}  r   r  sessionr   r{   r  r   r   r   rw   r;   r   r   
is_enabledr   r   r  r   r   r   rF   r   r   r  r  r   r   r   r   rZ  r"   )r   PayrollSettingsEncashmentGeneralSettingsr|  r}  currency_instancer  encashment_instancer  r  r  prefix_instancer  r   r   r  r  r  history_fields_form_initialr  
paginationr  s                         r   general_settingsr    s   
 #1'8
 %<'B%
! 	FE+3399;+5FG7??EEG7ATU!//--.@Ae#+>OO'')	OO**.A*B	 -44::<O2OLK!))//1H!84D##**, 	;''--/:: 
 	""))+ 	:&&,,.99  !6 = = C C E"$ %>%N%N8HH! '
#
 4<WX  '''=DDF&..55gll5KQQS
/D/1~~%gllXF==?IIKWa(;&<='(8(8(MNN$*..#6)B%:$8&"#6	
 r   c                     t        | d      S )zH
    This method is used to render Date format selector in settings
    zbase/company/date.htmlr   r   s    r   date_settingsr  <  s     '344r   c                    | j                   dk(  rW| j                  j                  d      }t        |      s!t	        j
                  | t        d             n| j                  }|j                  }t        j                  j                  |      }|j                         r|D ]  }|j                  } t        j                  j                        }|j                         }| t	        j                   | t        d             nV||_        |j%                          t	        j&                  | t        d             nt	        j                   | t        d             t)        d	d
i      S t)        dddd      S )Nr   selected_formatz"Please select a valid date format.r#  r  -Please update the company field for the user.zDate format saved successfully.z5Date format cannot saved. You are not in the company.r   TFUnsupported methodr   r     status)r   r   r   r  r   r   r   r   r   r   r   r   r   r  r{   r  r   date_formatr  r   r   	r   r  r   r  r[  r  employee_companycompany_nameemp_companys	            r   save_date_formatr  E  F    ~~!,,**+<=?#NN7A&J$KL<<D((H +2299h9OD{{}  7D'+$7  '55>N5O*002&$$#R!S
 />K+$$&$$Wa0Q.RS  QVW
  D 122 %2FGPSTTr   c                 b   | j                   }|j                  }t        j                  j	                  |      }|j                         rY|D ]  }|j                  } t        j                  j	                        }|j                         }|r|r|j                  nd}nd}nd}t        d|i      S )Nr#  r  zMMM. D, YYYYr  )r   r   r   r   r   r   r  r{   r  r  r   )	r   r   r  r[  r  r  r  r  r  s	            r   get_date_formatr  q  s    <<D  H #**11h1GD{{} 	/D#	/--6F-G"((*5@+11nK(K$*K899r   c                    | j                   dk(  rW| j                  j                  d      }t        |      s!t	        j
                  | t        d             n| j                  }|j                  }t        j                  j                  |      }|j                         r|D ]  }|j                  } t        j                  j                        }|j                         }| t	        j                   | t        d             nV||_        |j%                          t	        j&                  | t        d             nt	        j                   | t        d             t)        d	d
i      S t)        dddd      S )Nr   r  z"Please select a valid time format.r#  r  r  zTime format saved successfully.z5Time format cannot saved. You are not in the company.r   TFr  r  r  r  )r   r   r   r  r   r   r   r   r   r   r   r   r   r  r{   r  r   time_formatr  r   r   r  s	            r   save_time_formatr    r  r   c                 Z   | j                   }|j                  }t        j                  j	                  |      }|j                         rU|D ]  }|j                  } t        j                  j	                        }|j                         }|r|j                  }nd}nd}t        d|i      S )Nr#  r  zhh:mm Ar  )r   r   r   r   r   r   r  r{   r  r  r   )	r   r   r  r[  r  r  r  r  r  s	            r   get_time_formatr    s    <<D  H #**11h1GD{{} 	/D#	/--6F-G"((*%11K#K*K899r   c                    | j                   dk(  r| j                  j                  d      }| j                  j                  d      }t        j
                  j                  ddd|ii      \  }}|sLd|i|_        |dk(  rd|_        nd|_        t        j                  | t        d	             |j                          t        t              S )
Nr   r  work_info_trackr  )r  defaultsonTFr  )r   r   r  r   r   r   r  r  r  r   r   r   r  r!   r  )r   r=  checkhistory_objectcreateds        r   history_field_settingsr    s    ~~%%&78  !23"7"?"?"M"M-0A6/JK #N #
 .?-HN*}15.16.Wa(;&<=!$%%r   z(horilla_audit.change_accountblockunblockc                    | j                   dk(  r| j                  j                  d      dk(  }t        j                  j                         }|r||_        |j                          n t        j                  j                  |       t        j                  | t        d|rdnd d             | j                  j                  d	      r
t               S t        t              S t        d
      S )Nr   enable_block_accountr  r  z'Account block/unblock setting has been enableddisabledr  r  r  r  )r   r   r   r   r   r  r  r  creater   r   r   rZ  r   r!   r  )r   r  r   s      r   enable_account_block_unblockr    s     ~~,,""#9:dB&..446")HMMO''..'.B9w)T^9__`a	
 <<-.>!())s##r   )ACCESSBILITY_FEATUREzemployee.change_employeec                 "   | j                   dk(  rt| j                  j                  d      dk(  }t        j                  j                         }t        j                  j                  d      j                         }|r||_        |j                          n t        j                  j                  |       |r&|s$t        j                  j                  dddgi       |r7t        d	 t        D              s5t        j                  dt        d
      f       nt        j                          t!        j"                  | t        d|rdnd d             | j$                  j                  d      r
t'               S t)        t*              S t'        d      S )Nr   enable_profile_editr  profile_edit)featurer  r  )r  r   c              3   ,   K   | ]  }|d    dk(    yw)r   r  NrU  )r  items     r   r  z.enable_profile_edit_feature.<locals>.<genexpr>  s     RTtAw.0Rs   zProfile Edit AccesszProfile edit feature has been r  r  r  r  r  r  )r   r   r   r   r   r  r,   r   r  r  r  anyr  r  r   r1  r   r   rZ  r   r!   r  )r   r  r   r  s       r   enable_profile_edit_featurer    sL    ~~,,""#89TA%--335&..55n5MSSU")HMMO&&---A7 ((//&	N;K/L 0  R=QRR$++^Q?T=U,VW $$&.Gy.TTUVW	
 <<-.>!())s##r   c                    | j                   j                  d      }|dk(  r| j                  j                  d      rt        j
                  j                         }nUt        j
                  j                  | j                        t        j
                  j                  | j                        z  }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )	Nr  r  r  r  Gemployee_id__employee_work_info__reporting_manager_id__employee_user_idr  total_countFsafe)r/  r   r   r  r   r   r  r   r  r<  ri  r   r   page_numberr  r  r  r  r  s          r   shift_selectr    s    ++//&)Ke<<  !9:$,,002I$,,33.5ll 4 $$++X_XdXd , I ,55CCK5L5//#K+KHGe,, 6   4C4c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w Nr  r   r  r  r  )r/  r   r  r  r7   r   r   r  r  r  r<  ri  r   
r   r  filteredfiltersemployee_filterfiltered_employeesr  r  r  r  s
             r   shift_select_filterr  4  s    ++//&)K{{x(H&.djj"BGe,l22668

 -///ABCFFBB(..0#/LG$$  C   Cc                    | j                   j                  d      }|dk(  r| j                  j                  d      rt        j
                  j                         }nUt        j
                  j                  | j                        t        j
                  j                  | j                        z  }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )	Nr  r  r  r  r  r  Fr  )r/  r   r   r  r   r   r  r   r  r<  ri  r   r  s          r   work_type_selectr  J  s    ++//&)Ke<<  !<='//335I'//66.5ll 7 ''..X_XdXd / I ,55CCK5L5//#K+KHGe,, 6r  c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w r  )r/  r   r  r  r9   r   r   r  r  r  r<  ri  r   r  s
             r   work_type_select_filterr  `  s    ++//&)K{{x(H&.djj"BGe/o5599;

 -///ABCFFBB(..0#/LG$$  Cr  c                    | j                   j                  d      }|dk(  rg| j                  j                  d      r!t        j
                  j                  d      }nIt        j
                  j                  | j                        }nt        j
                  j                         }|D cg c]  }t        |j                         }}|j                         }||d}t        |d	      S c c}w )
Nr  r  rX  Tr  r  r  Fr  )r/  r   r   r  rT   r   r   r  r  r<  ri  r   r  s          r   rotating_shift_selectr  v  s    ++//&)Ke<<  !@A+33::T:JI+33::X_XdXd ; I (//335	+45CCK5L5//#K+KHGe,, 6   *C*c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w r  )r/  r   r  r  r3   rT   r   r  r  r  r<  ri  r   r  s
             r   rotating_shift_select_filterr    s    ++//&)K{{x(H&.djj"BGe4199==?

 -///ABCFFBB(..0#/LG$$  Cr  c                    | j                   j                  d      }|dk(  rg| j                  j                  d      r!t        j
                  j                  d      }nIt        j
                  j                  | j                        }nt        j
                  j                         }|D cg c]  }t        |j                         }}|j                         }||d}t        |d	      S c c}w )
Nr  r  r  Tr  r  r  Fr  )r/  r   r   r  r   r   r   r  r  r<  ri  r   r  s          r   rotating_work_type_selectr    s    ++//&)Ke<<  !CD.66===MI.66==X_XdXd > I +22668	+45CCK5L5//#K+KHGe,, 6r  c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w r  )r/  r   r  r  r5   r   r   r  r  r  r<  ri  r   r  s
             r    rotating_work_type_select_filterr    s    ++//&)K{{x(H&.djj"BGe64<<@@B

 -///ABCFFBB(..0#/LG$$  Cr  zhorilla_audit.view_audittagc                 \    t         j                  j                         }t        | dd|i      S )z0
    This method is used to show Audit tags
    zbase/tags/tags.html	audittags)r   r   r  r"   )r   r  s     r   tag_viewr    s3       $$&I	i  r   zhelpdesk.view_tagc                 \    t         j                  j                         }t        | dd|i      S )z4
    This method is used to show Help desk tags
    zbase/tags/helpdesk_tags.htmltags)r   r   r  r"   )r   r  s     r   helpdesk_tag_viewr    s0     <<D&	 r   zhelpdesk.add_tagc                 $   t               }| j                  dk(  rit        | j                        }|j                         rD|j	                          t               }t        j                  | t        d             t        d      S t        | dd|i      S )E
    This method renders form and template to create Ticket type
    r   "Tag has been created successfully!r   base/tags/tags_form.htmlr   )
ra   r   r   r  r  r   r   r   r   r"   r  s     r   
tag_creater    s}     :D~~%==?IIK:DWa(L&MN KLL"D	
 r   zhelpdesk.change_tagc                 n   t         j                  j                  |      }t        |      }| j                  dk(  rkt        | j
                  |      }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d||d      S )r  r;  r  r   "Tag has been updated successfully!r   r  r   tag_id)r   r   r   ra   r   r   r  r  r   r   r   r   r"   r   r  tagr   s       r   
tag_updater    s     ,,

f

%CS!D~~s3==?IIK:DWa(L&MN KLL"( r   zhorilla_audit.add_audittagc                 $   t               }| j                  dk(  rit        | j                        }|j                         rD|j	                          t               }t        j                  | t        d             t        d      S t        | dd|i      S )r  r   r  r   "base/audit_tag/audit_tag_form.htmlr   )
r>   r   r   r  r  r   r   r   r   r"   r  s     r   audit_tag_creater    s}     >D~~GLL)==?IIK>DWa(L&MN KLL,D	
 r   zhorilla_audit.change_audittagc                 n   t         j                  j                  |      }t        |      }| j                  dk(  rkt        | j
                  |      }|j                         rD|j                          t               }t        j                  | t        d             t        d      S t        | d||d      S )r  r;  r  r   r  r   r  r  )r   r   r   r>   r   r   r  r  r   r   r   r   r"   r  s       r   audit_tag_updater   1  s     



&

)C%D~~GLL37==?IIK>DWa(L&MN KLL,( r   z#base.view_multipleapprovalconditionc                 N   t               }| j                  j                  d      }|dk7  r6t        j                  j                  |      j                  d      d d d   }n3t        j                  j                         j                  d      d d d   }d}t        | d|||d      S )	Nr~  r  r  r  r/  Tz'multi_approval_condition/condition.html)r   
conditionsr  )	rQ   r  r   r   r   r   r  r  r"   )r   r   r~  r  r  s        r   multiple_approval_conditionr  H  s     ()D**+=>5 .66==' > 

(<
 2'
 /66::<EElSbD

 F1Z6B r   c                 2   | j                   j                  d      }|dk7  r6t        j                  j	                  |      j                  d      d d d   }n3t        j                  j                         j                  d      d d d   }t        | dd|i      S )Nr~  r  r  r  r/  z-multi_approval_condition/condition_table.htmlr  )r  r   r   r   r   r  r  r"   )r   r~  r  s      r   hx_multiple_approval_conditionr  ]  s     **+=>5 .66==' > 

(<
 2'
 /66::<EElSbD

 7	z" r   z"base.add_multipleapprovalconditionc                     | j                   j                  d      }t               }|r|dk(  rdnd}||d}t        d|      }t	        |      S )Ncondition_operatorrangeTF)r   r	  z4multi_approval_condition/condition_value_fields.html)r/  r   rQ   r#   r   )r   operatorr   is_ranger  r:  s         r   get_condition_value_fieldsr  q  sU     {{34H')DH$7tUHh/G!>J 
##r   c           
         | j                   j                  d      }|j                  d      }dj                  |d   t	        t        |d         dz         g      }t               }| j                  j                  d      }||d}|rt        |      dz   }d| }d	t        d
      fgt        j                  j                         D cg c]  }|j                  t	        |      f c}z   }	t        j                  |	t        j                  d|d| d      d      |j                   |<   ||d<   ||   j#                         |d<   np|j                   d   j$                  j&                  j)                  dt	        t        |d         dz          dt	        t        |d         dz          d       ||d<   t+        d|      }
t-        |
      S c c}w )Nr.  r   r   r/  r  managers_count)r<  currnet_hx_targetmulti_approval_manager_r   Reporting Managerr8  r1  r2  r4  F)choicesr6  r7  r:  multi_approval_managerid_multi_approval_manager_)r  r<  r   z7multi_approval_condition/add_more_approval_manager.html)rZ  r   r>  r   r  r=  rQ   r/  r   r   r   r  r  r
   ChoiceFieldrB  r=  rC  r6  r5  updater#   r   )r   r  hx_target_splitr<  r   r  r  r  r  r  r:  s              r   add_more_approval_managersr    s     (()9:'--c2OXXq13s?2;N7ORS7S3TUVN')D[[__%56N(.G ^,q0.~.>?
*A.A,BCD9A9I9I9M9M9OH
-5X[[#h-(H
 
 #("3"3<<9&
|, 
#
J %3 ! $Z 0 : : <,-44::AA1#c/":M6NQR6R2S1TU23s?2;N7ORS7S3T2UV	
 !A7J 
##;H
s   Gc                     t               S ry  )r   r   s    r   remove_approval_managerr    s     >r   c                 \   t               }d}| j                  dk(  rt        | j                        }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d	      }	| j                  j	                  d
      }
t
        j                  j                  |	      }t        j                  j                  |      }t               }|j                         r||_
        ||_        ||_        ||_        |dk7  r||_        n||_        ||_        |j#                          d}|
D ]8  }|dz  }d }	 t%        |      }t&        j                  j)                  ||||       : t               }t+        j,                  | t/        d             t1        | d||d      S #  d }|}Y fxY w)NTr   r  condition_fieldr  condition_valuecondition_start_valuecondition_end_valuer  r  r;  r	  r   r  condition_idsequencer   reporting_managerz0Multiple approval condition created successfullyz3multi_approval_condition/condition_create_form.html)r   r  )rQ   r   r   r   r  r{   r   r~   r   r  r  r  r  r  r  r  r  r  r=  r   r  r   r   r   r"   )r   r   r  dept_idr  r  r  r  r  r  condition_approval_managersr  r  r   r"  r  r#  r   s                     r   multiple_level_approval_creater&    s	    ()DF~~+GLL9,,""<0!,,**+<=$\\--.BC!,,**+<= ' 0 01H I%ll../DE\\%%l3
&-ll&:&:;S&T#//%%%4''++w+7
,.==?",H'6H$*<H'")H!W,+:(1F./B,MMOH5 A$(!/"%f+K )0077!)% +&7	 8  01DMN =( /"&K(.%s   :H##H+c           	         t        |      D ]  \  }}|dk(  r|j                  | j                  d<   %d| }dt        d      fgt        j
                  j                         D cg c]  }|j                  t        |      f c}z   }t        j                  |t        d      j                  |      t        j                  ddi	      d
      | j                  |<   |j                  | j                  |<    | S c c}w )Nr   r  r  r   r  zApproval Manager {}r3  r8  r4  F)r  labelr6  r7  )	enumerater   r   r   r   r   r  r  r  r
   r  r  rB  r=  )r   managersir   r  r  r  s          r   edit_approval_managersr,    s    ) ;
765<5H5HDLL1221#6J.2E0FGH=E=M=M=Q=Q=SL19c(m,L G ',&7&7-.55a8||74P*QR	'DKK
# (/':':DLL$; KLs   #C7z%base.change_multipleapprovalconditionc                 2   d}t         j                  j                  |      }t        j                  j	                  |      j                  d      }t        |      }t        ||       | j                  dk(  rt        | j                  |      }|j                         r|j                         }t        j                  | t        d             d}t        j                  j	                  |      j                          | j                  j!                         D ]M  \  }}	|j#                  d	      s|d
z  }d }
	 t%        |	      }t        j                  j'                  ||||
       O | j(                  j                  d      }|dk7  r6t         j                  j	                  |      j                  d      d d d   }n3t         j                  j+                         j                  d      d d d   }t-        | d||||t/        |      d      S #  d }|	}
Y xY w)NFr;  )r!  r"  r  r   z0Multiple approval condition updated successfullyr   r  r  r   r~  r  r  r  r/  z1multi_approval_condition/condition_edit_form.html)r   r  r  	conditionr  )r   r   r   r   r   r  rQ   r,  r   r   r  r  r   r   r   r  r   
startswithr=  r  r  r  r"   r  )r   r!  r  r.  r*  r   r   r"  r  r  r#  r   r~  r  s                 r   multiple_level_approval_editr0    s    F)11555FI'//66I6NWWH (;D4*~~+GLL9M==?yy{HMN H$,,333KRRT%ll002 
U>>":;MH(,%2&)%j -44;;%-!)$/*;	 <  **+=>5 .66==' > 

(<
 2'
 /66::<EElSbD

 ;$"!(m	

 
'2&*,1)s   9HHz%base.delete_multipleapprovalconditionc                     t         j                  j                  |      }|j                          t	        j
                  | t        d             t        t              S )Nr;  z0Multiple approval condition deleted successfully)	r   r   r   r  r   r   r   r!   r  )r   r!  r.  s      r   multiple_level_approval_deleter2  =  sK     *11555FIWa RST233r   c                    t        j                  |      }| j                  j                  }t	        |j
                  |d      }| j                  dk(  rt	        | j                        }|j                         r||j                  _
        ||j                  _        |j                          t        j                  j                  |      j!                  d      }d}|j#                         sd}t	        |j
                  |d      }t%        j&                  | t)        d             t*        j                  j                  |j                  	      }|j#                         r|j                  j,                  j.                  	 p| j                  j                  j
                  |j                  j
                  k(  r|j                  j,                  j.                  j0                  }t3        j4                  | j                  j                  ||j                   d
d|j                   d|j                   dd|j                   dd|j                   dt7        d      d|j
                   z   d	       n| j                  j                  j
                  |j                  j,                  j.                  j
                  k(  rc|j                  j0                  }t3        j4                  | j                  j                  |dddddt7        d      d|j
                   z   d	       n1|j                  j0                  |j                  j,                  j.                  j0                  g}t3        j4                  | j                  j                  ||j                   d
d|j                   d|j                   dd|j                   dd|j                   dt7        d      d|j
                   z   d	       na|j                  j0                  }t3        j4                  | j                  j                  |dddddt7        d      d|j
                   z   d	       t9        | d||||d      S t9        | d|||d      S )zP
    This method renders form and template to create shift request comments
    r   
request_idr   r   r5  -created_atFTComment added successfully!r#  z('s shift request has received a comment.u   تلقت طلب تحويل     تعليقًا.z-s Schichtantrag hat einen Kommentar erhalten.zLa solicitud de turno de  ha recibido un comentario.z%La demande de changement de poste de     a reçu un commentaire.r  r  chatbox-ellipsesr  z*Your shift request has received a comment.u.   تلقت طلبك للتحول تعليقًا.z/Ihr Schichtantrag hat einen Kommentar erhalten.z0Tu solicitud de turno ha recibido un comentario.u<   Votre demande de changement de poste a reçu un commentaire.%shift_request/htmx/shift_comment.htmlcommentsno_commentsr5  r  )r   r5  r  )r   r  r   r   r_   r<  r   r   r  r   r   r5  r  r   r   r   r  r   r   r   r   r   r   r   r  r   rX  r$   r"   )	r   r  rB  r  r   r?  r@  r  recs	            r   create_shiftrequest_commentrB  F  s    h'E
,,
#
#C" #h?D ~~&w||4==?(+DMM%',DMM$IIK*2299X9NWWH  K??$"*(+hGD Wa(E&FG/77>>!-- ? I !%%88MM  ||0033u7H7H7K7KK!--@@UUff  #LL55&)$)$5$5#66^!_&A%BSBSATTd$e','8'8&99f$g&?@Q@Q?RRm$n&KEL]L]K^^v$w%,-A%BtEHH:EV%V!3
  1144 ,,??TTWWX $//@@#LL55&)!M$T$U$V$b%,-A%BtEHH:EV%V!3
 "-->>!--@@UUff #LL55&)$)$5$5#66^!_&A%BSBSATTd$e','8'8&99f$g&?@Q@Q?RRm$n&KEL]L]K^^v$w%,-A%BtEHH:EV%V!3
  ++<<CKK11"%I P Q R ^!()=!>4zAR!R/
 7 (#."*%*		 	 /XF r   c           	      *   t        j                  |      }t        j                  j	                  |      j                  d      }d}|j                         sd}| j                  r| j                  j                  d      }| j                  d   }t        j                  j                  |      }g }|D ]4  }	t               }
|	|
_        |
j                          |j                  |
       6  |j                  j                   |  t#        | d||||d	      S )
E
    This method is used to render all the notes of the employee
    r6  r7  FTfiles
comment_idr;  r=  r>  )r   r  r   r   r   r  r   r  r  r/  r   ry   r   r  r  rE  r  r"   )r   r  r  r?  r@  rE  rF  commentattachmentsr   file_instances              r   view_shift_commentrJ    s    !%%h/M"**11X1FOOH K??}}%%g.[[.
%--11Z1@ 	.D+-M!%M }-		.
 	;'/ &"*		
	 	r   c                 D   | j                   j                  d      }| j                   d   }| j                   d   }t        j                  |      }d}| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       rXt        j                  j                  |      j                          t        j                  | t        d             t#        |      S t        j                   | t        d             d	| d
}t#        |      S )#
    Used to delete attachment
    rd  r  rF  rI  base.delete_baserequestfilere  File deleted successfullyr  "<span hx-get="/view-shift-comment/Y/" hx-trigger="load" hx-target="#commentContainer" data-target="#activitySidebar"></span>)r/  r  r   r  r   r   r   r  rp   ry   r   r   r  r   r   r   r   r   )r   rd  r  rF  rG  rl  s         r   delete_shift_comment_filerQ    s     ++

e
$C{{:&H\*J!&&z2GF!!W%8%88<<  !>?w'&&c&299;!$?"@A  	!$?"@A7z  B[  ^r   c           	      *   t        j                  |      }t        j                  j	                  |      j                  d      }d}|j                         sd}| j                  r| j                  j                  d      }| j                  d   }t        j                  j                  |      }g }|D ]4  }	t               }
|	|
_        |
j                          |j                  |
       6  |j                  j                   |  t#        | d||||d	      S )
rD  r6  r7  FTrE  rF  r;  -work_type_request/htmx/work_type_comment.htmlr?  r@  r5  r  )r   r  r   r   r   r  r   r  r  r/  r   ry   r   r  r  rE  r  r"   )r   r  r  r?  r@  rE  rF  rG  rH  r   rI  s              r   view_work_type_commentrU    s    (,,\:%--444MVVH K??}}%%g.[[.
(0044
4C 	.D+-M!%M }-		.
 	;'7 &&!2		
	 	r   c                 D   | j                   j                  d      }| j                   d   }| j                   d   }t        j                  |      }d}| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       rXt        j                  j                  |      j                          t        j                  | t        d             t#        |      S t        j                   | t        d             d	| d
}t#        |      S )rL  rd  r5  rF  rI  rM  re  rN  r  &<span hx-get="/view-work-type-comment/rP  )r/  r  r   r  r   r   r   r  rp   ry   r   r   r  r   r   r   r   r   )r   rd  r5  rF  rG  rl  s         r   delete_work_type_comment_filerX    s     ++

e
$C\*J\*J$))*5GF!!W%8%88<<  !>?w'&&c&299;!$?"@A  	!$?"@A;J<  Ha  dr   c                    t        j                  |      }|j                  j                  }d}| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       r:|j                          t        j                  | t        d             t        |      S t        j                  | t        d             d| d}t        |      S )z>
    This method is used to delete shift request comments
    rI  rM  Comment deleted successfully!r  rO  rP  )r   r  r5  r<  r   r   r   r  rp   r  r   r   r   r   r   )r   rF  rG  r5  rl  s        r   delete_shiftrequest_commentr[  /  s     "&&z2G##&&JF!!W%8%88<<  !>?w'!$C"DE  	!$?"@A7
|  D]  `r   c                 $	   t         j                  j                  |      j                         }| j                  j
                  }t        |j                  |d      }| j                  dk(  rt        | j                        }|j                         r||j                  _        ||j                  _        |j                          t        j                  j                  |      j!                  d      }d}|j#                         sd}t        |j                  |d      }t%        j&                  | t)        d	             t*        j                  j                  |j                  
      }|j#                         r|j                  j,                  j.                  	 p| j                  j
                  j                  |j                  j                  k(  r|j                  j,                  j.                  j0                  }t3        j4                  | j                  j
                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt7        d      d|j                   z   d	       n| j                  j
                  j                  |j                  j,                  j.                  j                  k(  rc|j                  j0                  }t3        j4                  | j                  j
                  |dddddt7        d      d|j                   z   d	       n1|j                  j0                  |j                  j,                  j.                  j0                  g}t3        j4                  | j                  j
                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt7        d      d|j                   z   d	       na|j                  j0                  }t3        j4                  | j                  j
                  |dddddt7        d      d|j                   z   d	       t9        | d||||d      S t9        | d|||d      S )zT
    This method renders form and template to create Work type request comments
    r;  r4  r   r   r6  r7  FTr8  r#  z,'s work type request has received a comment.u"   تلقت طلب نوع العمل r9  z1s Arbeitsart-Antrag hat einen Kommentar erhalten.z#La solicitud de tipo de trabajo de r:  z!La demande de type de travail de r;  r  r  r<  r  z.Your work type request has received a comment.uA   تلقى طلب نوع العمل الخاص بك تعليقًا.z3Ihr Arbeitsart-Antrag hat einen Kommentar erhalten.z:Tu solicitud de tipo de trabajo ha recibido un comentario.u8   Votre demande de type de travail a reçu un commentaire.rS  rT  )r   r5  r  )r   r   r   r  r   r   re   r<  r   r   r  r   r   r5  r  r   r  r   r   r   r   r   r   r   r  r   rX  r$   r"   )	r   worktype_idr  r  r   r?  r@  r  rA  s	            r   create_worktyperequest_commentr^  E  s7     ''..+.>DDFI
,,
#
#C% #kBD ~~)',,7==?(+DMM%'0DMM$IIK-55<<& = h}%   K??$"-(+kJD Wa(E&FG/77>>%11 ? I !))<<QQ  ||0033y7L7L7O7OO%11DDYYjj  #LL55&)$-$9$9#::f!g&HI^I^H__o$p'0'<'<&==n$o&I)J_J_I``{$|&G	H]H]G^^v$w%,-E%F $Y\\N3&4!3  1144$00CCXX[[\ (33DD#LL55&)!Q$g$Y$`$^%,-E%F $Y\\N3&4!3 &11BB%11DDYYjj #LL55&)$-$9$9#::f!g&HI^I^H__o$p'0'<'<&==n$o&I)J_J_I``{$|&G	H]H]G^^v$w%,-E%F $Y\\N3&4!3 $//@@CKK11"%M c U \ Z!()A!B /"0/ ? (#."-)2		 	 7[yQ r   c                    d}t        j                  |      }|j                  j                  }| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       r:|j                          t        j                  | t        d             t        |      S t        j                  | t        d             d| d}t        |      S )zB
    This method is used to delete Work type request comments
    rI  rM  rZ  r  rW  rP  )r   r  r5  r<  r   r   r   r  rp   r  r   r   r   r   r   )r   rF  rl  rG  r5  s        r   delete_worktyperequest_commentr`    s     F$))*5G##&&J!!W%8%88<<  !>?w'!$C"DE  	!$?"@A;J<  Ha  dr   c                 4   t         j                  j                  | j                        j	                         rt         j                  j                  | j                        j                         }t        |      }| j                  dk(  rt        | j                  |      }|j                         r|j                          t        j                  | t        d             nmt               }| j                  dk(  rTt        | j                        }|j                         r/|j                          t        j                  | t        d             | j                  j                  d      r
t!               S t#        | j                  j                  dd            S )Nr  r  r   zDefault pagination updated.r  rT  r   )r   r   r   r   r   r  rF   r   r   r  r  r   r   r   rZ  r   r   r   )r   r  r  s      r   pagination_settings_viewrb    s,     '''=DDF&..55gll5KQQS
/D>>V#3GLL:VO'')$$&  !,I*JK/1>>V#3O '')$$&  !,I*JK||)*~ 0 0 EFFr   zemployee.view_actiontypec                 \    t         j                  j                         }t        | dd|i      S )z1
    This method is used to show Action Type
    z!base/action_type/action_type.htmlaction_types)r   r   r  r"   )r   rd  s     r   action_type_viewre    s2     %%))+L4~|6T r   zemployee.add_actiontypec                    t               }| j                  j                         }| j                  j                  d      }| j                  dk(  rt        | j
                        }|j                         r|j                          t               }t        j                  | t        d             |dk7  rt        d      }t        j                  j                         j                  d      j!                         }| j                  j#                         }t%        |j&                        |d<   t)        | d|j                                S t+        | d	||d
      S )zE
    This method renders form and template to create Action Type
    r  r   z%Action has been created successfully!Nonezcreate-actionsr  actionr.  &base/action_type/action_type_form.htmlr   r  )r   r/  r	   r   r   r   r  r  r   r   r   r$   r   r   r  r  r  r  r  r<  r!   r"   )r   r   r  r  r  r   mutable_gets          r   action_type_createrl    s    DKK))+Mkkooi(G~~gll+==?IIK!#DWa(O&PQ& ./%--113<<UCIIK%kk..0(+HKK(8H%3%q)>)>)@(A BCC0	
 r   zemployee.change_actiontypec                    t         j                  j                  |      }t        |      }|j                  dk(  rlt
        j                  j                         rNt
        j                  j                         j                  r&t        j                         |j                  d   _        | j                  dk(  rt        | j                  |      }|j                         r^|j                  d   }|dk(  rd|j                   _        |j%                          t               }t'        j(                  | t+        d             t-        | d	||d
      S )zE
    This method renders form and template to update Action type
    r;  r  r   block_optionr   action_typeFz%Action has been updated successfully!ri  )r   act_id)r   r   r   r   ro  r   r  r  r
   HiddenInputr=  r6  r   r   r  r  r   rn  r  r   r   r   r"   )r   rp  rh  r   act_types        r   action_type_updaters    s    ##v#.F6*DY&''--/#++113>>161B1B1DDKK'.~~gllV<==?((7H9$-2*IIK!#DWa(O&PQ0( r   zemployee.delete_actiontypec                 `   t         j                  j                  |      j                         r*t	        j
                  | t        d             t        d      S t        j                  j                  |      j                          t	        j                  | t        d             t               S )z8
    This method is used to delete the action type.
    )rh  zIThis action type is in use in disciplinary actions and cannot be deleted.r   r;  z%Action has been deleted successfully!)r   r   r   r   r   r   r   r   r   r  r   )r   rp  s     r   action_type_deleteru  7  s     !!(((7>>@[	
 GHH 	!!V!,335!$K"LM~r   c                     t        | j                        }|j                         r|j                          t	        d      S )z<
    This method is used to update driver viewed status
    rI  )rC   r/  r  r  r   r  s     r   driver_viewed_statusrw  N  s/    
 gkk"D}}		r   c                 8   t         j                  j                  | j                  j                        d   }|j
                  xs g }| j                  j                  d      }|r,||vr(|j                  |       ||_        |j                          t        d      S )zU
    This function is used to create personalized dashboard charts for employees
    r  r   chart_idrI  )r}   r   r  r   r   r  r/  r   r  r  r   )r   r  r  ry  s       r   dashboard_components_togglerz  Y  s    
 .55CC** D 	O ##)rF{{z*HHF*h!'r   c                    ddl m} t        j                  d      r
ddlm} g d}i ddddd	d
dddddddddddddddddddddddddd
dd
ddddd}i ddddd	d dd!dd!dd"dd#dd#dd$dd%dd&dd'dd(dd)dd)dd*dd+d,d-i}g }g d.}|D ]  }	t        j                  |j                  |	d               s,|	d   |j                         v s#|	d   |v st        j                  d      r|	d   v r| j                  j                  ||	d            r|j                  |	       |	d   |v r% || j                        s|j                  |	       t        j                  d      s|	d   v s | j                        s|j                  |	       |j                  |	        |S )/zr
    This function is used to check the permissions for the charts
    Args:
        charts: dashboard charts
    r   )rp   r   )is_stagemanager)hired_candidatesonboarding_candidatesrecruitment_analyticsoffline_employeesr   online_employeesoverall_leave_chartr   r}  r~  r   r  attendance_analytichours_chartobjective_statusr   key_result_statusfeedback_statusrO  r  r  overtime_approveattendance_validateleave_request_approveleave_allocation_approver   r  )asset_request_approveemployees_chartgender_chartdepartment_chartzemployee.view_employeezleave.view_leaverequestzrecruitment.view_candidatezrecruitment.view_recruitmentzattendance.view_attendancezpms.view_employeeobjectivezpms.view_employeekeyresultzpms.view_feedbackr)  r  zattendance.change_attendancezleave.change_leaverequestz#leave.change_leaveallocationrequestr  zasset.change_assetrequest)r  r  r  r  r  r  r  rO  r  r  r  r  r  r  )base.templatetags.basefiltersrp   r   r   +recruitment.templatetags.recruitmentfiltersr|  r   keysr   r  r  )
r   r  rp   r|  need_stage_manager
chart_appsr  
chart_listneed_reporting_managercharts
             r   check_chart_permissionr  j  s    B'O

\L 	w 	M	
 	  	  	| 	| 	E 	U 	5 	  	$V 	L 	|  	 !" 	#G#$ ")%""+J.54 	8 	8	
 	 != 	 !? 	; 	3 	8 	9 	. 	 !; 	$%B 	: 	=  	 !<!" 	#$I#$ 	 !<%K( J   )Z^^E!H56aK,,..855%%m4qEW9W<<((U1X)>?%%e,1X!77*7<<8"))%0%%m4qEW9W&w||4"))%0!!%(%)( r   c                    t         j                  j                  | j                  j                        d   }dt        d      fdt        d      fdt        d      fd	t        d
      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d      fdt        d       fd!t        d"      fd#t        d$      fd%t        d&      fd't        d(      fd)t        d*      fd+t        d,      fd-t        d.      fg}t        | |      }| j                  d/k(  rg |_        |j                          | j                  }|D ]  }|d   |j                         vr0|d   |j                  vr|j                  j                  |d          H|d   |j                         v r0|d   |j                  v r|j                  j                  |d           |j                          t        d0      S ||j                  d1}t        | d2|      S )3zN
    This function is used to choose which chart to show in the dashboard
    r  r   r  zOffline Employeesr  zOnline Employeesr  zOverall Leave Chartr}  zHired Candidatesr~  zOnboarding Candidatesr  zRecruitment Analyticsr  zAttendance analyticsr  zHours Chartr  zEmployees Chartr  zDepartment Chartr  zGender Chartr  zObjective Statusr  zKey Result Statusr  zFeedback StatusrO  zShift Request to Approver  zWork Type Request to Approver  zOvertime to Approver  zAttendance to Validater  zLeave Request to Approver  zLeave Allocation to Approvefeedback_answerzFeedbacks to Answerr  zAsset Request to Approver   r1  )dashboard_chartsemployee_chartzdashboard_chart_form.html)r}   r   r  r   r   r   r  r   r  r  r   r  r  r  r   r"   )r   r  r  r  r  r  s         r   employee_chart_showr    si   
 .55CC** D 	O 
a 345	Q123	"7 89	Q123	 !$;"<=	 !$;"<=	"8 9:	-()	A/01	Q123	>*+	Q123	a 345	A/01	 !$>"?@	$a(F&GH	Q456	": ;<	 !$>"?@	#Q'D%EF	A345	 !$>"?@-F0 $GV4F~~!#|| 	EQxtyy{*uQx?U?U/U&&--eAh7qTYY[(U1X9O9O-O&&--eAh7	 	HII#)_=S=STG'6@@r   zbase.view_biometricattendancec                 \    t         j                  j                         }t        | dd|i      S )Nz&base/install_biometric_attendance.html	biometric)rz   r   r  r"   )r   r  s     r    enable_biometric_attendance_viewr    s3     $++113I0	i  r   zbase.add_biometricattendancec                    | j                   dk(  r| j                  j                  d      }t        j                  j                         }|st        j                  j                         }|dk(  r'd|_        t        j                  | t        d             n&d|_        t        j                  | t        d             |j                          t        dd	i      S )
Nr/  r   r  TzAThe biometric attendance feature has been activated successfully.FzCThe biometric attendance feature has been deactivated successfully.r  r'  )r   r/  r   rz   r   r  r  r   r   r   r   r[  r  r   )r   r   r   s      r   activate_biometric_attendancer    s     ~~{{~6&..446*2299;H6!$(H!UV
 %*H!MMY 	I.//r   c                 <    t         j                  }t        d|i      S )Nr  )r   r  r   )r   r  s     r   get_horilla_installed_appsr  &  s    ,,N)>:;;r   c                 d   | D ]D  }|j                         D ]/  \  }}||v r|j                  ||          |j                  d        1 F |j                         D cg c]  \  }}t        d |D              s| }}}|D ]  }||=  t        j                  ||j                               }|j                  j                  d t        j                  d d d d f         }t        d      d| dd	<   t        j                  d
      }	|j                  |	dd       |	j                  d   }
|
j                  dd       |	j                          fd}ddlm}m} dt%        j&                          |j                   ||             t)        j                         S c c}}w )Nc              3   $   K   | ]  }|d u  
 y wry  rU  )r  vs     r   r  z(generate_error_report.<locals>.<genexpr>5  s     7QaT	7Qs   columnsc                      y)Nztext-align: centerrU  r  s    r   r  z'generate_error_report.<locals>.<lambda><  s    r   )subsetapplication/ms-excelcontent_typezattachment; filename=""Content-Disposition
xlsxwriter)engineFSheet1)index
sheet_namezA:Z   c                     t               S ry  )r   )r   	path_infort  s    r   get_error_sheetz.generate_error_report.<locals>.get_error_sheetH  s    9%r   r   )r   urlpatternszerror-sheet-)r  )r   r  r  r  	DataFramer  styleapplymap
IndexSlicer   ExcelWriterto_excelsheets
set_columnr  	base.urlsr   r  uuiduuid4r   )
error_list
error_datar  r  r  r  keys_to_remove
data_framestyled_data_framewriter	worksheetr  r   r  r  rt  s                 @@r   generate_error_reportr  ,  s    #$**, 	#JCd{T#Y'T"		## )..0UC7Q57Q4QN   sO j*//2CDJ"((11&r}}QT/B 2  )?@H(>yk&KH"#^^H\:FvUxHh'I#
LLN , tzz|n-ItIYGH	*?s   F,:F,c                 4   t               }|j                  }|j                  }t        j                  j                  t        ||      t        |      z        }t        t        |            }t        |      D ]  \  }}||   |_
         t        | dd|i      S )zZ
    Retrieve and display a list of upcoming holidays for the current month and year.
    )start_date__monthstart_date__year)start_date__gtezholiday/upcoming_holidays.htmlholidays)r(   r  yearr   r   r   r   rm   r  r)  background_colorr"   )r   r  current_monthcurrent_yearr  colorsr+  holidays           r   get_upcoming_holidaysr  V  s     KEKKM::L&&	MLI
E
"	#H S]+F) -
7#)!9 -';j(=STTr   zbase.add_holidaysc                    | j                   j                         }t               }| j                  dk(  rt        | j                        }|j                         rs|j                          t               }t        j                  | t        d             t        j                  j                         j                         dk(  rt        d      S t        | d||d      S )z
    function used to create holidays.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return holiday creation form template
    POST : return holiday view template
    r   z"New holiday created successfully..r  r1  zholiday/holiday_form.htmlrj  )r/  r	   rK   r   r   r  r  r   r   r   r   r   r   ri  r   r"   )r   r  r   s      r   holiday_creationr  i  s     KK))+M=D~~7<<(==?IIK=DWa(L&MN&&(..0A5#$PQQ,t=.Q r   c                     	 g d}t        j                  |      }t        d      }d|d<   |j                  |d       |S # t        $ r}t        |      cY d }~S d }~ww xY w)	NHoliday Name
Start DateEnd Date	Recurringr  r  r  z3attachment; filename="assign_leave_type_excel.xlsx"r  F)r  )r  r  r   r  r   )r   r  r  rt  	exceptions        r   holidays_excel_templater    sl    '
 \\'2
-CDA 	&' 	HE2 'I&&'s   ?A 	A 
AA A c                    g g }}t        j                  dt        | j                                     }t        j                  |      }t        |d      5 }d}t        j                  |      }t        |       t        |d      D ]  \  }}		 |	\  }
}}}|
|||d}	 t        |      }	 t        |      }|j                         dvr!d}t        d      |d<   |j                  |       |r/|j                  t        |
|||j                         dk(                	 ddd       |rt        j"                  j%                  |       t&        j                  j)                  |      rt'        j*                  |       |fS #  d}t        d	      |d
<   |j                  |       Y xY w#  d}t        d      |d<   |j                  |       Y xY w# t        $ r*}t!        |      d<   |j                  |       Y d}~td}~ww xY w# 1 sw Y   xY w)a*  
    Imports holiday data from a CSV file.

    This function reads a CSV file containing holiday information, validates the data,
    and saves valid holiday records to the database using bulk creation for efficiency.

    The expected format for the CSV file is:
    - "Holiday Name": Name of the holiday (string)
    - "Start Date": Start date of the holiday (date string in a recognized format)
    - "End Date": End date of the holiday (date string in a recognized format)
    - "Recurring": Indicates whether the holiday recurs ("yes" or "no")
    zholiday_import.csvignore)errorsTr  )startr  FzInvalid start date format.Start Date ErrorzInvalid end date format.End Date ErroryesnozRecurring must be yes or no.Recurring Field Errorr  r  
start_dateend_date	recurringOther ErrorsN)r   r  r   rU  r   rT  csvreaderr-  r)  rl   r   r  lowerr   r   r  r   bulk_createosr   r  )r   holiday_listr  r  holiday_filecsv_filer  r  
total_rowsrowr  r  r  r  holiday_dictrl  s                   r   csv_holiday_importr    s     "2*L!!"6DIIK8PQI$$Y/L	l8	, 00H%V(q9 +	0OJ*08;5j(I$(", (!*	 4!,Z!8J4*84H ??$M9 D<=6=L!89 %%l3 '' !%'1%-&/oo&75&@	A+	000d $$\2	ww~~l#
		,
##O4 D789U7VL!34%%l34 D567Q5RL!12%%l3&  0/21v^,!!,//0]00 00sa   6H G
E9&F!1A$G
H 9#FG
!#GG

	G=G82H 8G==H  H	c                    g }g }t        j                  |       }|j                  d      }|D ]  }d}	 |d   }	 t        j                  |d         j	                         }	 t        j                  |d         j	                         }	|j                  dd      j                         }
|
dv r|
dk(  }n d}t        d      j                  dd      |d<   |r!t        |	      }|j                  |       n|j                  |        |rt        j                  j                  |       |t        |      fS # t
        $ r& d}t        d      j                  |d         |d<   Y w xY w# t
        $ r& d}t        d	      j                  |d         |d
<   Y w xY w# t
        $ r*}t        |      |d<   |j                  |       Y d}~d}~ww xY w)a2  
    Imports holiday data from an Excel file.

    This function reads an Excel file containing holiday information, validates the data,
    and saves valid holiday records to the database using bulk creation for efficiency

    The expected format for the Excel file is:
    - "Holiday Name": Name of the holiday (string)
    - "Start Date": Start date of the holiday (date string in a recognized format)
    - "End Date": End date of the holiday (date string in a recognized format)
    - "Recurring": Indicates whether the holiday recurs ("yes" or "no")

    recordsTr  r  FzInvalid start date format {}r  r  zInvalid end date format {}r  r  rI  r  r  zRecurring must be {} or {}r  r  r  zOther errorsN)r  
read_excelto_dictto_datetimer  r   r   r  r   r  r   r  r  r   r  r  )r   r  valid_holidaysr  holiday_dictsr  r  r  r  r  recurring_strr  holiday_instancerl  s                 r   excel_holiday_importr    s    JNt$J&&y1M  +')	'>*D^^GL,ABGGI
>>'**=>CCE $KKR8>>@M-)U2	3404&% /0 #+)%'	$  %%&67!!'*O+'Z $$^4s=)))S  ./0N.O.V.VL)/*+  ,-.J,K,R,RJ'-()4  	'&)!fGN#g&&	'sY   F&D4 &E&A>F4+E#F"E##F&+FFFF	G!GGzbase.add_holidayc           	         d }d}d }g g g g g g g g d}| j                   dk(  r| j                  j                  d      }|r|j                  }|dk(  rt	        |      \  }}|r[t        |||      }nM|dk(  rt        |      \  }}|r8t        |||      }n*t        j                  | t        d             t        d      S |t        |      z
  }	|	t        |      t        d	      |d
}
t        d|
      }t        |      S )NzHolidaysImportError.xlsx)r  r  r  r  r  r  r  r  r   holidays_importztext/csvzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetz/The file you attempted to import is unsupportedr   r   )created_counterror_countr  r  zimport_popup.html)r   r  r   r  r  r  r  r   r   r   r   r  r#   )r   r{  r  r  r  r   r  r  r  created_holidays_countr  s              r   holidays_info_importr  ,  s"    F*II!#	J ~~}}  !23,,Lz)*<T*B'
K 5j*i XIVW +?t*D'
K 5j*i XIQPQ $$OPP%03z?%B"!7"::&	G &&97CFr   c                     | j                   j                  d      r't               }t               }||d}t	        | d|      S t        | t        t        t        d      S )Nr  )r  export_columnz'holiday/holiday_export_filter_form.htmlr  Holidays_exportr	  )rZ  r   r1   rL   r"   ri   r   )r   r  r  rs  s       r   holiday_info_exportr  ^  sf    ||)*%02**
 >
 	
 "+# r   c                    t         j                  j                         ddd   }| j                  j	                         }| j                  j                  d      }t        ||      }t               }t        | d||j                  |d      S )z
    function used to view holidays.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return holiday view  template
    Nr/  r  zholiday/holiday_view.html)r  r   r  )
r   r   r  r/  r	   r   rq   r1   r"   r   )r   r>  r  r  page_objholiday_filters         r   holiday_viewr  s  s     ##%dd+HKK))+M++//&)KX{3H"_N# "''	
 r   c                    t         j                  j                         }| j                  j	                         }t        | j                  |      j                  }| j                  j                  d      rt        | |d      }| j                  j                  d      }t        |ddd   |      }t        |      }t        t         |       t        | d|||d      S )z
    function used to filter holidays.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return holiday view template
    rs   r  Nr/  zholiday/holiday.html)r  r  r  )r   r   r  r/  r	   r1   r  r   rs   rq   r   rn   r"   )r   r>  r  r  r  r  r  s          r   r  r    s     ##%HKK))+M"7;;9<<N{{x B++//&)K^DbD1;?H'Ih	*]9M r   zbase.change_holidaysc                    | j                   j                         }|j                  d      rt        |t	        d      d       }nt        |      }t
        j                  j                  |      }t        |      }| j                  dk(  rVt        | j                  |      }|j                         r/|j                          t        j                  | t        d             t!        | d|||d      S )	z
    function used to update holiday.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : holiday id

    Returns:
    GET : return holiday update form template
    POST : return holiday view template
    r  Nr;  r  r   zHolidays updated successfully..z holiday/holiday_update_form.html)r   r<  r  )r/  r	   r/  r   r  r   r   r   rK   r   r   r  r  r   r   r   r"   )r   r  query_stringr  r  r   s         r   holiday_updater    s     ;;((*Lu%SZ\ :;-""f"-G(D~~7<<':==?IIKWa(I&JK*V=9 r   zbase.delete_holidaysc                    | j                   j                         }	 t        j                  j	                  |      j                          t        j                  | t        d             t        j                  j                         st        d      S t        d|       S # t        j                  $ r" t        j                  | t        d             Y kt        $ r" t        j                  | t        d             Y w xY w)z
    function used to delete holiday.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : holiday id

    Returns:
    GET : return holiday view template
    r;  zHolidays deleted successfully..zHolidays not found.Related entries existsr1  z/holiday-filter?)r/  r	   r   r   r   r  r   r   r   r  r   r   r   r   r!   )r   r  r  s      r   holiday_deleter    s     ;;((*L='..0!$E"FG
 ""$HII&|n566    :w"7 89 =w": ;<=   AB   2C>'C>=C>zbase.delete_holidayc                    | j                   j                  d      }t        j                  j	                  |      j                         d   }t        j                  | t        dj                  |                   t        d      S )zL
    Deletes multiple holidays based on IDs passed in the POST request.
    rd  re  r   z+{} Holidays have been successfully deleted.zholiday-filter)r   r  r   r   r   r  r   r   r   r  r!   )r   rd  deleted_counts      r   bulk_holiday_deleter!    sq     ,,

u
%C$$++3+7>>@CM@GGVW $%%r   c                    | j                   j                  d      }|dk(  rt        j                  j	                         }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr  r  r  Fr  )	r/  r   r   r   r  r  r<  ri  r   r  s          r   holiday_selectr#    ss    ++//&)Ke$$((*	+45CCK5L5//#K+KHGe,, 6s   Bc                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w r  )r/  r   r  r  r1   r   r   r  r  r  r<  ri  r   r  s
             r   holiday_select_filterr%    s    ++//&)K{{x(H&.djj"BGe'(:J:J:N:N:PQ -///ABCFFBB(..0#/LG$$  Cr  zbase.add_companyleavesc                 n   t               }| j                  dk(  rt        | j                        }|j                         ri|j	                          t        j                  | t        d             t        j                  j                         j                         dk(  rt        d      S t        | dd|i      S )
    function used to create company leave.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return company leave creation form template
    POST : return company leave view template
    r   z(New company leave created successfully..r  r1  z.company_leave/company_leave_creation_form.htmlr   )rA   r   r   r  r  r   r   r   r|   r   r   ri  r   r"   r  s     r   company_leave_creationr(    s     D~~-==?IIKWa(R&ST$$++-335:#$PQQAFD> r   c           
         t         j                  j                         }| j                  j	                         }| j                  j                  d      }t        ||      }t               }t        | d|t        t        |j                  |d      S )z
    function used to view company leave.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return company leave view template
    r  z%company_leave/company_leave_view.html)company_leavesweeks	week_daysr   r  )r|   r   r  r/  r	   r   rq   r0   r"   ru   rt   r   )r   r>  r  r  r  company_leave_filters         r   company_leave_viewr.  5  s~     $$((*HKK))+M++//&)KX{3H-//&"(--	

 
r   c           
      l   t         j                  j                         }| j                  j	                         }| j                  j                  d      }t        | j                  |      j                  }t        ||      }t        |      }t        t         |       t        | d|t        t        ||d      S )z
    function used to filter company leave.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return company leave view template
    r  z company_leave/company_leave.html)r*  r+  r,  r  r  )r|   r   r  r/  r	   r   r0   r  rq   r   rn   r"   ru   rt   )r   r>  r  r  r-  r  r  s          r   r-  r-  R  s     $$((*HKK))+M++//&)K-gkk8DGG1;?H'ImY/*&"$	

 
r   zbase.change_companyleavesc                 D   t         j                  j                  |      }t        |      }| j                  dk(  rVt        | j
                  |      }|j                         r/|j                          t        j                  | t        d             t        | d||d      S )z
    function used to update company leave.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : company leave id

    Returns:
    GET : return company leave update form template
    POST : return company leave view template
    r;  r  r   z$Company leave updated successfully..z,company_leave/company_leave_update_form.html)r   r<  )r|   r   r   rA   r   r   r  r  r   r   r   r"   )r   r<  company_leaver   s       r   company_leave_updater2  s  s     "))---4M]3D~~}E==?IIKWa(N&OP6R  r   zbase.delete_companyleavesc                    | j                   j                         }	 t        j                  j	                  |      j                          t        j                  | t        d             t        j                  j                         st        d      S t        d|       S # t        j                  $ r" t        j                  | t        d             Y kt        $ r" t        j                  | t        d             Y w xY w)r'  r;  z$Company leave deleted successfully..zCompany leave not found.r  r1  z/company-leave-filter?)r/  r	   r|   r   r   r  r   r   r   r  r   r   r   r   r!   )r   r<  r  s      r   company_leave_deleter4    s     ;;((*L=!!R!(//1!$J"KL
   '')HII,\N;<< %% ?w"< => =w": ;<=r  c                 ^    t        | j                        j                  }t        | dd|i      S )z=
    This method is used to filter or view the penalties
    zpenalty/penalty_view.htmlr   )r2   r/  r  r"   )r   r   s     r   view_penaltiesr6    s-     GKK(++G'6G8LMMr   )NN(  re  r  r  r  r  r   r   email.mime.imager   r   urllib.parser   r   r	   pandasr  djangor
   django.appsr   django.confr   django.contribr   django.contrib.authr   r   r   django.contrib.auth.modelsr   r   r   django.contrib.auth.viewsr   r   django.core.files.baser   django.core.mailr   django.core.managementr   django.core.paginatorr   django.db.modelsr   r   django.httpr   r   r   r   django.shortcutsr    r!   r"   django.template.loaderr#   django.urlsr$   r%   django.utilsr&   django.utils.htmlr'   django.utils.timezoner(   django.utils.translationr)   r   django.views.decorators.csrfr*   django.views.decorators.httpr+   accessibility.modelsr,   base.backendsr-   base.decoratorsr.   r/   base.filtersr0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   
base.formsr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   base.methodsrg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   base.modelsrt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   employee.filtersr   employee.formsr   r   employee.modelsr   r   r   r   r   r   horilla.decoratorsr   r   r   r   r   r   horilla.group_byr   r   r   r   r   r   r   horilla.methodsr   r   horilla_audit.formsr   horilla_audit.modelsr   r   r   notifications.modelsr   notifications.signalsr   r   r   r   r   r   r   r  r  r  r!  r&  r)  r+  r8  r?  rA  rC  rj  setattrrq  ru  rw  r   r  r  r  r  r  r  r  r  r  r  r  r  r)  rE  rK  rb  rk  rp  rr  ru  rw  ry  r|  r  r  r  r  r  r  r(  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r%  r(  r+  r/  r3  r6  r=  r@  rD  rG  rJ  rM  rP  rS  rW  r]  r_  ra  rc  rg  rj  rl  rp  ru  rw  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r&  r,  r.  r<  rA  rC  rO  rQ  rS  r[  r^  ra  rf  rj  rm  rr  rt  rw  rc  r  r  r  r  r  r  r  r  accessibility.accessibilityr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r&  r,  r0  r2  rB  rJ  rQ  rU  rX  r[  r^  r`  rb  re  rl  rs  ru  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r#  r%  r(  r.  r-  r2  r4  r6  rU  r   r   <module>rc     sO     	  ( &  5 5      # ; ; > > Q . 3 / + . Q Q @ @ 3 - ! ( + 1 4 = 5 0   - - - - - - - - - - - -\   ! ! ! ! ! ! ! ! !D , K   /  H 9 U U - ('1,%P8 +K +K\ W W:  2 " "J 4 4   B $ $N  6/d.++0 ++\+T 1 +T\  /3H I  ,0A B  - 5 M MB"  2 2D :;H < HV , , %&  '   F vh*+O ,   O8 &' ( @ &'  (  F %& '  : &' (   &'P ( P ^$vh
G   % 
G ^$vh
G   % 
G vx()?K *  ?KD 1.   1.h A   AH :; <  :;M < M` <= > D( 9: ;    45 6 $ 67 8  * vh34) 5   ) 67) 8 ) '( )  . ()R * R *+ ,  ( *+ ,  , +, -  -. /  * ,- . , +, -  , ./ 0  , '( )  < () * " *+ ,  6 () *  . )*
 + 
 +, -  . 01 2  ( 12	 3 	 34 5  0 56" 7 "J 45, 6  ,^ 565 7  5p T  TB 78 9  > 78 9 *K6 78L 9  L2 78#7 9 #7L 9:0 ; 04 9:vhL   ;  L" -. /  ,- .  * /0 1  . ./ 0   -. /  . 01 2  ( 67 8   56 7  , 89 :  0 ./	 0 	 -. /  , 01 2  4 23& 4 &R 12, 3  ,^ 23. 4  .b P  PB 45" 6  "J 45 6 (K4 45H 6  H. 45(0 6 (0V 450 6 08 45vhH   6  H&	 )*8 + 8v '(! ) !H vh*+O ,   O* *+# ,  #L - -` ./ 0 ( 5  5p)6 <S  <S~ED +; +;\ 01$, 2 $,N ); );X &, &,R $&Y '  Y@ vh3I    3Il  4 23vh',   4 ',T 8  8v ' '" C  CL D DN +, - * i iX   2   2  "!U #  !UH ? ?D EG EGP "G "GJ -.vh6,   / 6,r -.AG / AGH K KD vh-.,, /   ,,^ vh G    GF *+vh(,   , (,V 	 	  " 
 
         L L  $   O Od ()5 * 5 *+'U  ,'UT : :, *+'U  ,'UT : :, & &( ?@$ A $* = < /0$ 1 $B - -, % %* - -* % %* - -* % %* - -* % %* 23	 4 	 ()	 * 	 '( )  * *+ ,  ( 12 3  * 45 6  ( :; < & :; <  " 9:$ ;  $ 9:+$ ;  +$\ 9: ;   9:3 ;  3l& <=4 >  4n <=4 > 4 l  l^   D     ,   D     ,     ( q  qh     ( G G. /0 1  ./ 0  < 12 3  < 12 3  (     `F 0A 0Af 45 6  340 5 00 < <
'T U  U" () *  6'&I$XC*L '(-  ) - `  (  6   4 +, -  > +,7 -  70 vh*+	& ,   	& - - % %& -. /  0  8   > 01 2  4 01= 2  =0 N  Nr   