
    i                       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 i dd	d
dddddddddddddddddddddddddddddddddddddddddd
Zd!dZd"dZdd	 	 	 	 	 d#d Zy)$    )annotations)Iterable)date)Guest)apply_guest_istat_defaults)ValidationError)normalize_country_fields	full_name is_main_guestF
guest_typeNemailphonedate_of_birthcountry_of_birthcityregiongendertourism_typetransport_typedocument_type	id_numberdocument_issue_datedocument_expiry_datedocument_issuing_country)
nationalityaddresszip_codecountrylanguage_preferencespecial_requestsguest_notesis_city_tax_exemptcity_tax_exemption_reasoncity_tax_exemption_notesc                   | j                   xs dj                         j                         }d|v ry|r| j                  rt	        j
                         }|j                  | j                  j                  z
  }|j                  |j                  f| j                  j                  | j                  j                  fk  r|dz  }||k  S y)z6Return True if the guest should be counted as a child.r   minorT   F)	r$   striplowerr   r   todayyearmonthday)guestminor_age_limitreasonr+   yearss        /backend/guests/services.py_is_minor_guestr4   +   s     --3::<BBDF&5..



U00555KK#u':':'@'@%BUBUBYBY&ZZQJE&&    c                    	 | j                   j                  j                  t	        fd|D              }t        |      |z
  }|| _        || _        | j                  ddg       y# t        $ r dY Rw xY w)zPRecalculate and persist adults_count / children_count from actual guest records.Nc              3  <   K   | ]  }t        |      sd   yw)r(   N)r4   ).0gr0   s     r3   	<genexpr>z/_update_booking_guest_counts.<locals>.<genexpr>B   s     Smq//R1ms   adults_countchildren_count)update_fields)		structurecity_tax_settingsr0   	Exceptionsumlenr;   r<   save)bookingsynced_guestschildrenadultsr0   s       @r3   _update_booking_guest_countsrH   ;   sz    !++==MM SmSSH(*F!G%GLL0@ALB  s    A( (A65A6)update_booking_countsc           
        t        |d       }t        |      }t        t        j                  j                  |       j                  d            }|D ci c]  }|j                  | }}|j                         }g }	t               }
t        |      D ]  \  }}t        || ||      }t        |      }|j                  dd       }t        |j                  di       xs i       }d }|#||vrt        dd| d	| j                   d
gi      ||
v rt        dd| dgi      ||v r||   }||v r%|j                  |       n|r|j                  d      }t         j#                         D ci c]  \  }}||j%                  ||       }}}||d<   |"t        j                  j&                  dd| i|}n<|j#                         D ]  \  }}t)        |||        | |_        |j-                          |	j/                  |       |
j1                  |j                          t        j                  j                  |       j3                  |
      j5                          |rt7        | |	       |	S c c}w c c}}w )Nc                8    t        | j                  d             S )Nr   )boolget)r/   s    r3   <lambda>z%sync_booking_guests.<locals>.<lambda>R   s    d599_#=>>r5   )key)rD   id)rD   indextotal_guests
extra_dataguestsz	Guest ID z does not belong to booking .z' appears more than once in the payload.r   rD   )id__in )sortedrB   listr   objectsfilterorder_byrP   copyset	enumerater   r	   popr   removeGUEST_REPLACEMENT_DEFAULTSitemsrM   createsetattrrD   rC   appendaddexcludedeleterH   )rD   guests_datarI   ordered_guestsrR   existing_guestsr/   existing_by_idremaining_guestsrE   seen_guest_idsrQ   
guest_datapayloadguest_idrS   fielddefaultreplacement_valuesvalues                       r3   sync_booking_guestsrw   J   s    >N ~&L5==///@II$OPO3BC?%ehho?NC&++-!#MUN&~6z,%	
 +73;;tT*-gkk,.K.QrR
HN$B!iz1Mgjj\YZ[\]  ~%!iz1XYZ[  ~%"8,E(( ''.$((+E #="B"B"D
"Dw 7;;ug.."D 	 
 ,6<(=MM(( $E
 !3 8 8 :uue, !;#EMJJLU#588$] 7` 
MM)111HOOQ$Wm<u DB
s   I-+I2)r/   r   r0   z
int | NonereturnrL   )rE   list[Guest]rx   None)rj   zIterable[dict]rI   rL   rx   ry   )
__future__r   collections.abcr   datetimer   guests.modelsr   guests.istat_utilsr   rest_framework.exceptionsr   services.country_utilsr	   rb   r4   rH   rw   rW   r5   r3   <module>r      sF   " $   9 5 ;U $ T	
 T T  D d d D d T  4  D!" #$ !% $7 > C& #(	G  G  	G
 Gr5   