
    `j$                    d   d Z ddlmZ ddl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 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mZmZmZ ddl m!Z! ddZ"d dZ#d!dZ$d"dZ%d#dZ&d$dZ'd%dZ(d&dZ)	 d'	 	 	 	 	 	 	 d(dZ*d)dZ+d)dZ,dd	 	 	 	 	 	 	 d*dZ-ddd	 	 	 	 	 	 	 d+dZ.y),zBuild normalized ISTAT XML-ready payload objects.

This module intentionally stops at typed payload creation. It does not produce
XML strings, files, ZIP archives, endpoints, or TXT export data.
    )annotationsN)Iterable)date	timedelta)Any)ValidationError) istat_not_specified_export_value)resolve_residence)XmlPayloadValidationError)IstatXmlGuestPayload) normalize_guest_for_istat_exportvalidate_guest_for_istat_export)IstatLookupService)require_valuevalidate_payloadvalidate_residence_payloadvalidate_stay_dates)generate_guest_nightsc                X    | t        |       ndj                         j                         S N )strstripupper)values    5/backend/istat/xml_export/builders/payload_builder.py_normalize_coder   "   s%    +CJ::<BBDD    c                H    | t        |       ndj                         }|xs d S r   )r   r   )r   
normalizeds     r   _normalize_optional_textr!   &   s&     % 1#e*r@@BJr   c                   t        | dd       }t        |t              r|S t        |t              r*	 t	        j
                  |      }t        |t              r|S i S i S # t        t        t        j                  f$ r i cY S w xY w)N
extra_data)	getattr
isinstancedictr   jsonloads	TypeError
ValueErrorJSONDecodeError)guestr#   parseds      r   _get_extra_datar.   +   s{    d3J*d#*c"	ZZ
+F $FD1v9r9I :t';';< 	I	s   A  A?>A?c                 `    | D ])  }|t        |t              r|j                         s'|c S  y N)r%   r   r   )valuesr   s     r   _first_presentr2   8   s3    =eS!%++-  r   c                d    t        |       t        t        | |d       gfd|xs |fD         S )Nc              3  @   K   | ]  }j                  |        y wr0   )get).0keyr#   s     r   	<genexpr>z#_get_guest_field.<locals>.<genexpr>F   s     	E)D#*..
)Ds   )r.   r2   r$   )r,   
field_name
extra_keysr#   s      @r   _get_guest_fieldr;   B   s=     'Jz4(	E)D
})D	E r   c                    t        |       }t        t        |j                  d      |j                  d      |j                  d      t	        | dd                   S )Nresidence_provinceprovincestateregion)r.   r   r2   r5   r$   r,   r#   s     r   _get_guest_provincerB   J   sR     'JNN/0NN:&NN7#E8T*		
 r   c           	         t        |       }t        t        | dd       |j                  d      |j                  d      |j                  d      |j                  d            S )Ncityresidence_cityresidence_municipalityplace_of_birth)r.   r2   r$   r5   rA   s     r   _get_guest_cityrH   V   sX     'Jvt$v'(/0'( r   c                J    t        |       }ddddd}|j                  ||      S )z;Normalize guest gender into the XML payload representation.MF)MALErJ   FEMALErK   )r   r5   )genderr    gender_mappingss      r   normalize_genderrP   a   s4     (J	O z:66r   c                J   t        |       }t        |d       |dk(  r	 t        |||d      }t        |j                        }t        |d       t        j                  |      }|t	        d| d      |j                  d	      }t        j                  |      t	        d
| d      d|d||d   |d}	n2t        j                  |      }
|
t	        d| d      d||
d   dddd}	t        di |	 |	S # t        $ r$}t	        t        |j                              |d}~ww xY w)z3Resolve residence fields for the XML guest payload.countryITT)rR   rD   r>   require_for_italyNr>   z$Missing ISTAT province mapping for ''region_codez"Missing ISTAT region mapping for 'province_code)is_italian_residentresidence_country_iso2residence_country_codeprovince_siglarW   rV   z#Missing ISTAT country mapping for 'F
istat_code )r   r   r
   DrfValidationErrorr   r   detailrW   r   get_provincer5   get_region_by_istat_codeget_countryr   )rR   r>   municipalityrY   	residenceexcr[   province_mappingrV   residence_payloadcountry_mappings              r   resolve_residence_payloadri   m   s{    -W5()4%	F).!!"&	I ))@)@Anj1-::>J#+6~6FaH  '**=966{CK+4[MC 
 $(&<&*,-o>&
 -889OP"+56L5MQO 
 $)&<&5l&C"!
 3!23U " 	F+C

O<#E	Fs   C5 5	D">DD"c                T    |t        |dd      rt        |dd       S t        | dd       S )Nis_arrival_nightFr   check_in_date)r$   )bookingguest_nights     r   _resolve_arrival_datero      s2    7;8JE#R{FD117OT22r   c                z    |-t        |dd      r t        |dd       }|r|t        d      z   S d S t        | dd       S )Nis_departure_nightFr      )dayscheck_out_date)r$   r   )rm   rn   
night_dates      r   _resolve_departure_daterv      sI    7;8Le#T[&$7
1;zI1--EE7,d33r   )rn   c                   t        |      }t        |       t        | |      }t        | |      }t	        ||       t        | dd      }t        |dd      }t        t        |d            }t        t        |d            }t        t        |dd            }	t        |      }
t        |      }t        |d       t        |d       t        |d       t        |d       t        |	d       t        |	|
|      }t        d||||||z
  j                  ||t        t!        t        |dd            xs t        | dd            t        t!        t        |d	d            xs t        | d	d            d
	|}t#        |      S )z<Build a normalized, validated ISTAT XML-ready guest payload.idN
