
    93iQ                     F   d dl mZ ddlmZmZmZmZmZmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ ddlmZ d d	lmZ  e       Z G d
 dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Z  G d dej.                        Z! G d dej.                        Z" G d  d!      Z# G d" d#e#ej.                        Z$ G d$ d%e#ej.                        Z% G d& d'ejL                        Z' G d( d)ejL                        Z( G d* d+ejL                        Z)y,)-    )serializers   )CompanyOfficeHoursSalesTimingCatchPhraseCompanyHistoryHolidayCompanyBotSettings)UserCompanyRoleRole)UserBasicInfoSerializer)models)get_user_model)normalize_website)Countc                        e Zd Z G d d      Zy)CompanyBotDetailSerializerc                       e Zd ZeZg dZy)CompanyBotDetailSerializer.Meta)idbot_namephone_numberN)__name__
__module____qualname__r   modelfields     C/var/www/html/dp2/backend_v2.1/server/apps/companies/serializers.pyMetar      s    "3r    r"   Nr   r   r   r"   r   r    r!   r   r      s    4 4r    r   c                   6    e Zd Z eddd      Z G d d      Zy)CompanyBotsListSerializerbot_settingsTsourcemany	read_onlyc                       e Zd ZeZg dZy)CompanyBotsListSerializer.Meta)r   namebotsNr   r   r   r   r   r   r   r    r!   r"   r,      s    'r    r"   N)r   r   r   r   r.   r"   r   r    r!   r%   r%      s    %^$RVWD( (r    r%   c                   H    e Zd Z ej                  dd      Z G d d      Zy)CompanyBotSettingsSerializercompany.nameTr(   r*   c                        e Zd ZeZg dZg dZy)!CompanyBotSettingsSerializer.Meta)r   companycompany_namer   r   	is_active
created_at
updated_atr   r6   r7   r9   r:   Nr   r   r   r   r   r   read_only_fieldsr   r    r!   r"   r5   #   s    "

 Yr    r"   N)r   r   r   r   	CharFieldr7   r"   r   r    r!   r1   r1       s"    (;(($OLY Yr    r1   c                        e Zd Z G d d      Zy)BotDetailsSerializerc                        e Zd ZeZddgZddgZy)BotDetailsSerializer.Metar   r   Nr<   r   r    r!   r"   rB   5   s    "
# *-r    r"   Nr#   r   r    r!   r@   r@   4   s    . .r    r@   c                       e Zd Z ej                  dd      Z ej                         Z ej                  e	j                  j                         ddd      Z eddd      Z G d d	      Zd
 Zd Zy)HolidaySerializerr2   Tr3   Fquerysetr)   requiredallow_emptyr.   r'   c                        e Zd ZeZg dZg dZy)HolidaySerializer.Meta)r   r6   r7   r-   message
start_dateend_dater8   r.   bots_detailduration_daysr9   r:   )r   r6   r7   rO   r9   r:   N)r   r   r   r
   r   r   r=   r   r    r!   r"   rJ   Q   s    

 jr    r"   c                 "    |j                         S )z$Get number of days in holiday period)get_duration_daysselfobjs     r!   rQ   z#HolidaySerializer.get_duration_daysZ   s    $$&&r    c                     |j                  d      }|j                  d      }|r|r||kD  rt        j                  d      |S )zValidate holiday datesrL   rM   z-End date must be after or equal to start date)getr   ValidationError)rS   datarL   rM   s       r!   validatezHolidaySerializer.validate^   sB    XXl+
