403Webshell
Server IP : 65.108.144.40  /  Your IP : 216.73.217.165
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux ubuntu-8gb-hel1-1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User : dev ( 1000)
PHP Version : 8.2.30
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/erp/base/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/erp/base/__pycache__/models.cpython-310.pyc
o

hͦh���
@s6dZddlZddlmZmZmZddlmZddlZddlm	Z	ddl
mZddlm
Z
mZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%m&Z&ded�fded�fded�fded�fded�fgZ'ded�fded�fded�fded �fded!�fd"ed#�fd$ed%�fgZ(d&d'�Z)d(d)�Z*Gd*d+�d+e#�Z+Gd,d-�d-e#�Z,Gd.d/�d/e#�Z-Gd0d1�d1e#�Z.Gd2d3�d3e#�Z/Gd4d5�d5e#�Z0d6d7�e1d8d9�D�Z2e2�3d:ed;�f�d<ed�fd=ed�fd>ed�fd?ed �fd@ed!�fdAed#�fdBed%�fgZ4dCedD�fdEedF�fdGedH�fgZ5GdIdJ�dJe#�Z6GdKdL�dLe#�Z7GdMdN�dNej8�Z9GdOdP�dPe#�Z:ddQl;m<Z<m=Z=GdRdS�dSe#�Z>GdTdU�dUe#�Z?GdVdW�dWe#�Z@GdXdY�dYej8�ZAGdZd[�d[e#�ZBGd\d]�d]e#�ZCGd^d_�d_e#�ZDGd`da�dae#�ZEGdbdc�dce#�ZFGddde�dee#�ZGGdfdg�dge#�ZHdhdiedj�fgZIdkedl�fdmedn�fdoedp�fdqedr�fdsedt�fduedv�fdwedx�fdyedz�fgZJGd{d|�d|e#�ZKGd}d~�d~ej8�ZLGdd��d�ej8�ZMGd�d��d�ej8�ZNGd�d��d�ej8�ZOGd�d��d�e#�ZPGd�d��d�e#�ZQGd�d��d�ej8�ZRGd�d��d�ej8�ZSGd�d��d�ej8�ZTGd�d��d�e#�ZUGd�d��d�ej8�ZVd�d��ZWGd�d��d�ej8�ZXGd�d��d�e#�ZYGd�d��d�e#�ZZGd�d��d�e#�Z[Gd�d��d�e#�Z\Gd�d��d�ej8�Z]eee\d��d�d���Z^e�_d�ej`d�d���dS)�z:
models.py

This module is used to register django models
�N)�date�datetime�	timedelta)�Iterable)�apps)�messages)�AbstractUser�User)�ValidationError)�models)�	post_save)�receiver)�gettext_lazy)�HorillaCompanyManager)�horilla_middlewares)�_thread_locals)�get_horilla_model_class)�HorillaModel)�HorillaAuditInfo�HorillaAuditLog�0z
First Week�1zSecond Week�2z
Third Week�3zFourth Week�4z
Fifth Week�Monday�Tuesday�	Wednesday�Thursday�Friday�5�Saturday�6�Sundayc
Cs�t|�dkrttd���z&|�d�\}}t|�}t|�}tt|��dks*|td�vr0ttd���WdStyE}zttd��|�d}~ww)	zM
    this method is used to validate the format of duration like fields.
    �z)Invalid format, it should be HH:MM format�:��<zInvalid time, excepted HH:MMzInvalid format,  excepted HH:MMN)�lenr
�_�split�int�str�range�
ValueError)�value�hour�minute�e�r3�/var/www/erp/base/models.py�validate_time_format1s���r5cCst�|�}|D]}qdS�N)r�get_messages)�request�storage�messager3r3r4�clear_messagesAs
�r;c@s�eZdZdZejdd�Zejdd�Zej	dd�Z
ejdd�Zejdd�Zejdd�Z
ejdd�Zejdd	d
�Ze��Zejdd	d	d�Zejdd	d	d�Zej	d	d	d
�ZGdd�d�Zdefdd�ZdS)�Companyz
    Company model
    �2��
max_lengthF��default��z	base/iconT)�	upload_to�null��r?�blankrE)rHrEc@s,eZdZdZed�Zed�ZddgZdZdS)zCompany.Meta�6
        Meta class to add additional options
        r<�	Companies�company�address�baseN)	�__name__�
__module__�__qualname__�__doc__r)�verbose_name�verbose_name_plural�unique_together�	app_labelr3r3r3r4�Meta\srV�returncC�
t|j�Sr6)r,rK��selfr3r3r4�__str__f�
zCompany.__str__N)rNrOrPrQr�	CharFieldrK�BooleanField�hq�	TextFieldrL�country�state�city�zip�	FileField�icon�Manager�objects�date_format�time_format�	auth_coderVr,r[r3r3r3r4r<Gs&�
r<csjeZdZdZejddd�Zejede	d�d�Z
e�ZGdd	�d	�Z
�fd
d�Z�fdd
�Zdd�Z�ZS)�
Departmentz
    Department model
    r=F)r?rHTr<�rHrRc@�eZdZed�Zed�ZdS)zDepartment.Metarl�DepartmentsN�rNrOrPr)rRrSr3r3r3r4rVt�rVc�nt�j|i|��ttdd�}|r5|jr5|j�dd�}|j�dd�}tjj	||d�j
