
    `ji4                     P   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Zd dlmZmZ ddlmZ ddlmZ dedefdZ G d dej6                        Z G d dej6                        Z G d dej<                        Z G d dej<                        Z y
)    )transaction)timezone)serializers   )Guest)sync_booking_guests)resolve_property_typevalidate_guest_limit)Booking)dateN)COUNTRY_FIELD_NAMESnormalize_country)validate_italian_residence)normalize_istat_guest_defaultsdobreturnc                     t        j                         }|j                  | j                  z
  }|j                  |j                  f| j                  | j                  fk  r|dz  }|S )Nr   )r   todayyearmonthday)r   r   yearss      /backend/guests/serializers.py_calculate_ager      sO    JJLEJJ!EUYY399cgg"66
L    c                        e Zd ZdZ ej
                  dd      Z ej                  d      Z G d d      Z	 fdZ
d	 Zd
 Zd Zd Zd Zd Zd Zd Z xZS )GuestSerializerz1Guest serializer used by BookingSerializer (READ)FTrequired
allow_nullr   c                        e Zd ZeZg dZg dZy)GuestSerializer.Meta)idbooking	full_nameis_main_guest
guest_typeemailphonedate_of_birthcountry_of_birthgendertourism_typetransport_typedocument_typedocument_issue_datedocument_expiry_datedocument_issuing_countrynationality	id_numberaddresszip_codecountrycityregionlanguage_preferenceguest_notesspecial_requestsis_city_tax_exemptcity_tax_exemption_reason
extra_data
created_at
updated_at)r%   rA   rB   N__name__
__module____qualname__r   modelfieldsread_only_fields r   r   Metar#      s    -
\ Cr   rK   c                    t         |   |      }|j                  }t        |t              r	 t        j                  |      }t        |t              r5|j                         D ]"  \  }}||vs|j                  |      dv s|||<   $ t        D ]$  }||v st        |j                  |            ||<   & |S # t        $ r d }Y w xY wN)N superto_representationr@   
isinstancestrjsonloads	Exceptiondictitemsgetr   r   selfinstancedataextrakeyvalue
field_name	__class__s          r   rQ   z!GuestSerializer.to_representationQ   s    w(2##eS!

5) eT"#kkm
Ud?dhhsmz&A %DI , .JT!#4TXXj5I#JZ  .      B7 7CCc                     t        |      S Nr   r[   r`   s     r   _normalize_country_fieldz(GuestSerializer._normalize_country_fieldg        ''r   c                     |rE|j                  dd      j                  dd      j                         st        j                  d      |S )N+rN    z2Phone number must contain only digits or '+' sign.)replaceisdigitr   ValidationErrorrg   s     r   validate_phonezGuestSerializer.validate_phonej   sE    sB/77R@HHJ--D  r   c                 T    |r%|j                         st        j                  d      |S )NzFull name cannot be blank.)stripr   ro   rg   s     r   validate_full_namez"GuestSerializer.validate_full_nameq   s$    --.JKKr   c                 $    | j                  |      S re   rh   rg   s     r   validate_country_of_birthz)GuestSerializer.validate_country_of_birthv       ,,U33r   c                 $    | j                  |      S re   ru   rg   s     r   !validate_document_issuing_countryz1GuestSerializer.validate_document_issuing_countryy   rw   r   c                 $    | j                  |      S re   ru   rg   s     r   validate_nationalityz$GuestSerializer.validate_nationality|   rw   r   c                 $    | j                  |      S re   ru   rg   s     r   validate_countryz GuestSerializer.validate_country   rw   r   c                    t        | dd       }|j                  dt        |dd             }|j                  dt        |dd             }|j                  dt        |dd             }|j                  dt        |di       xs i       }t        |t              r|j                  d      nd }t	        |||||       t        ||      S )	Nr\   r8   r9   r:   r@   provincer:   r@   r@   )getattrrY   rR   rW   r   r   )r[   attrsr\   r8   r9   r:   r@   r   s           r   validatezGuestSerializer.validate   s    4T2))IwxD'IJyy64!@A8WXx%FGYY|WX|R-P-VTVW
1;J1M:>>*-SW"!	
 .e