88J'(H$!112abbr    N)r   r   r   r   r>   r7   SerializerMethodFieldrO   PrimaryKeyRelatedFieldr   objectsallr.   r@   rN   r"   rQ   rY   r   r    r!   rD   rD   B   s~    (;(($OL5K557M-;--#++//1	D 'Kj j'	r    rD   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)OfficeHoursSerializerget_day_displayTr3   c                       e Zd ZeZg dZdgZy)OfficeHoursSerializer.Meta)r   dayday_displayis_open
start_timeend_timer   N)r   r   r   r   r   r   r=   r   r    r!   r"   rb   m   s    
 !6r    r"   c                    | j                   d   j                  j                  }|j                  d      }| j                  Xt
        j                  j                  ||      j                         r)t        j                  dd|j                          di      | j                  r|t
        j                  j                  ||      j                  | j                  j                        j                         r)t        j                  dd|j                          di      |j                  d      rW|j                  d      r|j                  d	      st        j                  d
      |d   |d	   k\  rt        j                  d      |S )z"Custom validation for office hoursrequestrc   )r6   rc   zOffice hours for z  already exist for this company.r   re   rf   rg   z4Start and end times are required when office is open!End time must be after start time)contextuseractive_companyrV   instancer   r\   filterexistsr   rW   
capitalizeexcluder   )rS   rX   r6   rc   s       r!   rY   zOfficeHoursSerializer.validatet   sZ    ,,y)..==hhuo == [%8%8%?%?UX%?%Y%`%`%b--+CNN,<+==]^_ 
 ==[0077S7QYY]a]j]j]m]mYnuuw--+CNN,<+==]^_  88I88L)*1E!112hiiL!T*%55!112UVVr    N)r   r   r   r   r>   rd   r"   rY   r   r    r!   r_   r_   j   s&    '+''/@DQK" "r    r_   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)SalesTimingSerializerr2   Tr3   c                        e Zd ZeZg dZg dZy)SalesTimingSerializer.Meta)	r   r6   r7   rf   rg   r8   botr9   r:   r;   N)r   r   r   r   r   r   r=   r   r    r!   r"   rw      s    
 Yr    r"   c                    | j                   rdd|v rd|vrt        j                  d      d|v rd|vrt        j                  d      d|v r$d|v r |d   |d   k\  rt        j                  d      |S |j                  d      r|j                  d      st        j                  d      |d   |d   k\  rt        j                  d      |S )z"Custom validation for sales timingrf   rg   z9If start_time is provided, end_time must also be providedz9If end_time is provided, start_time must also be providedrk   z Start and end times are required)partialr   rW   rV   rS   rX   s     r!   rY   zSalesTimingSerializer.validate   s     <<t#
$(>!112mnn T!l$&>!112mnn t#
d(:%j)99%556YZZ  88L)*1E!112TUUL!T*%55!112UVVr    Nr   r   r   r   r>   r7   r"   rY   r   r    r!   ru   ru      s'    (;(($OLY Yr    ru   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)CatchPhraseSerializerr2   Tr3   c                        e Zd ZeZg dZg dZy)CatchPhraseSerializer.Meta)r   r6   r7   phraser9   r:   r;   N)r   r   r   r   r   r   r=   r   r    r!   r"   r      s    
 Yr    r"   c                     |j                  d      r|j                  d      j                         st        j                  d      |S )z"Custom validation for catch phraser   zCatch phrase cannot be empty)rV   stripr   rW   r{   s     r!   rY   zCatchPhraseSerializer.validate   s9    xx!();)A)A)C--.LMMr    Nr|   r   r    r!   r~   r~      s'    (;(($OLY Yr    r~   c                   p    e Zd Z ej                  dd      Z ej                  dd      Z G d d      Zy)CompanyHistorySerializerzupdated_by.usernameTr3   r2   c                        e Zd ZeZg dZg dZy)CompanyHistorySerializer.Meta)
r   r6   r7   
updated_byupdated_by_usernameaction
model_name	object_iddetailsr9   )r   r7   r   r9   N)r   r   r   r	   r   r   r=   r   r    r!   r"   r      s    
 Wr    r"   N)r   r   r   r   r>   r   r7   r"   r   r    r!   r   r      s9    /+//7LX\](;(($OLW Wr    r   c                   $    e Zd ZdZ G d d      Zy)MissingUserSerializerz4Serializer for users in missing_call_notify_to fieldc                       e Zd ZeZddgZy)MissingUserSerializer.Metar   usernameN)r   r   r   Userr   r   r   r    r!   r"   r      s    
