
    si>-                    %   d Z ddl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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 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,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlFmGZG ddlHmIZI ddlJmKZK ddlLmMZN ddlOmPZP ddlQmRZR dd lSmTZT dd!lUmVZV dd"lWmXZXmYZY dd#lZm[Z[ dd$l\m]Z] dd%l^m_Z_ dd&l`maZa dd'lbmcZcmdZd dd(lemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZp dd)lqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd*lmZmZmZmZmZmZmZmZmZmZmZmZmZ dd+lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd,lmZ dd-lmZmZ dd.lmZmZmZmZmZmZ dd/lmZ dd0lmZmZmZmZmZmZ dd1lmZ dd2lmZmZmZmZmZ dd3lmZmZ dd4lmZ dd5lmZmZmZ dd6lmZ dd7lmZ d8 eNd9      fd: eNd;      fd< eNd=      fd> eNd?      fd@ eNdA      fdB eNdC      fdD eNdE      fdF eNdG      fdH eNdI      fdJ eNdK      fdL eNdM      fdN eNdO      fdP eNdQ      fdR eNdS      fdT eNdU      fdV eNdW      fdX eNdY      fdZ eNd[      fd\ eNd]      fd^ eNd_      fd` eNda      fdb eNdc      fdd eNde      fgZdf Zdg Zdh Zdi Zdj Zedk        Zedl        Zedm        Zedn        Z edo        Zedp        Zedq        Zedr        Zds Zdt Zdu Z G dv dwe&      Z G dx dye&      Z	 e
e%dzd{        e
e%d|e        e
e%d}d~       ed        Zed        Zd Zd Zd Zd Zd Z G d d      Zed        Ze ed      d               Zed        Zee ed      d                      Ze eTdg       ed      d                      Ze ed      d               Ze ed      d               Zee ed      d                      Ze ed      d               Ze ed      d               Ze ed       eTdg      d                      Ze ed       eTdg      d                      Ze eܫ        eTddg      d                      Zee eݫ       d                      Z eed               Z!e ed      d               Z"e ed      d               Z#e ed      d               Z$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.e ed      d               Z/ee ed      d                      Z0e ed      d               Z1ee ed      d                      Z2ee ed      d                      Z3ee ed      d                      Z4e ed«      dÄ               Z5ee edī      dń                      Z6ee edƫ      dǄ                      Z7e edȫ      dɄ               Z8ee edʫ      d˄                      Z9ee 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ل                      ZAe edث      dڄ               ZBddۄZCee edث      d܄                      ZDe edث      d݄               ZEe edޫ      d߄               ZFee edޫ       eTdg      d                             ZGe ed      d               ZHee ed      d                      ZIee ed      d                      ZJe ed      d               ZKee ed      d                      ZLee ed      d                      ZMe ed      d               ZNee ed      d                      ZOee ed      d                      ZPe ed      d               ZQee ed      d                      ZRee ed      d                      ZSe ed      d               ZTee ed      d                      ZUee ed      d                      ZVeed               ZWee ed      d                       ZXe ed      d               ZYd ZZe edԫ      d               Z[d Z\ee ed      d                      Z]e ed      d               Z^e ed      d               Z_ee ed       eTdg      d	                             Z`d
 Zae ed      dd              Zbe ed      dd              Zce eTdg       ed      d                      Zdee ed      d                      Zeeߐd        Zfe ed      d               Zgeeސd               Zhd Zieeސd               Zjd Zkeߐd        Zle ed      d               Zmeߐd        Zneߐd        Zoee ed       d                      Zpee eTdg      d                      Zqeߐd        Zre ed        eTdg      d!                      Zseeސd"               Zteߐd#        Zueeސd$               Zveߐd%        Zwe ed&      d'               Zxeߐd(        Zyeeސd)               Zzeeސd*               Z{ee ec       d+                      Z|eߐd,        Z}eߐd-        Z~eߐd.        Ze ed/       eTdg      d0                      Ze ed/      d1               Zeߐd2        Ze eTdg       ed/      d3                      Ze eTdg      d4               Ze ed5       eTdg      d6                      Zeߐd7        Zeߐd8        Zeߐd9        Zeߐd:        Zeߐd;        Zeߐd<        Zeߐd=        Zeߐd>        Zeߐd?        Ze ed      d@               Z ed      eRdA               ZeߐdB        Z ed      eRdC               ZeߐdD        ZeߐdE        Ze edF      dG               Ze edH      dI               ZeߐdJ        ZeߐdK        ZeߐdL        ZeߐdM        ZeߐdN        ZeߐdO        ZeߐdP        ZeߐdQ        Ze edR      dS               Ze edT      dU               Zee edV      dW                      Zee edX      dY                      Zee edZ      d[                      Zee ed\      d]                      Ze ed^      d_               Zee ed^      d`                      Zee eda      db                      Zee eda      dc                      Zee eda      dd                      Zee eda      de                      Zdf Zdg Zee edh      di                      Ze edj      dk               Zeeސdl               Zeeސdm               Zeeސdn               Zeeސdo               Zeeސdp               Zeeސdq               Zeeސdr               Zeeސds               Zeߐdt        Ze edu      dv               Zee edw      dx                      Zee edy      dz                      Zee ed{      d|                      Zeߐd}        Zeߐd~        Zeߐd        Zeߐd        Ze ed      d               Ze ed      d               Zeߐd        Zd Zeeސd               Zee ed      d                      ZŐd ZƐd Zǐd Ze ed      d               Zeߐd        Zeߐd        Zeeސd               Zee ed      d                      Zee ed      d                      Ze eTdg       ed      d                      Zeߐd        Zeߐd        Zee ed      d                      Zeߐd        Zeeސd               Zee ed      d                      Zee ed      d                      Zeeސd               Ze ed      d               Z eGeߐd       eG ed      d       G d deP                    Zِd Zڐd Zy(  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urlparse)parser)forms)apps)settings)messages)authenticateloginlogout)Group
PermissionUser)PasswordResetConfirmViewPasswordResetView)ValidationError)ContentFile)EmailMessageEmailMultiAlternatives)call_command)validate_ipv46_address)ProtectedErrorQ)FileResponseHttp404HttpResponseHttpResponseRedirectJsonResponse)get_object_or_404redirectrender)render_to_string)reversereverse_lazy)timezone)method_decorator)
strip_tags)url_has_allowed_host_and_scheme)gettext)View)csrf_exempt)require_http_methods)JWTAuthentication)InvalidToken
TokenError)UntypedToken)ACCESSBILITY_FEATURE)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ChangeUsernameForm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)check_chart_permissionchoosesubordinatesclosest_numbersexport_datafiltersubordinatesfiltersubordinatesemployeemodelformat_dategenerate_colorsgenerate_otpget_key_instancesis_reportingmanagerpaginator_qrysortby)	WEEK_DAYSWEEKSAnnouncementExpireBaserequestFileBiometricAttendanceCompanyCompanyLeavesDashboardEmployeeCharts
DepartmentDynamicEmailConfigurationDynamicPaginationEmployeeShiftEmployeeShiftScheduleEmployeeTypeHolidaysHorillaMailTemplateIntegrationAppsJobPositionJobRoleMultipleApprovalConditionMultipleApprovalManagersPenaltyAccountsRotatingShiftRotatingWorkTypeRotatingWorkTypeAssignShiftRequestShiftRequestCommentTagsWorkTypeWorkTypeRequestWorkTypeRequestComment)EmployeeFilter)ActiontypeForm EmployeeGeneralSettingPrefixForm)
ActiontypeDisciplinaryActionEmployeeEmployeeGeneralSettingEmployeeWorkInformationProfileEditFeature)horilla_apps)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)notifyemployee_work_infozEmployee Work Infooffline_employeeszOffline Employeesonline_employeeszOnline Employeesoverall_leave_chartzOverall Leave Charthired_candidateszHired Candidatesonboarding_candidateszOnboarding Candidatesrecruitment_analyticszRecruitment Analyticsattendance_analyticzAttendance analyticshours_chartzHours Chartemployees_chartzEmployees Chartdepartment_chartzDepartment Chartgender_chartzGender Chartshift_request_approvezShift Request to Approvework_type_request_approvezWork Type Request to Approveovertime_approvezOvertime to Approveattendance_validatezAttendance to Validateleave_request_approvezLeave Request to Approveleave_allocation_approvezLeave Allocation to Approvefeedback_answerzFeedbacks to Answerasset_request_approvezAsset Request to Approveobjective_statuszObjective Statuskey_result_statuszKey Result Statusfeedback_statuszFeedback Statusc                     t        | d      S )z
    Custom 404 method
    z404.htmlr'   requests    ./var/www/python-projects/worksol/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_idr   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)init_database
superusersr   s      r   initialize_database_conditionr      sg     ++--M\\((d(;
 	Dt^, %		 r   c                    t               r| j                  dk(  r| j                  j                  d      t        k(  rg d}g d}||D cg c]  \  }}t        j                  |      s| c}}z  }|D ]4  }t        j                  t        j                  d|      }	 t        d|       6 t        j                  | t!        d             t#        t$              S t        j                  | t!        d	             t#        t$              S t#        d
      S c c}}w # t        $ r#}t        j                  | d|        Y d }~d }~ww xY w)NPOSTload_data_password)zuser_data.jsonzemployee_info_data.jsonzbase_data.jsonzwork_info_data.json)
)
attendancezattendance_data.json)leavezleave_data.json)assetzasset_data.json)recruitmentzrecruitment_data.json)
onboardingzonboarding_data.json)offboardingzoffboarding_data.json)pmszpms_data.json)payrollzpayroll_data.json)r   zpayroll_loanaccount_data.json)projectzproject_data.json	load_dataloaddatazAn error occured : zDatabase loaded successfully.zDatabase Authentication Failed/)r   methodr   getr   r   is_installedr   joinr   BASE_DIRr   r   r   errorsuccess_r&   home)r   
data_filesoptional_appsappfile	file_pathes          r   load_demo_databaser    s&   $&>>V#|| 459II
! *7&S$4;L;LS;QD 

 ' KD $		(*;*;[$ OIK$Z;K   !,K*LM ~ w*J(KL~C=! % K w2EaS0IJJKs$   
D(DD	E!D??Ec                    t               rx| j                  dk(  r]| j                  j                  d      }t        |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   passwordz8The password you entered is incorrect. Please try again.)<script>window.location.reload()</script>z%initialize_database/horilla_user.htmlr   )r   r   _postr   r   r&   initialize_database_userr   warningr  r"   r'   )r   r  s     r   initialize_databaser  =  s~     %&>>V#}}((4H8+ 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   rM   )r   	form_datar  r  r  
first_name	last_namer  r  r  r   employees               r   r  r  W  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  )rM   r   r   FILESis_validr+  r   r   r   r1  r'   rO   )r   r   companyr/  s       r   initialize_database_companyr5    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.
    r1  r"  r   0initialize_database/horilla_department_form.htmlr   departments)r   r   allrO   r   r%  r   r   r3  cleaned_datar   r+  r'   )r   r9  r   r4  s       r   initialize_database_departmentr<    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   r1  r7  r"  r8  )r   
departmentr9  )r   findrO   r   r   r3  r;  r   r+  r'   r   r:  )r   obj_idr?  r   r4  s        r   initialize_department_editrB    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   rA  r?  s      r   initialize_department_deleterD    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.
    r1  r"  r   2initialize_database/horilla_job_position_form.htmlr   job_positionsr4  z-initialize_database/horilla_job_position.html)r   r   r%  r[   r   r   r3  r+  r'   r   r:  )r   r4  r   s      r    initialize_database_job_positionrI    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   rF  r1  r"  rG  )r   job_positionrH  r4  )r   r   r%  r   r@  rZ   r   r   r3  r+  r'   r[   r:  )r   rA  r4  rK  r   s        r   initialize_job_position_editrL    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.
    NrF  r1  r"  rG  )	r   r   r%  r   r@  r&  r'   r[   r:  )r   rA  r4  rK  s       r   initialize_job_position_deleterN  ?  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             t+        || j-                         h      sd}|r|d| z  }t#        |      S t/        | ddt1               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.)allowed_hosts?z
