
    si`                       d Z ddlZddl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 dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z, ddl-m.Z. d ed      fd ed      fd ed      fd ed      fd ed      fgZ/d ed       fd ed!      fd ed"      fd ed#      fd ed$      fd% ed&      fd' ed(      fgZ0d) Z1d* Z2 G d+ d,e'      Z3 G d- d.e'      Z4 G d/ d0e'      Z5 G d1 d2e'      Z6 G d3 d4e'      Z7 G d5 d6e'      Z8 e9d7d8      D  cg c]  }  e:|        e:|       f c} Z;e;jy                  d9 ed:      f       d; ed       fd< ed!      fd= ed"      fd> ed#      fd? ed$      fd@ ed&      fdA ed(      fgZ=dB edC      fdD edE      fdF edG      fgZ> G dH dIe'      Z? G dJ dKe'      Z@ G dL dMej                        ZB G dN dOe'      ZCddPlDmEZEmFZF  G dQ dRe'      ZG G dS dTe'      ZH G dU dVe'      ZI G dW dXej                        ZJ G dY dZe'      ZK G d[ d\e'      ZL G d] d^e'      ZM G d_ d`e'      ZN G da dbe'      ZO G dc dde'      ZP G de dfe'      ZQdgdh edi      fgZRdj edk      fdl edm      fdn edo      fdp edq      fdr eds      fdt edu      fdv edw      fdx edy      fgZS G dz d{e'      ZT G d| d}ej                        ZU G d~ dej                        ZV G d dej                        ZW G d dej                        ZX G d de'      ZY G d de'      ZZ G d dej                        Z[ G d dej                        Z\ G d dej                        Z] G d de'      Z^ G d dej                        Z_d Z` G d dej                        Za G d de'      Zb G d de'      Zc G d de'      Zd G d de'      Ze G d dej                        Zf G d de'e(      Zg eeee      d        Zh eeee      d        Zi e
j                  d ej                  d             yc c} w )z/
This module is used to register django models
    N)datedatetime)apps)messagesUser)ValidationError)models)post_delete	post_save)receiver)reversereverse_lazyformat_html)	mark_safe)gettext_lazy)HorillaCompanyManager)horilla_middlewares)_thread_locals)get_horilla_model_class)HorillaModelNoPermissionModelupload_path)HorillaAuditInfoHorillaAuditLogrender_template0z
First Week1zSecond Week2z
Third Week3zFourth Week4z
Fifth WeekMondayTuesday	WednesdayThursdayFriday5Saturday6Sundayc                 Z   t        |       dkD  rt        t        d            	 | j                  d      \  }}t	        |      }t	        |      }t        t        |            dkD  s|t        d      vrt        t        d            y# t        $ r}t        t        d            |d}~ww xY w)	zM
    this method is used to validate the format of duration like fields.
       z)Invalid format, it should be HH:MM format:   <   zInvalid time, excepted HH:MMzInvalid format,  excepted HH:MMN)lenr	   _splitintstrrange
ValueError)valuehourminutees       //var/www/python-projects/worksol/base/models.pyvalidate_time_formatr>   2   s     5zA~a KLMMK{{3'f4yVs4y>AuRy!8!!$B"CDD "9 Ka ABCJKs   A"B 	B*B%%B*c                 <    t        j                  |       }|D ]  } y)z
    clear messages
    N)r   get_messages)requeststoragemessages      r=   clear_messagesrD   B   s&     ##G,G     c                      e Zd ZdZ ej
                  d ed            Z ej                  d      Z	 ej
                  d      Z
 ej
                  d      Z ej
                  d      Z ej
                  d      Z ej
                  d	      Z ej                  ed
      Z ej$                         Z ej
                  dd
d
      Z ej
                  d	d
d
      Z G d d      ZdefdZd Zd Zd Zd Zy)Companyz
    Company model
    2   Name
max_lengthverbose_nameFdefault   rK      T)	upload_tonull   )rK   blankrS   c                   <    e Zd ZdZ ed      Z ed      ZddgZdZy)Company.Meta6
        Meta class to add additional options
        rG   	CompaniescompanyaddressbaseN)	__name__
__module____qualname____doc__r3   rL   verbose_name_pluralunique_together	app_label rE   r=   MetarW   _   s+    	 |n$i0	rE   re   returnc                 ,    t        | j                        S N)r6   rZ   selfs    r=   __str__zCompany.__str__i   s    4<<  rE   c                 ^    ddl m}  |d| j                  j                  | j                        S )Nr   r   z]<img src="{}" style="width: 30px; border-radius: 100%" class="oh-profile__image" alt="" /> {})django.utils.htmlr   iconurlrZ   )rj   r   s     r=   company_icon_with_namezCompany.company_icon_with_namel   s'    1kIIMMLL
 	
rE   c                 8    t        dd| j                  i      }|S )/
        This method to get update url
        zcompany-update-formpkkwargsr   rs   rj   ro   s     r=   get_update_urlzCompany.get_update_urlu        0$I
rE   c                     t        d      }|S /
        This method to get delete url
        generic-deleter   rw   s     r=   get_delete_urlzCompany.get_delete_url|        +,
rE   c                     | j                   S z,
        to get instance for delete
        rs   ri   s    r=   get_delete_instancezCompany.get_delete_instance       
 wwrE   N)r]   r^   r_   r`   r
   	CharFieldr3   rZ   BooleanFieldhqr[   countrystatecityzip	FileFieldr   rn   Managerobjectsdate_formattime_formatre   r6   rk   rp   rx   r   r   rd   rE   r=   rG   rG   K   s    f"1V9EG			U	+Bf#.Gf"-GF+E6r*D
&

b
)C6D fnnG"&""b4HK"&""b4HK ! !
rE   rG   c                        e Zd ZdZ ej
                  dd ed             Z ej                  e	d ed            Z
 e       Z G d d	      Z fd
Zd Zd Zd Zd Zd Zd Z fdZd Z xZS )
Departmentz
    Department model
    rH   F)rK   rU   rL   TrG   rU   rL   c                   0    e Zd ZdZ ed      Z ed      Zy)Department.Metaz
        meta
        r   DepartmentsNr]   r^   r_   r`   r3   rL   ra   rd   rE   r=   re   r      s    	 .rE   re   c                 z   t        |   |i | t        t        dd       }|r|j                  r|j                  j                  dd       }|j                  j                  dd       }t        j                  j                  ||      j                  | j                        j                         rt        d      y )NrA   
company_id
department)company_id__id__inr   idz.This department already exists in this company)supercleangetattrr   POSTgetlistgetr   r   filterexcluder   existsr	   )rj   argsru   rA   rZ   r   	__class__s         r=   r   zDepartment.clean   s    t&v&.)T:w||ll**<>G )),=J""))'.: *  DGG$	 &&VWWrE   c                 R    | j                   j                         j                         S rh   )job_positionallcountri   s    r=   toggle_countzDepartment.toggle_count   s       $$&,,..rE   c                      t        dd| i      S )zM
        this method is to get custom department col in job position
        z"cbv/settings/job_position_dpt.htmlinstancepathcontextr   ri   s    r=   get_department_colzDepartment.get_department_col       
 5&
 	
rE   c                 8    t        dd| j                  i      }|S )rr   zsettings-department-updaters   rt   rv   rw   s     r=   rx   zDepartment.get_update_url        7twwP
rE   c                     t        d      }|S r{   r~   rw   s     r=   r   zDepartment.get_delete_url   r   rE   c                     | j                   S r   r   ri   s    r=   r   zDepartment.get_delete_instance   r   rE   c                      t        dd| i      S )zO
        this method is to get custom job position col in job position
        z*cbv/settings/position_in_job_position.htmlr   r   r   ri   s    r=   get_job_position_colzDepartment.get_job_position_col   s    
 =&
 	
rE   c                 J    t        |   |i |  | j                  |i | | S rh   r   saver   rj   r   ru   r   s      r=   r   zDepartment.save   ,    d%f%

D#F#rE   c                 ,    t        | j                        S rh   )r6   r   ri   s    r=   rk   zDepartment.__str__   s    4??##rE   )r]   r^   r_   r`   r
   r   r3   r   ManyToManyFieldrG   r   r   r   re   r   r   r   rx   r   r   r   r   rk   __classcell__r   s   @r=   r   r      s     "!!U<J (''t!I,WJ#%G/ / /


$rE   r   c                      e Zd ZdZ ej
                  ddd ed            Z ej                  e	ej                  d ed            Z ej                  ed	 ed
            Z ed      Z G d d      Zd Zd Zd Zd Zy)JobPositionz
    JobPosition model
    rH   FJob PositionrK   rU   rS   rL   r   r   	on_deleterelated_namerL   TrG   r   department_id__company_idc                   0    e Zd ZdZ ed      Z ed      Zy)JobPosition.MetarX   r   zJob PositionsNr   rd   rE   r=   re   r      s    	 (0rE   re   c                 f    t        | j                  dz   | j                  j                  z         dz   S )Nz - ())r6   r   department_idr   ri   s    r=   rk   zJobPosition.__str__   s/    4$$v-0B0B0M0MMNQTTTrE   c                      t        dd| i      S )5
        This method for get custom column .
        z.cbv/settings/job_position_col_in_job_role.htmlr   r   r   ri   s    r=   job_position_colzJobPosition.job_position_col  s    
 A&
 	
rE   c                 R    | j                   j                         j                         S rh   )jobrole_setr   r   ri   s    r=   get_data_countzJobPosition.get_data_count  s     ##%++--rE   c                      t        dd| i      S )r   zcbv/settings/job_role.htmlr   r   r   ri   s    r=   job_role_colzJobPosition.job_role_col  s    
 -&
 	
rE   N)r]   r^   r_   r`   r
   r   r3   r   
ForeignKeyr   PROTECTr   r   rG   r   r   r   re   rk   r   r   r   rd   rE   r=   r   r      s     $6##UQ~=NL &F%%..#|_	M (''t!I,WJ#$?@G1 1U
.
rE   r   c                       e Zd ZdZ ej
                  eej                   ed            Z	 ej                  ddd ed            Z ej                  ed ed	      
      Z ed      Z G d d      Zd Zy)JobRolezJobRole modelr   r   rL   rH   FTJob Roler   rG   r   *job_position_id__department_id__company_idc                   4    e Zd ZdZ ed      Z ed      ZdZy)JobRole.MetarX   r   z	Job Roles)job_position_idjob_roleN)r]   r^   r_   r`   r3   rL   ra   rb   rd   rE   r=   re   r   &  s!    	 }n9rE   re   c                     	 | j                   r;t        | j                   d      r%| j                   d| j                   j                   S | j                   dS # t        $ r | j                   dcY S w xY w)Nr    - z - (No Position)z - (Invalid Position))r   hasattrr   r   	Exceptionri   s    r=   rk   zJobRole.__str__/  st    	;##0D0Dn(U--D,@,@,M,M+NOO--(899 	;mm_$9::	;s   AA 	A A32A3N)r]   r^   r_   r`   r
   r   r   r   r3   r   r   r   r   rG   r   r   r   re   rk   rd   rE   r=   r   r     s~    'f''v~~An<MO  vUAjMH (''t!I,WJ#$PQG: :;rE   r   c                        e Zd ZdZ ej
                  d ed            Z ej                  e	d ed            Z
 e       Z G d d	      Zd