#r    r"   N)r   r   r   __doc__r"   r   r    r!   r   r      s    >$ $r    r   c                   L    e Zd ZdZ ej
                         Z G d d      Zd Zy)RoleSerializerzSerializer for rolesc                       e Zd ZeZg dZy)RoleSerializer.Meta)r   r-   permissions_countN)r   r   r   r   r   r   r   r    r!   r"   r      s    4r    r"   c                 6    |j                   j                         S )z0Return number of permissions linked to this role)permissionscountrR   s     r!   get_permissions_countz$RoleSerializer.get_permissions_count   s    $$&&r    N)	r   r   r   r   r   rZ   r   r"   r   r   r    r!   r   r      s%    999;5 5'r    r   c                       e Zd Zd Zy)CurrentUserRoleMixinc                 *   | j                   j                  d      }|r8|j                  r,|j                  j                  s|j                  j                  ry |j                  }t        |d      sXt        j                  j                  |d      j                  d      D ci c]  }|j                  |j                   c}|_        |j                  j                  |j                        }|sy t        || j                         j                  S c c}w )Nri   _company_role_cacheT)rm   r8   rolerl   )rl   rV   rm   is_anonymousis_superuserhasattrr   r\   rp   select_related
company_idr   r   r   r   rX   )rS   rT   ri   rm   ucrr   s         r!   get_current_user_rolez*CurrentUserRoleMixin.get_current_user_role   s    ,,""9-gllgll.G.G7<<KdKd||t23 +2299 :  .()()C ()(D$ ''++CFF3dDLL9>>>(s   !DN)r   r   r   r   r   r    r!   r   r      s    ?r    r   c                   f   e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 ej
                         Z
 edd      Z ej
                         Z edd      Z ej
                         Z edd      Z ej
                         Z edd      Z ej
                         Z ej.                  ej2                  j5                         ddd      Z edd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+y)CompanySerializerzFSingle serializer for Company model - handles create, update, and readTr)   r*   FrE   missing_call_notify_tor'   c                        e Zd ZeZg dZg dZy)CompanySerializer.Meta)r   r-   phoneoffice_time
