
    nsiN                        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 d dlmZ d d	lmZ d d
lmZmZmZmZmZmZmZ  e       Z G d dej8                        Z G d dej8                        Z G d dej8                        Z G d dej8                        Z  G d dej8                        Z! G d dej8                        Z" G d dej8                        Z# G d dej8                        Z$ G d dej8                        Z% G d dej8                        Z& G d d ej8                        Z' G d! d"      Z( G d# d$e(ej8                        Z) G d% d&e(ej8                        Z* G d' d(ejV                        Z, G d) d*ejV                        Z- G d+ d,e-      Z. G d- d.e-      Z/ G d/ d0ej8                        Z0y1)2    )models)get_user_model)serializers)PhoneUniquenessService)UserBasicInfoSerializer)ProfileServices)UserCompanyRoleRole)CompanyContextService)normalize_website)CompanyOfficeHoursSalesTimingCatchPhraseCompanyHistoryHolidayCompanyBotSettingsc                        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     O/var/www/html/dp2/backend_v2.1/server/apps/companies/serializers/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                   N    e Zd Z ej                  dd      Z G d d      Z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   r7   r8   r:   r;   Nr   r   r   r   r   r   read_only_fieldsr    r!   r"   r#   r6   $   s    "

 Yr!   r#   c                     	 t        j                  || j                  r| j                  j                        S d       S # t        $ r#}t        j                  t        |            d }~ww xY w)N)exclude_bot_idr   assert_uniqueinstancer   
ValueErrorr   ValidationErrorstrselfvaluees      r"   validate_phone_numberz2CompanyBotSettingsSerializer.validate_phone_number-   sd    	6)7737==t}}// FJ   	6--c!f55	6   6A  A   	A,	A''A,N)r   r   r   r   	CharFieldr8   r#   rK   r    r!   r"   r2   r2   !   s'    (;(($OLY Y6r!   r2   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#   rQ   7   s    "
# *-r!   r#   Nr$   r    r!   r"   rO   rO   6   s    . .r!   rO   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)HolidaySerializerr3   Tr4   Fquerysetr*   requiredallow_emptyr/   r(   c                        e Zd ZeZg dZg dZy)HolidaySerializer.Meta)r   r7   r8   r.   message
start_dateend_dater9   r/   bots_detailduration_daysr:   r;   )r   r7   r8   r^   r:   r;   N)r   r   r   r   r   r   r>   r    r!   r"   r#   rY   R   s    

 jr!   r#   c                 "    |j                         S )z$Get number of days in holiday period)get_duration_daysrH   objs     r"   r`   z#HolidaySerializer.get_duration_days[   s    $$&&r!   c                     |j                  d      }|j                  d      }|r|r||kD  rt        j                  d      |S )zValidate holiday datesr[   r\   z-End date must be after or equal to start date)getr   rE   )rH   datar[   r\   s       r"   validatezHolidaySerializer.validate_   sB    XXl+