guest_typerN   rR   
booking_idguest_idtourism_typetransport_type)	rz   r{   arrival_datedeparture_datenightsrN   ry   r|   r}   r]   )r   r   ro   rv   r   r$   r   r;   rP   rB   rH   r   ri   r   rs   r!   r	   r   )rm   r,   rn   r~   r   rz   r{   ry   rN   rR   r>   rc   rg   payloads                 r   build_guest_payloadr      s    -U3E#E*(+>L,WkBNn5$-JudD)H !1%!FGJ.uh?@F.uiKLG"5)H"5)L*l+(J'*l+&(#'9%1'8\R" !%-33-,WUND-QR 6w5
 0,WU<Ld-ST 8w 0$7
  !G$ G$$r   period_startperiod_end_exclusivec                  t        | dd      }t        | dd      }t        ||       t        t        | d      j                               }|sg S t	        | g|xs ||xs |      }|D ci c]'  }|j
                  r|j                  |j                  |) }}|D 	cg c]*  }	t        | |	|j                  t        |	dd                  , c}	S c c}w c c}	w )zDBuild XML-ready guest payloads for all guests attached to a booking.rl   Nrt   guestsr   rx   )rm   r,   rn   )	r$   r   listallr   rk   r{   r   r5   )
rm   r   r   r~   r   r   guest_nightsrn   arrival_nights_by_guest_idr,   s
             r   build_booking_payloadr      s     7OT:LW&6=Nn5''8,0023F	(		!1\1C^L ("'K''K,@,@,L 	k)'  "  E 	266wudD7QR	

  "s   ),C/C)r   r   returnr   )r   r   r   
str | None)r,   r   r   r&   )r1   r   r   r   )r,   r   r9   r   r:   r   r   r   )r,   r   r   r   )r,   r   r   r   )rN   r   r   r   r0   )rR   r   r>   r   rc   r   r   zdict[str, Any])rm   r   rn   
Any | Noner   date | None)rm   r   r,   r   rn   r   r   r   )rm   r   r   r   r   r   r   zlist[IstatXmlGuestPayload])/__doc__
__future__r   r'   collections.abcr   datetimer   r   typingr   rest_framework.exceptionsr   r^   guests.guest_defaultsr	   istat.municipalitiesr
   istat.xml_export.exceptionsr   'istat.xml_export.payloads.guest_payloadr   4istat.xml_export.services.guest_export_normalizationr   r   (istat.xml_export.services.lookup_servicer   -istat.xml_export.validators.payload_validatorr   r   r   r   services.guest_night_servicer   r   r!   r.   r2   r;   rB   rH   rP   ri   ro   rv   r   r   r]   r   r   <module>r      s
   #  $ $  K B 2 A H H  ?E

		7  $;;; ; 	;|34 #	/%/% /% 	/%
 /%j !%(,	!! ! &	!
  !r   