login.htmlr  )r   r   r   GETdictpopr	   r   r   r   r   r%  	is_activer   r  r  r  r&   getattrr   r  r.   get_hostr'   r   )	r   r  r  next_urlquery_paramsparamsr   user_objectr/  s	            r   
login_userr]  [  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 /W%5%5%7$8
 H!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%  ra  )r   r   rc  r/  s       r   include_employee_instancerd    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_successrf    s    ',--r   c                   .    e Zd ZdZdZeZ ed      Zd Z	y)HorillaPasswordResetViewz)
    Worksol 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   rj  zNo user found with the username )r9   rW  r   configurationr   r  r   r  r&   r;  r   r   r   r%  	is_securerr  $dynamic_from_email_with_display_namert  ru  rv  rw  r+  r   is_authenticatedr  r#   METAr   r*   info)	selfr   email_backenddefaultis_default_backendrm  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_namer_   
form_classr*   success_urlr  rz  r   r   rh  rh    s#     +M"J34K"+r   rh  c                       e Zd ZdZdZeZd Zy)EmployeePasswordResetViewz2
    Worksol View for Employee Reset Password
    ri  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)Nrl  Trm  rn  Fro  ry  r   r  r  rp  rx  zNo user with the given usernamezSomething went wrong.....rz  )r9   rW  r   r{  r   r  r   r  r#   r  r   r;  r   r   r   r%  r|  rr  r}  rt  ru  rv  rw  r+  r  r   )
r  r   r  r  r  rm  r  r   r  r  s
             r   r  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)r  r  r  r  r  r_   r  r  rz  r   r   r  r    s     +M"J#Tr   r  r  zreset_password.htmlr  r  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 successfully*<script>window.location.href='/';</script>z#base/auth/password_change_form.htmlr   zbase/auth/password_change.html)r   rK   r   r   r3  r;  set_passwordr+  r   r  r   r  r   r   r  r  r"   r'   )r   r   r   r  s       r   change_passwordr    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                    | j                   }t        |d|j                  i      }| j                  dk(  rt        || j                        }|j                         rs|j                  d   }||_        |j                          t        |d      rd|_	        |j                          t        j                  | t        d             t        d      S t        | d	d
|i      S t        | dd
|i      S )a  
    Handles the username 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 username 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.
    old_username)r   r#  r   r  r  FzUsername changed successfullyr  z#base/auth/username_change_form.htmlr   zbase/auth/username_change.html)r   rL   r  r   r   r3  r;  r+  r   r  r   r  r  r"   r'   )r   r   r   new_usernames       r   change_usernamer  *  s     <<D4.$--1PQD~~!$5==?,,Z8L(DMIIKt./',$		Wa(G&HI LMMgDvtnUU';fd^LLr   c                 P   	 t        |       }| j                  dk(  r| j                  j                  d      }||k(  rhd| j                  d<   d| j                  d<   d| j                  d<   | j                  j                          t        j                  | d       t        d	      S |"t        j                  | d
       t        | d      S t        j                  | d       t        | d      S t        j                  st        d	      S |t        |        t        | d      S #  d}Y xY w)zA
    function to handle two-factor authentication for users.
    Nr   otpotp_codeotp_code_timestampTotp_code_verifiedzOTP verified successfully.r   z&OTP expired. Please request a new one.zbase/auth/two_factor_auth.htmlzInvalid OTP.)get_otpr   r   r   sessionr+  r   r  r&   r  r'   r   TWO_FACTORS_AUTHENTICATIONsend_otp)r   r  user_otps      r   two_factor_authr  J  s	   
g ~~<<##E*s?*.GOOJ'48GOO0137GOO/0OO  "W&BCC= [NN7$LM'#CDDNN7N3'#CDD22}
{';<<1s   D D%c                 ,   | j                   j                  }|j                         }t               }|j                  }t        |       }t        dd| ||g      }t        j                  |j                        }|j                          t        d      S )z
    Function to send OTP to the user's email address.
    It generates a new OTP code, stores it in the session, and sends it via email.
    zYour OTP CodezYour OTP code is )subjectbodyrs  to)targetz
two-factor)r   r   get_mailr9   r}  set_otpr   	threadingThreadsendstartr&   )r   r/  r  r  display_email_namer  threads          r   r  r  l  s    
 ||((HE*,M&KKwH 
+%7	E UZZ0F
LLNL!!r   c                     t               }|| j                  d<   t        j                         j	                         | j                  d<   d| j                  d<   | j                  j                          |S )z
    Function to set the OTP code in the session.
    Generates a new OTP code, stores it in the session, and sets a timestamp for expiration.
    r  r  Fr  )r|   r  r+   now	timestampr+  )r   r  s     r   r  r    s[     ~H"*GOOJ,4LLN,D,D,FGOO()+0GOO'(OOOr   c                 6   | j                   j                  dd      }t        j                         j	                         }||z
  dkD  r9d| j                   d<   d| j                   d<   | j                   j                          y| j                   j                  d      S )z
    Function to retrieve the OTP code from the session.
    Checks if the OTP code has expired (10 minutes) and clears it if so.
    r  r   iX  Nr  )r  r   r+   r  r  r+  )r   
created_atcurrent_times      r   r  r    s    
 $$%91=J<<>++-Lj 3&&*
#04,-"":..r   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_userr    s*     ||w~HH Or   c                       e Zd ZddZy)WorkinfoNc                 B    || _         || _        |j                  | _        y N)r   r   ra  )r  r/  s     r   __init__zWorkinfo.__init__  s     "*#++r   )returnN)r  r  r  r  rz  r   r   r  r    s    r   r  c                 D   t        j                         }|j                         }|t        |      z
  }|t        d      z   }t        j
                  j                  d      j                         }| j                  j                  }t        j
                  j                  |      j                         }t        | t              D cg c]  }|d   	 }	}|r|j                  |j                  }	t        j                          j#                         }d}
|j$                  dk7  rH|j$                  j&                  |j&                  k(  xr# |j$                  j(                  |j(                  k(  }
|j+                  d      |j+                  d      |	|
|d	}t-        | d
|      S c c}w )z2
    This method is used to render index page
    )days   TrV  r/  r   Nz%Y-%m-%d)first_day_of_weeklast_day_of_weekchartsis_birthdaytotal_employeesz
index.html)r   todayweekdayr   r   r   r   countr   r   r   r%  rt   CHARTSr  r+   r  datedobmonthdaystrftimer'   )r   r  today_weekdayr  r  r  current_employeeemployee_chartschart
chart_listr  contexts               r   r  r    st    NNEMMOM	} ==(9!+<<&&---=CCEO||00-55<<! = eg  )?w(OPu%(PJP?11=$++
LLN!EKt#  &&%++5 6 $$((EII5 	 /77
C,55jA"*G '<11- Qs   F%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   r1  locationr  mobileshift_iddate_joiningcontract_end_datebasic_salarysalary_hoursearchrn  T)+employee_id__employee_first_name__icontainsemployee_id__is_activer  )rc  permc              3   :   K   | ]  }t        |      d  y w)N   )rW  ).0
field_namer/  s     r   	<genexpr>z-employee_workinfo_complete.<locals>.<genexpr>  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>&  s    eA6M4N.O r   )keypagezwork_info_complete.htmlemployees_with_pending)rS  r   rx   r   r   r   sumappendry   r   insertr  sortr   r'   )r   r  fields_to_focusr  employees_workinfosr  percentemployee_infoempsempr/  s             @r   employee_workinfo_completer
    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  3  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   ro   get_models_in_appr  _metar  
capitalizer  r   r   r3  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.
    ra  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   ro   r3  r+  r$   lenr$  r;  r  clear)r   group_idr   r   r$  permss         r   update_group_permissionr-  a  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                         j                  dd      |d        t        j                  j                         }t        | d||t        || j                  j!                  d            |d      S )=
    This method is used to create user permission group
    r  r   r  zbase/auth/group.htmlr  r  r   groupsr  )r   r   ro   r  r  r  r  r  r  replacer   r   r:  r'   r   rS  r   )	r   r  r   r  r   r  r  r  r2  s	            r   
user_groupr4    s     KD/?D 

&x0 	E$)KK$<$<$G$G$I"'++"8"8	 	'')11#s;:V	

 ]] 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  rn  r  name__icontainszbase/auth/group_lines.htmlr  r1  )r   r   ro   r  r  r  r  r  r  rS  r   strr   r   r   r'   r   )
r   r  r   r  r   r  r  r  r  r2  s
             r   user_group_searchr9    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__idra  Tflat)r;  r/  r"  r/  zUser group assigned.r  z base/auth/group_user_assign.html)r   r+  )rS  r   rI   r   r   r   values_listr   getlistr3  r+  r   r  r  r"   r'   )r   r+  r   s      r   group_assignrA    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
    rn  r  r6  z base/auth/group_assign_view.htmlr  )r2  pd)rS  r   r   r   r   r	   r'   r   )r   r  r2  previous_datas       r   group_assign_viewrE    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
    rn  r  r  data)rS  r   r   r   r   r'   )r   r  r4  s      r   user_group_viewrH    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`     ry  r   )r   r   r   r   r  remover#   r  )r   pidgidr;  
permissions        r   user_group_permission_removerP    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`  ry  r   )r   r   r   r   user_setrL  r#   r  )r   uidrN  r;  r   s        r   group_remove_userrT    s`     MM%E<<s#D	NN$ 0 0 EFFr   DELETEc                 h   |j                  d      }|j                  d      }d}	 |j                  j                         }|j                  j                  |      }|j                          t	        j
                  | t        d      j                  |             t%        j&                  d      rt|dk(  rot)        dd      }|j                  j+                         }|j-                         r-| j.                  j1                         }|dz   |z   }t3        |      S t5        d      S |r-| j.                  j1                         }|dz   |z   }t3        |      S |j                  d      r&|sdk(  rdn|j                  d      }t5        |       S t7        | j8                  j                  dd            S # |j                  $ rH d}t	        j                  | t        d      j                  |j                  j                               Y jt        $ 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  rR  r  r"   r  z-<script>$('.reload-record').click();</script>ry  r   )r   r   r  r&  r   r  r  formatDoesNotExistr  r  r  r   setprotected_objectsaddr  r  r   r   r   r:  r   rS  r	   r&   r"   r#   r  )r   rA  kwargsr  rW  delete_errorr  r   r  model_verbose_names_setobjmodel_names_str	KeyResultkey_resultsrD  return_parts                   r   object_deleterh  (  sX   & 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	# uz <N+ 	
 {m--#GLL$4$4^S$IJJI  Uw/ 2 9 9%++:R:R ST 
"%%&& 	PC#''#))*@*@*K*K*M(NO	P ))$;<1299(OT	
 	
s    A4F. .AJ1J1BJ,,J1c                    |d   }|d   }|d   }	 |j                   j                  |      } ||      }t        |d      r|j                         nd}	| 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|j1                  d      }d|_        |j1                          t        d      S |j                  dd      |d|ddd|	i}t3        | ||      S # |j                  $ r t        j                  | |j
                  j                   d       | j                  j                  d      rt        ddd	i
      cY S | j                  j                  dd      }t        |      cY S w xY w)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`  z object does not exist.z
HX-Request   
HX-Refreshtrue)statusheadersry  r   r>  get_template_languageNrS  rn  z (copy)ra  r   Fcommitr  	form_namerA  	duplicateTsearchWords)r   r   r\  r   r  r  r  ro  r"   r  r#   r   rp  r   rb  items
isinstancer   	CharFieldr#  r   ra  r   r3  r+  r'   )r   rA  r`  r  r  rj  original_objectcurrent_urlr   search_wordsr  fieldinitial_value
new_objectr  s                  r   object_duplicater  l  s   * 7OEJj!H5--++v+6 /D(/6M(N""$TX  ~~!%!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--K  5w5;;#;#;"<<S TU??|,s\64JKK!,,**>3?K'445s   F. .A&I 'I ?I 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  r  rj  empty_labelfield_name_pre
field_typeHTTP_HX_TARGETr  r  r   	characterzoh-input w-100id_classr$  ra  attrsF)widgetrequiredz oh-select oh-select-2 mb-3 w-100)rc  r  r  r  )field_counts
field_htmlcurrent_hx_targetnext_hx_target)r   r   r  intsplitrsplitr   rx  	TextInputrb  ModelChoiceFieldr   r:  Select	as_widgetr(   r"   )r   r`  r  r  rj  r  r  r  	hx_targetr  r  r   r  r  r  s                  r   add_remove_dynamic_fieldsr    s   0 ~~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 <<%G$.$'
|"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   r  r  s      r   mail_server_confr    sb     -4488:L! ((//4/@GGI!&+(&<	
 r   c           
      8   | j                   j                  d      }t        t        dd      }t	        j
                  t        j                  d      }d}|rt        j                  j                  d      j                         }	 | j                  j                  j                         r$| j                  j                  j                         n|}|rD|j                  }t	        j
                  t        j                   |j"                  j$                        }t'               }| j(                  dk(  rnt'        | j*                        }|j-                         rH|j.                  d	   }t1        d
      }	d| d| dt3        j4                         j6                   d| d	}