efdZ fdZd Zd Zd Z fdZ xZS )WorkTypez
    WorkType model
    rH   	Work TyperJ   TrG   r   c                   0    e Zd ZdZ ed      Z ed      Zy)WorkType.MetarX   r   z
Work TypesNr   rd   rE   r=   re   r   C  s    	 ~orE   re   rf   c                 ,    t        | j                        S rh   )r6   	work_typeri   s    r=   rk   zWorkType.__str__K  s    4>>""rE   c                 z   t        |   |i | t        t        dd       }|r|j                  r|j                  j                  dd       }|j                  j                  dd       }t        j                  j                  ||      j                  | j                        j                         rt        d      y )NrA   r   r   )r   r   r   z-This work type already exists in this company)r   r   r   r   r   r   r   r   r   r   r   r   r   r	   )rj   r   ru   rA   rZ   r   r   s         r=   r   zWorkType.cleanN  s    t&v&.)T:w||ll**<>G((d;I  ''7i'XDGG$ &&UVVrE   c                 8    t        dd| j                  i      }|S )rr   zwork-type-update-formrs   rt   rv   rw   s     r=   rx   zWorkType.get_update_url\       2D$''?K
rE   c                     t        d      }|S r{   r~   rw   s     r=   r   zWorkType.get_delete_urlc  r   rE   c                     | j                   S r   r   ri   s    r=   r   zWorkType.get_delete_instancej  r   rE   c                 J    t        |   |i |  | j                  |i | | S rh   r   r   s      r=   r   zWorkType.saveq  r   rE   )r]   r^   r_   r`   r
   r   r3   r   r   rG   r   r   r   re   r6   rk   r   rx   r   r   r   r   r   s   @r=   r   r   9  sx     !  BQ{^LI'''t!I,WJ#%G. .# # rE   r   c                      e Zd ZdZ ej
                  d      Z ej                  eej                  d e
d            Z ej                  eej                  d e
d            Z ej                  d	d
 e
d            Z ej                  edd      Z ed      Z G d d      ZdefdZd Zd Zd Zd Zd Zd Zy)RotatingWorkTypez 
    RotatingWorkType model
    rH   rP   
work_type1zWork Type 1r   
work_type2zWork Type 2employee.EmployeeRotatingWorkTypeAssignEmployeethroughrL   TrN   rU   rS   +employee_id__employee_work_info__company_idc                   0    e Zd ZdZ ed      Z ed      Zy)RotatingWorkType.MetarX   Rotating Work TypezRotating Work TypesNr   rd   rE   r=   re   r         	 -. 56rE   re   rf   c                 ,    t        | j                        S rh   r6   nameri   s    r=   rk   zRotatingWorkType.__str__      499~rE   c                 8    t        dd| j                  i      }|S )rr   zrotating-work-type-update-formrs   rt   rv   rw   s     r=   rx   zRotatingWorkType.get_update_url  s     ;T477OT
rE   c                     t        d      }|S r{   r~   rw   s     r=   r   zRotatingWorkType.get_delete_url  r   rE   c                     | j                   S r   r   ri   s    r=   r   z$RotatingWorkType.get_delete_instance  r   rE   c                     | j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )zG
        this method is to get additional work types if exists
        <br>None)additional_work_typesjoinr6   )rj   additional_workwork
additionals       r=   get_additional_worktytpesz*RotatingWorkType.get_additional_worktytpes  sA    
 446O%LDc$i%LMJ &M   >c                 8   | j                   | j                  k(  rt        t        d            | j                  r| j                  j                  dg       ng }|r9t        | j                  j                        |d   k(  rt        t        d            |r9t        | j                   j                        |d   k(  rt        t        d            t        t        |      dz
        D ]3  }||   s	||dz      s||   ||dz      k(  s!t        t        d             y )Nz'Select different work type continuouslyr  r      )
r   r   r	   r3   additional_datar   r6   r   r7   r2   )rj   r  is      r=   r   zRotatingWorkType.clean  s   ??doo-!!$M"NOO ##   $$%<bA 	 "DOO&&'+@+CC!!$M"NOO "DOO&&'+@+DD!!$M"NOOs01A56 	XA$Q',A!a%,H(+/DQU/KK)!,U*VWW	XrE   c                     t         j                  j                  | j                        }|j                  }|r9|j                  d      }|r"t
        j                  j                  |      }|S d }|S d }|S )Nr   r  id__in)r   r   r   rs   r  r   r   )rj   rotating_work_typer  additional_work_type_idsr  s        r=   r  z&RotatingWorkType.additional_work_types  s    -5599TWW9E,<<'6':':;R'S$'(0(8(8(?(?3 )@ )% %$ )-% %$ %)!$$rE   N)r]   r^   r_   r`   r
   r   r  r   r   r   r3   r   r   r   employee_id	JSONFielddictr  r   r   re   r6   rk   rx   r   r   r  r   r  rd   rE   r=   r   r   w  s     6r*D"""..!}%	J #""..!}%	J )&(((z]K
 'f&&O
 $$QRG7 7 	X6%rE   r   r      lastzLast Daymondaytuesday	wednesdaythursdayfridaysaturdaysundayafterAfterweeklyWeekendmonthlyMonthlyc            
       b   e Zd ZdZ ej
                  dej                  d ed            Z ej
                  e	ej                   ed            Z
 ej                  ej                  j                  j                   ed      	      Z ej                  d ed
            Z ej
                  edej                  d ed            Z ej
                  edej                  d ed            Z ej*                  dedd ed            Z ej0                  d ed      	      Z ej*                  ddedd ed            Z ej*                  dde ed            Z ej<                  edd      Z  e!de"g      Z# e$d       Z% G d! d"      Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/y,)-r   z&
    RotatingWorkTypeAssign model
    r   Tr   )r   rS   rL   r  r   
Start DaterN   rL   Next SwitchrS   rL   current_work_typezCurrent Work Type)rS   r   r   rL   next_work_typezNext Work Type
   FBased OnrK   choicesrS   rU   rL      Rotate After Dayr%  Rotate Every WeekendrK   rN   r<  rU   rS   rL   r    Rotate Every Month)rK   rN   r<  rL   r   history_setr   basesr   c                   8    e Zd ZdZ ed      Z ed      ZddgZy)RotatingWorkTypeAssign.MetarX   zRotating Work Type AssignzRotating Work Type Assigns-next_change_date!-employee_id__employee_first_nameNr]   r^   r_   r`   r3   rL   ra   orderingrd   rE   r=   re   rF  B  s+    	 45 <=')LMrE   re   c                    | j                   t        j                  j                  j	                         j                         k  rt        t        d            | j                  r| j                  xt        j                  j                  d| j                        }|j                         r<|j                         j                  | j                  k7  rt        t        d            y y y y )N+Date must be greater than or equal to todayT)	is_activer   +Only one active record allowed per employee)
start_datedjangoutilstimezonenowr   r	   r3   rM  r   r   r   r   r   firstr   rj   siblingss     r=   r   zRotatingWorkTypeAssign.cleanK  s    ??V\\22668==??!!$Q"RSS>>d..:-55<<D,<,< = H  X^^%5%8%8DGG%C%a(U&VWW &D  ;>rE   c                      t        dd| i      S )z'
        method for rotate col
        z(cbv/rotating_work_type/rotation_col.htmlr   r   r   ri   s    r=   rotate_dataz"RotatingWorkTypeAssign.rotate_dataW      
 ;&
 	
rE   c                 R    t        t              j                  | j                        S z#
        Display work type
        r"  BASED_ONr   based_onri   s    r=   get_based_on_displayz+RotatingWorkTypeAssign.get_based_on_displaya       H~!!$--00rE   c                      t        dd| i      S )z'
        get different actions
        z/cbv/rotating_work_type/work_rotate_actions.htmlr   r   r   ri   s    r=   get_actionsz"RotatingWorkTypeAssign.get_actionsg      
 B&
 	
rE   c                     	 | j                   j                  j                   d| j                   j                  j                   S #  Y yxY w)Z
        Return subtitle containing both department and job position information.
         /
            Nr   employee_work_infor   r   ri   s    r=   work_rotate_detail_subtitlez2RotatingWorkTypeAssign.work_rotate_detail_subtitleq  sS    	((;;IIK L11AABF F	   AA A	c                 8    t        dd| j                  i      }|S ))
        for detail view of page
        zwork-rotating-detail-viewrs   rt   r   rs   rw   s     r=   work_rotate_detail_viewz.RotatingWorkTypeAssign.work_rotate_detail_view{  s     14/J
rE   c                 8    t        dd| j                  i      }|S )z=
        for detail view of page in employee profile
        z$individual-work-rotating-detail-viewrs   rt   rm  rw   s     r=   &individual_tab_work_rotate_detail_viewz=RotatingWorkTypeAssign.individual_tab_work_rotate_detail_view  s     <dDGG_U
rE   c                     | j                   ryy)z&
        return active or not
        	Is ActiveArchivedrM  ri   s    r=   detail_is_activez'RotatingWorkTypeAssign.detail_is_active      
 >>rE   c                      t        dd| i      S )z)
        get detail view actions
        z6cbv/rotating_work_type/rotate_detail_view_actions.htmlr   r   r   ri   s    r=   get_detail_view_actionsz.RotatingWorkTypeAssign.get_detail_view_actions      
 I&
 	
rE   N)0r]   r^   r_   r`   r
   r   r   r3   r   r   rotating_work_type_id	DateFieldrP  rQ  rR  rS  rO  next_change_dater   r7  r8  r   r]  r^  IntegerFieldrotate_after_dayDAYrotate_every_weekendDAY_DATErotate_everyr!  r"  r  r   r   historyr   r   re   r   rX  r_  rb  ri  rn  rp  ru  rx  rd   rE   r=   r   r     s    $&##..z]	K .F--FNNCWAX "!!%%)),J (v''T-@PQ)))..(*+ 'V&&..%'(N  vz]H +v**"4 5 ,6++-. $6##+,	L 'f&&O
 "
G $$QRGN N
X
1

rE   r   c                        e Zd ZdZ ej
                  d      Z ej                  ed e	d            Z
 ed      Z G d d	      Zd
efdZd Zd Zd Z fdZ fdZ xZS )EmployeeTypez
    EmployeeType model
    rH   rP   TrG   r   r   c                   0    e Zd ZdZ ed      Z ed      Zy)EmployeeType.MetarX   zEmployee TypezEmployee TypesNr   rd   rE   r=   re   r    s    	 ) 01rE   re   rf   c                 ,    t        | j                        S rh   )r6   employee_typeri   s    r=   rk   zEmployeeType.__str__  s    4%%&&rE   c                 8    t        dd| j                  i      }|S )rr   zemployee-type-update-viewrs   rt   rv   rw   s     r=   rx   zEmployeeType.get_update_url  s     6dggO
rE   c                     t        d      }|S r{   r~   rw   s     r=   r   zEmployeeType.get_delete_url  r   rE   c                     | j                   S rh   r   ri   s    r=   get_instance_idzEmployeeType.get_instance_id      wwrE   c                 z   t        |   |i | t        t        dd       }|r|j                  r|j                  j                  dd       }|j                  j                  dd       }t        j                  j                  ||      j                  | j                        j                         rt        d      y )NrA   r   r  )r   r  r   z1This employee type already exists in this company)r   r   r   r   r   r   r   r  r   r   r   r   r   r	   )rj   r   ru   rA   rZ   r  r   s         r=   r   zEmployeeType.clean  s    t&v&.)T:w||ll**<>G#LL,,_dCM$$++'.m ,  DGG$	 &G  	rE   c                 J    t        |   |i |  | j                  |i | | S rh   r   r   s      r=   r   zEmployeeType.save  r   rE   )r]   r^   r_   r`   r
   r   r  r   rG   r3   r   r   r   re   r6   rk   rx   r   r  r   r   r   r   s   @r=   r  r    su     %F$$3M'''t!I,WJ#$QRG2 2' '$ rE   r  c                       e Zd ZdZ ej
                  de      Z ej                  e	d e
d            Z e       Z G d d      Zd	efd
Zy)EmployeeShiftDayz 
    EmployeeShiftDay model
    rQ   rK   r<  TrG   r   c                   0    e Zd ZdZ ed      Z ed      Zy)EmployeeShiftDay.MetarX   zEmployee Shift DayzEmployee Shift DaysNr   rd   rE   r=   re   r    r  rE   re   rf   c                 Z    t        t        | j                        j                               S rh   )r6   r3   day
capitalizeri   s    r=   rk   zEmployeeShiftDay.__str__  s    1TXX;))+,,rE   N)r]   r^   r_   r`   r
   r   r  r  r   rG   r3   r   r   r   re   r6   rk   rd   rE   r=   r  r    sU     &

b#
6C'''t!I,WJ#%G7 7- -rE   r  c            
           e Zd ZdZ ej
                  ddd      Z ej                  ed      Z	 ej
                  ddd	d	e
g
      Z ej
                  dde
g      Z ej                  ed	 ed            Z ej"                  d      r( ej$                  dd	d	dej&                   ed            Z ed      Z G d d      ZdefdZd Zd Zd Zd Z fdZ fdZ xZ S )EmployeeShiftz
    EmployeeShift model
    rH   FrK   rS   rU   EmployeeShiftSchedule)r   r.   z40:00T)rK   rN   rS   rU   
validatorsz200:00)rK   rN   r  rG   r   
attendancezattendance.GraceTimeemployee_shiftz
Grace Time)rS   rU   r   r   rL   employee_shift__company_idc                   0    e Zd ZdZ ed      Z ed      Zy)EmployeeShift.MetarX   zEmployee ShiftzEmployee ShiftsNr   rd   rE   r=   re   r         	 )* 12rE   re   rf   c                 ,    t        | j                        S rh   )r6   r  ri   s    r=   rk   zEmployeeShift.__str__  s    4&&''rE   c                 4    | j                   r| j                   S y)NNil)grace_time_idri   s    r=   get_grace_timezEmployeeShift.get_grace_time  s    %%%rE   c                     | j                   S rh   r   ri   s    r=   r  zEmployeeShift.get_instance_id%  r  rE   c                 8    t        dd| j                  i      }|S )rr   zemployee-shift-update-viewrs   rt   rv   rw   s     r=   rx   zEmployeeShift.get_update_url(  r   rE   c                     t        d      }|S z0
        This method to get delete  url
        r}   r~   rw   s     r=   r   zEmployeeShift.get_delete_url/  r   rE   c                 z   t        |   |i | t        t        dd       }|r|j                  r|j                  j                  dd       }|j                  j                  dd       }t        j                  j                  ||      j                  | j                        j                         rt        d      y )NrA   r   r  )r   r  r   z2This employee shift already exists in this company)r   r   r   r   r   r   r   r  r   r   r   r   r   r	   )rj   r   ru   rA   rZ   r  r   s         r=   r   zEmployeeShift.clean6  s    t&v&.)T:w||ll**<>G$\\--.>EN%%,,'.~ -  DGG$	 &H  	rE   c                 J    t        |   |i |  | j                  |i | | S rh   r   r   s      r=   r   zEmployeeShift.saveH  r   rE   )!r]   r^   r_   r`   r
   r   r  r   r  daysr>   weekly_full_time	full_timerG   r3   r   r   is_installedr   r   r  r   r   re   r6   rk   r  r  rx   r   r   r   r   r   s   @r=   r  r    s    &V%%N
 "6!!"2<STD'v''() !  h4H3II (''t!I,WJt&)))")nn<
 $$@AG3 3( ($ rE   r  )CaseWhenc                       e Zd ZdZ ej
                  eej                  d      Z ej
                  e	ej                   e
d            Z ej                  ddeg e
d      	      Z ej                  d
 e
d            Z ej                  d
 e
d            Z ej$                  d e
d            Z ej$                  d e
d       e
d            Z ej                  d
d
 e
d       e
d            Z ej,                  ed
 e
d            Z ed      Z G d d      ZdefdZd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$ fd%Z%d& Z& xZ'S )'r  z%
    EmployeeShiftSchedule model
    day_scheduler   r   Shiftr   z08:15   zMinimum Working Hours)rN   rK   r  rL   Tz
Start Timer6  zEnd TimeFzNight Shiftr4  zEnable Automatic Check Outz+Enable this to trigger automatic check out.rN   rL   	help_textzAutomatic Check Out Timez^Time at which the horilla will automatically check out the employee attendance if they forget.)rS   rU   rL   r  rG   r   $shift_id__employee_shift__company_idc                       e Zd ZdZ ed      Z ed      ZddggZ e e	dd       e	d	d
       e	dd       e	dd       e	dd       e	dd       e	dd      d      gZ
y)EmployeeShiftSchedule.MetarX   zEmployee Shift SchedulezEmployee Shift Schedulesshift_idr  r%  r   )day__daythenr&  r  r'     r(  r0   r)     r*  r  r+  r.   r=  rM   N)r]   r^   r_   r`   r3   rL   ra   rb   r  r  rJ  rd   rE   r=   re   r  w  s    	 23 :;&./hQ/ia0k2jq1hQ/jq1hQ/	
rE   re   rf   c                 L    | j                   j                   d| j                   S N )r  r  r  ri   s    r=   rk   zEmployeeShiftSchedule.__str__  s"    --../q
;;rE   c                 8    t        dd| j                  i      }|S )z!
        Detail view url
        z"employee-shift-shedule-detail-viewrs   rt   rv   rw   s     r=   get_detail_urlz$EmployeeShiftSchedule.get_detail_url  s     ?twwX
rE   c                     | j                   S rh   r   ri   s    r=   r  z%EmployeeShiftSchedule.get_instance_id  r  rE   c                 >    | j                   rd| j                   dS dS )z<
        Custome column for automatic checkout time
        zM<div class='oh-timeoff-modal__stat-title'>Automatic Check Out Time</div><div>z</div> )is_auto_punch_out_enabledauto_punch_out_timeri   s    r=   get_automatic_check_out_timez2EmployeeShiftSchedule.get_automatic_check_out_time  s4     -- \\`\t\t[uu{|	
 	
rE   c                 :    d| j                   j                    d}|S V
        Method will retun the api to the avatar or path to the profile image
        !https://ui-avatars.com/api/?name=&background=random)r  rw   s     r=   
get_avatarz EmployeeShiftSchedule.get_avatar  s      2$((,,?QR
rE   c                      t        dd| i      S )zD
        This for actions column in employee shift schedule
        z0cbv/settings/employee_shift_schedule_action.htmlr   r   r   ri   s    r=   actions_colz!EmployeeShiftSchedule.actions_col  s     C&
 	
rE   c                      t        dd| i      S )zK
        This for detail actions column in employee shift schedule
        z7cbv/settings/employee_shift_schedule_detail_action.htmlr   r   r   ri   s    r=   detail_actions_colz(EmployeeShiftSchedule.detail_actions_col  s     J&
 	
rE   c                 "    | j                   rdS dS NYesNo)r  ri   s    r=   auto_punch_out_colz(EmployeeShiftSchedule.auto_punch_out_col  s    66u@D@rE   c                     | j                   r*| j                  r| j                   | j                  kD  | _        t        |   |i | y rh   )
start_timeend_timeis_night_shiftr   r   r   s      r=   r   zEmployeeShiftSchedule.save  s6    ??t}}"&//DMM"ADd%f%rE   c                 f    t        t              j                  | j                  j                        S )zB
        Custom column for day in employee shift schedule
        )r"  r  r   r  ri   s    r=   day_colzEmployeeShiftSchedule.day_col  s    
 Cy}}TXX\\**rE   )(r]   r^   r_   r`   r
   r   r  r   r  r  r3   r  r   r>   minimum_working_hour	TimeFieldr  r  r   r  r  r  r   rG   r   r   r   re   r6   rk   r  r  r  r  r  r  r  r   r  r   r   s   @r=   r  r  Q  s    &

FNNC !v  ajH ,6++()./	 "!!t!L/JJvT*FH(V((Q}EUVN 3 3 334AB!
 +&**12l
	 (''t!I,WJ#$JKG
 
*< <


A&
+rE   r  c                      e Zd ZdZ ej
                  d      Z ej                  dd ed            Z	 ej                  edej                   ed	      d
d
      Z ej                  edej                   ed      d
d
      Z ej                  ed
d
      Z ed      Z G d d      ZdefdZd Zd Zd Zd Zd Zd Zd Zy)RotatingShiftz
    RotatingShift model
    rH   rP   r   RotatingShiftAssignr   r   shift1zShift 1T)r   r   rL   rU   rS   shift2zShift 2r   r   c                   0    e Zd ZdZ ed      Z ed      Zy)RotatingShift.MetarX   Rotating ShiftzRotating ShiftsNr   rd   rE   r=   re   r    r  rE   re   rf   c                 ,    t        | j                        S rh   r  ri   s    r=   rk   zRotatingShift.__str__  r  rE   c                     | j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )zi
        Returns a list of additional shifts or a message if no additional shifts are available.
        r  r  )additional_shiftsr  r6   )rj   r  shiftadditional_shifts       r=   get_additional_shiftsz#RotatingShift.get_additional_shifts  sD     !224%{{DU+V5CJ+VW## ,Wr  c                 8    t        dd| j                  i      }|S )rr   zrotating-shift-updaters   rt   rv   rw   s     r=   rx   zRotatingShift.get_update_url  r   rE   c                     t        d      }|S r  r~   rw   s     r=   r   zRotatingShift.get_delete_url  r   rE   c                     | j                   S rh   r   ri   s    r=   r  zRotatingShift.get_instance_id  r  rE   c                     | j                   r| j                   j                  dg       ng }|r.| j                  | j                  k(  rt	        t        d            y y )Nr  z#Select different shift continuously)r  r   r  r  r	   r3   )rj   r  s     r=   r   zRotatingShift.clean  s[     ##   $$%8"= 	 !;!!$I"JKK "<rE   c                 \   | j                   }|r|j                  d      }|rt        |      }t        j                  j                  |      D ci c]  }|j                  | }}g }|D ]3  }|r|j                  |t        |                #|j                  d        5 |S d }|S d }|S c c}w )Nr  r  )	r  r   setr  r   r   r   appendr5   )rj   r  additional_shift_ids
unique_idsr  shifts_dictr  r  s           r=   r  zRotatingShift.additional_shifts*  s    ..#2#6#67J#K # !56
 "/!6!6!=!=Z!=!P HHeO  %'! 4 7H)00S]1KL)006	7 !  %)! !  !%  s   B)c                     g }|| j                   | j                  gz  }| j                         r|t        | j                               z  }|S rh   )r  r  r  list)rj   total_shiftss     r=   r   zRotatingShift.total_shifts@  sH    dkk22!!#D!7!7!9::LrE   N)r]   r^   r_   r`   r
   r   r  r   r3   r   r   r  r   r  r  r!  r"  r  r   r   re   r6   rk   r  rx   r   r  r   r  r   rd   rE   r=   r  r    s     6r*D(&((%::K V..y\F V..y\F 'f&&O
 $$QRG3 3 	L0!,rE   r  c            
       t   e Zd ZdZ ej
                  dej                   ed            Z ej
                  e	ej                   ed            Z
 ej                  ej                  j                  j                   ed            Z ej                  d ed	      
      Z ej
                  eej                  dd ed            Z ej
                  eej                  dd ed            Z ej*                  dedd ed            Z ej0                  ddd ed            Z ej*                  ddedd ed            Z ej*                  dddde ed            Z ej<                  edd      Z  e!de"g      Z# e$d       Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d' Z,d( Z-d) Z.d* Z/ G d+ d,      Z0d- Z1y.)/r  z#
    RotatingShiftAssign model
    r   r   r   r  r3  r4  Tr5  r6  current_shiftzCurrent Shiftr   rS   r   rL   
next_shiftz
Next Shiftr9  Fr:  r;  r=  r>  )rS   rU   rN   rL   r%  r?  r@  r    rA  )rK   rU   rS   rN   r<  rL   r   rB  rC  r   c                      t        dd| i      S )7
        This method for get custome coloumn .
        z'cbv/rotating_shift/rotating_column.htmlr   r   r   ri   s    r=   rotating_columnz#RotatingShiftAssign.rotating_column      
 :&
 	
rE   c                      t        dd| i      S )r  z-cbv/rotating_shift/actions_rotaing_shift.htmlr   r   r   ri   s    r=   actionszRotatingShiftAssign.actions  s    
 @&
 	
rE   c                      t        dd| i      S )r  z5cbv/rotating_shift/rotating_shift_detail_actions.htmlr   r   r   ri   s    r=   rotating_detail_actionsz+RotatingShiftAssign.rotating_detail_actions  s    
 H&
 	
rE   c                 R    t        t              j                  | j                        S r[  r\  ri   s    r=   r_  z(RotatingShiftAssign.get_based_on_display  r`  rE   c                 8    t        dd| j                  i      }|S )
        detail view
        zrotating-shift-detail-viewrs   rt   rm  rw   s     r=   rotating_shift_detailz)RotatingShiftAssign.rotating_shift_detail  s    
 2D$''?K
rE   c                 8    t        dd| j                  i      }|S )z(
        individual detail view
        z%rotating-shift-individual-detail-viewrs   rt   rm  rw   s     r=    rotating_shift_individual_detailz4RotatingShiftAssign.rotating_shift_individual_detail  s    
 =tTWWoV
rE   c                     | j                   j                  j                   d| j                   j                  j                   S )&
        Detail view subtitle
        z /
          rg  ri   s    r=   rotating_subtitlez%RotatingShiftAssign.rotating_subtitle  sF    
 $$77EEG H//??
@D 	DrE   c                     | j                   ryy)z
        Check active
        rr  rs  rt  ri   s    r=   check_activez RotatingShiftAssign.check_active  rv  rE   c                 8    t        dd| j                  i      }|S )"
        Detail view edit
        zrotating-shift-assign-updater   rt   rm  rw   s     r=   detail_edit_urlz#RotatingShiftAssign.detail_edit_url  s    
 4dDGG_M
rE   c                 8    t        dd| j                  i      }|S )r  zrotating-shift-assign-archiveobj_idrt   rm  rw   s     r=   detail_archive_urlz&RotatingShiftAssign.detail_archive_url  s    
 5x>QR
rE   c                   8    e Zd ZdZ ed      Z ed      ZddgZy)RotatingShiftAssign.MetarX   zRotating Shift AssignzRotating Shift AssignsrG  rH  NrI  rd   rE   r=   re   r    s+    	 01 89')LMrE   re   c                    | j                   r| j                  vt        j                  j	                  d| j                        }|j                         r;|j                         j                  | j                  k7  rt        t        d            | j                  t        j                  j                  j                         j                         k  rt        t        d            y )NT)rM  employee_id__idrN  rL  )rM  employee_id_idr  r   r   r   rT  r   r	   r3   rO  rP  rQ  rR  rS  r   rU  s     r=   r   zRotatingShiftAssign.clean  s    >>d11=*22990C0C : H  X^^%5%8%8DGG%C%a(U&VWW??V\\22668==??!!$Q"RSS @rE   N)2r]   r^   r_   r`   r
   r   r   r3   r   r  rotating_shift_idr{  rP  rQ  rR  rS  rO  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  re   r   rd   rE   r=   r  r  I  s    $&##v~~AjMK *))a@P>Q "!!%%)),J (v''T-@PQ%F%%..$'M #""..!|_J  vz]H +v**qq9K7L ,6++-. $6##+,L 'f&&O
 "
G $$QRG


1DN N
TrE   r  c                   T    e Zd Z ej                  e      Z ej                         Zy)BaserequestFilerR   N)	r]   r^   r_   r
   r   r   filer   r   rd   rE   r=   r%  r%    s"    6k2DfnnGrE   r%  c            
       ,    e Zd ZdZ ej
                  dej                  dd ed            Z ej
                  e	ej                  d ed      	      Z
 ej
                  e	ej                  ddd
 ed            Z ej                  dej                  j                  j                    ed            Z ej                  dd ed            Z ej&                  d ed            Z ej*                  d ed            Z ej*                  d ed            Z ej*                  d ed            Z ej*                  d      Z edeg      Z ed      Z G d d      Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z& fd%Z'd& Z(d' Z)d( Z*d)e+fd*Z, xZ-S )+WorkTypeRequestz
    WorkTypeRequest model
    r   Twork_type_requestr   r  requested_work_typezRequesting Work Typer   previous_work_typezPrevious Work Typer   rS   rU   r   rL   Requested DaterS   rN   rL   Requested TillrS   rU   rL   Descriptionr6  FPermanent Requestr4  ApprovedCanceledrM   rB  rC  r   c                   :    e Zd ZdZ ed      Z ed      ZdZdgZy)WorkTypeRequest.MetarX   zWork Type RequestzWork Type Requests))approve_worktyperequestzApprove Work Type Request)cancel_worktyperequestzCancel Work Type Request-idN	r]   r^   r_   r`   r3   rL   ra   permissionsrJ  rd   rE   r=   re   r7  1  s3    	 ,- 45

 
rE   re   c                      t        dd| i      S )z>
        method used for comment note col in the page
        zcbv/work_type_request/note.htmlr   r   r   ri   s    r=   comment_notezWorkTypeRequest.comment_note@  s    
 2&
 	
rE   c                      t        dd| i      S )zE
        method for rendering actions(edit,duplicate,delete)
        z"cbv/work_type_request/actions.htmlr   r   r   ri   s    r=   work_actionszWorkTypeRequest.work_actionsJ  r   rE   c                      t        dd| i      S )z>
        method for rendering options(approve,reject)
        z'cbv/work_type_request/confirmation.htmlr   r   r   ri   s    r=   confirmationzWorkTypeRequest.confirmationT  r  rE   c                 8    t        dd| j                  i      }|S )rl  zwork-detail-viewrs   rt   rm  rw   s     r=   detail_viewzWorkTypeRequest.detail_view^  s     ($A
rE   c                 "    | j                   rdS dS )zW
        Method to display "Yes" or "No" based on is_permanent_work_type value
        r  r  )is_permanent_work_typeri   s    r=   is_permanent_work_type_displayz.WorkTypeRequest.is_permanent_work_type_displaye  s     33u==rE   c                      t        dd| i      S )z^
        method for rendering different options
        convert,skillzone,reject,mail
        z.cbv/work_type_request/detail_view_actions.htmlr   r   r   ri   s    r=   detail_view_actionsz#WorkTypeRequest.detail_view_actionsk  s     A&
 	
rE   c                     | j                   j                  j                   d| j                   j                  j                   S )re  z / rg  ri   s    r=   detail_subtitlezWorkTypeRequest.detail_subtitlev  s;     ""55CCDCHXHXHkHkH{H{G|}}rE   c                     t        t        dd       }| j                  st        |   |i | y |r"t        |       t        j                  |d       y y NrA   z$The request entry cannot be deleted.r   r   approvedr   deleterD   r   warningrj   r   ru   rA   r   s       r=   rP  zWorkTypeRequest.delete|  J    .)T:}}GND+F+w'  *PQ rE   c                    t         j                  j                  | j                  dd| j                  | j
                  g| j                  | j
                  g      j                  | j                        }|ryt         j                  j                  | j                  dd| j                  | j                        j                  | j                        }|ry| j
                  r_t         j                  j                  | j                  dd| j
                  | j
                        j                  | j                        }|ryt         j                  j                  | j                  dd| j                        }|ryyNTF)r   rO  canceledrequested_date__rangerequested_till__ranger   )r   rO  rV  requested_date__lterequested_till__gte)r   rO  rV  requested_date__exact)r)  r   r   r   requested_daterequested_tillr   r   )rj   !approved_work_type_requests_rangeapproved_work_type_requestsapproved_work_type_requests_2approved_permanent_reqs        r=   is_any_work_type_request_existsz/WorkTypeRequest.is_any_work_type_request_exists  so   ,;,C,C,J,J((#'#6#68K8K"L#'#6#68K8K"L -K -
 'TWW'
 	* -&5&=&=&D&D(( $ 3 3 $ 3 3 'E '
 'TWW'
 	$ ',;,C,C,J,J ,,$($7$7$($7$7 -K - gg! * -!0!8!8!?!?(("&"5"5	 "@ "
 "rE   c                 (   t        t        j                  dd       }|j                  j                  sW| j
                  t        j                  j                  j                         j                         k  rt        t        d            | j                  r-| j                  | j
                  k  rt        t        d            | j                         rt        t        d            | j                  s!| j                  st        t        d            y y )NrA   rL  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.)r   r   r   useris_superuserr\  rP  rQ  rR  rS  r   r	   r3   r]  rb  rF  rj   rA   s     r=   r   zWorkTypeRequest.clean  s    -<<iN||((""V\\%:%:%>%>%@%E%E%GG%a(U&VWW4#6#69L9L#L!HI  //1!OP  **&&%a(K&LMM ' +rE   c                 t    | j                   rt        d      S | j                  rt        d      S t        d      S NRejectedr4  	RequestedrV  r3   rO  ri   s    r=   request_statuszWorkTypeRequest.request_status  ;     }} jM	
 $(==!J-	
 78n	
rE   rf   c                 z    | j                   j                   d| j                   j                   d| j                   S Nz             r   r   employee_first_nameemployee_last_namer\  ri   s    r=   rk   zWorkTypeRequest.__str__  D    ""667 8001T5H5H4IK 	KrE   ).r]   r^   r_   r`   r
   r   r   r3   r   r   work_type_idprevious_work_type_idr{  rP  rQ  rR  rS  r\  r]  	TextFielddescriptionr   rF  rO  rV  work_type_changedr   r   r  r   r   re   r>  r@  rB  rD  rG  rI  rK  rP  rb  r   rn  r6   rk   r   r   s   @r=   r)  r)    s    $&##..(z]K %6$$..*-.	L .F--..)+, &V%%6<<00441EUCVN &V%%A.>,?N #&""1];KLK0V00A&9$: #v""5q}MH"v""5q}MH+++E:"
G $$QRG
 



>	
~R%NN"
K KrE   r)  c                      e Zd ZdZddlmZ  ej                  eej                        Z
 ej                  eej                        Z ej                  d ed            Z ej                  ed      Z ej$                         Zd	efd
Zy)WorkTypeRequestCommentz&
    WorkTypeRequestComment Model
    r   r   r   TCommentr6  rU   rf   c                     | j                    S rh   commentri   s    r=   rk   zWorkTypeRequestComment.__str__      ,, rE   N)r]   r^   r_   r`   employee.modelsr   r
   r   r)  CASCADE
request_idr   rx  r3   r  r   r%  filesr   r   r6   rk   rd   rE   r=   r|  r|    s     )"""?fnnMJ#&##HGKfDq|DG"F""?$?EfnnG! !rE   r|  c            
           e Zd ZdZ ej
                  dej                  dd ed            Z ej
                  e	ej                  d ed      	      Z
 ej
                  e	ej                  ddd
 ed            Z ej                  dej                  j                  j                    ed            Z ej
                  dej                  ddd ed            Z ej&                  d ed            Z ej&                  d ed            Z ej                  dd ed            Z ej.                  d ed            Z ej&                  d ed            Z ej&                  d ed            Z ej&                  d ed            Z ej&                  d      Z edeg      Z e d      Z! G d d      Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0 fd.Z1 fd/Z2d0e3fd1Z4 xZ5S )2ShiftRequestz
    ShiftRequest model
    r   Tshift_requestr   r  requested_shiftzRequesting Shiftr   previous_shiftzPrevious Shiftr-  r.  r/  reallocate_shift_requestzReallocate EmployeeFr4  r4  r5  r0  r1  r2  r6  r3  rM   rB  rC  r   c                   :    e Zd ZdZ ed      Z ed      ZdZdgZy)ShiftRequest.MetarX   zShift RequestzShift Requests))approve_shiftrequestzApprove Shift Request)cancel_shiftrequestzCancel Shift Requestr:  Nr;  rd   rE   r=   re   r    s2    	 ) 01

 