|jd���r5t
d��dS)Nr8�
company_id�
department)�company_id__id__inrt��idz.This department already exists in this company)�super�clean�getattrr�POST�getlist�getrlrh�filter�excluderw�existsr
)rZ�args�kwargsr8rKrt��	__class__r3r4ryxs
���zDepartment.cleanc�&t�j|i|��|j|i|��|Sr6�rx�savery�rZr�r�r�r3r4r���zDepartment.savecCrXr6)r,rtrYr3r3r4r[�r\zDepartment.__str__)rNrOrPrQrr]rt�ManyToManyFieldr<r)rsrrhrVryr�r[�
__classcell__r3r3r�r4rljsrlc@sjeZdZdZejdddd�Zejeej	de
d�d�Zeje
de
d	�d
�Zed�ZGdd
�d
�Zdd�ZdS)�JobPositionz
    JobPosition model
    r=FrG�job_positionrl��	on_delete�related_namerRTr<rm�department_id__company_idc@� eZdZdZed�Zed�ZdS)zJobPosition.MetarI�Job Positionz
Job PositionsN�rNrOrPrQr)rRrSr3r3r3r4rV��rVcCst|jd|jj�dS)Nz - (�))r,r��
department_idrtrYr3r3r4r[�szJobPosition.__str__N)rNrOrPrQrr]r��
ForeignKeyrl�PROTECTr)r�r�r<rsrrhrVr[r3r3r3r4r��s�r�c@sheZdZdZejeejed�d�Z	ej
dddd�Zeje
ded�d	�Zed
�ZGdd�d�Zd
d�ZdS)�JobRolez
JobRole modelr��r�rRr=FTrGr<rm�*job_position_id__department_id__company_idc@s$eZdZdZed�Zed�ZdZdS)zJobRole.MetarIzJob Rolez	Job Roles)�job_position_id�job_roleN)rNrOrPrQr)rRrSrTr3r3r3r4rV�s
rVcCs|j�d|jj��S)N� - )r�r�r�rYr3r3r4r[��zJobRole.__str__N)rNrOrPrQrr�r�r�r)r�r]r�r�r<rsrrhrVr[r3r3r3r4r��s�	r�csneZdZdZejdd�Zejede	d�d�Z
e�ZGdd�d�Z
d	efd
d�Z�fdd
�Z�fdd�Z�ZS)�WorkTypez
    WorkType model
    r=r>Tr<rmc@r�)z
WorkType.MetarIz	Work Typez
Work TypesNr�r3r3r3r4rV�r�rVrWcCrXr6)r,�	work_typerYr3r3r4r[�r\zWorkType.__str__crr)Nr8rsr�)rur�rvz-This work type already exists in this company)rxryrzrr{r|r}r�rhr~rrwr�r
)rZr�r�r8rKr�r�r3r4ry�s
��zWorkType.cleancr�r6r�r�r�r3r4r��r�z
WorkType.save)rNrOrPrQrr]r�r�r<r)rsrrhrVr,r[ryr�r�r3r3r�r4r��sr�c@s�eZdZdZejdd�Zejeej	de
d�d�Zejeej	de
d�d�Zej
d	d
e
d�d�Zejed
d
d�Zed�ZGdd�d�Zdefdd�Zdd�Zdd�ZdS)�RotatingWorkTypez 
    RotatingWorkType model
    r=r>�
work_type1zWork Type 1r��
work_type2zWork Type 2�employee.Employee�RotatingWorkTypeAssign�Employee��throughrRT�rArHrE�+employee_id__employee_work_info__company_idc@r�)zRotatingWorkType.MetarI�Rotating Work TypezRotating Work TypesNr�r3r3r3r4rVr�rVrWcCrXr6�r,�namerYr3r3r4r[r\zRotatingWorkType.__str__cC��|j|jkrttd���|jr|j�dg�ng}|r*t|jj�|dkr*ttd���|r<t|jj�|dkr<ttd���tt	|�d�D]}||r`||dr`||||dkr`ttd���qDdS)Nz'Select different work type continuously�additional_work_typesr����)
r�r�r
r)�additional_datar}r,rwr-r()rZr��ir3r3r4rys(������zRotatingWorkType.cleancC�Jtjj|jd�}|j}|r!|�d�}|rtjj|d�}|Sd}|Sd}|S)Nrvr���id__in)r�rhr}�pkr�r�r~)rZ�rotating_work_typer��additional_work_type_idsr�r3r3r4r�2�
���z&RotatingWorkType.additional_work_typesN)rNrOrPrQrr]r�r�r�r�r)r�r�r��employee_id�	JSONField�dictr�rrhrVr,r[ryr�r3r3r3r4r��s<����r�cCsg|]
}t|�t|�f�qSr3)r,)�.0r�r3r3r4�
<listcomp>Bsr�r�� �lastzLast Day�monday�tuesday�	wednesday�thursday�friday�saturday�sunday�after�After�weekly�Weekend�monthly�Monthlyc@s2eZdZdZejdejded�d�Zeje	ejed�d�Z
ejej
jjed�d	�Zejded
�d�Zejedejded
�d�Zejedejded�d�Zejdedded�d�Zejded�d	�Zejddedded�d�Zejddeed�d�Zejeddd�Z e!de"gd�Z#e$d �Z%Gd!d"�d"�Z&d#d$�Z'd%S)&r�z&
    RotatingWorkTypeAssign model
    r�Tr�)r�rErRr�r��
Start Date�rArR�Next Switch�rErR�current_work_typezCurrent Work Type)rEr�r�rR�next_work_typezNext Work Type�
F�Based On�r?�choicesrErHrR��Rotate After Dayr��Rotate Every Weekend�r?rAr�rHrErRr�Rotate Every Month)r?rAr�rRr��history_set�r��basesr�c@�(eZdZdZed�Zed�ZddgZdS)zRotatingWorkTypeAssign.MetarIzRotating Work Type AssignzRotating Work Type Assigns�-next_change_date�!-employee_id__employee_first_nameN�rNrOrPrQr)rRrS�orderingr3r3r3r4rV��
rVcC�l|jr#|jdur#tjjd|jd�}|��r#|��j|jkr#tt	d���|j
tjj
����kr4tt	d���dS)NT)�	is_activer��+Only one active record allowed per employee�+Date must be greater than or equal to today)r�r�r�rhr~r��firstrwr
r)�
start_date�django�utils�timezone�nowr�rZ�siblingsr3r3r4ry����zRotatingWorkTypeAssign.cleanN)(rNrOrPrQrr�r�r)r�r��rotating_work_type_id�	DateFieldr�r�r�r�r��next_change_dater�r�r�r]�BASED_ON�based_on�IntegerField�rotate_after_day�DAY�rotate_every_weekend�DAY_DATE�rotate_everyr�r�r�rr�historyrrhrVryr3r3r3r4r�Ts�������������	r�cspeZdZdZejdd�Zejede	d�d�Z
ed�ZGdd	�d	�Z
d
efdd�Z�fd
d�Z�fdd�Z�ZS)�EmployeeTypez
    EmployeeType model
    r=r>Tr<rmr�c@r�)zEmployeeType.MetarIz
Employee TypezEmployee TypesNr�r3r3r3r4rV�r�rVrWcCrXr6)r,�
employee_typerYr3r3r4r[�r\zEmployeeType.__str__crr)Nr8rsr)rurrvz1This employee type already exists in this company)rxryrzrr{r|r}rrhr~rrwr�r
)rZr�r�r8rKrr�r3r4ry�� 
����zEmployeeType.cleancr�r6r�r�r�r3r4r��r�zEmployeeType.save)rNrOrPrQrr]rr�r<r)rsrrhrVr,r[ryr�r�r3r3r�r4r�src@sTeZdZdZejded�Zeje	de
d�d�Ze�Z
Gdd�d�Zd	efd
d�ZdS)
�EmployeeShiftDayz 
    EmployeeShiftDay model
    rC�r?r�Tr<rmc@r�)zEmployeeShiftDay.MetarIzEmployee Shift DayzEmployee Shift DaysNr�r3r3r3r4rV�r�rVrWcCstt|j����Sr6)r,r)�day�
capitalizerYr3r3r4r[��zEmployeeShiftDay.__str__N)rNrOrPrQrr]r�rr�r<r)rsrrhrVr,r[r3r3r3r4r�srcs�eZdZdZejdddd�Zejedd�Z	ejddd	d	e
gd
�Zejdde
gd�Zeje
d	ed
�d�Ze�d�rFejdd	d	dejed�d�Zed�ZGdd�d�Zdefdd�Z�fdd�Z�fdd�Z�ZS)�
EmployeeShiftz
    EmployeeShift model
    r=F�r?rErH�EmployeeShiftSchedule)r�r$z40:00T)r?rArErH�
validatorsz200:00)r?rAr
r<rm�
attendancezattendance.GraceTime�employee_shiftz
Grace Time)rErHr�r�rR�employee_shift__company_idc@r�)zEmployeeShift.MetarIzEmployee ShiftzEmployee ShiftsNr�r3r3r3r4rVr�rVrWcCrXr6)r,rrYr3r3r4r[r\zEmployeeShift.__str__crr)Nr8rsr)rurrvz2This employee shift already exists in this company)rxryrzrr{r|r}r
rhr~rrwr�r
)rZr�r�r8rKrr�r3r4ryrzEmployeeShift.cleancr�r6r�r�r�r3r4r�0r�zEmployeeShift.save)rNrOrPrQrr]rr�r�daysr5�weekly_full_time�	full_timer<r)rsr�is_installedr�r��
grace_time_idrrhrVr,r[ryr�r�r3r3r�r4r
�sB���
�	r
)�Case�WhencseZdZdZejeejded�d�Z	eje
ejed�d�Zejdde
ged	�d
�Zejded�d
�Zejded�d
�Zejded�d�Zejded�ed�d�Zejdded�ed�d�Zejeded�d�Zed�ZGdd�d�Zdefdd�Z�fd d!�Z�ZS)"rz%
    EmployeeShiftSchedule model
    �day_schedulez	Shift Dayr��Shiftr�z08:15�zMinimum Working Hours)rAr?r
rRTz
Start Timer�zEnd TimeFzNight Shiftr�zEnable Automatic Check Outz+Enable this to trigger automatic check out.�rArR�	help_textzAutomatic Check Out Timez^Time at which the horilla will automatically check out the employee attendance if they forget.)rErHrRrr<rm�$shift_id__employee_shift__company_idc@s|eZdZdZed�Zed�ZddggZee	ddd�e	d	d
d�e	ddd�e	d
dd�e	ddd�e	ddd�e	ddd�dd�gZ
dS)zEmployeeShiftSchedule.MetarIzEmployee Shift SchedulezEmployee Shift Schedules�shift_idrr�r)�day__day�thenr�r�r��r�r&r��r�rr�r$r�r@N)rNrOrPrQr)rRrSrTrrr�r3r3r3r4rVas 







��rVrWcCs|jj�d|j��S�N� )rrrrYr3r3r4r[vr�zEmployeeShiftSchedule.__str__cs0|jr
|jr
|j|jk|_t�j|i|��dSr6)�
start_time�end_time�is_night_shiftrxr�r�r�r3r4r�yszEmployeeShiftSchedule.save) rNrOrPrQrr�rr�r)rr
rr]r5�minimum_working_hour�	TimeFieldr%r&r^r'�is_auto_punch_out_enabled�auto_punch_out_timer�r<rsrrhrVr,r[r�r�r3r3r�r4r9sL������rc@s�eZdZdZejdd�Zejdded�d�Z	ej
edejed	�d
�Z
ej
edejed�d
�Zejed
d
d�Zed�ZGdd�d�Zdefdd�Zdd�Zdd�ZdS)�
RotatingShiftz
    RotatingShift model
    r=r>r��RotatingShiftAssignr�r��shift1zShift 1)r�r�rR�shift2zShift 2Tr�r�c@r�)zRotatingShift.MetarI�Rotating ShiftzRotating ShiftsNr�r3r3r3r4rV�r�rVrWcCrXr6r�rYr3r3r4r[�r\zRotatingShift.__str__cCr�)Nz#Select different shift continuously�additional_shiftsrr�r�)
r.r/r
r)r�r}r,rwr-r()rZr1r�r3r3r4ry�s ����zRotatingShift.cleancCr�)Nrvr1r�)r,rhr}r�r�r
r~)rZ�rotating_shiftr��additional_shift_idsr1r3r3r4r1�r�zRotatingShift.additional_shiftsN)rNrOrPrQrr]r�r�r)r�r�r
r�r.r/r�r�r�rrhrVr,r[ryr1r3r3r3r4r,s8
����r,c@s8eZdZdZejdejed�d�Zeje	ejed�d�Z
ejej
jjed�d�Zejded	�d
�Zejeejdded�d
�Zejeejdded�d
�Zejdedded�d�Zejddded�d�Zejddedded�d�Zejddddeed�d�Zejeddd�Z e!de"gd�Z#e$d �Z%Gd!d"�d"�Z&d#d$�Z'd%S)&r-z#
    RotatingShiftAssign model
    r�r�r�r0r�r�Tr�r��
current_shiftz
Current Shift�r�rEr�rR�
next_shiftz
Next Shiftr�Fr�r�r�r�)rErHrArRr�r�r�rr�)r?rHrErAr�rRr�r�r�r�c@r�)zRotatingShiftAssign.MetarIzRotating Shift AssignzRotating Shift Assignsr�r�Nr�r3r3r3r4rVr�rVcCr�)NT)r��employee_id__idr�r�)r��employee_id_idr-rhr~r�r�rwr
r)r�r�r�r�r�rr�r3r3r4ryr�zRotatingShiftAssign.cleanN)(rNrOrPrQrr�r�r)r�r,�rotating_shift_idr�r�r�r�r�r�r�r
r4r6r]r�r�r�r�r�r�r�rr�r�r�rrrrrhrVryr3r3r3r4r-�s�������������	r-c@s eZdZejdd�Ze��ZdS)�BaserequestFilezbase/request_files�rDN)rNrOrPrre�filergrhr3r3r3r4r:$sr:cs:eZdZdZejdejdded�d�Zeje	ejded�d	�Z
eje	ejddd
ed�d�Zejde
jjjed
�d�Zejdded�d�Zejded�d�Zejded�d�Zejded�d�Zejded�d�Zejdd�Zedegd�Zed�ZGdd�d�Z�fdd�Z d d!�Z!d"d#�Z"d$d%�Z#d&e$fd'd(�Z%�Z&S))�WorkTypeRequestz
    WorkTypeRequest model
    r�T�work_type_requestr�r5�requested_work_typezRequesting Work Typer��previous_work_typezPrevious Work Type�r�rErHr�rR�Requested Date�rErArR�Requested Till�rErHrR�Descriptionr�F�Permanent Requestr��Approved�Canceledr@r�r�r�c@�*eZdZdZed�Zed�ZdZdgZdS)zWorkTypeRequest.MetarIzWork Type RequestzWork Type Requests))�approve_worktyperequestzApprove Work Type Request)�cancel_worktyperequestzCancel Work Type Request�-idN�	rNrOrPrQr)rRrS�permissionsr�r3r3r3r4rVX��rVc�Httdd�}|jst�j|i|��dS|r"t|�t�|d�dSdS�Nr8z$The request entry cannot be deleted.�rzr�approvedrx�deleter;r�warning�rZr�r�r8r�r3r4rUg��zWorkTypeRequest.deletecC�tjj|jdd|j|jg|j|jgd�j|jd�}|rdStjj|jdd|j|jd�j|jd�}|r4dS|jrNtjj|jdd|j|jd�j|jd�}|rNdStjj|jdd|jd�}|r^dSdS�NTF)r�rT�canceled�requested_date__range�requested_till__rangerv)r�rTr[�requested_date__lte�requested_till__gte)r�rTr[�requested_date__exact)r=rhr~r��requested_date�requested_tillrrw)rZ�!approved_work_type_requests_range�approved_work_type_requests�approved_work_type_requests_2�approved_permanent_reqr3r3r4�is_any_work_type_request_existsp�V

�������z/WorkTypeRequest.is_any_work_type_request_existscCs�ttjdd�}|jjs|jtjj�	��
�krttd���|j
r+|j
|jkr+ttd���|��r5ttd���|jsA|j
sCttd���dSdS)Nr8r��4End date must be greater than or equal to start datez;A work type request already exists during this time period.�!Requested till field is required.)rzrr�user�is_superuserrar�r�r�r�rr
r)rbrg�is_permanent_work_type�rZr8r3r3r4ry�s"���zWorkTypeRequest.cleancCs$|jrtd�S|jrtd�Std�S)N�RejectedrH�	Requested)r[r)rTrYr3r3r4�request_status�s����zWorkTypeRequest.request_statusrWcC�|jj�d|jj�d|j��S�Nz
             r��r��employee_first_name�employee_last_namerarYr3r3r4r[��

��zWorkTypeRequest.__str__)'rNrOrPrQrr�r�r)r�r��work_type_id�previous_work_type_idr�r�r�r�r�rarbr`�descriptionr^rmrTr[�work_type_changedrrrrrhrVrUrgryrqr,r[r�r3r3r�r4r=)s`����
����	'r=c@sreZdZdZddlmZejeej	d�Z
ejeej	d�Zejde
d�d�Zejedd�Ze��Zd	efd
d�ZdS)
�WorkTypeRequestCommentz&
    WorkTypeRequestComment Model
    r�r��r�T�Commentr��rHrWcC�|j�Sr6��commentrYr3r3r4r[��zWorkTypeRequestComment.__str__N)rNrOrPrQ�employee.modelsr�rr�r=�CASCADE�
request_idr�r`r)r�r�r:�filesrgrhr,r[r3r3r3r4r|�sr|cs~eZdZdZejdejdded�d�Zeje	ejded�d	�Z
eje	ejddd
ed�d�Zejde
jjjed
�d�Zejdejddded�d�Zejded�d�Zejded�d�Zejdded�d�Zejded�d�Zejded�d�Zejded�d�Zejded�d�Zejdd�Zedegd�Ze d�Z!Gdd�d�Z"d d!�Z#d"d#�Z$�fd$d%�Z%�fd&d'�Z&d(e'fd)d*�Z(�Z)S)+�ShiftRequestz
    ShiftRequest model
    r�T�
shift_requestr�r5�requested_shiftzRequesting Shiftr��previous_shiftzPrevious ShiftrArBrC�reallocate_shift_requestzReallocate EmployeeFrHr�rIrDrErFr�rGr@r�r�r�c@rJ)zShiftRequest.MetarIz
Shift RequestzShift Requests))�approve_shiftrequestzApprove Shift Request)�cancel_shiftrequestzCancel Shift RequestrMNrNr3r3r3r4rV�rPrVcCs�ttjdd�}|jjs|js|jtjj	�
���krtt
d���|jr.|j|jkr.tt
d���|��r8tt
d���|jsD|jsFtt
d���dSdS)Nr8r�rizAAn approved shift request already exists during this time period.rj)rzrrrkrlr�rar�r�r�r�rr
r)rb�is_any_request_exists�is_permanent_shiftrnr3r3r4ry
s"���zShiftRequest.cleancCrYrZ)r�rhr~r�rarbrrw)rZ�approved_shift_requests_range�approved_shift_requests�approved_shift_requests_2rfr3r3r4r�rhz"ShiftRequest.is_any_request_existscst�j|i|��dSr6)rxr�r�r�r3r4r�FszShiftRequest.savecrQrRrSrWr�r3r4rUIrXzShiftRequest.deleterWcCrrrsrtrYr3r3r4r[RrwzShiftRequest.__str__)*rNrOrPrQrr�r�r)r�r
r�previous_shift_idr�r�r�r�r�ra�
reallocate_tor^�reallocate_approved�reallocate_canceledrbr`rzr�rTr[�
shift_changedrrrrrhrVryr�r�rUr,r[r�r3r3r�r4r��st�����
����'	r�c@sreZdZdZddlmZejeej	d�Z
ejeej	d�Zeje
dd�Zejded�d�Ze��Zd	efd
d�ZdS)
�ShiftRequestCommentz#
    ShiftRequestComment Model
    rr}r~Tr�rr�rWcCr�r6r�rYr3r3r4r[dr�zShiftRequestComment.__str__N)rNrOrPrQr�r�rr�r�r�r�r�r�r:r�r`r)r�rgrhr,r[r3r3r3r4r�Wsr�c@sJeZdZejdd�Zejdd�Zejeddej	d�Z
edd�Zdd	�Z
d
S)�TagsrFr>TF)rE�editabler�rs��related_company_fieldcC�|jSr6��titlerYr3r3r4r[p�zTags.__str__N)rNrOrPrr]r��colorr�r<r�rsrrhr[r3r3r3r4r�hs
�
r�c@sTeZdZejddd�Ze��Zeje	ddej
ed�d�Ze
dd�Zdefd	d
�ZdS)�HorillaMailTemplate�T)r?�uniquer<�rErHr�rRrsr�rWcCr�r6r�rYr3r3r4r[�r�zHorillaMailTemplate.__str__N)rNrOrPrr]r�r`�bodyr�r<r�r)rsrrhr,r[r3r3r3r4r�ts�
r�cs$eZdZdZejdded�d�Zejded�d�Z	ej
dded�d�Zejdded	�d�Zejdded
�d�Z
ejdded�d�Zejded�d
�Zejded�d
�Zejded�d
�Zejded�d
�Zejded�d�Zejeejddd�Zdd�Zdd�Zd�fdd�ZGdd�d�Z�ZS)�DynamicEmailConfigurationz?
    SingletonModel to keep the mail server configurations
    T�z
Email Host)rEr?rRz
Email Portr�zDefault From EmailzEmail Host UsernamezDisplay NamezEmail Authentication PasswordzUse TLSr�FzUse SSLz
Fail SilentlyzPrimary Mail ServerzEmail Send Timeout (seconds))r�rErHcCs<|jr|jrttd���|js|jstdtd�i��dSdS)NzZ"Use TLS" and "Use SSL" are mutually exclusive, so only set one of those settings to True.rszThis field is required)�use_ssl�use_tlsr
r)rs�
is_primaryrYr3r3r4ry�s���zDynamicEmailConfiguration.cleancCr�r6)�usernamerYr3r3r4r[�r�z!DynamicEmailConfiguration.__str__rWNcsl|jrtjjdd�jdd�tj��sd|_t�j|i|��tjj|jd�j	|j
d�}|��r4|��dS)NT)r�F)rsrv)r�r�rhr~�updater�rxr�rsrrwrU)rZr�r��servers_same_companyr�r3r4r��s�
��zDynamicEmailConfiguration.savec@seZdZed�ZdS)zDynamicEmailConfiguration.MetazEmail ConfigurationN)rNrOrPr)rRr3r3r3r4rV�srV�rWN)rNrOrPrQrr]r)�host�SmallIntegerField�port�
EmailField�
from_emailr��display_name�passwordr^r�r��
fail_silentlyr��timeout�
OneToOneFieldr<r�rsryr[r�rVr�r3r3r�r4r��sL
������
�r�)�z	---------�requested_dayszLeave Requested Days�equalz
Equal (==)�notequalzNot Equal (!=)r-�Range�ltz
Less Than (<)�gtzGreater Than (>)�lezLess Than or Equal To (<=)�gezGreater Than or Equal To (>=)�	icontains�Containscs�eZdZejeejd�Zejde	d�Z
ejdeddd�Zejddde
d�d�Zejddde
d	�d�Zejddde
d
�d�Ze��Zejeddeje
d�d�Zd
efdd�Z�fdd�Z�fdd�Zdd�Z�ZS)�MultipleApprovalConditionr~rBrT)r?r�rErH�dzCondition Value)r?rErHrRzStarting ValuezEnding Valuer<r�rWcC�|j�d|j��Sr#)�condition_field�condition_operatorrYr3r3r4r[
r	z!MultipleApprovalCondition.__str__c
st|jr tjj|j|j|j|j|jd�j|j	d�}|r t
td���|jdkr�|jdkrQ|js5t
dtd�i��zt|j�}Wnrt
yP}zt
dtd�i��d}~ww|jrW|js_t
dtd	�i��zt|j�}Wnt
yz}zt
dtd
�i��d}~wwzt|j�}Wnt
y�}zt
dtd�i��d}~ww||kr�t
dtd�i��||kr�t
dtd
�i��t�j|i|��dS)N)rtr�r��condition_valuersrvz3A condition with the provided fields already existsr�r-r�z0Please enter a numeric value for condition valuezlPlease enter a valid numeric value for the condition value when the condition field is Leave Requested Days.z$Please specify condition value rangezkPlease enter a valid numeric value for the starting value when the condition field is Leave Requested Days.ziPlease enter a valid numeric value for the ending value when the condition field is Leave Requested Days.z<End value must be different from the start value in a range.z:End value must be greater than the start value in a range.)r�r�rhr~rtr�r�rsrr�r
r)�floatr.�condition_start_value�condition_end_valuerxry)rZr�r��instance�float_valuer2�start_value�	end_valuer�r3r4ry
s����

��������	�������������	������zMultipleApprovalCondition.cleancs4|jdkrd|_d|_nd|_t�j|i|��dS)Nr-)r�r�r�r�rxr�r�r�r3r4r�^s

zMultipleApprovalCondition.savec	Os\g}ddlm}tjj|jd��d�}|D]}|j}|s|jn|jj	|d�}|�
|�q|S)Nrr})�condition_id�sequencerv)r�r��MultipleApprovalManagersrhr~r��order_byr��reporting_managerr}�append)	rZr�r��managersr��queryset�query�emp_id�employeer3r3r4�approval_managersfs����z+MultipleApprovalCondition.approval_managers)rNrOrPrr�rlr�rtr]�FIELD_CHOICEr��CONDITION_CHOICEr�r)r�r�r�rgrhr<rsr,r[ryr�r�r�r3r3r�r4r��sN������Qr�c@sXeZdZejeejd�Zejddd�Z	ejddd�Z
ejdddd�Ze�
�Zdd�Zd	S)
r�r~F�rErHTr�rcCs |j}|r|j�dd���}|S)Nr)r$)r�r��replacer�)rZ�managerr3r3r4�get_manager�sz$MultipleApprovalManagers.get_managerN)rNrOrPrr�r�r�r�r�r�r�r]r�rgrhr�r3r3r3r4r�ys�r�csxeZdZdZddlmZddlmZej	eej
ddded�d�Zej
d	ed
�gd�Ze��Z�fdd
�Zdd�Z�ZS)�DynamicPaginationz4
    model for storing pagination for employees
    r)r	)�MinValueValidatorT�dynamic_paginationr	)r�rHrEr�rRr=r�)rAr
cs.ttdd�}|j}||_t�j|i|��dS)Nr8)rzrrk�user_idrxr�)rZr�r�r8rkr�r3r4r��szDynamicPagination.savecCr�)N�|)r��
paginationrYr3r3r4r[�r	zDynamicPagination.__str__)rNrOrPrQ�django.contrib.auth.modelsr	�django.core.validatorsr�rr�r�r)r�r�r�rgrhr�r[r�r3r3r�r4r��s �r�c@s$eZdZdZejdd�Zdd�ZdS)�
AttachmentzE
    Attachment model for multiple attachments in announcements.
    zattachments/r;cCs|jjSr6)r<r�rYr3r3r4r[�r�zAttachment.__str__N)rNrOrPrQrrer<r[r3r3r3r4r��sr�c@s(eZdZdZejdddd�Ze��ZdS)�AnnouncementExpirezb
    This model for setting a expire days for announcement if no expire date for announcement
    TrF�rErHrAN)	rNrOrPrQrr�rrgrhr3r3r3r4r��sr�c@s�eZdZdZddlmZejdd�Zej	dd�Z
ejeddd	�Z
ejddd
�Zejeddd	�Zejedd�Zejedd�Zejedd
d�Zejdd�Zedd�Zdd�Zdd�Zdd�ZdS)�Announcementz;
    Announcement Model for storing all announcements.
    rr}r�r>T)rE�announcement_attachments)r�rHr��announcement_employeesr��announcement)rHr�Fr@rsr�cCs|jjdd�S)zO
        This method is used to get the view count of the announcement
        T)�viewed)�announcementview_setr~rYr3r3r4�	get_views�szAnnouncement.get_viewscCs0tjj|jdd�}g}|D]}|�|j�q
|S)NT)�announcement_id__idr�)�AnnouncementViewrhr~rwr�rk)rZ�	viewed_by�
viewed_empr�r3r3r4r��s�zAnnouncement.viewed_bycCr�r6r�rYr3r3r4r[�r�zAnnouncement.__str__N)rNrOrPrQr�r�rr]r�r`rzr�r��attachmentsr��expire_date�	employeesrlrtr�r�r<rsr^�disable_commentsrrhr�r�r[r3r3r3r4r��s0���

r�c@sXeZdZdZddlmZejeej	d�Z
ejeej	d�Zejde
d�dd�Ze��Zd	S)
�AnnouncementCommentz#
    AnnouncementComment Model
    rr}r~TrrB)rErRr?N)rNrOrPrQr�r�rr�r�r��announcement_idr�r`r)r�rgrhr3r3r3r4r�src@sReZdZdZejeejd�Zeje	ejd�Z
ejdd�Zej
ddd�Ze��ZdS)r�z!
    Announcement View Model
    r~Fr@T)�auto_now_addrEN)rNrOrPrQrr�r	r�rkr�r�r^r��
DateTimeField�
created_atrgrhr3r3r3r4r��sr�c@sveZdZdZddgZejdd�Zejdd�Z	e�
�Ze�
�Zejded�Z
ejdd	�Ze��Zejeejdd
d�ZdS)
�EmailLogz 
    EmailLog Keeping model
    )�sent�Sent)�failed�FailedrBr>r$rT)rF�r�rEr�N)rNrOrPrQ�statusesrr]�subjectr`r�r�r��to�statusrrrgrhr�r<r�rsr3r3r3r4rs