t9        |
      }t;               }t<        j                  j                  |      j?                         }||_         	 tC        |	||jD                  |g|      }|jG                  |
d       tI        |d      5 }tK        |jM                               }|jO                  dd       |jQ                  |       d d d        |jS                          tW        j^                  | t1        d             t]        d      S ta        | d||d      S #  |}Y xY w# 1 sw Y   ]xY w# tT        $ rN}tW        jX                  | dj                  t1        d      t[        |      g             t]        d      cY d }~S d }~ww xY w)Ninstance_idWHITE_LABELLINGFzimages/ui/horilla-logo.pngWorksolT)r!  r   to_emailzTest mail from Worksola  
            <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;">a  </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 a  .</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; r0  z</p>
                            </td>
                        </tr>
                    </table>
                </body>
            </html>
            r`  )
connectionz	text/htmlrbz
Content-IDz<unique_image_id>zSomething went wrong :r  zMail sent successfullyz%base/mail_server/form_email_test.html)r   r  )1rS  r   rW  r   r   r  r   STATIC_ROOTr   r   r   lastr   r   get_companyr4  
MEDIA_ROOTiconr$  rR   r   r   r3  r;  r  r   r  yearr-   r9   r   r%  r{  r   r}  attach_alternativeopenr   read
add_headerattachr  r   r   r  r8  r"   r  r'   )r   r  white_labelling
image_pathcompany_namer!  r4  r   email_tor  html_contenttext_contentr  emailconfigmsgimgmsg_imgr  s                     r   mail_server_test_emailr  
  s    ++//-0Kl,=uEO8//1MNJL__##t#,113	 <<,,88: ))557  "??L8#6#68I8IJJ D~~"7<<0==?((4H01G H IU~ Va bn`n oR S[R`R`RbRgRgQhhijviw x'L8 &l3L24M3;;BB C eg  +6M'Q, !FFJ, &&|[A*d+ (s'
3G&&|5HIJJw'(
 

 Wa(@&AB KLL/k2 S	Gx( (  Qw!4L2MsSTv1V(WX#$OPPQsD   A
J, $9K =J6K ,J36J?;K 	LALLL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 deletedr  z"base/mail_server/replace_mail.htmlzCan't Delete)mailstitle)rS  r@  r   r   r   r%  r  r&  r   r  r"   r:  r  r  excluder'   r  )r   r  r&  ra  r  r  s         r   mail_server_deleter  j  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`  Tr  z*Primary Mail server configuration replacedzmail-server-conf)r   r   r   r   r  r+  r   r%  r&  r   r  r&   )r   emailconfig_idemail_configs      r   replace_primary_mailr    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 )Nr  r`  r>  r   r  zbase/mail_server/form.html)r   r   )rS  r   r   r   r   r%  rQ   r   r   r3  r+  r"   r'   )r   r  r   r   s       r   mail_server_create_or_updater    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   ru  )r   r   r:  r]   r   rp  r'   )r   r  r   rj  ru  s        r   view_mail_templatesr    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  mail/htmx/form.htmlFr   rt  ru  )r   r   r   r]   rp  r   r   r3  r+  r   r  r"   r'   )r   rA  rj  r   ru  s        r   view_mail_templater    s     #**..&.9HX.D,,.K~~x@==?IIKW&89 KLLE+F r   zbase.add_horillamailtemplatec                 B   t               }|j                         }| j                  dk(  rft        | j                        }|j	                         rA|j                         }|j                          t        j                  | d       t        d      S t        | d|d|d      S )z<
    This method is used to create offerletter template
    r   zTemplate createdr  r  Fr  )
r]   rp  r   r   r3  r+  r   r  r"   r'   )r   r   ru  r   s       r   create_mail_templatesr    s     D,,.K~~-==?yy{HMMOW&89 KLLE+F r   zbase.delete_horillamailtemplatec                     | j                   j                  d      }t        j                  j	                  |      j                         }t        j                  | d       t        t              S )Nr  r  zTemplate deleted)
rS  r@  r   r   r   r&  r   r  r&   r  )r   r  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)rM   r   r   r:  r   r   r2  r3  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                 n    t         j                  j                         }t        | d|t               d      S )z4
    This method used to view created companies
    zbase/company/company.html)r  r  )r   r   r:  r'   )r   r  s     r   company_viewr    s3     ##%I#')4 r   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   r4  )r   r   r   rM   r   r   r2  r3  r+  r   r  r  r"   r'   )r   ra  r`  r4  r   s        r   company_updater  %  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   )
rO   r   r   r3  r+  r   r  r  r"   r'   r   r   s     r   department_creater  <  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.htmlr9  )r   r   r:  r'   )r   r9  s     r   department_viewr  U  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@  rO   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  r?  r   s        r   department_updater  e  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   r9  jobs)r   r   r:  r   r   rZ   r   r   r3  r+  r   r  r  r'   )r   r9  r  r   s       r   rK  rK  }  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
    dynamicrn  r   r  r  (base/job_position/job_position_form.htmlr   r  )rS  r   r[   r   r   r3  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   Trq  zJob position updated.r  r  )r   rK  )r   r@  rZ   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  rK  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   Trq  z'Job role has been created successfully!r  job_roler   base/job_role/job_role_form.htmlr  )rS  r   r\   r   r   r   pkr3  r+  r   r  r  rG  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)rH  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   Trq  zJob role updated.r  r  )r   r  )r   r@  r\   r   r   r3  r+  r   r  r  r"   r'   )r   ra  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  )rS  r   rp   r   r   r:  r   r   r3  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  3  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@  rp   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  r  r   s        r   work_type_updater  B  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)ri   r   r   r3  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  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@  ri   r   r   r3  r+  r   r  r  r"   r'   )r   ra  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
    Tr  rc  -idr  r  r  z6base/rotating_work_type/rotating_work_type_assign.html)frwork_type_assign
assign_ids	rwork_all	gp_fields)rA   r   r   r   r:  qsorder_byrx   jsondumpsr   rS  r   object_listra  r'   rB   rb  )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   r  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_frr  r&   zRotating work type assigned.z@base/rotating_work_type/htmx/rotating_work_type_assign_form.htmlr   utf-8#<script>location.reload();</script>)rg   rS  r   rh   ru   r   r   r3  r+  r@  r   r   r   select_relatedr(  r   r  r   r   r)   r   r  r  r'   r"   r  decoder   r   r/  employee_ids	employeesusersr  s          r   rotating_work_type_assign_addr4    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|  rV  )rm  unknownTr  falseFr  orderbyz;base/rotating_work_type/rotating_work_type_assign_view.htmlrn  r  listz*base/rotating_work_type/htmx/group_by.html)r  rC  filter_dictr  r|  )rS  r	   rA   r  r  r   r   rx   r   r   r}   r   r   r  r  ra  r  r  r:  r   r'   )r   rD  r  r|  rj  	data_dictentrylist_valuesid_listvaluer   r  s               r   rotating_work_type_assign_viewrA    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   rC  previousrP  r  ry  rn  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)rS  copyrU  r	   r   r   r   r%  r   r  loadsrv   r  endswithr  r  
ValueErrorr'   )r   r  request_copyrD  r   r  assign_ids_jsonr  previous_idnext_idry  partHTTP_REFERERSr   s                 r   rotating_work_individual_viewrU  0	  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>  rV  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   rh   ru   r   r   r3  r+  r   r  r  r'   r"   r  r/  )r   ra  rotating_work_type_assign_objr   r  s        r    rotating_work_type_assign_updaterZ  S	  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_REQUESTrm  export_filterexport_columnsz=base/rotating_work_type/rotating_work_type_assign_export.htmlr  Rotating_work_type_assignr   r  filter_classr  	file_name)r  r   rA   rf   r'   rw   r   r   r  s     r    rotating_work_type_assign_exportrf  u	  se     ||)*f49;>@
 K
 	
 $13- r   c           	         | j                   j                         }|j                  dd        |j                         }| j                  j                  dd       }| j                  j                  dd       }t        |      }|j                  j                  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|dk(  r|| j                   j                  d      }	t        j                  |	      }
||
v r|
j                  |       t        t        j                  |	      |      \  }}t        d| d| d
|
 d      S |rz|dk(  ru|dk(  rat        j                  j!                         }| j                   j                         }|j#                         rt        d|       S t%        d      S t        d| d      S |rt%        d      S t'        | j                  j                  dd            S )NrC  r  HTTP_HX_CURRENT_URLr   view-containerz /rotating-work-type-assign-view?objectDetailsModalTargetz/rwork-individual-view/rR  z&instances_ids=shift_targetrI  genericModalBodyz/work-rotating-detail-view//?z&deleted=Truezrotating-work-containerz#employee/rotating-work-type-assign/z#/rotating-list-view?is_active=True&r  z!/employee-rotating-work-tab-list/z?deleted=Truery  )rS  rK  rU  r	   r  r   r
   r   lstripr&   r  rL  rL  rv   r   r   r:  r   r"   r#   )r   rA  r   rO  rD  r  hx_current_url
parsed_urlhx_current_pathrC  instances_listprevious_instancenext_instanceurlr[  rwork_type_requestss                   r   "rotating_work_type_assign_redirectrw  	  s   ;;##%L_d+ **,M  !148I\\%%&;TBN.)J oo,,S1OY"22:=/JKK	y$>>8M2^#!!&)+:JJ}%v,
(= (a8]O?>2BCf%%	yN2{.{m<==	y$668M2^#!!&)+:JJ}%v,
(= )-=/YgXhhuv
 	
 
y$==CC"8"@"@"D"D"F#KK113M"))+"Em_ UVV#$OPP3K=N  
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rV  r   Already on record is activeun-archivedarchivedzRotating work type assign is {}$Rotating work type assign not found.)r%   r   r   ra  r   r   rV  r   r  r+  r  r  r[  rw  r!   )r   rA  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                    | j                   d   }t        j                  |      }d}t        d      }| j                  j                  d      dk(  rd}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  r=t        j                   | t        d      j                  ||             t#        ddi      S t%        |       S )zT
    This method is used to archive/un-archive bulk rotating work type assigns.
    r  Tr{  rV  FalseFr|  r   r`  ry  z3Rotating work type for {employee_id} already existsr   r  z5Rotating work type for {count} employees is {message})r  r!  r!  Success)r   r  rL  r  rS  r   r   r   r   r   r   r   r  r[  rV  r+  r  r$   rw  )r   r  rV  r!  r  ra  r  employees_rwork_type_assigns           r   &rotating_work_type_assign_bulk_archiver  	  sa    ,,u
C
**S/CIG{{{#w.	J-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 	
 Y	233-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
    r  r`  z{employee} deleted.r  z{rwork_type_assign} not found.z%You cannot delete {rwork_type_assign})r  r!  r  )r   r  rL  r   r   r   r&  r   r  r  r[  r   r\  r  r   r$   )r   r  ra  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   ra  r&  r   r  r  r\  r  r   rw  )r   rA  rY  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  @
  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  )rS  r   rW   r   r   r:  r   r   r3  r+  r   r  r  r"   r'   )r   r  r   r  s       r   employee_type_creater  Q
  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.r  r  )r   employee_type)r   r@  rW   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  r  r   s        r   employee_type_updater  i
  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   	gracetimerY  T)