rE   re   c                      t        dd| i      S )B
        This method for get custome coloumn for comment.
        zcbv/shift_request/comment.htmlr   r   r   ri   s    r=   r  zShiftRequest.comment"  s    
 1&
 	
rE   c                      t        dd| i      S )zL
        This method for get custome coloumn for allocated actions.
        z/cbv/shift_request/allocated_confirm_action.htmlr   r   r   ri   s    r=   allocated_confirm_action_colz)ShiftRequest.allocated_confirm_action_col6  rc  rE   c                      t        dd| i      S )zL
        This method for get custome coloumn for User availability.
        z(cbv/shift_request/user_availability.htmlr   r   r   ri   s    r=   user_availabilityzShiftRequest.user_availability@  rY  rE   c                 8    t        dd| j                  i      }|S )z
        Detail view
        zshift-detail-viewrs   rt   rm  rw   s     r=   shift_detailszShiftRequest.shift_detailsJ  s    
 )4/B
rE   c                 8    t        dd| j                  i      }|S )z&
        Allocate detail view
        zallocate-detail-viewrs   rt   rm  rw   s     r=   allocate_shift_detailsz#ShiftRequest.allocate_shift_detailsS  s    
 ,dDGG_E
rE   c                 "    | j                   rdS dS )z!
        Permanent shift
        r  r  )is_permanent_shiftri   s    r=   is_permanentzShiftRequest.is_permanent\  s     //u9T9rE   c                      t        dd| i      S )zB
        This method for get custome coloumn for actions.
        z+cbv/shift_request/actions_shift_requst.htmlr   r   r   ri   s    r=   shift_actionszShiftRequest.shift_actionsb      
 >&
 	