�rc@s>eZdZdZgd�Zejeejd�Z	ej
ded�Zdd�ZdS)	�DriverViewedz-
    Model to store driver viewed status
    ))�	dashboardr)�pipeliner)�settingsrr~r�rcCs|jjjddd�S)zD
        This method is used to access all the viewd driver
        r�T)�flat)rk�driverviewed_set�values_listrYr3r3r4�user_viewed szDriverViewed.user_viewedN)
rNrOrPrQr�rr�r	r�rkr]r�rr3r3r3r4rsrc@sFeZdZddlmZejeejd�Zej	e
d�eddd�Zdd�Z
d	S)
�DashboardEmployeeChartsrr}r~zExcluded ChartsT)rRrArHrEcCs|j�d�S)Nz	 - charts)r�rYr3r3r4r[/�zDashboardEmployeeCharts.__str__N)rNrOrPr�r�rr�r�r�r�r)�list�chartsr[r3r3r3r4r's�rc@s>eZdZejdd�Zejeddejdd�Z	e�
�Zdd�ZdS)	�BiometricAttendanceFr@T�biometric_enabled_company)rEr�r�r�cCr�r6)rrYr3r3r4r[>r�zBiometricAttendance.__str__N)
rNrOrPrr^rr�r<r�rsrgrhr[r3r3r3r4r3s�rcCsdgiS)N�allowed_ipsr3r3r3r3r4�default_additional_dataBr�rc@s<eZdZdZejdd�Zejdded�Z	dd�Z
dd	�Zd
S)�AttendanceAllowedIPa
    Represents client IP addresses that are allowed to mark attendance.
    Usage:
        - This model is used to store IP addresses that are permitted to access the attendance system.
        - It ensures that only authorized IP addresses can mark attendance.
    Fr@Tr�c	CsF|j�dg�}|D]}zt�|�Wq	ty td|����wdS)zo
        Validate that all entries in `allowed_ips` are either valid IP addresses or network prefixes.
        rz&Invalid IP address or network prefix: N)r�r}�	ipaddress�
ip_networkr.r
)rZr�ipr3r3r4rySs��zAttendanceAllowedIP.cleancCsd|j��S)NzAttendanceAllowedIP - )�
is_enabledrYr3r3r4r[^rzAttendanceAllowedIP.__str__N)rNrOrPrQrr^r#r�rr�ryr[r3r3r3r4rFs�rc@s:eZdZejded�ed�d�ZGdd�d�Zdd�Zd	S)
�TrackLateComeEarlyOutT�Enablez[By enabling this, you track the late comes and early outs of employees in their attendance.rc@rn)zTrackLateComeEarlyOut.MetazTrack Late Come Early OutzTrack Late Come Early OutsNrpr3r3r3r4rVkrqrVcCs |jrtd�ntd�}d|��S)N�enabled�disabledzTracking late come early out )�	is_enabler))rZ�trackingr3r3r4r[os
zTrackLateComeEarlyOut.__str__N)	rNrOrPrr^r)r(rVr[r3r3r3r4r$bs��r$c@s�eZdZejdded�d�Zejed�d�Zejdded�d	�Z	ej
ded
�d�Zeje
dejed�d
�Zedd�Zdd�Zddejfdd�ZdS)�HolidaysrFF�Name)r?rErRr�)rRTzEnd DaterE�	Recurringr�r<)rEr�rRrsr�cCr�r6)r�rYr3r3r4r[�r�zHolidays.__str__NrWcCs|pt��}tjj||d�S)at
        Retrieve holidays that overlap with the given date (default is today).

        Args:
            today (date, optional): The date to check for holidays. Defaults to the current date.

        Returns:
            QuerySet: A queryset of `Holidays` instances where the given date falls between
                    `start_date` and `end_date` (inclusive).
        )�start_date__lte�
end_date__gte)r�todayr*rhr~)r/r3r3r4�today_holidays�szHolidays.today_holidaysr6)rNrOrPrr]r)r�r�r��end_dater^�	recurringr�r<r�rsrrhr[�QuerySetr0r3r3r3r4r*ts�
r*c@s^eZdZejdeddd�Zejded�Zej	e
dejd�Ze
dd�ZGdd	�d	�Zd
d�ZdS)
�
CompanyLeavesr�T)r?r�rHrEr)rEr�rsr�c@seZdZdZdS)zCompanyLeaves.Meta)�
based_on_week�based_on_week_dayN)rNrOrPrTr3r3r3r4rV�srVcCs&tt��|j��dtt��|j���S)Nz | )r��	WEEK_DAYSr}r6�WEEKSr5rYr3r3r4r[�s&zCompanyLeaves.__str__N)rNrOrPrr]r8r5r7r6r�r<r�rsrrhrVr[r3r3r3r4r4�s�
r4cs�eZdZdZejdejddddd�Ze�	d�r!ejd	ej
ddd
�Ze�	d�rHejddej
dd
�Zejdej
dddd�Zejddd�Zejdd�Zejddd�Zd�fdd�ZGdd�d�Z�ZS)�PenaltyAccountsz(
    LateComeEarlyOutPenaltyAccount
    r��penalty_accountsFr�T)r�r�r�rRrErz%attendance.AttendanceLateComeEarlyOutr