is_defaultNzbase/shift/shift.html)shiftsgrace_times)r   r   r:  r   r   r   r  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!r  base/shift/shift_form.html)r   r  r  )rS  r   rT   r   r   r:  r   r   r3  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 updatedr  r  )r   shift)r   r@  rT   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  employee_shiftr   s        r   employee_shift_updater  
  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   r  r  s      r   employee_shift_schedule_viewr  
  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!r  base/shift/schedule_form.html)r   r  )rU   r   r   r:  r   r   r3  r+  r   r  r  r"   r'   )r   r   r  s      r   employee_shift_schedule_creater  
  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.r  r  )r   r  )r   r@  rV   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  employee_shift_scheduler   s        r   employee_shift_schedule_updater  
  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_viewr    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.r  1base/rotating_shift/htmx/rotating_shift_form.html)r   r  )re   r   r   r3  r+  r   r  r  r"   r'   r   r   r:  r  s     r   rotating_shift_creater    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.r  r  )r   rshift)r   r@  re   r   r   r3  r+  r   r  r  r"   r'   )r   ra  r`  rotating_shiftr   s        r   rotating_shift_updater  3  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  r  r  r  z.base/rotating_shift/rotating_shift_assign.html)r   r  r^  r_  rshift_assignr  
rshift_allr  )rc   ru   r?   ra   r   r   r  r:  rx   r  r  r   rS  r   r  ra  r'   rb   r@   rb  )r   r   r   r  r  r   r  s          r   rotating_shift_assignr  P  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<r  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"  r  r   r  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-  )rc   rS  r   rd   ru   r   r   r3  r+  r@  r   r   r   r.  r(  r   r  r   r   r)   r   r  r  r'   r"   r  r/  r0  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r5  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|  rV  r7  Tr  r  r9  z3base/rotating_shift/rotating_shift_assign_view.htmlrn  r  r:  z&base/rotating_shift/htmx/group_by.html)r  rC  r;  r  r|  )rS  r	   r?   r  r  r   r   rx   r   r   r}   ra   r   r  r  ra  r  r  r:  r   r'   )r   rD  r  r|  r<  rj  r=  r>  r?  r@  r   r  s               r   rotating_shift_assign_viewr    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
    rC  Nr`  rD  ry  rn  rF  rG  zrotating-shift-assign/z/rotating-shift-assign-viewrH  r   r  rI  rJ  rE  rP  r  z(base/rotating_shift/individual_view.html)rS  rK  rU  r	   ra   r   r   r%  r   r  rM  r  r  rN  r  rL  rv   r'   )r   r  rO  rD  r   r  rP  ry  rS  rT  r   r  rQ  rR  s                 r   rotating_shift_individual_viewr    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>  r  r   zRotating shift assign updated.z?base/rotating_shift/htmx/rotating_shift_assign_update_form.htmlrX  r,  r-  )ra   r@  rd   ru   r   r   r3  r+  r   r  r  r'   r"   r  r/  )r   ra  rotating_shift_assign_objr   r  s        r   rotating_shift_assign_updater    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_exportrb  )r  r   r?   rb   r'   rw   ra   re  s     r   rotating_shift_assign_exportr  ,  s`     ||)*79;=
 C
 	

 !/00 r   c                 Z    | D cg c]  }t        j                  |      rd n| c}S c c}w r  )rC  isna)lstr  s     r   normalize_listr  B  s%    /23!BGGAJDA%333s    (c           	         | j                   dk(  rg }g }g }g }i }t        j                  j                         }t        j                  j                         }| j
                  d   }|j                  j                  d      d   j                         }	d}
d}|D ci c]9  }|j                  |j                         D cg c]  }|r|j                  nd  c}; }}}|	dk(  rt        j                  |      nt        j                  |      }|j                  d      }	 t!        |d	   j#                               }|D ci c]  }|g  }}g |d<   g |d<   g |d<   t/        |      dkD  r3|d   }t1        j2                  t5        |      d      j7                         }t9        |d      D ]a  \  }}|j;                  |d          t!        |j=                               dd  }t?        |      }tA        jB                         j7                         k  rd|d<   |t!        |j=                               vr1|t!        |j=                               vr|jE                  |d         jG                         rd|d<   d}
|j;                  |       t        |d   |jE                  |d	          jI                         |jE                  |d          jI                         !      }|d"d  r_g }|d"d  D ]<  }	 |j;                  |jE                  |       jI                         j                         > d#|i|_%        |jM                          |||j                  <   |j;                  |       d}|jO                         D ]?  \  }}||k(  st        j                  jQ                  |$      }|j;                  |       d} n |s|jO                         D ]>  \  }}||k(  st        j                  jQ                  |$      }|j;                  |        a d tR        j                  jE                  |%      } tT        j                  j                         }!r|rtW        | |      D ]  \  }"}#|!jE                  |"|#&      jG                         sftU               }$|"|$_,        |#|$_-        ||$_.        d'|$_/        d|$_0        ||$_1        |#jd                  |$_3        d|$jJ                  d(<   |j;                  |$       d)|#j                   d*|" }%|D ],  }|d   |"jh                  k(  s|%|d<   |j;                  |          | xs | jj                  jQ                  d+      d,k(  }|r!|rtT        j                  jm                  |       to               }&g }'|D ].  }|d   }(|(|&vs|'j;                  |       |&jq                  |(       0 |'r|'D ]E  }|jO                         D ]0  \  }})||v r|)j;                  ||          	 |)j;                  d        2 G |jO                         D )cg c]  \  }})t        d- |)D              r| }*}})|*D ]  }||=  t        j(                  ||j#                               }t/        |'      }t+        d      }d|d<   |j-                  |d       ||d<   |S ts        d.t/        |       d/      S t+        d0      S c c}w c c}}w c c}w #  t%        j&                  | d
       t        j(                  dgdg      }d}t+        d      }d|d<   |j-                  |d       ||d<   |cY S xY w#  |j;                  d        Y [xY w#  Y xY wc c})}w )1Nr   r
  .r  FTcsvrecordsr   zsomething went wrong....zPlease provide valid datazTitle Errorcolumnsr  text/csvcontent_typez&attachment; filename="ImportError.csv"Content-DispositionindexzX-Error-CountzEmployee Errorz
Date Error   r%  )dayfirstr  zBadge Idz%Start Date must be greater than todayTitler$  z-Rotating Shift with this Title already exists)r  )r$  shift1shift2rK  additional_shiftsr`  )badge_id__in)r   rotating_shift_idafternext_shift_indexzRotating Shift with ID z! is already assigned to employee create_rotating_shiftrm  c              3   $   K   | ]  }|d u  
 y wr  rz  r  vs     r   r  z/rotating_shift_assign_import.<locals>.<genexpr>  s     0QqDy0   zEmployees Imported Succefully)r  success_countrn  ):r   r   r   r:  r   r2  r$  r  lowerra  total_shiftsr  rC  read_csv
read_excelto_dictr:  keysr   r  	DataFramer"   to_csvr)  r   parser8  r  	enumerater  valuesr  r   r  r   r   r%  additional_datar+  rv  r   r   ra   zipr   r  
start_datebased_onrotate_after_daynext_change_dater  
next_shiftr  r   bulk_creater]  r_  r$   )+r   rotating_shift_obj_listr1  rotating_shift_assign_list
error_list	new_dictsrotating_shiftsr  r
  file_extensionr  r  	rot_shiftr  existing_dicts
data_framework_info_dicts	keys_listr  
error_dicterror_countr  r  
total_rowsrowcurrent_listrotating_shift_objr  itemflagrot_shift_id
shift_listemployee_listr_shiftsr/  r  rot_shift_assignerror_messageflgunique_error_listr  r@  keys_to_removes+                                              r   rotating_shift_assign_importr  F  s    ~~"$%'"
	'//335&&**,}}V$-b1779 $ -

 	 LL&335 ).$$47 
 
 "05!8BKKbmmD>Q 	 %,,Y7	_Q/4467I-67c#r'7J7  %'
=!')
#$#%
< y>A"1Jc*oEJJLJ(B 5	"OJJ0

-ab1L),7LHNN,1133+R
<(4%%'$ d9+;+;+=&>>"))s7|)<CCE)XC& E%%c*%2W!==Q=HNNP!==Q=HNNP&"
  #&(O ,QR 0 99+22 &T B H H J M M9 ,_:&6 '++-3?	,//0'../AB0>0D0D0F ,L*!\1-:-B-B-F-F,-F-W*/667IJ$ 4=OO4E "0j%51>1F1F1J1J#/ 2K 2. 4::;MN!"_5	"n !((//\/J&..224,$'7N$O " & (F ' &( (;'<$3;$09?$62<$/07$-89$58B$528--$/KL$445GH.556FG&=fkk]Jkltku$vM. "z?h.?.??4AC 01&--c2!	"!". NQgll../FG6Q 	 !)#++778RSe 	"C:Hs"!((-!		" ) !","2"2"4 !JCd{T#Y/!!LL.!! #-"2"2"4C0%00 N  & $sO$j*//:KLJ/0K#<H.VH*+he4(3H_%O:!$]!3
 	
 O
 8	NN7$>?,-&J
 K#<H.VH*+he4(3H_%OJ9+2248X! sU   "Z<=Z7Z< [ =
[[ )9\*']]7Z<[ A\'*] ]c           	      H   | 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                  |      |      \  }}	t        d|	 d| d|       S |r|d	k(  r|| j                   j                  d      }t        j                  |      }||v r|j                  |       t        t        j                  |      |      \  }}	t        d
|	 d| d| d      S |r|dk(  r|rt        d|       S |rf|dk(  ra| j                  j                  dd       }
t        |
      }|j                  j                  d      }|dk(  rt        d      S t        d| d      S |rt        d      S t        | j                  j                  dd            S )NrC  r  ri  z/rotating-shift-assign-view?rj  z/rshit-individual-view/rm  z            &instances_ids=rl  z'/rotating-shift-individual-detail-view/&instance_ids=z&detail=truerk  rI  zrotating-shift-containerrh  r   zemployee/rotating-shift-assign/z,/rotating-shift-request-list/?is_active=truez$/rotating-shift-individual-tab-view/?deleted=truer  ry  )rS  rK  rU  r	   r  r   r&   r  rL  rL  rv   r
   r   rn  r"   r#   )r   rA  r   rO  rD  r  rC  rr  rs  rt  r   rp  parsed_paths                r   rotating_shift_assign_redirectr     s=   ;;##%L_d+ **,M  !148IY"226}oFGG	y$>>8M2^#!!&)+:JJ}%v,
(= %m_B}o F*+-
 	
 
y$668M2^#!!&)+:JJ}%v,
(= 5m_B}oUcdrcss  A
 	
 
yN2{.{m<==	y$>>|| 5t<d^
 oo,,S1;;JLL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`  Try  rz  r{  r|  zRotating shift assign is {} Rotating shift assign not found.)r%   ra   r   ra  r   r   rV  r   r  r+  r  r  r[  r!   r   )r   rA  r  r   employees_rshift_assignsr!  s         r   rotating_shift_assign_archiver$  0  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
    r  Tr{  rV  r  Fr|  r`  ry  r  z*Rotating shift for {employee} is {message})r/  r!  z/Rotating shift for {employee} is already existsr  r!  r  )r   r  rL  r  rS  r   ra   r   r   r   r)  rV  r+  r   r  r[  r  r$   )r   r  rV  r!  ra  r  employees_rshift_assignr  s           r   "rotating_shift_assign_bulk_archiver'  J  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
    r  r`  z{employee} assign deleted.r  z{rshift_assign} not found.z!You cannot delete {rshift_assign})r  r!  r  )r   r  rL  ra   r   r   r&  r   r  r  r[  r   r\  r  r   r$   )r   r  ra  r  s       r   !rotating_shift_assign_bulk_deleter)  w  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.Nr"  z-You cannot delete this rotating shift assign.)ra   r   r   r   ra  r&  r   r  r  r\  r  r   r   )r   rA  r  r   s       r   rotating_shift_assign_deleter+    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      j                  d      }|d   }d}|dk7  r|}nd}|r6d}t        j                  j                  |      }|j                         |d<   n3t        j                  j                  d	
      j                         }d|d<   t        D 	
