
    `j                       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 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)normalize_istat_guest_defaults)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/guest_sync_service.py_is_minor_guestr5   ,   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)r5   ).0gr1   s     r4   	<genexpr>z/_update_booking_guest_counts.<locals>.<genexpr>C   s     Smq//R1ms   adults_countchildren_count)update_fields)		structurecity_tax_settingsr1   	Exceptionsumlenr<   r=   save)bookingsynced_guestschildrenadultsr1   s       @r4   _update_booking_guest_countsrI   <   sz    !++==MM SmSSH(*F!G%GLL0@ALB  s    A( (A65A6)update_booking_countsc           
     j   t        |d       }t        |      }t        t        j                  j                  |       j                  d            }|D ci c]  }|j                  | }}|j                         }g }	t               }
t        |      D ]  \  }}t        || ||      }t        |t        |j                  d      t              r|j                  d      nd       }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/        |||        | |_        |j3                          |	j5                  |       |
j7                  |j                          t        j                  j                  |       j9                  |
      j;                          |rt=        | |	       |	S c c}w c c}}w )Nc                8    t        | j                  d             S )Nr   )boolget)r0   s    r4   <lambda>z%sync_booking_guests.<locals>.<lambda>S   s    d599_#=>>r6   )key)rE   id)rE   indextotal_guests
extra_data)rT   guestsz	Guest ID z does not belong to booking .z' appears more than once in the payload.r   rE   )id__in )sortedrC   listr   objectsfilterorder_byrQ   copyset	enumerater   r   
isinstancerN   dictr
   popr	   removeGUEST_REPLACEMENT_DEFAULTSitemscreatesetattrrE   rD   appendaddexcludedeleterI   )rE   guests_datarJ   ordered_guestsrS   existing_guestsr0   existing_by_idremaining_guestsrF   seen_guest_idsrR   
guest_datapayloadguest_idrT   fielddefaultreplacement_valuesvalues                       r4   sync_booking_guestsrz   K   s    >N ~&L5==///@II$OPO3BC?%ehho?NC&++-!#MUN&~6z,%	
 14>w{{<?XZ^4_w{{<0ei
 +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$e 7h 
MM)111HOOQ$Wm<} DJ
s   J*(J/)r0   r   r1   z
int | NonereturnrM   )rF   list[Guest]r{   None)rm   zIterable[dict]rJ   rM   r{   r|   )
__future__r   collections.abcr   datetimer   guests.modelsr   guests.guest_defaultsr   guests.istat_utilsr   rest_framework.exceptionsr	   services.country_utilsr
   re   r5   rI   rz   rX   r6   r4   <module>r      sI   " $   @ 9 5 ;U $ T	
 T T  D d d D d T  4  D!" #$ !% $7 > C& #(	K  K  	K
 Kr6   