�leavezleave.LeaveRequest)rEr�r�zleave.LeaveTypez
Leave type)r�rHrErRg)rArEr@rWNcs�t���t�d�r|js|jrtdtd�i��t�d�r+|jr+|js+tdtd�i��|js9|js9tdtd�i��|js?|j	rJ|jsJtdtd�i��dS)Nr;�
leave_type_idz+Specify the leave type to deduct the leave.�minus_leaveszCIf a leave type is chosen for a penalty, minus leaves are required.z3Either minus leaves or a penalty amount is requiredzLeave type is required)
rxryrrr<r=r
r)�penalty_amount�deduct_from_carry_forwardrYr�r3r4ry�s6

�������	���zPenaltyAccounts.cleanc@seZdZdgZdS)zPenaltyAccounts.Metaz-created_atN)rNrOrPr�r3r3r3r4rV�s
rVr�)rNrOrPrQrr�r�r�rrr��
late_early_id�leave_request_id�
DO_NOTHINGr<�
FloatFieldr=r^r?r>ryrVr�r3r3r�r4r9�sB�
�

��r9c@s6eZdZddlmZejeejdd�Zej	dd�Z
dS)�NotificationSoundrr}�notification_sound)r�r�Fr@N)rNrOrPr�r�rr�r�r�r^�
sound_enabledr3r3r3r4rD�s�rD)�senderc	KsP|r�|j}t�d�re|retddd�}|�}|jr(|j���d�|_|jjj|_	n|j
r9d|j
j��|_|j
j|_	n
dt�
���|_t�
�|_	d|_d|_|j|_d|_|��d|_|j�|j�|��t�d	�r�|jr�|jr�|jjj|jd
���}t|jd�d}|js�td|j|�|_n	td|j|�|_|��d
Sd
Sd
Sd
Sd
S)zS
    This is post save method, used to create deduction and cut availabl leave days�payroll�	deduction)rU�modelz penaltyzLeave penalty zPenalty on FTr;)r<r!rN) r>rrrr@�get_type_displayr��
attendance_id�attendance_date�
one_time_daterAr1rr/�include_active_employees�is_fixed�amount�only_show_under_employeer��specific_employees�addr�r<r=�available_leaver~r��roundr?�max�available_days�carryforward_days)	rGr��createdr�r>�	Deduction�penalty�	available�unitr3r3r4�&create_deduction_cutleave_from_penalty�sT�
�����
��r_�is_new_employeeFr@)arQr rrr�typingrr��django.appsr�django.contribrr�rr	�django.core.exceptionsr
�	django.dbr�django.db.models.signalsr�django.dispatchr
�django.utils.translationrr)�base.horilla_company_managerr�horillar�horilla.horilla_middlewaresr�horilla.methodsr�horilla.modelsr�horilla_audit.modelsrrr8r7r5r;r<rlr�r�r�r�r-r�r�r�r�r�r�Modelrr
�django.db.modelsrrrr,r-r:r=r|r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rrrrrrr$r*r4r9rDr_�add_to_classr^r3r3r3r4�<module>s�




�







�#')T






�



�Z-EFLYS
�







�	.
D
	
0

Youez - 2016 - github.com/yon3zu
LinuXploit