cg c]  }	|	j                         j                  dd      t        |	      D 
cg c]Y  }
|
j                  j                  t        vr;|
j                  j                  j                         |
j                  j                  d[ c}
d }}	}
||d<   t        |d<   t!        || j"                  j%                  d            |d<   t'        | ||      S c c}
w c c}
}	w )zD
    This method is used to assign permissions to employee user
    zbase/auth/permission.htmlr   r  Nzemployee-permission-assignztabs/group_permissions.htmlr`  r/  F*employee_user_id__user_permissions__isnullTshow_assignr  r0  r  r  r  r  r  r2  )r   stripr  r   r   r   r%  distinctr   r  r3  r  r  r  r   r  r   rS  r   r'   )r   r  r  rj  r   partsid_partr"  r2  r  r  r  s               r   employee_permission_assignr:    s    G*H<<DDJJsO!!#&EBiGF..0$$++v+6	'oo/
$$++7< , 

(* 	 "&   &&(00c: /x8
 ;;))1EE	 %*KK$<$<$G$G$I"'++"8"8
	
K  )GM&:G"#(GKKOOF4KLGK s   71F(AFFFview_permissionsc                 *   i }d}t        | j                        j                  }| j                  j                  d      rAt        j
                  j                  | j                  d         }|j                         |d<   n%|j                  d      j                         }d|d	<   t        D cg c]  }|j                         j                  d
d      t        |      D cg c]Y  }|j                  j                  t        vr;|j                  j                   j                         |j                  j                  d[ c}d }}}||d<   t        |d<   t#        || j                  j                  d            |d<   t%        | ||      S c c}w c c}}w )zP
    This method renders template to view all instances of user permissions
    zbase/auth/permission_lines.htmlprofile_tabr   r`  r/  Fr3  Tr5  r  r0  r  r  r  r  r  r2  )r   rS  r  r   r   r   r   r%  r7  r   r  r3  r  r  r  r   r  r   r'   )	r   codenamerS  r  rj  r2  r  r  r  s	            r   employee_permission_searchr?    s{    G0Hw{{+..I{{}%$$++w{{=/I+J	'oo/
$$7< % 

(* 	 "&   &&(00c: /x8
 ;;))1EE	 %*KK$<$<$G$G$I"'++"8"8
	
K  )GM&:G"#(GKKOOF4KLGK s   .1FAF
=F
F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(  )rH   r   r3  r+  r$   rG  r   r   r   r   r%  r(  user_permissionsr*  r  s     r   update_permissionrB    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                         j                  dd      |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  r0  r  r   zEmployee permission assigned.r  z base/auth/permission_assign.htmlr  )r   rH   r   r  r  r  r  r  r  r3  r   r   r3  r+  r   r  r  r"   r'   )r   r  r   r   r  r  r  r  s           r   permission_tablerD  +  s"    KDD/ 

&x0 	E00!!(-(@(@(K(K(M&+kk&<&<	 	'')11#s;:V	

 ~~-==?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)rG  r  r   r;  requests_idsr  )rS  r	   r   r   r   r   r%  has_permr   r:  rx   r  r  r   r   r  ra  rE   r   r}   rs   ru   rd  r'   r  rF   rb  )	r   rD  r/  work_type_requestsr   rH  r  r<  r   s	            r   work_type_request_viewrK  V  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)rF  c                     | j                   j                  d      dk(  r't               }t               }||d}t	        | d|      S t        | t        t        t        d      S )Nr\  rm  export_fieldsr^  z/work_type_request/work_type_request_export.htmlr`  Work_type_request)r  r   rE   rq   r'   rw   r   )r   r^  rN  r  s       r   work_type_request_exportrP    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|  rF  rG  r  r  r9  z$work_type_request/htmx/requests.htmlrn  r  r:  z$work_type_request/htmx/group_by.html)rG  rC  r;  rH  r|  )r   r   r   r   r%  rS  r	   r   rE   rI  rx   r  r:  r   r]  ra  r   r   r  r  r  r  r   r   r}   r'   )r   r/  rD  r|  r  work_typ_requestsemployee_work_requestssubordinates_work_requestscombined_requestsreqcombined_requests_qsrj  r=  r>  r?  r@  r   rH  r<  s                      r   work_type_request_searchrX    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)Nry  rn  pd=r   r%  dashboard-work-type-requestz#WorkTypeRequestApproveBodyzwork-type-request-view//work-type-request-search?rH  zemployee-profile/rI  z?profile=truerJ  r  )r   r   ra  r  r   r   rS  r	   r3  r  r  r)   rM  r  rN  )	r   r/  ry  rD  rF  rG  rS  rT  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  .
    rZ  rn  r"  r   r"  rG  )r  rC  rF  rG  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   #work_type_request/request_form.htmlr`  )"rS  r	   r   r3  rs   r   r   ra  r   ru   rd  rE   r]  r   r   r3  r+  r   r  r   r   r   r(  r)   r   r   r  r  r   r   r:  r)  r"   r'   )
r   encoded_datarD  r   r/  r  r  r   r  rJ  s
             r   work_type_requestrd    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\  rm  ry  r   rh  rn  r%  r  r  rj  rC  	dashboardzwork-type-request-single-viewrA  )r`  z?instances_ids=z&dashboard=r[  z/work-type-request-view/r\  z/employee-view/rI  )r  r   r#   r  r  r"   rS  r)   ra  r&   r	   r   )r   rd  
hx_requestrz  r  rC  rf  ru  s           r   handle_wtr_redirectrh  3  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.ry  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`  ra  closer&  r'  r(  r)  r*  r+  r&   r  )r   r@  r   r  r  r#   r  r   r   r   rI  r   r   approvedcanceledr   r   r   r   previous_work_type_idr   r  r+  r  r   r  r(  r)   ra  rh  )r   ra  rd  	work_infos       r   work_type_request_cancelrs  U  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
    r  Fr`  rk  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`  ra  rm  rn  r  )r   r  rL  r   r   r   r   r   rI  r   r   ro  rp  rq  r   r  r+  r   r  r  r   r  r(  r)   ra  r$   )r   r  r  ra  rd  s        r   work_type_request_bulk_cancelrv    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
    rj  ry  r   approve_worktyperequestchange_worktyperequestrl  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`  ra  	checkmarkrn  zEAn approved work type request already exists during this time period.)r   r@  r   r  r  r#   r  r   r   r   rI  ro  is_any_work_type_request_existsrp  r+  r  r   r  r   r   r(  r)   ra  rh  )r   ra  rd  s      r   r   r     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
    r  Fr`  rx  ry  Trz  r{  r|  r}  r~  r  r`  ra  r  rn  r  )r   r  rL  r   r   r   r   r   rI  ro  rp  r   r   r  r+  r   r  r  r   r  r   r(  r)   ra  r$   )r   r  r  ra  rd  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>  rt  r   rb  r   Request Updated Successfullyr,  r-  )r   r   r   rs   ru   rd  r   r'   r   r3  r+  r   r  r  r"   r  r/  )r   work_type_request_idrd  r   r  s        r   work_type_request_updater    s     (//337K3L(9:Dgt-JKD$Wd3D~~1
 #7<<:KL!'41NO($7==?IIKWa(F&GH  ''03XX  '@64.QQr   c                 T   	 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      }| j                   j                  dd      }t#        |      }|j$                  j'                  d      }|r|dk(  r| j(                  j                  d      }t+        j,                  |      }	||	v r|	j/                  |       t1        t+        j,                  |      |      \  }
}| j(                  j3                         }t5        d| d| d|	 d      S |r|dk(  r~|dk(  rat         j                  j7                         }| j(                  j3                         }|j9                         rt5        d|       S t;        d      S t5        dj<                         S |r|dk(  rrt5        d|j<                         S t;        d      S # t         j                  $ r% d}t	        j                  | t        d             Y t        $ 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`  z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.#trashrn  Nrj  z)You cannot delete this work type request.r  rh  r   rl  rC  z/work-detail-view/rm  r  &deleted=truez
work-shiftz employee/work-type-request-view/z/work-list-view?r  z'/employeeprofileview-Work Type & Shift/rk  rI  )r   r   r   r   r   r  r  r&  r   r  r   r   r(  r\  r  r   r  r
   r   rn  rS  r  rL  rL  rv   r	   r&   r:  r   r"   ra  )r   rA  rd  r/  r  ro  rp  rq  rC  rr  rs  rt  rD  rJ  s                 r   work_type_request_deleter  '  sm   P+337767B$00!$@"AB  "LL%%//;==HJ
	
"   !148I\\%%&;TBN.)J oo,,S1OY"448M2^#!!&)+:JJ}%v,
(=  --/ r-~N^^kl
 	
 
yL0@@!0!8!8!<!<!>#KK113M!((*"2=/ BCC#$OPPEhkk]STT	yN2x.x{{m<== GHH[ '' Cw"@ AB Pw"M NOPs   BI 4J'<'J'&J'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`  rf  )rd  rf  rC  rH  rE  rP  rF  rG  z9work_type_request/htmx/work_type_request_single_view.html)r   r   r   r%  rS  r   r  rL  rv   r]  r'   )r   rA  rd  r  requests_ids_jsonrH  rQ  rR  s           r   work_type_request_single_viewr  r  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                  |      }g }|D ]  }	 t        j                  j                  |      }|j                  j                  }|j                          |j                  |       t        j                  | j                  j                  |ddddddd	
	       d} t        j*                  | t#        dj'                  t-        |                         t/        di      S # t        j                  $ r" t        j                   | t#        d             Y |t$        $ rG t        j                   | t#        d      j'                  j                  |j(                               Y w xY w)r  r  r`  r  r  r  r  r  r  r  rn  rj  zCYou cannot delete {employee} work type request for the date {date}.r/  r  Tz{} work type requests deleted.r  )r   r  rL  r   r   r   r   r(  r&  r  r   r  r   r   r\  r   r  r  r   r[  requested_dater  r)  r$   )r   r  del_idsra  rd  r   r  s          r   work_type_request_bulk_deleter    sZ    ,,u
C
**S/CG 	 / 7 7 ; ;r ; B$00AAD$$&NN,-KK))?AALN
. ;< Wa @ G GG UVW6*++ ++ 	GNN7A&D$EF 		NNY&.::*99  			s   B	C>>2F2AF F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-viewra  r%  NzShift request addedr,  r-  )rm   r   r   ra  rS  r   ru   rd  rC   r   r   r'   r3  r+  r   r  r   r   r   r(  r)   r   r   r  r  r"   r  r/  )r   r   r/  r  r  r   r  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=  r  reallocate_tor   z2shift_request/htmx/shift_reallocate_employees.html)rS  r   rj   r   r   r   r%  employeeworkinformation_setr?  r   rb  rc  r(   r"   )r   r  r   r1  r2  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 r  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  ra  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-  )rj   rS  r   ru   rd  rC   r   r   r'   r3  r+  r;  r   r  r   r   r   r(  r)   ra  r   r   r  r  r"   r  r/  )r   r   r/  r  r  r   reallocate_empr  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_datarG  r  r   r;  rH  allocated_idsr  )rS  r	   r   r   r   r   r%  rx   r   rI  r   r  r  r   r   r  ra  rC   r   r}   rm   ru   rd  r'   r  rD   rb  )r   rD  r/  shift_requestsallocated_shift_requestsallocated_requestsr   rH  r  r  r<  r   s               r   shift_request_viewr  S  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\  rm  rM  z'shift_request/shift_request_export.htmlr`  Shift_requests)r  r   rk   rC   r'   rw   r   )r   rN  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|  r   Tr  r  employee_id__employee_user_idFr  r  r  r  z shift_request/htmx/requests.htmlrn  r:  z shift_request/htmx/group_by.html)r  rG  rC  r;  rH  r  r|  )r   r   r   r   r%  rS  r	   r   rC   r   r  rx   rI  r   r  r  r   r  ra  r   r   r  r:  r}   r   r'   )r   r/  rD  r|  r  r  r  r   rH  r  r<  rj  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
    rC  rf  r  rf  rE  rP  rH  z,shift_request/htmx/shift_request_detail.htmlr   r@  rS  r   r  rL  rv   r'   r   ra  r  r  r  rH  rQ  rR  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  rC  rf  r  rE  rP  allocation_idsz*shift_request/htmx/allocation_details.htmlr  r  s           r    shift_allocation_request_detailsr  :  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   rm   ru   rd  r   ro  r'   r   r3  r+  r   r  r  r"   r  r/  r  )r   shift_request_idr  r   r  s        r   shift_request_updater  U  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  ra  r%  Nr  r  r  r  r  r  r,  r-  z1shift_request/allocation_request_update_form.html)r   r   r   rj   ru   rd  r   r'   r   r3  r+  r;  r   r  r   r   r   r(  r)   ra  r   r   r  r  r"   r  r/  )r   r  r  r   r  r   r  r  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.ry  r   base.cancel_shiftrequestFrl  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  ra  rm  rn  z%Your shift request has been rejected.)$r   r@  r   r  r  r#   r  r   r   r   rI  r   r   ro  r   r  r  r  requested_tillis_permanent_shiftprevious_shift_idr   r  r+  rp  r   r   r   r   r  r  r   r  r(  r)   ra  )r   ra  r  