KKr   )rD   rE   rF   __doc__r   IntegerFieldr$   	JSONFieldr@   rK   rQ   rh   rp   rs   rv   ry   r{   r}   r   __classcell__rb   s   @r   r   r      sg    ;	!	!	!5T	BB&&&6J0C 0Cd,(
4444Lr   r   c                        e Zd ZdZ ej
                  dd      Z G d d      Z 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 )CheckInGuestSerializerz7Accepts both model fields and unlimited dynamic fields.FTr   c                       e Zd ZeZg dZg Zy)CheckInGuestSerializer.Meta)r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r5   r1   r2   r3   r4   r6   r7   r8   r9   r:   r;   r=   r<   r>   r?   NrC   rJ   r   r   rK   r      s    
: r   rK   c                     t        | j                  j                               }h d}i }i }|j                         D ]  \  }}||v r|||<   ||vs|||<    t        	|   |      }||d<   |S )N>   r$   r%   rA   r@   rB   r@   )setrH   keysrX   rP   to_internal_value)
r[   r]   known_fieldssystem_fieldscleaned_datar@   r_   r`   internalrb   s
            r   r   z(CheckInGuestSerializer.to_internal_value   s    4;;++-.
 
**,JCl"$)S!M)"'
3	 ' 7,\:!+r   c                 *    ||S |j                         S re   )rr   rg   s     r   rs   z)CheckInGuestSerializer.validate_full_name   s    =L{{}r   c                 b    |r,|t        j                         k  rt        j                  d      |S )NzDocument has expired.r   r   r   ro   rg   s     r   validate_document_expiry_datez4CheckInGuestSerializer.validate_document_expiry_date   s)    UTZZ\)--.EFFr   c                 b    |r,|t        j                         k\  rt        j                  d      |S )Nz"Date of birth must be in the past.r   rg   s     r   validate_date_of_birthz-CheckInGuestSerializer.validate_date_of_birth   s)    Udjjl*--.RSSr   c                     t        |      S re   rf   rg   s     r   rv   z0CheckInGuestSerializer.validate_country_of_birth   ri   r   c                     t        |      S re   rf   rg   s     r   ry   z8CheckInGuestSerializer.validate_document_issuing_country   ri   r   c                     t        |      S re   rf   rg   s     r   r{   z+CheckInGuestSerializer.validate_nationality   ri   r   c                     t        |      S re   rf   rg   s     r   r}   z'CheckInGuestSerializer.validate_country   ri   r   c                    t         |   |      }|j                  }t        |t              r	 t        j                  |      }t        |t              r5|j                         D ]"  \  }}||vs|j                  |      dv s|||<   $ t        D ]$  }||v st        |j                  |            ||<   & |S # t        $ r d }Y w xY wrM   rO   rZ   s          r   rQ   z(CheckInGuestSerializer.to_representation   s    w(2##eS!

5) eT"#kkm
Ud?dhhsmz&A %DI , .JT!#4TXXj5I#JZ  .   rc   c                    |j                  d      }|j                  d      }|j                  d      }|j                  di       }t        |t              r|j                  d      nd}t        |||||       t	        ||      S )	z@Cross-field validation for Italian residence municipality rules.r8   r9   r:   r@   r   Nr   r   )rY   rR   rW   r   r   )r[   r   r8   r9   r:   r@   r   s          r   r   zCheckInGuestSerializer.validate  s|    ))I&yy 8$YY|R0
1;J1M:>>*-SW"!	
 .e
KKr   )rD   rE   rF   r   r   r   r$   rK   r   rs   r   r   rv   ry   r{   r}   rQ   r   r   r   s   @r   r   r      sX    A	!	!	!5T	BB B2


((((*Lr   r   c                   ^    e Zd Z ej                  d      Z edd      Zd Zd Z	d Z
d Zy)	CheckInSerializerTr!   )manyr   c                     	 t         j                  j                  dd      j                  |      | _        |S # t         j
                  $ r}t        j                  d| d      |d }~ww xY w)Nproperty_typeproperty__property_typer$   zBooking with ID z does not exist.)r   objectsselect_relatedrY   _bookingDoesNotExistr   ro   )r[   r`   excs      r   validate_booking_idz%CheckInSerializer.validate_booking_id   su    	#OO::) cUcm M 	 ## 	--"5')9:	s   59 A+A&&A+c                     |st        j                  d      |D cg c]  }|j                  d      s| }}|st        j                  d      t        |      dkD  rt        j                  d      |S c c}w )NzAt least one guest is required.r'   z$At least one main guest is required.r   zOnly one main guest is allowed.)r   ro   rY   len)r[   r`   gmain_guestss       r   validate_guestsz!CheckInSerializer.validate_guests,  su    --.OPP"'B%Q155+Aq%B--.TUU{a--.OPP Cs
   A5A5c                    t        | dd       }|3t        j                  j                  dd      j	                  |d         }t        |      }	 t        |t        |d                	 |j                  j                  }|j                  }|t!        |d         D ]  \  }}|j	                  d	      xs d