rE   c                      t        dd| i      S )H
        This method for get custome coloumn for confirmations.
        z$cbv/shift_request/confirmations.htmlr   r   r   ri   s    r=   confirmationszShiftRequest.confirmationsl      
 7&
 	
rE   c                      t        dd| i      S )r  z(cbv/shift_request/confirm_allocated.htmlr   r   r   ri   s    r=   allocate_confirmationsz#ShiftRequest.allocate_confirmationsv  rY  rE   c                      t        dd| i      S )r  z+cbv/shift_request/shift_deatil_actions.htmlr   r   r   ri   s    r=   detail_actionszShiftRequest.detail_actions  r  rE   c                 t    | j                   rt        d      S | j                  rt        d      S t        d      S rj  rm  ri   s    r=   rn  zShiftRequest.request_status  ro  rE   c                     	 | j                   j                  j                   d| j                   j                  j                   S #  Y yxY w)r  rf  Nrg  ri   s    r=   details_subtitlezShiftRequest.details_subtitle  sS    
	((;;IIK L11AABF F	rj  c                 @   t        t        j                  dd       }|j                  j                  sc| j
                  sW| j                  t        j                  j                  j                         j                         k  rt        t        d            | j                  r-| j                  | j                  k  rt        t        d            | j                         rt        t        d            | j                   s!| j                  st        t        d            y y )NrA   rL  rd  zAAn approved shift request already exists during this time period.re  )r   r   r   rf  rg  rs   r\  rP  rQ  rR  rS  r   r	   r3   r]  is_any_request_existsr  rh  s     r=   r   zShiftRequest.clean  s    -<<iN||((77t22V\\5J5J5N5N5P5U5U5WW%a(U&VWW4#6#69L9L#L!HI  %%'!UV  &&&&%a(K&LMM ' 'rE   c                    t         j                  j                  | j                  dd| j                  | j
                  g| j                  | j
                  g      j                  | j                        }|ryt         j                  j                  | j                  dd| j                  | j                        j                  | j                        }|ry| j
                  r_t         j                  j                  | j                  dd| j
                  | j
                        j                  | j                        }|ryt         j                  j                  | j                  dd| j                        }|ryyrU  )r  r   r   r   r\  r]  r   r   )rj   approved_shift_requests_rangeapproved_shift_requestsapproved_shift_requests_2ra  s        r=   r  z"ShiftRequest.is_any_request_exists  sm   (4(<(<(C(C((#'#6#68K8K"L#'#6#68K8K"L )D )
 'TWW'
 	& )"."6"6"="=(( $ 3 3 $ 3 3 #> #
 'TWW'
 	  #(4(<(<(C(C ,,$($7$7$($7$7 )D ) gg! & )!-!5!5!<!<(("&"5"5	 "= "
 "rE   c                 $    t        |   |i | y rh   )r   r   r   s      r=   r   zShiftRequest.save  s    d%f%rE   c                     t        t        dd       }| j                  st        |   |i | y |r"t        |       t        j                  |d       y y rM  rN  rR  s       r=   rP  zShiftRequest.delete  rS  rE   rf   c                 z    | j                   j                   d| j                   j                   d| j                   S rq  rr  ri   s    r=   rk   zShiftRequest.__str__  ru  rE   )6r]   r^   r_   r`   r
   r   r   r3   r   r  r  previous_shift_idr{  rP  rQ  rR  rS  r\  reallocate_tor   reallocate_approvedreallocate_canceledr]  rx  ry  r  rO  rV  shift_changedr   r   r  r   r   re   r  r  r  r  r  r  r  r  r  r  rn  r  r   r  r   rP  r6   rk   r   r   s   @r=   r  r    sL    $&##..$z]K !v  ..&)*	H *))..%'( &V%%6<<00441EUCVN &F%%../,-M .&--e!J-X-&--e!J-X%V%%A.>,?N #&""1];KLK,,,A&9$: #v""5q}MH"v""5q}MH'F''6M"
G $$QRG
 

(

:




	N$%N&RK KrE   r  c                      e Zd ZdZddlmZ  ej                  eej                        Z
 ej                  eej                        Z ej                  ed      Z ej                  d ed            Z ej$                         Zd	efd
Zy)ShiftRequestCommentz#
    ShiftRequestComment Model
    r   r}  r~  Tr  r  r6  rf   c                     | j                    S rh   r  ri   s    r=   rk   zShiftRequestComment.__str__  r  rE   N)r]   r^   r_   r`   r  r   r
   r   r  r  r  r   r   r%  r  rx  r3   r  r   r   r6   rk   rd   rE   r=   r  r    s     )"""<6>>JJ#&##HGK"F""?$?EfDq|DGfnnG! !rE   r  c                       e Zd Z ej                  d      Z ej                  d      Z ej                  eddej                        Z
 ed      Z G d d	      Zd
 Zd Zd Zd Zd Zy)TagsrT   rP   TF)rS   editabler   r   related_company_fieldc                   ,    e Zd Z ed      Z ed      Zy)	Tags.MetaTagr  Nr]   r^   r_   r3   rL   ra   rd   rE   r=   re   r    s    xirE   re   c                     | j                   S rh   titleri   s    r=   rk   zTags.__str__      zzrE   c                 &    d| j                    d}|S )zK
        This method returns the style string with the tag's color
        z:<span style='height: 25px; width: 25px; background-color: z5; border-radius: 50%; display: inline-block;'></span>)color)rj   r  s     r=   	get_colorzTags.get_color  s&    
!!% -./ 	 rE   c                     | j                   S )z!
        To get instance
        r   ri   s    r=   r  zTags.get_instance_id       wwrE   c                 8    t        dd| j                  i      }|S )rr   zupdate-helpdesk-tagrs   rt   rv   rw   s     r=   rx   zTags.get_update_url  ry   rE   c                 8    t        dd| j                  i      }|S )r|   z
tag-deleter  rt   rv   rw   s     r=   r   zTags.get_delete_url   s      <4770CD 
rE   N)r]   r^   r_   r
   r   r  r  r   rG   r   r   r   r   re   rk   r  r  rx   r   rd   rE   r=   r  r    st    F+EF+E"""dUfnnJ $,GG( (rE   r  c            	           e Zd Z ej                  dd      Z ej                         Z ej                  e	ddej                   ed            Z ed      Zdefd	Zy
)HorillaMailTemplated   TrK   uniquerG   rS   rU   r   rL   r   r  rf   c                     | j                    S rh   r  ri   s    r=   rk   zHorillaMailTemplate.__str__6  s    **rE   N)r]   r^   r_   r
   r   r  rx  bodyr   rG   r  r3   r   r   r   r6   rk   rd   rE   r=   r  r  *  sg    FD9E6D"""..y\J $,GG rE   r  c                   
    e Zd ZdZ ej
                  dd ed            Z ej                  d ed            Z	 ej                  dd ed            Z ej
                  dd ed	            Z ej
                  dd ed
            Z ej
                  dd ed            Z ej                  d ed            Z ej                  d ed            Z ej                  d ed            Z ej                  d ed            Z ej                  d ed            Z ej                  d ed            Z ej,                  eej0                  dd      Zd Zd Zd Zd Zd fdZ G d d      Z xZ S )DynamicEmailConfigurationz?
    SingletonModel to keep the mail server configurations
    T   z
Email Host)rS   rK   rL   z
Email Portr6  zDefault From EmailzEmail Host UsernamezDisplay NamezEmail Authentication PasswordzUse TLSr4  FzUse SSLzFail SilentlyzPrimary Mail ServerzGBy enabling this the display name will take from who triggered the mail)rN   r  zEmail Send Timeout (seconds))r   rS   rU   c                     | j                   ryy )Nz3style="background-color: rgba(255, 68, 0, 0.134);" 
is_primaryri   s    r=   highlight_cellz(DynamicEmailConfiguration.highlight_cellp  s    ??I rE   c                      t        dd| i      S )r  z$cbv/settings/mail_server_action.htmlr   r   r   ri   s    r=   
action_colz$DynamicEmailConfiguration.action_colt  r  rE   c                     | j                   r | j                  rt        t        d            | j                  s#| j
                  st        dt        d      i      y y )NzZ"Use TLS" and "Use SSL" are mutually exclusive, so only set one of those settings to True.r   zThis field is required)use_ssluse_tlsr	   r3   r   r  ri   s    r=   r   zDynamicEmailConfiguration.clean~  sV    <<DLL!A  t!<3K1L"MNN (7rE   c                     | j                   S rh   )usernameri   s    r=   rk   z!DynamicEmailConfiguration.__str__  s    }}rE   c                    | j                   r0t        j                  j                  d      j	                  d       t        j                  j                         sd| _         t        |   |i | t        j                  j                  | j                        j                  | j                        }|j                         r| j                          y )NTr  F)r   r   )r  r  r   r   updater   r   r   r   r   r   rP  )rj   r   ru   servers_same_companyr   s       r=   r   zDynamicEmailConfiguration.save  s    ??%--444ELL  M  )00779"DOd%f%8@@GG  H  

'TWW'
 	  &&(KKMrE   c                       e Zd Z ed      Zy)DynamicEmailConfiguration.MetazEmail ConfigurationN)r]   r^   r_   r3   rL   rd   rE   r=   re   r    s    ./rE   re   rf   N)!r]   r^   r_   r`   r
   r   r3   hostSmallIntegerFieldport
EmailField
from_emailr  display_namepasswordr   r  r  fail_silentlyr  use_dynamic_display_nametimeoutOneToOneFieldrG   r  r   r  r  r   rk   r   re   r   r   s   @r=   r  r  :  s    6#AlOTD#6##AlOLD"""c2F0GJ  v,-H $6##~&L  v67H "f!!$Qy\JG!f!!%a	lKG'F''AoDVWM$$$A&;$<J  3v22U
  'f&&"@ AG &%%6>>DJJ
	O 0 0rE   r  )r  z	---------requested_dayszLeave Requested Daysequalz