today_daterr  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 )r  TFr  Shift request canceledr  r  r  r  r  r  ra  rm  rn  ry  r   )r   r@  reallocate_canceledreallocate_approvedr   r   r   r   r   r  r   r  r+  r   r  r  r   r  r   r   r(  r)   ra  r#   r  r   )r   ra  r  rr  s       r   shift_allocation_request_cancelr    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.
    r  Fr`  r  Tr  r  r  r  r  r  r  ra  rm  rn  r  )r   r  rL  r   r   r   r   r   rI  r   r   ro  rp  r  r   r  r  r+  r   r  r  r   r  r(  r)   ra  r$   )r   r  r  ra  r  s        r   shift_request_bulk_cancelr  .  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
    r  ry  r   approve_shiftrequestchange_shiftrequestrl  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  ra  r  rn  )"r   r@  r   r  r  r#   r  r   r   r   rI  ro  is_any_request_existsr   r  r  r  r  r  r  r   r   r+  rp  r  r  r  r(  r  r   r  r   r)   ra  )r   ra  r  r   r  
recipientsr&  s          r   r   r   j  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  ra  r  rn  ry  r   r  )r   r@  r  r  r  r+  r   r  r  r   r  r   r   r   r(  r)   ra  r#   r  r   r  )r   ra  r  s      r    shift_allocation_request_approver    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
    r  Fr`  r  r  TzShifts have been approved.r  r  r  r  r  r  ra  r  rn  r  )r   r  rL  r   r   r   r   r   rI  ro  rp  r  r  r   r  r+  r   r   r  r  r   r  r   r(  r)   ra  r$   )r   r  r  ra  r  r   s         r   shift_request_bulk_approver    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      }| j                  j!                  dd      }t#        |      }|j$                  j'                  d      }|rR|dk(  rM| j(                  j+                         }|dk(  rt-        d      S t-        dj                  j.                   d      S |r|dk(  r| j(                  j+                         }| j(                  j!                  d      }	t1        j2                  |	      }
||
v r3|
j5                  |       t7        t1        j2                  |	      |      \  }}t-        d d| d|
 d      S t9        | 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  rn  r  z%You cannot delete this shift request.r  Nrh  r   zshift-containerzemployee/shift-request-view/z!/list-shift-request/?deleted=truez#/shift-request-individual-tab-view/r  rl  rC  z/shift-detail-view/rm  r  r  ry  )r   r@  r   r(  r   r  r&  r   r  r   r   r\  r  r  r   r  r   r
   r   rn  rS  r	   r&   ra  r  rL  rL  rv   r#   )r   ra  r  r   r  r   rp  r  rD  rC  rr  rs  rt  s                r   shift_request_deleter    s!   L$))"-((99"9:LL%%7H8<@
	
"   !148I<<148D$J//((-KY"33--/88?AA5m6O6O6R6R5SS`a  Y"44--/8M2!!"%/>

=)20,} !-=/P^O__lm
 	
   0 0 EFF; $$ ?w"< => Lw"I JKLs   BG9 92I.'IIdelete_shiftrequestc                    | j                   d   }t        j                  |      }g }d}|D ]  }	 t        j                  j                  |      }|j                  j                  }|j                          |j                  |       t        j                  | j                  j                  |dddddd	d
	       d} t        j*                  | t#        dj'                  t-        |                         t/        d|i      S # t        j                  $ r" t        j                   | t#        d             Y |t$        $ rG t        j                   | t#        d      j'                  j                  |j(                               Y w xY w)r  r  Fr`  r  r   r  r  r  r  r  rn  r  z?You cannot delete {employee} shift request for the date {date}.r  Tz{} shift requests deleted.r  )r   r  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  ra  r  r   s          r   shift_request_bulk_deleter  @  s]    ,,u
C
**S/CGF 	(00444;M ,,==D  "NN=)KK));L<@D
. ;> Wa < C CCL QRS6*++ (( 	CNN7A&@$AB 		NNU&*66&55  			s   B	D  2F4AFFc                 h    | j                   j                  j                         }t        | dd|i      S )z4
    This method will render notification items
    $notification/notification_items.htmlnotifications)r   r
  unreadr'   )r   all_notificationss     r   r
  r
  q  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	  r
  )
r   r
  r  r&  r   r  r  r   r  r'   r   r  r
  s      r   clear_notificationr  ~  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.htmlr
  )r   r
  r  r&  r  r   r  r  r   r  r:  r'   r  s      r   delete_all_notificationsr    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
    rn  r`  zNotification deleted.Nz\<span hx-get='/all-notifications' hx-target='#allNotificationBody' hx-trigger='load'></span>)r   r
  r   r&  r   r  r  r   r  r:  r"   )r   ra  scriptr  s       r   delete_notificationr    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 )Nrn  r`  zZ<span hx-get='/notifications' hx-target='#notificationContainer' hx-trigger='load'></span>)r   r   r   mark_as_readr   r
  r  r"   )r   notification_idr  notifications       r   mark_as_read_notificationr    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)Nr  r`  r  TFzInvalid request)r  r  )r   r  r   r   r   r  r$   )r   r  r  s      r   mark_as_read_notification_jsonr    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	  r
  )r   r
  r:  mark_all_as_readr   r  r  r   r  r  r'   r  s      r   read_notificationsr     s    
#""&&(99;gq!?@A LL..557M.	-( 	  #w""#r  c                 d    t        | dd| j                  j                  j                         i      S )z=
    This method to render all notifications to template
    r  r
  )r'   r   r
  r:  r   s    r   r  r    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   payrollsettingsrY  encashmentgeneralsettingsr   )PayrollSettingsForm)EncashmentGeneralSettingsFormr>  Nselected_companyr:  r`  tracking_fieldsr"  user_idr   Settings updated.ry  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%  r  r   r   r:  r   r   r   r   rG   r   r   
is_enabledr   r   r(  r   r   r   rS   r   r   r3  r+  r   r  r  r#   r  r'   )r   PayrollSettingsEncashmentGeneralSettingsr%  r&  currency_instancer,  encashment_instancer.  r4  r  prefix_instancer3  r   r   r1  r2  r0  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_settingsrA  6  s     '344r   c                    | j                   dk(  rL| j                  j                  d      }t        |      s!t	        j
                  | t        d             n| j                  }|j                  }| j                  j                  r| j                  j                  d      }|dk(  r\t        j                  j                         }|D ]  }||_        |j                           t	        j                   | t        d             nVt        j                  j                  |      }||_        |j                          t	        j                   | t        d             t#        dd	i      S 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:  Date format saved successfully.r`  r  Tr  r4  -Please update the company field for the user.z5Date format cannot saved. You are not in the company.FUnsupported methodr  r    rn  )r   r   r   r)  r   r  r  r   r   r   r  r   r   r:  date_formatr+  r  r$   r   r   r   r1  r%  r  r   rC  r   r/  r'  all_companiescmpr4  r  rG  employee_companyr  emp_companys                r   save_date_formatrQ  ?  s    ~~!,,**+<=?#NN7A&J$KL<<D((H||((#*??#6#67I#J #u,$+OO$7$7$9M, #*9
# $$Wa0Q.RS%oo115E1FG*9G'LLN$$Wa0Q.RS $Y$566 /66==(=S;;= $ ;+/??(; $+??#9#9BR#9#SL"."4"4"6K"* ((#Q'V%W
 3B/#((* ((!4U2VW$$QR
 $Y$566 %2FGPSTTr   c                 N   | j                   }|j                  }| j                  j                  d      }|dk7  rV| j                   j                  r@t
        j                  j                  |      }|j                  }|r|}nd}t        d|i      S 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:  r`  zMMM. D, YYYYrC  r  rE  )r   r   r  r   r   r   r   rK  r$   r   r   r   r1  r%  )r   r   r/  r'  r4  rK  r  rG  rO  r  rP  s              r   get_date_formatrS  {  s   <<D  H**+=>5 W\\%>%>//%%)9%:))%K(K.<== #**11h1GD{{} 	/D#	/--6F-G"((*5@+11nK(K$*K899r   c                    | j                   dk(  rL| j                  j                  d      }t        |      s!t	        j
                  | t        d             n| j                  }|j                  }| j                  j                  r| j                  j                  d      }|dk(  r\t        j                  j                         }|D ]  }||_        |j                           t	        j                   | t        d             nVt        j                  j                  |      }||_        |j                          t	        j                   | t        d             t#        dd	i      S 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   rC  z"Please select a valid time format.r'  r:  rD  r`  r  Tr  rE  rF  zTime format saved successfully.z5Time format cannot saved. You are not in the company.FrG  rH  rI  rJ  )r   r   r   r)  r   r  r  r   r   r   r  r   r   r:  time_formatr+  r  r$   r   r   r   r1  r%  r  rL  s                r   save_time_formatrV    s    ~~!,,**+<=?#NN7A&J$KL<<D((H||((#*??#6#67I#J #u,$+OO$7$7$9M, #*9
# $$Wa0Q.RS%oo115E1FG*9G'LLN$$Wa0Q.RS $Y$566 /66==(=S;;= $ ;+/??(; $+??#9#9BR#9#SL"."4"4"6K"* ((#Q'V%W
 3B/#((* ((!4U2VW$$QR $Y$566 %2FGPSTTr   c                 F   | j                   }|j                  }| j                  j                  d      }|dk7  rV| j                   j                  r@t
        j                  j                  |      }|j                  }|r|}nd}t        d|i      S t        j                  j                  |      }|j                         rU|D ]  }|j                  } t
        j                  j                        }	|	j                         }
|
r|
j                  }nd}nd}t        d|i      S )Nr'  r:  r`  zhh:mm ArC  r  rE  )r   r   r  r   r   r   r   rU  r$   r   r   r   r1  r%  )r   r   r/  r'  r4  rU  r  rG  rO  r  rP  s              r   get_time_formatrX    s   <<D  H**+=>5 W\\%>%>//%%)9%:))%K#K.<== #**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   get_or_creater(  rZ  r   r  r  r+  r&   r?  )r   rb  checkhistory_objectcreateds        r   history_field_settingsra    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\  r7  z'Account block/unblock setting has been enableddisabledr  r\  rI  rJ  )r   r   r   r   r   r%  r7  r+  creater   r  r  r  r"   r&   r?  )r   re  r   s      r   enable_account_block_unblockrh    s     ~~,,""#9:dB&..446")HMMO''..'.B9w)T^9__`a	
 <<-.>!())s##r   zemployee.change_employeec                    | j                   dk(  r| 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       n1|/|j                          t        j                  | t        d	             |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)featurerd  rl  )rl  r   z4Profile edit accessibility feature has been removed.c              3   ,   K   | ]  }|d    dk(    yw)r   rk  Nrz  )r  r  s     r   r  z.enable_profile_edit_feature.<locals>.<genexpr>@  s     RTtAw.0Rs   zProfile Edit AccesszProfile edit feature has been re  rf  r  r\  rI  rJ  )r   r   r   r   r   r%  r8   r   r7  r+  rg  r&  r   r  r  anyr7   r  rU  r  r  r"   r&   r?  )r   re  r   rl  s       r   enable_profile_edit_featurero  &  su    ~~,,""#89TA%--335&..55n5MSSU")HMMO&&---A7 ((//&	N;K/L 0  " QUV 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r1  total_countFsafe)rS  r   r   rI  r   r   r:  r   r8  ra  r  r$   r   page_numberr2  r	  r1  rt  r  s          r   shift_selectry  O  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  rs  )rS  r   r  rL  rC   r   r   r:  r  r8  ra  r  r$   