j#                         j%                         }	|j	                  d      }
d|	v sM|
sPt'        |
      }||k\  sa|dk(  rdnd|dz    }t        j                  | d|
 d| d| d       ||d<   |S # t        $ r#}t        j                  t        |            d }~ww xY w# t        $ r d }d }Y w xY w)Nr   r   r   
booking_idr   )r%   guests)r   total_guestsr?   rN   r+   minorr   z
Main guestzGuest #r   z<: Exemption reason is set to 'Minor' but the date of birth (z) indicates an age of z1 years. The minor age limit for this property is zB. Please correct the date of birth or change the exemption reason.r%   )r   r   r   r   rY   r	   r
   r   
ValueErrorr   ro   rS   	structurecity_tax_settingsminor_age_limitrV   	enumeraterr   lowerr   )r[   r   r%   r   r   r   r   indexguestreasonr   ageguest_labels                r   r   zCheckInSerializer.validate9  s   $
D1?oo44) cU<(c) 
 .g>	8 + x1	# ' 1 1 C C/??O
 & )%/ :u))$?@FBMMOUUWii0f$(-Co-6;qjlPUXYPY{F[)99*m ,..1U2H NHHWGX Y_`  !; #i;  	8--c#h77	8  	# $"O	#s*   D5 *"E$ 5	E!>EE!$E43E4c                 V   |j                  d      }||j                  n|d   }|d   }t        j                         5  t        j
                  j                         j                  |      }|j                  }t        ||d      }d|_        t        j                         |_        d|_        	 |j                  ddg	       d
|_        |s|j                  rddlm}  ||       d d d        |j                  |j                  |j                  dS # d
|_        w xY w# 1 sw Y   :xY w)Nr%   r   r   r   T)r%   guests_dataupdate_booking_countsis_checked_inchecked_in_at)update_fieldsFr   )sync_receipt_for_booking)r   r   r   r   )rY   r$   r   atomicr   r   select_for_updater   r   r   nowr   _skip_receipt_syncsaveservices.receipt_servicer   )r[   validated_datar%   r   r   previous_is_checked_increated_guestsr   s           r   createzCheckInSerializer.createg  s    $$Y/#*#6WZZN<<X
$X.!oo779===LG%,%:%:"0'&*N
 %)G!$,LLNG!)-G&3O_+MN-2*)g.C.CM(1' ", "**$22$22$	
 	
 .3* "!s$   A0D/D#D	DDD(N)rD   rE   rF   r   r   r   r   r   r   r   r   r   rJ   r   r   r   r     s5    )))48J#=F
,\
r   r   c                       e Zd Z ej                         Z ej                         Z ej                  d      Z	 e
d      Z ej                         Zy)CheckInResponseSerializerT)r    )r   N)rD   rE   rF   r   r   r   BooleanFieldr   DateTimeFieldr   r   r   	CharFieldmessagerJ   r   r   r   r     sN    )))+J,K,,.M-K-->M$'F#k##%Gr   r   )!	django.dbr   django.utilsr   rest_frameworkr   modelsr   guests.guest_sync_servicer   bookings.guest_limitsr	   r
   bookings.modelsr   datetimer   rT   services.country_utilsr   r   
validationr   guest_defaultsr   intr   ModelSerializerr   r   
Serializerr   r   rJ   r   r   <module>r      s    ! ! &  9 M #   I 2 :  xLk11 xL|~L[88 ~LHj
.. j
`& 6 6 &r   