bdc_numbertimezoner   missing_call_notify_to_detailsdefault_transfer_staffdefault_transfer_staff_namer8   r9   r:   
user_countactive_users_countinactive_users_countavailable_users_countoffice_hoursoffice_hours_summarysales_timingssales_timings_summarycatch_phrasescatch_phrases_summarywebsitebiouserscurrent_user_role)r   r9   r:   r   r   r   r   N)r   r   r   r   r   r   r=   r   r    r!   r"   r   %  s    
Nr    r"   c                 f    t        |d      r|j                  S |j                  j                         S )'Get the number of users in this companyr   )r   r   r   r   rR   s     r!   get_user_countz CompanySerializer.get_user_count2  s%    !(l!;s~~RARRr    c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   Tr8   r   r   r   rp   r   rR   s     r!   get_active_users_countz(CompanySerializer.get_active_users_count6  E    )06J)Ks%% 	$QTQZQZQaQa Rb R!EG	$r    c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   Fr   r   r   r   rp   r   rR   s     r!   get_inactive_users_countz*CompanySerializer.get_inactive_users_count;  E    +238N+Os'' 	%UXU^U^UeUe Vf V"UW	%r    c                     t        |d      r|j                  S |j                  j                  dd      j	                         S r   r   T)r8   is_availabler   r   r   rp   r   rR   s     r!   get_available_users_countz+CompanySerializer.get_available_users_count@  G    ,3C9P,Qs(( 	7WZW`W`WgWg Xh X//4uw	7r    c                     |rf|D cg c]  }|j                    }}t        j                  j                  |d      }t	        |      t	        |      k7  rt        j                  d      |S c c}w )z/Validate that all user IDs exist and are activeT)id__inr8   z%Some user IDs are invalid or inactive)r   r   r\   rp   lenr   rW   )rS   valuerm   user_idsexisting_userss        r!   validate_missing_call_notify_toz1CompanySerializer.validate_missing_call_notify_toE  sc    ,12EDEH2!\\00D0QN>"c%j0!112YZZ	 3s   A+c                 "    |j                         S )z&Get the name of default transfer staff)get_default_transfer_staff_namerR   s     r!   r   z1CompanySerializer.get_default_transfer_staff_nameO  s    2244r    c                 "    |j                         S )zGet office hours summary)get_office_hours_summaryrR   s     r!   r   z*CompanySerializer.get_office_hours_summaryS  s    ++--r    c                 "    |j                         S )zGet sales timings summary)get_sales_timings_summaryrR   s     r!   r   z+CompanySerializer.get_sales_timings_summaryW      ,,..r    c                 "    |j                         S )zGet catch phrases summary)get_catch_phrases_summaryrR   s     r!   r   z+CompanySerializer.get_catch_phrases_summary[  r   r    c                     |r_| j                   rS|j                  j                  | j                   j                        j	                         st        j                  d      |S )z<Validate that default transfer staff belongs to this companyrj   z2Default transfer staff must belong to this company)ro   	companiesrp   r   rq   r   rW   rS   r   s     r!   validate_default_transfer_staffz1CompanySerializer.validate_default_transfer_staff_  sP    T]]??))T]]-=-=)>EEG!11H  r    c                     | j                   Ct        j                  j                  |      j	                         rt        j                  d      |S )z3Validate unique name only when creating new company)r-   z&Company with this name already exists.ro   r   r\   rp   rq   r   rW   r   s     r!   validate_namezCompanySerializer.validate_namei  sA    == %%5%188:!112Z[[r    c                     |rO| j                   Ct        j                  j                  |      j	                         rt        j                  d      |S )z4Validate unique phone only when creating new company)r   z.Company with this phone number already exists.r   r   s     r!   validate_phonez CompanySerializer.validate_phonep  sC    T]]*%%E%299;!112bccr    c                 ^   |r| j                   |S t        |      }t        d       t        j                  j                  t        j                  t        j                  d      d            j                  |      j                         r t        d       t        j                  d      |S )	z6Validate unique website only when creating new companyzwebsite validationr   LOWER)function)
normalized)website__icontainszwebsite existsz)Company with this website already exists.)ro   r   printr   r\   annotater   FuncFrp   rq   r   rW   )rS   r   normalized_values      r!   validate_websitez"CompanySerializer.validate_website~  s    1L,U3"#??##!;;HHY'$ $ 

 &$4&
5ffh? "#--.YZZr    N),r   r   r   r   r   rZ   r   r   r   r   r   r_   r   r   ru   r   r   r~   r   r   r   r   r   r[   r   r\   r]   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r     s]   P2224J:::<<;<<>=K==?"C+"C"C"E(ddCL<;<<>)ttDM=K==?)ttDM=K==?#>E999;?[??!!#	 &;'&"N NS$
%
7
5.//r    r   c                   H   e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                         Z	 ej
                         Z
 ej
                         Z ed      Z ej
                         Z G d d      Zd Zd Zd Zd	 Zd
 Zd Zy)CompanySummarySerializerz5Serializer for company summary in user's company listT)r)   c                       e Zd ZeZg dZy)CompanySummarySerializer.Meta)r   r-   r   r   r   	role_nameis_active_companyr8   r   r   r   r   r   r   r   r   Nr/   r   r    r!   r"   r    s    Ir    r"   c                 "    |j                         S )r   )r   rR   s     r!   r   z'CompanySummarySerializer.get_user_count  s    !!##r    c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   rR   s     r!   r   z/CompanySummarySerializer.get_active_users_count  r   r    c                     t        |d      r|j                  S |j                  j                  dd      j	                         S r   r   rR   s     r!   r   z2CompanySummarySerializer.get_available_users_count  r   r    c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   rR   s     r!   r   z1CompanySummarySerializer.get_inactive_users_count  r   r    c                 6    | j                  |      }|r|d   S dS )z$Get user's role name in this companyr-   zNo Role)r   )rS   rT   r   s      r!   get_role_namez&CompanySummarySerializer.get_role_name  s#    ))#.#tF|22r    c                     | j                   j                  d      }|r%|j                  r|j                  j                  |k(  S y)z0Check if this is user's currently active companyri   F)rl   rV   rm   rn   )rS   rT   ri   s      r!   get_is_active_companyz.CompanySummarySerializer.get_is_active_company  s7    ,,""9-w||<<..#55r    N)r   r   r   r   r   rZ   r  r  r   r   r   r   r   r   r   r"   r   r   r   r   r	  r  r   r    r!   r   r     s    ?1113I999;=K==?:::<<;<<>2224J#.E999;I I$$