r   rx  filteredfiltersemployee_filterfiltered_employeesr	  r1  rt  r  s
             r   shift_select_filterr  f  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:  rF  r  rq  rs  Fru  )rS  r   r   rI  r   r   r:  r   r8  ra  r  r$   rw  s          r   work_type_selectr  |  s    ++//&)Ke<<  !<='//335I'//66.5ll 7 ''..X_XdXd / I ,55CCK5L5//#K+KHGe,, 6rz  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|  )rS  r   r  rL  rE   r   r   r:  r  r8  ra  r  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:  r  Tr  rq  rs  Fru  )rS  r   r   rI  ra   r   r   r:  r8  ra  r  r$   rw  s          r   rotating_shift_selectr    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|  )rS  r   r  rL  r?   ra   r   r:  r  r8  ra  r  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  rq  rs  Fru  )rS  r   r   rI  r   r   r   r:  r8  ra  r  r$   rw  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|  )rS  r   r  rL  rA   r   r   r:  r  r8  ra  r  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   )
rn   r   r   r3  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   rn   r   r   r3  r+  r   r  r  r"   r'   r   r  tagr   s       r   
tag_updater  4  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   )
rJ   r   r   r3  r+  r   r  r  r"   r'   r  s     r   audit_tag_creater  K  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   rJ   r   r   r3  r+  r   r  r  r"   r'   r  s       r   audit_tag_updater  c  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:  r1  r?  r  Tz'multi_approval_condition/condition.html)r   
conditionsrg  )	r^   r  r   r   r   r   r  r:  r'   )r   r   r'  r  rg  s        r   multiple_approval_conditionr  z  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)rS  r   r^   r(   r"   )r   operatorr   is_ranger  r  s         r   get_condition_value_fieldsr    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 Manageroh-select oh-select-2 mb-3r  r  r  F)choicesr  r  r  multi_approval_managerid_multi_approval_manager_)r$  ra  r   z7multi_approval_condition/add_more_approval_manager.html)r  r   r  r  r8  r  r^   rS  r  r   r   r:  r  r   ChoiceFieldr  rb  r  r  r  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 
##9H
s   Gc                     t               S r  )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_valuer1  r  r`  r  r   r  condition_idsequencer   reporting_managerz0Multiple approval condition created successfullyz3multi_approval_condition/condition_create_form.html)r   rg  )r^   r   r   r   r@  r   r   r   r   r3  r?  r  r  r1  r  r  r  r+  r  r   rg  r   r  r  r'   )r   r   rg  dept_idr  r  r  r  r  r1  condition_approval_managersr4  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  Approval Manager {}r  r  r  F)r  labelr  r  )r  r   r#  r  r   r   r:  r  r8  r   r  r[  r  rb  )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c           	         t        |      D ]  \  }}|dk(  r|j                  | j                  d<   %d| }t        j                  t
        j                  j                         t        d      j                  |      t        j                  ddi      d	      | j                  |<   |j                  | j                  |<    | S )
Nr   r  r  r  r  r  r  F)rc  r  r  r  )r  r   r#  r   r  r   r   r:  r  r[  r  rb  )r   r  r  r   r  s        r   approval_managers_editr  5  s    ) ;
765<5H5HDLL1221#6J&+&<&<!))--/-.55a8||74P*QR	'DKK
# (/':':DLL$; Kr   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  rg  	conditionr  )r   r   r   r   r   r  r^   r  r   r   r3  r+  r   r  r  r&  rv  
startswithr  rg  r  r:  r'   r)  )r   r  rg  r  r  r   r   r  r  r@  r  r   r'  r  s                 r   multiple_level_approval_editr  E  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           	      |   | j                   j                         }|j                  dd        |j                         }t        j
                  j                  |      }|j                          t        j                  | t        d             | j                  j                  d      }|r|dk(  r|| j                   j                  d      }t        j                  |      }||v r3|j                  |       t        t        j                  |      |      \  }}	t!        d	 d| d| d	      S t!        t#        d
            S )NrC  r`  z0Multiple approval condition deleted successfullyr  rl  z)/detail-view-multiple-approval-condition/rm  r  r  zhx-multiple-approval-condition)rS  rK  rU  r	   r   r   r   r&  r   r  r  r  r  rL  rL  rv   r&   r)   )
r   r  rO  rD  r  r  rC  rr  rs  rt  s
             r   multiple_level_approval_deleter    s(    ;;##%L_d+ **,M)11555FIWa RST  !12IY"448M2>)!!,//>

=)<0,} 7bWefteu  vC  D
 	
 G<=>>r   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   r  -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  ra  chatbox-ellipsesrn  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_commentsr  r  )r   r  r  )r   r@  r   r   rl   ra  r   r   r3  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  rr  recs	            r   create_shiftrequest_commentr    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
    r  r  FTfiles
comment_idr`  r  r  )r   r@  r   r   r   r  r   r2  r@  rS  r   r   r
  r+  r  r  r_  r'   )r   r  r  r  r  r  r  commentattachmentsr
  file_instances              r   view_shift_commentr    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
    r  r  r  rn  base.delete_baserequestfiler  File deleted successfullyrl  "<span hx-get="/view-shift-comment/Y/" hx-trigger="load" hx-target="#commentContainer" data-target="#activitySidebar"></span>)rS  r@  r   r@  r   r   r   rI  r~   r   r   r   r&  r   r  r  r  r"   )r   r  r  r  r  r  s         r   delete_shift_comment_filer  /  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 )
r  r  r  FTr  r  r`  -work_type_request/htmx/work_type_comment.htmlr  r  r  rd  )r   r@  r   r   r   r  r   r2  r@  rS  r   r   r
  r+  r  r  r_  r'   )r   r  rd  r  r  r  r  r  r  r
  r  s              r   view_work_type_commentr  G  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 )r  r  r  r  rn  r  r  r  rl  &<span hx-get="/view-work-type-comment/r  )rS  r@  r   r@  r   r   r   rI  r~   r   r   r   r&  r   r  r  r  r"   )r   r  r  r  r  r  s         r   delete_work_type_comment_filer  k  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
    rn  r  Comment deleted successfully!rl  r  r  )r   r@  r  ra  r   r   r   rI  r~   r&  r   r  r  r  r"   )r   r  r  r  r  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`  r  r"  r   r  r  FTr  r  z,'s work type request has received a comment.u"   تلقت طلب نوع العمل r  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`  ra  r  rn  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.r  r  )r   r  rd  )r   r   r   r%  r   r   rr   ra  r   r   r3  r   r   r  r+  r   r  r   r   r  r  r   r   r   r(  r   r  r)   r'   )	r   worktype_idr  r	  r   r  r  rr  r  s	            r   create_worktyperequest_commentr    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
    rn  r  r  rl  r  r  )r   r@  r  ra  r   r   r   rI  r~   r&  r   r  r  r  r"   )r   r  r  r  r  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\  ry  r   )r   r   r   r   r   r%  rS   r   r   r3  r+  r   r  r  r  r   r"   r#   )r   r>  r-  s      r   pagination_settings_viewr  %  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   r  s     r   action_type_viewr  =  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!Nzcreate-actionsr  actionrR  &base/action_type/action_type_form.htmlr   rC  )r   rS  r	   r   r   r   r3  r+  r   r  r  r)   r   r   r:  r  r%  rK  r8  ra  r&   r'   )r   r   rD  r  ru  r   mutable_gets          r   action_type_creater  I  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!r  )r   act_id)r   r   r   r   r  r   r%  r7  r   HiddenInputrb  r  r   r   r3  r;  r   r  r+  r   r  r  r'   )r   r  r  r   act_types        r   action_type_updater  j  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.
    )r  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   r  s     r   action_type_deleter    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
    rn  )rP   rS  r3  r+  r"   r  s     r   driver_viewed_statusr     s/    
 gkk"D}}		r   c                 8   t         j                  j                  | j                  j                        \  }}|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  chart_idrn  )r   r   r]  r   r   r  rS  r   rL  r+  r"   )r   r  r`  r  r"  s        r   dashboard_components_toggler#    s    
  7>>LL**  M  OW ##)rF{{z*HH&h!'r   c                 :   t         j                  j                  | j                  j                        \  }}t        | t              }| j                  dk(  rt        | j                  j                               }|j                  xs g }|D cg c]	  }||v s| }}|D ]  }||vs|j                  |        ||_        |j                          t        j                  | t!        d             t#        d      S ||j                  d}	t%        | d|	      S c c}w )zN
    This function is used to choose which chart to show in the dashboard
    r  r   z%Dashboard charts updated successfullyr  )dashboard_chartsemployee_chartzdashboard_chart_form.html)r   r   r]  r   r   rt   r  r   r]  r   r  r  r  r+  r   r  r  r"   r'   )
r   r  r`  r  rG  current_orderc	new_ordercharr  s
             r   employee_chart_showr+    s   
  7>>LL**  M  OW $GV4F~~7<<$$&''..4" -;1dQ;	; 	'D9$  &	' "+!$K"LMHII#)_=S=STG'6@@ <s   	DDc                    t         j                  j                  | j                  j                        \  }}|j
                  D cg c]  }||j                  dd      f }}| j                  dk(  rft        | j                  j                               }|D cg c]  }||j
                  v s| }}||_        |j                          t        ddi      S t        | dd	|i      S c c}w c c}w )
z?
    This function is used to reorder the dashboard charts
    r  r  r0  r   rl  rm  )ro  z6horilla_theme/components/reorder_dashboard_charts.htmlr  )r   r   r]  r   r   r  r3  r   r:  r   r  r+  r"   r'   )r   r  r`  r  r  
chart_keysr  filtered_chart_keyss           r   reorder_dashboard_chartsr/    s    
  7>>LL**  M  OW =L<R<RS5uemmC-.SFS~~',,++-.
'
4?3I3I+ID
 
 "5\6$:;;@	6  T