88J'(H$!112abbr!   N)r   r   r   r   rM   r8   SerializerMethodFieldr^   PrimaryKeyRelatedFieldr   objectsallr/   rO   r]   r#   r`   rf   r    r!   r"   rS   rS   C   s~    (;(($OL5K557M-;--#++//1	D 'Kj j'	r!   rS   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)OfficeHoursSerializerget_day_displayTr4   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#   ro   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requestrp   )r7   rp   zOffice hours for z  already exist for this company.r   rr   rs   rt   z4Start and end times are required when office is open!End time must be after start time)contextuseractive_companyrd   rC   r   ri   filterexistsr   rE   
capitalizeexcluder   )rH   re   r7   rp   s       r"   rf   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   rM   rq   r#   rf   r    r!   r"   rl   rl   j   s&    '+''/@DQK" "r!   rl   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)SalesTimingSerializerr3   Tr4   c                        e Zd ZeZg dZg dZy)SalesTimingSerializer.Meta)	r   r7   r8   rs   rt   r9   botr:   r;   r<   N)r   r   r   r   r   r   r>   r    r!   r"   r#   r      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 timingrs   rt   z9If start_time is provided, end_time must also be providedz9If end_time is provided, start_time must also be providedrx   z Start and end times are required)partialr   rE   rd   rH   re   s     r"   rf   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   rM   r8   r#   rf   r    r!   r"   r   r      s'    (;(($OLY Yr!   r   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)CatchPhraseSerializerr3   Tr4   c                        e Zd ZeZg dZg dZy)CatchPhraseSerializer.Meta)r   r7   r8   phraser:   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 catchphraser   zCatch phrase cannot be empty)rd   stripr   rE   r   s     r"   rf   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.usernameTr4   r3   c                        e Zd ZeZg dZg dZy)CompanyHistorySerializer.Meta)
r   r7   r8   
updated_byupdated_by_usernameaction
model_name	object_iddetailsr:   )r   r8   r   r:   N)r   r   r   r   r   r   r>   r    r!   r"   r#   r      s    
 Wr!   r#   N)r   r   r   r   rM   r   r8   r#   r    r!   r"   r   r      sA    /+//$ );((L
W Wr!   r   c                   L    e Zd ZdZ ej
                         Zd Z G d d      Zy)MissingUserSerializerz4Serializer for users in missing_call_notify_to fieldc                 .    t        j                  |      S )Nrz   )r   resolve_display_namera   s     r"   get_full_namez#MissingUserSerializer.get_full_name   s    33==r!   c                       e Zd ZeZg dZy)MissingUserSerializer.Meta)r   username	full_nameN)r   r   r   Userr   r   r    r!   r"   r#   r      s    0r!   r#   N)	r   r   r   __doc__r   rg   r   r   r#   r    r!   r"   r   r      s$    >1113I>1 1r!   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countra   s     r"   get_permissions_countz$RoleSerializer.get_permissions_count   s    $$&&r!   N)	r   r   r   r   r   rg   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 )Nrv   _company_role_cacheT)rz   r9   rolery   )ry   rd   rz   is_anonymousis_superuserhasattrr	   ri   r|   select_related