7
%
3
r    r   c                   <    e Zd ZdZ edd      Z ed      Zd Zy)UserCompaniesSerializerz'Serializer for listing user's companiesTr   )r*   c                     t        |j                  j                         d| j                        j                  |j
                  r-t        |j
                  | j                        j                  dS ddS )z@Custom representation to get user's companies and active companyT)r)   rl   r   N)r   rn   )r   r   r]   rl   rX   rn   )rS   ro   s     r!   to_representationz)UserCompaniesSerializer.to_representation  st     2""&&( d -- 7'' d

 
	
 48

 
	
r    N)r   r   r   r   r   r   rn   r  r   r    r!   r  r    s     1(ddCI-=N
r    r  c                   B    e Zd ZdZ ej
                  d      Zd Zd Zy)SwitchCompanySerializerz.Serializer for switching user's active companyzID of company to switch to	help_textc                 T   	 t         j                  j                  |d      }| j                  j                  d      }|r<|j                  r0|j                  j                  |      st	        j
                  d      |S # t         j                  $ r t	        j
                  d      w xY wz3Validate that company exists and user belongs to itT)r   r8   zCompany not found or inactiveri   z You don't belong to this company	r   r\   rV   DoesNotExistr   rW   rl   rm   belongs_to_companyrS   r   r6   ri   s       r!   validate_company_idz+SwitchCompanySerializer.validate_company_id      	Ooo))Ud)CG ,,""9-w||<<227;!112TUU ## 	O--.MNN	O   !A> >)B'c                     | j                   d   }t        j                  j                  |      }|j	                  |      r|S t        j                  d      )zSwitch user's active companyr   rj   zFailed to switch company)validated_datar   r\   rV   switch_companyr   rW   rS   rm   r   r6   s       r!   r  z&SwitchCompanySerializer.switch_company  sN    ((6
//%%%4w'N--.HIIr    N)	r   r   r   r   r   IntegerFieldr   r  r  r   r    r!   r  r    s#    8)))4PQJJr    r  c                   B    e Zd ZdZ ej
                  d      Zd Zd Zy)SetDefaultCompanySerializerz-Serializer for setting user's default companyzID of company to set as defaultr  c                 T   	 t         j                  j                  |d      }| j                  j                  d      }|r<|j                  r0|j                  j                  |      st	        j
                  d      |S # t         j                  $ r t	        j
                  d      w xY wr  r  r  s       r!   r  z/SetDefaultCompanySerializer.validate_company_id  r  r  c                     | j                   d   }t        j                  j                  |      }|j	                  |      r|S t        j                  d      )zSet user's default companyr   rj   zFailed to set default company)r  r   r\   rV   set_default_companyr   rW   r   s       r!   r&  z/SetDefaultCompanySerializer.set_default_company  sN    ((6
//%%%4##G,N--.MNNr    N)	r   r   r   r   r   r!  r   r  r&  r   r    r!   r#  r#    s#    7)))4UVJOr    r#  N)*rest_frameworkr   r   r   r   r   r   r	   r
   r   apps.permissions.modelsr   r   apps.core.serializersr   	django.dbdjango.contrib.authr   utilsr   django.db.modelsr   r   ModelSerializerr   r%   r1   r@   rD   r_   ru   r~   r   r   r   r   r   r   
Serializerr  r  r#  r   r    r!   <module>r0     sr   &   : 9  . $ "4!<!< 4( ; ; (
Y;#>#> 
Y(.;66 .%33 %P"K77 "J*K77 *ZK77 $
W{:: 
W$K77 $
'[00 
'? ?0G,k.I.I GT.3[5P5P .b
k44 
(Jk44 J:O+"8"8 Or    