s   C'C,-C,zbase.view_biometricattendancec                 \    t         j                  j                         }t        | dd|i      S )Nz&base/install_biometric_attendance.html	biometric)r   r   r%  r'   )r   r1  s     r    enable_biometric_attendance_viewr2    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 )
NrS  r   rm  TzAThe biometric attendance feature has been activated successfully.FzCThe biometric attendance feature has been deactivated successfully.r!  r  )r   rS  r   r   r   r%  rg  r   r   r  r  r  r+  r$   )r   r   r   s      r   activate_biometric_attendancer4    s     ~~{{~6&..446*2299;H6!$(H!UV
 %*H!MMY 	I.//r   c                 $    t        dt        i      S )Ninstalled_apps)r$   r   r   s    r   get_horilla_installed_appsr7    s    )4011r   c                 |   | 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                         |D ]  }g ||<   	 S c c}}w )Nc              3   $   K   | ]  }|d u  
 y wr  rz  r  s     r   r  z(generate_error_report.<locals>.<genexpr>*  s     7QaT	7Qr  r  c                      y)Nztext-align: centerrz  r  s    r   r  z'generate_error_report.<locals>.<lambda>1  s    r   )subsetapplication/ms-excelr  zattachment; filename=""r  
xlsxwriter)engineFSheet1)r  
sheet_namezA:Z   c                     t               S r  )r   )r   	path_infor  s    r   get_error_sheetz.generate_error_report.<locals>.get_error_sheet=  s    9%r   r   )r   urlpatternszerror-sheet-r  )rv  r  r:  rC  r  r  styleapplymap
IndexSlicer"   ExcelWriterto_excelsheets
set_columnrm  	base.urlsr   rF  uuiduuid4r   )r  
error_datard  r  r  r@  r  r  styled_data_framewriter	worksheetrE  r   rF  rD  r  s                 @@r   generate_error_reportrU  !  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	* 
3As   F8:F8c                    t        j                         }|j                  }t        j                  j                  ||      }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__yearstart_date__gtezholiday/upcoming_holidays.htmlholidays)r+   	localdater  r   r   r   r{   r)  r  background_colorr'   )r   r  current_yearrY  colorsr  holidays          r   get_upcoming_holidaysr_  L  s      E::L&&%u ' 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  r  zholiday/holiday_form.htmlr  )rS  r	   rX   r   r   r3  r+  r   r  r  r   r   r   r  r"   r'   )r   rD  r   s      r   holiday_creationra  ]  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  Fr  )rC  r  r"   rK  r   )r   r  r  r  	exceptions        r   holidays_excel_templateri  {  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  r  rc  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 Errorrp  r$  r  end_date	recurringOther ErrorsN)r   r+  r   r  r   r  r  readerrP  r  rz   r  r  r  r   r   r8  r   r  osr   rL  )r
  holiday_listr  rd  holiday_filecsv_filer+  rw  r  r  r$  r  rt  ru  holiday_dictr  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")

    r  Trd  re  FzInvalid start date format {}rm  rf  zInvalid end date format {}rn  rg  rn  ro  rp  zRecurring must be {} or {}rq  rr  rs  zOther errorsN)rC  r  r  to_datetimer  r   r  r[  r   r  r   r  r8  r   r  r)  )r
  r  valid_holidaysr  holiday_dictsr^  r+  r$  r  rt  recurring_strru  holiday_instancer  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)rd  re  rf  rg  rm  rn  rr  rv  r   holidays_importr  zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetz/The file you attempted to import is unsupportedr  r   )created_countr  r  rD  zimport_popup.html)r   r2  r   r  r}  rU  r  r   r  r  r"   r)  r(   )r   r  rd  rD  rQ  r
  r  r  rt  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_exportrb  )r  r   r=   rY   r'   rw   r   )r   r^  r  r  s       r   holiday_info_exportr  T  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)rY  r   rC  )
r   r   r:  rS  r	   r   r   r=   r'   r   )r   rc  rD  rx  page_objholiday_filters         r   holiday_viewr  i  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
    r   r  Nr  zholiday/holiday.html)rY  rC  r;  )r   r   r:  rS  r	   r=   r  r   r   r   r   r}   r'   )r   rc  rD  r  rx  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
    rZ  Nr`  r>  r   zHolidays updated successfully..z holiday/holiday_update_form.html)r   ra  rC  )rS  r	   r  r   r)  r   r   r   rX   r   r   r3  r+  r   r  r  r'   )r   rA  query_stringrD  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 existsr  z/holiday-filter?)rS  r	   r   r   r   r&  r   r  r  r\  r  r   r   r"   r&   )r   rA  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.
    r  r  r   z+{} Holidays have been successfully deleted.zholiday-filter)r   r@  r   r   r   r&  r   r  r  r[  r&   )r   r  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:  rs  Fru  )	rS  r   r   r   r:  r8  ra  r  r$   rw  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|  )rS  r   r  rL  r=   r   r   r:  r  r8  ra  r  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  r  z.company_leave/company_leave_creation_form.htmlr   )rN   r   r   r3  r+  r   r  r  r   r   r   r  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   rC  )r   r   r:  rS  r	   r   r   r<   r'   r   r   r   )r   rc  rD  rx  r  company_leave_filters         r   company_leave_viewr  +  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  rC  r;  )r   r   r:  rS  r	   r   r<   r  r   r   r}   r'   r   r   )r   rc  rD  rx  r  r  r<  s          r   r  r  H  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   ra  )r   r   r   rN   r   r   r3  r+  r   r  r  r'   )r   ra  company_leaver   s       r   company_leave_updater  i  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  r  z/company-leave-filter?)rS  r	   r   r   r   r&  r   r  r  r\  r  r   r   r"   r&   )r   ra  r  s      r   company_leave_deleter    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  )r>   rS  r  r'   )r   r  s     r   view_penaltiesr    s-     GKK(++G'6G8LMMr   zbase.delete_penaltyaccountsc                     t         j                  j                  |      }|j                          t	        j
                  | t        d             t        d      S )Nr`  zPenalty deleted suucessfullyzP<script>$('.reload-record').click();$('#reloadMessagesButton').click();</script>)r   r   r   r&  r   r  r  r"   )r   
penalty_idpenaltys      r   delete_penalitiesr    sM     %%))Z)8GNNWa >?@Z r   dispatchr  z'horilla_meet.view_googlecloudcredentialc                       e Zd ZdZd Zy)EnableIntegrationsViewz?Handles enabling/disabling Google Meet integration dynamically.c                    |j                   j                  d      }|s!t        j                  |d       t	        d      S |j
                  j                  d      du}t        j                  j                  |d|i      \  }}	 t        j                  |      }|j                  }	|r$t        j                  ||	 d       t	        d      S t        j                  ||	 d       t	        d      S # t        $ r |}	Y Ww xY w)	z:Handles POST request to enable/disable an integration app.rZ  zMissing app_labelr  r7  N)rZ  r[  z enabledz	 disabled)rS  r   r   r  r"   r   r   r   update_or_creater   r-  r  r/  r  )
r  r   argsr`  rZ  re  integration_appr`  r0  app_verbose_names
             r   postzEnableIntegrationsView.post  s    KKOOK0	NN7$78 KLL,,""<0<#2#:#:#K#K"G, $L $
 	),,Y7J)66 W)9(:(&CD GHH NN7'7&8	$BCGHH  	)(	)s   !C. .C<;C<N)r  r  r  r  r  rz  r   r   r  r    s    
 JIr   r  c                    | r| j                  d      sy | j                  d      d   j                         }	 t        |       t	               j                  |      }t	               j                  |      }|S # t        t        f$ r Y y w xY w)NzBearer r  )	r  r  r6  r6   r3   get_validated_tokenget_userr4   r5   )auth_headertokenvalidated_tokenr   s       r   is_jwt_token_validr    s    k44Y?i(+113EU+-AA%H "++O<*% s   >A7 7B	B	c                 6   g d}dg}t         j                  j                  t        j                        }t         j                  j                  |      st        d      t        | j                  j                  dd            j                  }t        | j                  j                  dd            }||vrMt        fd|D              s9| j                  j                  s#|s!t        j                  | d       t!        d	      S t#        t%        |d
            S )N)z/loginz/forgot-passwordz/change-usernamez/change-passwordz/employee-reset-passwordz/recruitment/candidate-surveyz/recruitment/open-recruitmentsz+/recruitment/candidate-self-status-trackingz
base/icon/zFile not foundry  rn  HTTP_AUTHORIZATIONc              3   B   K   | ]  } j                   |        y wr  )r  )r  r  r   s     r   r  z"protected_media.<locals>.<genexpr>  s!      4 4s   zCYou must be logged in or provide a valid token to access this file.r   r  )rx  r   r  r   r  r   r!   r
   r  r   r  rn  r   r~  r   r  r&   r    r  )r   r   public_pagesexempted_folders
media_pathreferer_pathjwt_users    `     r   protected_mediar    s    	L %~h1148J77>>*%&''GLL,,^R@AFFL "',,"2"23G"LMH <' 4$44 1 ||,,XNNU G$$Z.//r   )NNr  (  r  r  r  rx  r  rO  r   r   email.mime.imager   r   urllib.parser   r   r	   r
   pandasrC  dateutilr   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.exceptionsr   django.core.files.baser   django.core.mailr   r   django.core.managementr   django.core.validatorsr   django.db.modelsr   r   django.httpr    r!   r"   r#   r$   django.shortcutsr%   r&   r'   django.template.loaderr(   django.urlsr)   r*   django.utilsr+   django.utils.decoratorsr,   django.utils.htmlr-   django.utils.httpr.   django.utils.translationr/   r  django.viewsr0   django.views.decorators.csrfr1   django.views.decorators.httpr2   'rest_framework_simplejwt.authenticationr3   #rest_framework_simplejwt.exceptionsr4   r5   rest_framework_simplejwt.tokensr6   accessibility.accessibilityr7   accessibility.modelsr8   base.backendsr9   base.decoratorsr:   r;   base.filtersr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   
base.formsrG   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   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   base.methodsrt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   base.modelsr   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   employee.filtersr   employee.formsr   r   employee.modelsr   r   r   r   r   r   horillar   horilla.decoratorsr   r   r   r   r   r   horilla.group_byr   horilla.horilla_settingsr   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  r5  r<  rB  rD  rI  rL  rN  r]  rd  rf  rh  r  setattrr  r  r  r  r  r  r  r  r  r
  r  r  r-  r4  r9  rA  rE  rH  rP  rT  rh  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rK  r  r  r  r  r  r   r  r  r	  r  r  r  r4  rA  rU  rZ  rf  rw  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:  r?  rB  rD  rK  rP  rX  r]  rd  rh  rs  rv  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   r  r?  rA  rQ  rS  rV  rX  ra  rh  ro  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
  r  r  r  r  r  r   r#  r+  r/  r2  r4  r7  rU  r_  ra  ri  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r   r   <module>r     sx     	   ( &  ? ?       # ; ; > > Q 2 . A / 9 .  A @ 3 - ! 4 ( = 1  4 = E H 8 < 5 0   . . . . . . . . . . . .^                    B , K  !  /  H 9 U U - ( 1123!/01-./A345-./a 789a 789A456Am$%+,--./Q~&'a :;< !$B"CD012A678a :;<#@!AB/01a :;<-./!/01+,-/
6'1,(V4 +K +K\ W W:  2 " "J 4 4   B $ $N  66r.++0 ++\+T 1 +T\  /3H I  ,0A B  - 5 M MB M M>=D"0/""  &2 &2R :;H < HV , , %&  '   F vh*+O ,   O8 &' ( D &'  (  F %& '  : &' (   &'P ( P ^$vh
G   % 
G ^$vh
G   % 
G vx()>K *  >KB <.   <.~ F  FR :; <  :;[ < [| <= > D( 9: ;    45 6 $ 67 8  * 34 5  , 67) 8 ) '( )  . ()	 * 	 *+ ,  ( *+ ,  , +, -  -. /  * ,- . , +, -  , ./ 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 *6Kr 78L 9  L2 78)7 9 )7X 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 (4 45v 6 vr,K^ 45H 6  H. 45(0 6 (0V 450 6 08 45vhH   6  H&	 )*- + -` '($ ) $N vh*+O ,   O* *+% ,  %P - -` ./ 0 ( 5  5p)6 <S  <S~ED +; +;\ 01$, 2 $,N ); );X &, &,R $&R '  R@ vhEI    EIP  4 23vh),   4 ),X 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6G   6Gr *+vh+,   , +,\ 	 	  " 
 
         L L  $   O Od ()5 * 5 *+7U  ,7Ut : :@ *+8U  ,8Uv : :@ & &( ?@$ A $* /0$$ 1 $$N - -, % %* - -* % %* - -* % %* - -* % %* 23	 4 	 ()	 * 	 '( )  * *+ ,  ( 12 3  * 45 6  ( :; < & :; <  " 9:$ ;  $ 9:*$ ;  *$Z 9: ;   9:3 ;  3l(  <=4 >  4n <=? > ?2 l  l^   D     ,   D     ,     ( q  qh     ( G G. /0 1  ./ 0  < 12 3  < 12 3  (      A A<  2 45 6  340 5 00 2 2(V U  U () *  6'&I$XC*L '(/  ) / d  (  6   4 +, -  > +,7 -  70 vh*+	& ,   	& - - % %& -. /  0  8   > 01 2  4 01= 2  =0 N  N 23 4  .z2ABIT I 3I<!0r   