Equal (==)notequalzNot Equal (!=)r7   RangeltzLess Than (<)gtzGreater Than (>)lezLess Than or Equal To (<=)gezGreater Than or Equal To (>=)	icontainsContainsc            	           e Zd ZdZ ej
                  eej                        Z ej                  de
      Z ej                  dedd      Z ej                  ddd ed      	      Z ej                  ddd ed
      	      Z ej                  ddd ed      	      Z ej
                  eddej                   ed            Z e       ZdefdZd Zd Zd Zd Zd Zd Zd Zd Z fdZ  fdZ!d Z" xZ#S )MultipleApprovalConditionz%
    Multiple approve conditions
    r~  rO   r  T)rK   r<  rS   rU   r  zCondition Value)rK   rS   rU   rL   zStarting ValuezEnding ValuerG   r  rf   c                 8    | j                    d| j                   S r  )condition_fieldcondition_operatorri   s    r=   rk   z!MultipleApprovalCondition.__str__  s!    &&'q)@)@(ABBrE   c                 R    t        t              j                  | j                        S )z)
        Display condition field
        )r"  FIELD_CHOICEr   r  ri   s    r=   get_condition_fieldz-MultipleApprovalCondition.get_condition_field  s      L!%%d&:&:;;rE   c                 R    t        t              j                  | j                        S )z,
        Display condition operator
        )r"  CONDITION_CHOICEr   r  ri   s    r=   get_condition_operatorz0MultipleApprovalCondition.get_condition_operator  s!     $%))$*A*ABBrE   c                 x    | j                   dk(  r | j                  }| j                  }|dz   |z   S | j                  S )z(
        Condition value column
        r7   r   )r  condition_start_valuecondition_end_valuecondition_value)rj   start_value	end_values      r=   get_condition_valuez-MultipleApprovalCondition.get_condition_value  sD     ""g-44K00I&22'''rE   c                      t        dd| i      S )z.
        For approval managers column
        z6cbv/multiple_approval_condition/approval_managers.htmlr   r   r   ri   s    r=   approval_managers_colz/MultipleApprovalCondition.approval_managers_col  ry  rE   c                      t        dd| i      S )z*
        For detail action column
        z2cbv/multiple_approval_condition/detail_action.htmlr   r   r   ri   s    r=   r  z(MultipleApprovalCondition.detail_actions  s    
 E&
 	
rE   c                      t        dd| i      S )z$
        For actions column
        z,cbv/multiple_approval_condition/actions.htmlr   r   r   ri   s    r=   r  z%MultipleApprovalCondition.actions_col  s    
 ?&
 	
rE   c                 &    d| j                    d}|S r  )r   rw   s     r=   r  z$MultipleApprovalCondition.get_avatar  s     2$//1BBTU
rE   c                 8    t        dd| j                  i      }|S )r  z'detail-view-multiple-approval-conditionrs   rt   rm  rw   s     r=   rD  z%MultipleApprovalCondition.detail_view  s     ?twwX
rE   c                     | j                   rt        j                  j                  | j                  | j
                  | j                  | j                   | j                        j                  | j                        }|rt        t        d            | j
                  dk(  r| j                  dk7  r9| j                   st        dt        d      i      	 t        | j                         }n| j                  r| j                  st        dt        d	      i      	 t        | j                        }	 t        | j                        }||k(  rt        dt        d      i      ||k  rt        dt        d      i      t!        | D  |i | y # t        $ r}t        dt        d      i      d }~ww xY w# t        $ r}t        dt        d
      i      d }~ww xY w# t        $ r}t        dt        d      i      d }~ww xY w)N)r   r  r  r  r   r   z3A condition with the provided fields already existsr  r7   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  r   r   r   r  r  r   r   rs   r	   r3   floatr8   r  r  r   r   )	rj   r   ru   r   float_valuer<   r  r  r   s	           r=   r   zMultipleApprovalCondition.clean  s9   088???? $ 4 4#'#:#: $ 4 4?? @  gg!  %KL  #33&&'1++)0! R3 	"'(<(<"=K 119Q9Q)0! F3 	"'(B(B"CK	 %d&>&> ?I )+)0! ^3  +)0! \3  	t&v&m " )0! !O3 & " )0! !N3  " )0! !L3 sH   F F2 0G 	F/F**F/2	G;GG	G="G88G=c                 n    | j                   dk7  rd | _        d | _        nd | _        t	        |   |i | y )Nr7   )r  r  r  r  r   r   r   s      r=   r   zMultipleApprovalCondition.saveo  s:    ""g-)-D&'+D$#'D d%f%rE   c                 $   g }ddl m} t        j                  j	                  | j
                        j                  d      }|D ]I  }|j                  }|s|j                  n|j                  j                  |      }|j                  |       K |S )z#
        approved managers
        r   r}  )condition_idsequencer   )r  r   MultipleApprovalManagersr   r   rs   order_byr   reporting_managerr   r  )	rj   r   ru   managersr   querysetqueryemp_idemployees	            r=   approval_managersz+MultipleApprovalCondition.approval_managersw  s     ,+33:: ; 

(:
 	  	&E&&F  ''%%))V)4 
 OOH%	& rE   )$r]   r^   r_   r`   r
   r   r   r  r   r   r
  r  r  r  r3   r  r  r  rG   r   r   r   r6   rk   r  r  r  r  r  r  r  rD  r   r   r+  r   r   s   @r=   r  r    sI    #"":HJ&f&&O *)) 0t4 'f&&()	O -F,,'(	 +&**~&	 #""..y\J $%GC C<C	(


O'b&rE   r  c                       e Zd ZdZ ej
                  eej                        Z ej                  dd      Z
 ej                  dd      Z ej                  ddd      Z ed	      Z G d
 d      Zd Zy)r#  z
    Multiple approve
    r~  FrS   rU   Tr  r  condition_id__company_idr  c                   ,    e Zd Z ed      Z ed      Zy)MultipleApprovalManagers.MetazMultiple Approval ManagersNr  rd   rE   r=   re   r0    s    56 <=rE   re   c                 v    | j                   }|r*| j                  j                  dd      j                         }|S )Nr3   r  )r   r%  replacer  )rj   managers     r=   get_managerz$MultipleApprovalManagers.get_manager  s6    "",,44S#>DDFGrE   N)r]   r^   r_   r`   r
   r   r  r  r!  r}  r"  r   r   r%  r   r   re   r4  rd   rE   r=   r#  r#    s     %6$$!V^^L #v""U;H%&%%4t<K(((Cd$O#:TUG> >rE   r#  c            
            e Zd ZdZddlmZ ddlmZ  ej                  eej                  ddd ed            Z ej                  d	 ed
      g      Z ej                         Z fdZd Z xZS )DynamicPaginationz4
    model for storing pagination for employees
    r   r   )MinValueValidatorTdynamic_paginationr   )r   rU   rS   r   rL   rH   r  )rN   r  c                 l    t        t        dd       }|j                  }|| _        t	        |   |i | y )NrA   )r   r   rf  user_idr   r   )rj   r   ru   rA   rf  r   s        r=   r   zDynamicPagination.save  s2    .)T:||d%f%rE   c                 8    | j                    d| j                   S )N|)r:  
paginationri   s    r=   rk   zDynamicPagination.__str__  s    ,,q 122rE   )r]   r^   r_   r`   django.contrib.auth.modelsr   django.core.validatorsr7  r
   r  r  r3   r:  r}  r=  r   r   r   rk   r   r   s   @r=   r6  r6    ss     08"f""..)vYG %$$R=Nq=Q<RSJfnnG&3rE   r6  c                   <    e Zd ZdZ ej
                  e      Zd Zy)
AttachmentzE
    Attachment model for multiple attachments in announcements.
    r&  c                 .    | j                   j                  S rh   )r'  r  ri   s    r=   rk   zAttachment.__str__  s    yy~~rE   N)	r]   r^   r_   r`   r
   r   r   r'  rk   rd   rE   r=   rA  rA    s      6k2DrE   rA  c                   \    e Zd ZdZ ej
                  ddd      Z ej                         Zy)AnnouncementExpirezb
    This model for setting a expire days for announcement if no expire date for announcement
    TrT   rS   rU   rN   N)	r]   r^   r_   r`   r
   r}  r  r   r   rd   rE   r=   rD  rD    s-     6DbADfnnGrE   rD  c                   n    e Zd ZdZddlmZ eZ ej                  d      Z	 ej                  d      Z ej                  edd	      Z ej                  dd
      Z ej                  edd	      Z ej                  ed      Z ej                  ed ed            Z ej                  edd ed            Z ej2                  d ed            Z ej2                  d ed       ed            Z ej                  edd      Z ed      Z G d d      Zd Z d Z! fd Z"d! Z#d" Z$ xZ%S )#Announcementz;
    Announcement Model for storing all announcements.
    r   r}  r  rP   T)rS   announcement_attachments)r   rU   r-  announcement_employeesr  r   r   announcementrG   )rU   r   rL   FzDisable Commentsr4  zShow Comments to Allz9If enabled, all employees can view each other's comments.r  announcement_filtered_employees)r   r  r   r  c                   ,    e Zd Z ed      Z ed      Zy)Announcement.MetarG  AnnouncementsNr  rd   rE   r=   re   rM    s    (0rE   re   c                 :    | j                   j                  d      S )zO
        This method is used to get the view count of the announcement
        T)viewed)announcementview_setr   ri   s    r=   	get_viewszAnnouncement.get_views	  s     ((//t/<<rE   c                     t         j                  j                  | j                  d      }g }|D ]  }|j	                  |j
                          |S )z#
        Announcement view
        T)announcement_id__idrP  )AnnouncementViewr   r   r   r  rf  )rj   	viewed_by
viewed_empr  s       r=   rV  zAnnouncement.viewed_by	  sV    
 %,,33 $ 4 
	 
 	&Aaff%	&rE   c                 J    | j                   rd| _        t        |   |i | y)zM
        if comments are disabled, force public comments to be false
        FN)disable_commentspublic_commentsr   r   r   s      r=   r   zAnnouncement.save	  s'       #(D d%f%rE   c                     | j                   S rh   r  ri   s    r=   rk   zAnnouncement.__str__	  r  rE   c                 h    t        j                         j                  d      }t        d| |d      S )6
        custom col for announcement list col
        z%Y-%m-%dz%cbv/dashboard/announcement_title.html)r   current_dater   )r   rS  strftimer   )rj   r^  s     r=   announcement_custom_colz$Announcement.announcement_custom_col	  s2    
  ||~..z:8!%|D
 	
rE   )&r]   r^   r_   r`   r  r   model_employeer
   r   r  rx  ry  r   rA  attachmentsr{  expire_date	employeesr   r   r   r3   r   rG   r   r   rY  rZ  filtered_employeesr   r   re   rR  rV  r   rk   r`  r   r   s   @r=   rG  rG    sj    )NF,E"&""-K(&((!;4K #&""D9K&&&7tI (''
$?J)6))4a.?L (''t.q|J +v**A&8$9 *f))-.OPO 0//@5 $,GG1 1=&

rE   rG  c                       e Zd ZdZddlmZ  ej                  eej                        Z
 ej                  eej                        Z ej                  d ed      d      Z ej                         Zy	)
AnnouncementCommentz#
    AnnouncementComment Model
    r   r}  r~  Tr  rO   )rS   rL   rK   N)r]   r^   r_   r`   r  r   r
   r   rG  r  announcement_idr   rx  r3   r  r   r   rd   rE   r=   rg  rg  ,	  se     )'f''OO#&##HGKfDq|PSTGfnnGrE   rg  c                       e Zd ZdZ ej
                  eej                        Z ej
                  e	ej                        Z
 ej                  d      Z ej                  dd      Z ej                         Zd Zy)	rU  z!
    Announcement View Model
    r~  FrM   T)auto_now_addrS   c                      t        dd| i      S )r]  z)cbv/dashboard/announcement_viewed_by.htmlr   r   r   ri   s    r=   announcement_viewed_by_colz+AnnouncementView.announcement_viewed_by_colE	  s    
 <D
 	
rE   N)r]   r^   r_   r`   r
   r   r   r  rf  rG  rJ  r   rP  DateTimeField
created_atr   r   rl  rd   rE   r=   rU  rU  9	  sr     6TV^^<D$6$$\V^^LL V  /F%%%4dCJfnnG

rE   rU  c                   p   e Zd ZdZddgZ ej                  d      Z ej                  d      Z	 ej                         Z ej                         Z ej                  de      Z ej                  d	      Z ej                          Z ej$                  eej(                  dd
      ZdefdZd Zd Zy)EmailLogz 
    EmailLog Keeping model
    )sentSent)failedFailedrO   rP   r.   r  T)rj  Fr   rS   r  rf   c                 8    | j                    d| j                   S r  )subjecttori   s    r=   rk   zEmailLog.__str__c	  s    ,,q	**rE   c                     t        | j                        j                  | j                        }| j                  dk(  rd}d}n| j                  dk(  rd}d}t	        d|      S )	Nrq  zoh-dot--successzlink-successrs  zoh-dot--dangerzlink-dangerzu<span class="oh-dot oh-dot--small me-1 oh-dot--color {color_class}"></span><span class="{link_class}">{status}</span>)color_classstatus
link_class)r"  statusesr   r{  r   )rj   r{  rz  r|  s       r=   status_displayzEmailLog.status_displayf	  sf    dmm$((5;;& +K'J[[H$*K&J9#!
 	
rE   c                 8    t        dd| j                  i      }|S )rl  zindividual-mail-log-detailrs   rt   rm  rw   s     r=   mail_log_detail_viewzEmailLog.mail_log_detail_vieww	  s     2D$''?K
rE   N)r]   r^   r_   r`   r}  r
   r   rw  rx  r  r  r  rx  r{  rm  rn  r   r   r   rG   r  r   r6   rk   r~  r  rd   rE   r=   rp  rp  R	  s     !"67Hf#.G6s+D"""$J				BVH=F%%%48JfnnG"""6>>uJ+ +
"rE   rp  c                       e Zd ZdZg dZ ej                  eej                        Z	 ej                  de      Zd Zy)DriverViewedz-
    Model to store driver viewed status
    ))	dashboardr  )pipeliner  )settingsr  r~  r9  r  c                 P    | j                   j                  j                  dd      S )zD
        This method is used to access all the viewd driver
        rP  T)flat)rf  driverviewed_setvalues_listri   s    r=   user_viewedzDriverViewed.user_viewed	  s$     yy))55hT5JJrE   N)r]   r^   r_   r`   r<  r
   r   r   r  rf  r   rP  r  rd   rE   r=   r  r  	  sB    G
 6TV^^<DVW=FKrE   r  c                       e Zd ZdZddlmZ  ej                  eej                        Z	 ej                   ed      edd      Z G d d	      Zd
 Zy)DashboardEmployeeChartsz"
    dashboard employee chart
    r   r}  r~  zExcluded ChartsT)rL   rN   rU   rS   c                   ,    e Zd Z ed      Z ed      Zy)DashboardEmployeeCharts.MetazDashboard Employee ChartsNr  rd   rE   r=   re   r  	  s    45 ;<rE   re   c                      | j                    dS )Nz	 - charts)r*  ri   s    r=   rk   zDashboardEmployeeCharts.__str__	  s    --	**rE   N)r]   r^   r_   r`   r  r   r
   r   r  r*  r!  r3   r  chartsre   rk   rd   rE   r=   r  r  	  sT     ) v  V^^DHV()4t$F= =+rE   r  c                       e Zd ZdZ ej
                  d      Z ej                  eddej                  d      Z
 ej                         Zd Zy)	BiometricAttendancez
    Biometric attendance
    FrM   Tbiometric_enabled_company)rS   r  r   r   c                     | j                    S rh   )r  ri   s    r=   rk   zBiometricAttendance.__str__	  s    ##$%rE   N)r]   r^   r_   r`   r
   r   r  r   rG   r   r   r   r   rk   rd   rE   r=   r  r  	  sU     '6&&u5L"""..0J fnnG&rE   r  c                  
    dg iS )Nallowed_ipsrd   rd   rE   r=   default_additional_datar  	  s    2rE   c                   l    e Zd ZdZ ej
                  d      Z ej                  dde      Z	d Z
d Zy)	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.
    FrM   TrE  c                     | j                   j                  dg       }|D ]  }	 t        j                  |        y# t        $ r t        d|       w xY w)zo
        Validate that all entries in `allowed_ips` are either valid IP addresses or network prefixes.
        r  z&Invalid IP address or network prefix: N)r  r   	ipaddress
ip_networkr8   r	   )rj   r  ips      r=   r   zAttendanceAllowedIP.clean	  sg     **..}bA 	UBU$$R(	U  U%(Nrd&STTUs	   ;Ac                      d| j                    S )NzAttendanceAllowedIP - )
is_enabledri   s    r=   rk   zAttendanceAllowedIP.__str__	  s    ''899rE   N)r]   r^   r_   r`   r
   r   r  r!  r  r  r   rk   rd   rE   r=   r  r  	  s@     %$$U3J&f&&'>O	U:rE   r  c                   z     e Zd Z ej                  d ed       ed            Z G d d      Zd Z fdZ	 xZ
S )	TrackLateComeEarlyOutTEnablez[By enabling this, you track the late comes and early outs of employees in their attendance.r  c                   ,    e Zd Z ed      Z ed      Zy)TrackLateComeEarlyOut.MetazTrack Late Come Early OutzTrack Late Come Early OutsNr  rd   rE   r=   re   r  	  s    45 <=rE   re   c                 P    | j                   rt        d      n
t        d      }d| S )NenableddisabledzTracking late come early out )	is_enabler3   )rj   trackings     r=   rk   zTrackLateComeEarlyOut.__str__	  s$    #'>>1Y<q}.xj99rE   c                     | j                   s2t        j                  j                         rt	        t        d            t        |   |i |S )Nz3Only one TrackLateComeEarlyOut instance is allowed.)rs   r  r   r   r	   r3   r   r   r   s      r=   r   zTrackLateComeEarlyOut.save	  sH    ww088??A!GH  w|T,V,,rE   )r]   r^   r_   r
   r   r3   r  re   rk   r   r   r   s   @r=   r  r  	  sC    ###x[i
I> >:- -rE   r  c                      e Zd Z ej                  dd ed            Z ej                   ed            Z ej                  dd ed      	      Z	 ej                  d ed
            Z ej                  edej                   ed            Z ed      Z G d d      Zd Zd Zd Zd Zd Zd Zddej2                  fdZy)HolidaysrT   FrI   )rK   rS   rL   r3  )rL   TzEnd Dater1  	Recurringr4  rG   rS   r   rL   r   r  c                   ,    e Zd Z ed      Z ed      Zy)Holidays.MetaHolidayr  Nr  rd   rE   r=   re   r   
  s    |
mrE   re   c                     | j                   S rh   r  ri   s    r=   rk   zHolidays.__str__
  s    yyrE   c                 8    t        dd| j                  i      }|S )r  zholiday-detail-viewrs   rt   rm  rw   s     r=   rD  zHolidays.detail_view
  s    
 +T477OD
rE   c                      t        dd| i      S )%
        detail view actions
        z%cbv/holidays/detail_view_actions.htmlr   r   r   ri   s    r=   rI  zHolidays.detail_view_actions
  s     8&
 	
rE   c                 "    | j                   rdS dS )z 
        recurring data
        r  r  )	recurringri   s    r=   get_recurring_statuszHolidays.get_recurring_status
  s     u0D0rE   c                      t        dd| i      S )z;
        method for rendering actions(edit,delete)
        z"cbv/holidays/holidays_actions.htmlr   r   r   ri   s    r=   holidays_actionszHolidays.holidays_actions
  r   rE   c                 &    d| j                    d}|S r  r  rw   s     r=   r  zHolidays.get_avatar(
  s     2$))<NO
rE   Nrf   c                 t    | xs t        j                         } t        j                  j	                  | |       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  r   r   )r  s    r=   today_holidayszHolidays.today_holidays/
  s0     %&&uE&RRrE   rh   )r]   r^   r_   r
   r   r3   r  r{  rO  end_dater   r  r   rG   r   r   r   r   re   rk   rD  rI  r  r  r  QuerySetr  rd   rE   r=   r  r  	  s    6rAfIND!!!q?JvTAjMRH###E+OI"""..y\	J $,GG, ,
1
Sfoo SrE   r  c            	          e Zd Z ej                  dedd ed            Z ej                  de ed            Z	 ej                  edej                   ed            Z e       Z G d	 d
      Zd Zd Zd Zd Zd Zd Zd Zd Zy)CompanyLeavesr  TzBased On Week)rK   r<  rU   rS   rL   zBased On Week Day)rK   r<  rL   rG   r  c                   0    e Zd ZdZ ed      Z ed      Zy)CompanyLeaves.Meta)based_on_weekbased_on_week_dayzCompany LeaveCompany LeavesN)r]   r^   r_   rb   r3   rL   ra   rd   rE   r=   re   r  N
  s    @) 01rE   re   c                     t        t              j                  | j                         dt        t              j                  | j
                         S )Nz | )r"  	WEEK_DAYSr   r  WEEKSr  ri   s    r=   rk   zCompanyLeaves.__str__S
  s>    y/%%d&<&<=>c$u+//RVRdRdBeAfggrE   c                 *    t        d| t        d      S )z%
        custom based on col
        zcbv/company_leaves/on_week.htmlr   weeksr   r   r  ri   s    r=   custom_based_on_weekz"CompanyLeaves.custom_based_on_weekV
  s    
 2!%6
 	
rE   c                 
    d}|S )z"
        for return title
        r  rd   )rj   r  s     r=   get_detail_titlezCompanyLeaves.get_detail_title`
  s    
 !rE   c                      t        dd| i      S )r  z+cbv/company_leaves/detail_view_actions.htmlr   r   r   ri   s    r=   rI  z!CompanyLeaves.detail_view_actionsh
  s     >&
 	
rE   c                 *    t        d| t        d      S )z.
        custom based on week day col
        z#cbv/company_leaves/on_week_day.html)r   	week_daysr   )r   r  ri   s    r=   based_on_week_day_colz#CompanyLeaves.based_on_week_day_colq
  s    
 6!%I>
 	
rE   c                 *    t        d| t        d      S )z$
        custom actions col
        z-cbv/company_leaves/company_leave_actions.htmlr  r   r  ri   s    r=   company_leave_actionsz#CompanyLeaves.company_leave_actions{
  s    
 @!%6
 	
rE   c                 8    t        dd| j                  i      }|S )r  zcompany-leave-detail-viewrs   rt   rm  rw   s     r=   rD  zCompanyLeaves.detail_view
  s    
 14/J
rE   c                     | j                   .dt        t              j                  | j                          d}|S d}d| d}|S )r  r  r  All)r  r"  r  r   )rj   ro   datas      r=   r  zCompanyLeaves.get_avatar
  sU     )5d5koodFXFX6Y5ZZlmC 
 D5dV;MNC
rE   N)r]   r^   r_   r
   r   r  r3   r  r  r  r   rG   r   r   r   r   re   rk   r  r  rI  r  r  rD  r  rd   rE   r=   r  r  >
  s    $F$$'M )((	:M8N #""dfnn1Y<J $%G2 2
h



	rE   r  c                       e Zd ZdZ ej
                  dej                  dddd      Z ej                  d      r  ej
                  d	ej                  dd
      Z ej                  d      rk ej
                  ddej                  d      Z ej
                  dej                  ddd      Z ej                  dd      Z ej"                  d      Zd Z ej                  dd      Zd Zd Zd Zd fdZ G d d      Z xZS )PenaltyAccountsz(
    LateComeEarlyOutPenaltyAccount
    r   penalty_accountsFr   T)r   r   r  rL   rS   r  z%attendance.AttendanceLateComeEarlyOutru  leavezleave.LeaveRequest)rS   r   r  zleave.LeaveTypez
Leave type)r   rU   rS   rL   g        )rN   rS   rM   c                     | j                   ryyr  )deduct_from_carry_forwardri   s    r=   get_deduct_from_carry_forwardz-PenaltyAccounts.get_deduct_from_carry_forward
  s    --rE   c                 8    t        dd| j                  i      }|S )z#
        To get delete url
        zdelete-penalties
penalty_idrt   rm  rw   s     r=   r   zPenaltyAccounts.get_delete_url
  s     (,1HI
rE   c                     | j                   S )z,
        To get instance for delete
        r   ri   s    r=   r   z#PenaltyAccounts.get_delete_instance
  r  rE   c                 J    t        j                  d      r| j                  ryyy )Nr  zLate come or Early out PenaltyzLeave Penalty)r   r  late_early_idri   s    r=   penalty_type_colz PenaltyAccounts.penalty_type_col
  s$    \*!!7" +rE   c                 R   t         |           t        j                  d      r.| j                  s"| j
                  rt        dt        d      i      t        j                  d      r.| j                  r"| j
                  st        dt        d      i      t        j                  d      r.| j
                  s"| j                  st        dt        d      i      t        j                  d      r:| j
                  s| j                  r"| j                  st        dt        d      i      y )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 requiredzLeave type is required)
r   r   r   r  r  r  r	   r3   penalty_amountr  )rj   r   s    r=   r   zPenaltyAccounts.clean
  s   W%d.@.@TEVEV! !$Q"RS  W%$*<*<TEVEV!"A]%  g&%%''!#QM&  g&""d&D&D&&!?A6N4O"PQQrE   c                   2    e Zd ZdgZ ed      Z ed      Zy)PenaltyAccounts.Metaz-created_atzPenalty AccountzPenalty AccountsN)r]   r^   r_   rJ  r3   rL   ra   rd   rE   r=   re   r  
  s     !?*+ 23rE   re   r  )r]   r^   r_   r`   r
   r   r   r   r   r  r  r  leave_request_id
DO_NOTHINGr  
FloatFieldr  r   r  r  r  r   r   r  r   re   r   r   s   @r=   r  r  
  s%    $&##..'K t&)))3nn	
 t!,6,, tv~~PU
 *))''%
 )v((4@$7F$7$7$F!	
 'V&&s>N#!F4 4rE   r  c                   |    e Zd ZddlmZ  ej                  eej                  d      Z ej                  d      Z
y)NotificationSoundr   r}  notification_soundr  FrM   N)r]   r^   r_   r  r   r
   r  r  r*  r   sound_enabledrd   rE   r=   r  r  
  s7    (#v##FNN9MH (F''6MrE   r  c                   Z    e Zd Z ej                  dd      Z ej                  d      Zy)IntegrationAppsrO   Tr  FrM   N)r]   r^   r_   r
   r   rc   r   r  rd   rE   r=   r  r    s(       C=I$$$U3JrE   r  )senderc                    |r]|j                   }t        j                  d      rX|rUt        dd      } |       }|j                  rH|j                  j                          d|_        |j                  j                  j                  |_	        n{|j                  r:d|j                  j                   |_        |j                  j                  |_	        n5dt        j                          |_        t        j                         |_	        d|_        d|_        |j                   |_        d|_        |j%                          d|_        |j&                  j)                  |j*                         |j%                          t        j                  d	      r|j,                  r|j.                  r|j*                  j0                  j3                  |j,                  
      j5                         }t7        |j.                  dz        dz  }|j8                  st;        d|j<                  |z
        |_        nt;        d|j>                  |z
        |_        |j%                          yyyyy)zS
    This is post save method, used to create deduction and cut availabl leave dayspayroll	deductionrc   model penaltyLeave penalty Penalty on FTr  r  r  r   N) r  r   r  r   r  get_type_displayr  attendance_idattendance_dateone_time_dater  r  r   r  include_active_employeesis_fixedamountonly_show_under_employeer   specific_employeesaddr   r  r  available_leaver   rT  roundr  maxavailable_dayscarryforward_days)	r  r   createdru   r  	Deductionpenalty	availableunits	            r=   &create_deduction_cutleave_from_penaltyr    s   
 !00Y'N/);WIkG%%#+#9#9#J#J#L"MX V**88HH % **"01J1J1S1S0T U(0(A(A(J(J%"-hnn.>-? @(0(8%/4G,#G%44GN/3G,LLN/4G,&&**8+?+?@LLN g&&&%% ,,<<CC&44 D eg  ..23a7D55+.q93K3Kd3R+T	(.1	33d:/	+ NN & ' '5 rE   c                 x   t        j                  d      rQt        dd      }|j                  r|j                  j	                          d}n=|j
                  rd|j
                  j                   }ndt        j                          }|j                  j                  |j                  |j                  |      }|j                  r1|j                  |j                  j                  j                        }nW|j
                  r'|j                  |j
                  j                        }n$|j                  t        j                               }|D ]  }|j                           t        j                  d	      r|j                   r|j"                  r|j                  j$                  j                  |j                   
      j'                         }|rct)        |j"                  dz        dz  }|j*                  s|xj,                  |z  c_        n|xj.                  |z  c_        |j1                          yyyyy)ze
    This is a post delete method, used to delete the deduction and update available leave days.
    r  r  r  r  r  r  )r  r  r  )r  r  r  r  N)r   r  r   r  r  r  r  r   r  r   r   r   r  r  r  rP  r  r  r  rT  r  r  r  r  r   )	r  r   ru   r  r  
deductionsr  r  r  s	            r=   &delete_deduction_cutleave_from_penaltyr  X  s    #+i{S	!!-->>@AJE&&$X%>%>%G%G$HIE!(.."2!34E &&--'33** . 

 !!#**&44BBRR + J &&#**&77@@ + J $**9I*JJ# 	I	 !h&<&<AVAV((88??"00 @ 

%' 	 ..23a7D55((D0(+++ NN 	 BW&<!rE   is_new_employeeFrM   )lr`   r  r   r   rP  django.appsr   django.contribr   r>  r   django.core.exceptionsr	   	django.dbr
   django.db.models.signalsr   r   django.dispatchr   django.urlsr   r   rm   r   django.utils.safestringr   django.utils.translationr   r3   base.horilla_company_managerr   horillar   horilla.horilla_middlewaresr   horilla.methodsr   horilla.modelsr   r   r   horilla_audit.modelsr   r   horilla_views.cbv_methodsr   r  r  r>   rD   rG   r   r   r   r   r   r7   r6   r  r  r  r]  r   r  Modelr  r  django.db.modelsr  r  r  r  r  r%  r)  r|  r  r  r  r  r  r
  r  r  r#  r6  rA  rD  rG  rg  rU  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  add_to_classr   )r  s   0r=   <module>r1     s	    #   # + 2  ; $ - ) - 6 > ' 6 3 G G B 5 	!L/!M
!L/!M
!L/	 	!H+!I,!K.!J-!H+!J-!H+	K =l =@V$ V$r2
, 2
j;l ;@;| ;|q%| q%h ',Arl3SVSV3 :' (q{)!K.!:q{:q{ ajq|)^
\ ^
B;< ;|-v|| -,YL Yx (x+L x+vzL zzqT, qThfll 
DKl DKN!\ !"IK< IKX!, !"0< 0f,  c0 c0N q/01
 ao#$%aj	1_	1 !	1)*+	1,-.!J- 	 Z Zzv|| 03 3:  S
< S
l
, 

v|| 
2*v|| *ZK6<< K(+l +(&&,, &&:&,, :8-L -2HS| HSVXL Xvb4l b4J7 74l$5 4
 
)O,- --V 
+o.2 /2j   #%8V%8%8%G HGM 4s   Q2