company_idr   r   r   r   re   )rH   rb   rv   rz   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+   FrT   missing_call_notify_tor(   c                        e Zd ZeZg dZg dZy)CompanySerializer.Meta)r   r.   phonecompany_typeoffice_time
bdc_numbertimezoner   missing_call_notify_to_detailsdefault_transfer_staffdefault_transfer_staff_namer9   r:   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   r:   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   ra   s     r"   get_user_countz CompanySerializer.get_user_count5  s%    !(l!;s~~RARRr!   c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   Tr9   r   r   r   r|   r   ra   s     r"   get_active_users_countz(CompanySerializer.get_active_users_count9  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   r|   r   ra   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)r9   is_availabler   r   r   r|   r   ra   s     r"   get_available_users_countz+CompanySerializer.get_available_users_countC  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__inr9   z%Some user IDs are invalid or inactive)r   r   ri   r|   lenr   rE   )rH   rI   rz   user_idsexisting_userss        r"   validate_missing_call_notify_toz1CompanySerializer.validate_missing_call_notify_toH  sc    ,12EDEH2!\\00D0QN>"c%j0!112YZZ	 3s   A+c                 F    |j                   }t        j                  |      S )z&Get the name of default transfer staffr   )r   r   r   )rH   rb   transfer_staffs      r"   get_default_transfer_staff_namez1CompanySerializer.get_default_transfer_staff_nameR  s    3333HHr!   c                 "    |j                         S )zGet office hours summary)get_office_hours_summaryra   s     r"   r   z*CompanySerializer.get_office_hours_summaryX  s    ++--r!   c                 "    |j                         S )zGet sales timings summary)get_sales_timings_summaryra   s     r"   r   z+CompanySerializer.get_sales_timings_summary\      ,,..r!   c                 "    |j                         S )zGet catchphrases summary)get_catch_phrases_summaryra   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 companyrw   z2Default transfer staff must belong to this company)rC   	companiesr|   r   r}   r   rE   rH   rI   s     r"   validate_default_transfer_staffz1CompanySerializer.validate_default_transfer_staffd  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.)rC   r   ri   r|   r}   r   rE   r   s     r"   validate_namezCompanySerializer.validate_namen  sA    == %%5%188:!112Z[[r!   c                     	 t        j                  || j                  r| j                  j                        S d       S # t        $ r#}t        j                  t        |            d }~ww xY w)N)exclude_company_idrA   rG   s      r"   validate_phonez CompanySerializer.validate_phoneu  sd    	6)777;}}4==#3#3 JN   	6--c!f55	6rL   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.)rC   r   printr   ri   annotater   FuncFr|   r}   r   rE   )rH   rI   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   rg   r   r   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   rh   r   ri   rj   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
I.//6@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   r   	role_nameis_active_companyr9   r   r   r   r   r   r   r   r   Nr0   r    r!   r"   r#   r    s    Ir!   r#   c                 "    |j                         S )r   )r   ra   s     r"   r   z'CompanySummarySerializer.get_user_count  s    !!##r!   c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   ra   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   ra   s     r"   r   z2CompanySummarySerializer.get_available_users_count  r   r!   c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   ra   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   )rH   rb   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 companyrv   F)ry   rd   rz   r{   )rH   rb   rv   s      r"   get_is_active_companyz.CompanySummarySerializer.get_is_active_company  s7    ,,""9-w||<<..#55r!   N)r   r   r   r   r   rg   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*   ry   r   N)r   r{   )r  r   rj   ry   re   r{   )rH   rC   s     r"   to_representationz)UserCompaniesSerializer.to_representation  st     2""&&( d -- 7'' d

 
	
 48

 
	
r!   N)r   r   r   r   r  r   r{   r!  r    r!   r"   r  r    s     1(ddCI-=N
r!   r  c                   4    e Zd Z ej                         Zd Zy)BaseCompanyActionSerializerc                 z    | j                   d   }|j                  }t        j                  |d   |      }||d<   |S )Nrv   r   )r   rz   r7   )ry   rz   r   get_company_for_user)rH   attrsrv   rz   r7   s        r"   rf   z$BaseCompanyActionSerializer.validate  sE    ,,y)||'<<\*

 #ir!   N)r   r   r   r   IntegerFieldr   rf   r    r!   r"   r#  r#    s    )))+J
r!   r#  c                       e Zd Zy)SwitchCompanySerializerNr   r   r   r    r!   r"   r)  r)        r!   r)  c                       e Zd Zy)SetDefaultCompanySerializerNr*  r    r!   r"   r-  r-    r+  r!   r-  c                        e Zd Z G d d      Zy)CompanyNamePhoneSerializerc                       e Zd ZeZg dZy)CompanyNamePhoneSerializer.Meta)r   r.   r   Nr0   r    r!   r"   r#   r1    s    (r!   r#   Nr$   r    r!   r"   r/  r/     s    ) )r!   r/  N)1	django.dbr   django.contrib.authr   rest_frameworkr   apps.core.servicesr   apps.core.serializersr   apps.userprofile.servicesr   apps.permissions.modelsr	   r
   apps.companies.servicesr   apps.companies.utilsr   apps.companies.modelsr   r   r   r   r   r   r   r   ModelSerializerr   r&   r2   rO   rS   rl   r   r   r   r   r   r   r   r  
Serializerr  r#  r)  r-  r/  r    r!   r"   <module>r>     s    . & 5 9 5 9 9 2   4!<!< 4
( ; ; (6;#>#> 6*.;66 .%33 %N"K77 "H*K77 *XK77 "W{:: W$	1K77 	1
'[00 
'? ?.[,k.I.I [z.3[5P5P .`
k44 
&+"8"8 	9 		"= 	)!<!< )r!   