
    9iQ                     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j0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z  G d dej0                        Z! G d dej0                        Z" G d dej0                        Z# G d d       Z$ G d! d"e$ej0                        Z% G d# d$e$ej0                        Z& G d% d&ejN                        Z( G d' d(ejN                        Z) G d) d*ejN                        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     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                   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   r5   r6   r8   r9   Nr   r   r   r
   r   r   read_only_fieldsr   r   r    r!   r4   #   s    "

 Yr   r!   N)r   r   r   r   	CharFieldr6   r!   r   r   r    r0   r0       s"    (;(($OLY Yr   r0   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!   rA   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)HolidaySerializerr1   Tr2   Fquerysetr(   requiredallow_emptyr-   r&   c                        e Zd ZeZg dZg dZy)HolidaySerializer.Meta)r   r5   r6   r,   message
start_dateend_dater7   r-   bots_detailduration_daysr8   r9   )r   r5   r6   rN   r8   r9   N)r   r   r   r	   r   r   r<   r   r   r    r!   rI   Q   s    

 jr   r!   c                 "    |j                         S )z$Get number of days in holiday period)get_duration_daysselfobjs     r    rP   z#HolidaySerializer.get_duration_daysZ   s    $$&&r   c                     |j                  d      }|j                  d      }|r|r||kD  rt        j                  d      |S )zValidate holiday datesrK   rL   z-End date must be after or equal to start date)getr   ValidationError)rR   datarK   rL   s       r    validatezHolidaySerializer.validate^   sB    XXl+
88J'(H$!112abbr   N)r   r   r   r   r=   r6   SerializerMethodFieldrN   PrimaryKeyRelatedFieldr
   objectsallr-   r?   rM   r!   rP   rX   r   r   r    rC   rC   B   s~    (;(($OL5K557M-;--#++//1	D 'Kj j'	r   rC   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)OfficeHoursSerializerget_day_displayTr2   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!   ra   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requestrb   )r5   rb   zOffice hours for z  already exist for this company.r   rd   re   rf   z4Start and end times are required when office is open!End time must be after start time)contextuseractive_companyrU   instancer   r[   filterexistsr   rV   
capitalizeexcluder   )rR   rW   r5   rb   s       r    rX   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=   rc   r!   rX   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)SalesTimingSerializerr1   Tr2   c                        e Zd ZeZg dZg dZy)SalesTimingSerializer.Meta)	r   r5   r6   re   rf   r7   botr8   r9   r:   N)r   r   r   r   r   r   r<   r   r   r    r!   rv      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 timingre   rf   z9If start_time is provided, end_time must also be providedz9If end_time is provided, start_time must also be providedrj   z Start and end times are required)partialr   rV   rU   rR   rW   s     r    rX   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=   r6   r!   rX   r   r   r    rt   rt      s'    (;(($OLY Yr   rt   c                   N    e Zd Z ej                  dd      Z G d d      Zd Zy)CatchPhraseSerializerr1   Tr2   c                        e Zd ZeZg dZg dZy)CatchPhraseSerializer.Meta)r   r5   r6   phraser8   r9   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)rU   stripr   rV   rz   s     r    rX   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.usernameTr2   r1   c                        e Zd ZeZg dZg dZy)CompanyHistorySerializer.Meta)
r   r5   r6   
updated_byupdated_by_usernameaction
model_name	object_iddetailsr8   )r   r6   r   r8   N)r   r   r   r   r   r   r<   r   r   r    r!   r      s    
 Wr   r!   N)r   r   r   r   r=   r   r6   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countrQ   s     r    get_permissions_countz$RoleSerializer.get_permissions_count   s    $$&&r   N)	r   r   r   r   r   rY   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 )Nrh   _company_role_cacheT)rl   r7   rolerk   )rk   rU   rl   is_anonymousis_superuserhasattrr   r[   ro   select_related
company_idr   r   r   r   rW   )rR   rS   rh   rl   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)   FrD   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_namer7   r8   r9   
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   r8   r9   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   rQ   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r7   r   r   r   ro   r   rQ   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   ro   r   rQ   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)r7   is_availabler   r   r   ro   r   rQ   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__inr7   z%Some user IDs are invalid or inactive)r   r   r[   ro   lenr   rV   )rR   valuerl   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_namerQ   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_summaryrQ   s     r    r   z*CompanySerializer.get_office_hours_summaryS  s    ++--r   c                 "    |j                         S )zGet sales timings summary)get_sales_timings_summaryrQ   s     r    r   z+CompanySerializer.get_sales_timings_summaryW      ,,..r   c                 "    |j                         S )zGet catch phrases summary)get_catch_phrases_summaryrQ   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 companyri   z2Default transfer staff must belong to this company)rn   	companiesro   r   rp   r   rV   rR   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.rn   r   r[   ro   rp   r   rV   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.)rn   r   printr   r[   annotater   FuncFro   rp   r   rV   )rR   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   rY   r   r   r   r   r   r^   r   r   rt   r   r   r}   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   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_companyr7   r   r   r   r   r   r   r   r   Nr.   r   r   r    r!   r     s    Ir   r!   c                 "    |j                         S )r   )r   rQ   s     r    r   z'CompanySummarySerializer.get_user_count  s    !!##r   c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   rQ   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   rQ   s     r    r   z2CompanySummarySerializer.get_available_users_count  r   r   c                     t        |d      r|j                  S |j                  j                  d      j	                         S r   r   rQ   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   )rR   rS   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 companyrh   F)rk   rU   rl   rm   )rR   rS   rh   s      r    get_is_active_companyz.CompanySummarySerializer.get_is_active_company  s7    ,,""9-w||<<..#55r   N)r   r   r   r   r   rY   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(   rk   r   N)r   rm   )r   r   r\   rk   rW   rm   )rR   rn   s     r    to_representationz)UserCompaniesSerializer.to_representation  st     2""&&( d -- 7'' d

 
	
 48

 
	
r   N)r   r   r   r   r   r   rm   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   r7   zCompany not found or inactiverh   z You don't belong to this company	r   r[   rU   DoesNotExistr   rV   rk   rl   belongs_to_companyrR   r   r5   rh   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   ri   zFailed to switch company)validated_datar   r[   rU   switch_companyr   rV   rR   rl   r   r5   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   ri   zFailed to set default company)r  r   r[   rU   set_default_companyr   rV   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   apps.companies.modelsr   r   r   r   r   r	   r
   apps.permissions.modelsr   r   apps.core.serializersr   	django.dbr   django.contrib.authr   apps.companies.utilsr   django.db.modelsr   r   ModelSerializerr   r$   r0   r?   rC   r^   rt   r}   r   r   r   r   r   r   
Serializerr  r  r"  r   r   r    <module>r0     sr   &   : 9  . 2 "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   