
    `j`                        d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 ddl
mZmZmZ d dlmZ d dlmZ d d	l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mZ 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' ddl(m)Z)m*Z* d dl+m,Z, ddl-m.Z.m/Z/ d Z0d Z1 G d de      Z2 edgdd       G d de             Z3 edgdde!d d!i"       G d# d$e             Z4 edgd%d&       G d' d(e             Z5 edgd)d*       G d+ d,e             Z6 edgd-d.       G d/ d0e             Z7 edgd1e$d d!i ed2d3d4d5d6d7d8d9d:gd5d6d7d8d9d:gd;d<d=>      g?       G d@ de             Z2 edgdAe$dBd!i edCdDdEd5dFd7d=d9d:dGdHdGd=dId:gd5dFd7d=d9d:gd;d<d=>      g?       G dJ dKe             Z8 edgdLdM       G dN dOe             Z9 edgdPQ       G dR dSe             Z: edgdTdU       G dV dWe             Z; edgdXdYe%dBd!i"       G dZ d[e             Z< ed\gd]d^ed ei ed_d`i dadbdcd=dGdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{dtd|d}d~d8dddvdgid=>      g       G d de             Z=y!)    )ListAPIView)IsAuthenticatedAllowAny)extend_schema)PrefetchCount   )CheckInTemplateCheckInTemplateFieldStructureCheckInTemplate)APIView)Response)statuspermissions)r   OpenApiExample)Property)Booking)CheckInSerializerCheckInResponseSerializer)GuestSerializer)CheckInTemplateCreateSerializerCheckInTemplateListSerializer!LinkTemplateToStructureSerializerStructureCheckInFormSerializerCheckInFormFieldSerializerCheckInTemplateUpsertSerializer%UnlinkTemplateFromStructureSerializer)get_object_or_404)flatten_default_fieldsserialize_checkin_field)	Structure)DEFAULT_MAIN_GUEST_FIELDSDEFAULT_ADDITIONAL_GUEST_FIELDSc           	         g }d}d}d}| D ]}  }t        |      }|j                  d      dk(  rd}|j                  d      dk(  r5d|d<   t        |j                  d	d            }|j                  d
      xs |}|j                  |        |s[t	        d t        |      D        d       }|%t	        d t        |      D        t        |            }|j                  |ddd||d       |S )NFPersonal infoslugcountry_of_birthTplace_of_birthzBirth Municipality / Citylabelrequiredcategoryc              3   T   K   | ]   \  }}|j                  d       dk(  r|dz    " yw)r&   date_of_birthr	   Nget.0indexfields      /backend/checkin/views.py	<genexpr>z0_normalize_istat_birth_fields.<locals>.<genexpr>.   s1      $@LE599V$7 	$@s   &(c              3   N   K   | ]  \  }}|j                  d       dk(  r|  yw)r&   r(   Nr.   r0   s      r4   r5   z0_normalize_istat_birth_fields.<locals>.<genexpr>7   s.      (Duyy(,<< (Ds   #%zCountry of Birthcountryr&   r)   typer*   r+   )dictr/   boolappendnext	enumerateleninsert)fieldsnormalized_fieldshas_country_of_birthr+   r*   r3   item	insert_ats           r4   _normalize_istat_birth_fieldsrF      s    HHE{88F11#' 88F//7DMDHHZ78Hxx
+7xH  &   $-.?$@
 
	 (12C(D
 %&I 	  *+!$$		
     c                 h    | j                         D ci c]  \  }}|t        |       c}}S c c}}w N)itemsrF   )sectionssectionrA   s      r4   _normalize_istat_sectionsrM   M   s?      (~~//OGV 	.v66/  s   .c                       e Zd Zej                  gZ edgeddi edddddd	d
ddddddddddddddddgiddgddd      g      d        Z	y) CreateCheckInTemplateAPIViewGuest Check-In Forms   NCreate Check-in TemplatezItaly Online Check-inzitaly-online-checkinz/Online check-in form for Italian law compliance
first_name
First NametextmainTr	   )r&   r)   
field_typetargetis_requiredordernationalityNationalityselectbothchoicesITItaly)valuer)   FRFrance   )r&   r)   rW   rX   rY   metarZ      )namer&   descriptionrA   structure_idrb   request_only)tagsrequest	responsesexamplesc                     t        |j                        }|j                  d       |j                          t	        ddit
        j                        S )NdataTraise_exceptionmessagez&Check-in template created successfullyr   )r   rs   is_validsaver   r   HTTP_201_CREATEDselfrn   
serializers      r4   postz!CreateCheckInTemplateAPIView.postV   sM    T 5',,G
D1@A**
 	
rG   )
__name__
__module____qualname__r   r   permission_classesr   r   r   r~    rG   r4   rO   rO   S   s    %556$%/+*32#T %1%1*0&,+/%& %2%2*2&,+/ ).2W$E.2X$F,"% &'0 %'9< "A!#
	(R
S(R
rG   rO   rP   zGet check-in formsz:Returns all check-in form templates with linked structures)rm   summaryri   c                       e Zd ZegZeZej                  j                  d      j                   e
dej                  j                  d                  Zy)CheckInTemplateListAPIViewrA   structure_links	structurequerysetN)r   r   r   r   r   r   serializer_classr
   objectsprefetch_relatedr   r   select_relatedr   r   rG   r4   r   r      sX     **4 			(	#		!199HHU

 rG   r   zLink check-in form to structurez.Links an existing check-in form to a structurerQ   N)rm   r   ri   rn   ro   c                   ,    e Zd Zej                  gZd Zy)LinkTemplateToStructureAPIViewc                     t        |j                        }|j                  d       |j                          t	        ddit
        j                        S )Nrr   Trt   rv   z.Check-in form linked to structure successfullyrw   )r   rs   rx   ry   r   r   rz   r{   s      r4   r~   z#LinkTemplateToStructureAPIView.post   sJ    6GLLI
D1HI**
 	
rG   N)r   r   r   r   r   r   r~   r   rG   r4   r   r      s     &556
rG   r   z"Get structures with check-in formsz@Returns structures with address details and linked check-in formc                       e Zd ZegZeZd Zy)StructureCheckInFormsAPIViewc                    t         j                  j                  t        dd      t        dd            j	                  t        dt        j                  j                  d                  }g }|D ]  }t        d	 |j                  j                         D        d       }|j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |rB|j(                  j                  |j(                  j                  |j(                  j*                  d
nd t-        |      d
        t/        |      S )N
propertiesT)distinctproperty_types)total_properties_counttotal_property_types_countcheckin_templatestemplater   c              3   :   K   | ]  }|j                   s|  y wrI   )	is_active)r1   links     r4   r5   z4StructureCheckInFormsAPIView.list.<locals>.<genexpr>   s     V"C$t~~"Cs   )idrh   r&   )
rj   structure_namestructure_typestreet_addresszip_coder7   r   r   checkin_formr   )r!   r   annotater   r   r   r   r   r=   r   allr<   r   rh   r   r   r   r7   r   r   r   r&   r;   r   )r|   rn   argskwargs
structuresresponser   active_links           r4   listz!StructureCheckInFormsAPIView.list   s?   X',\D'I+01AD+Q   '5==LLZX 	 #IV)"="="A"A"CVK
 OO )"+.."+":":"+":":%..$,,*3*J*J.7.R.R #	 *2255 + 4 4 9 9 + 4 4 9 9
 )-!+.#  $4 !!rG   N)r   r   r   r   r   r   r   r   r   rG   r4   r   r      s     **5+"rG   r   zGet structure check-in formzSReturns check-in form fields for a structure or default fields if no form is linkedc                       e Zd ZegZd Zy)GetStructureCheckInFormAPIViewc                    t        t        |      }t        j                  j	                  d      j                  d      j                  |d      j                         }|sg g d}t        t        d      }t        t        d	      }|D ];  }|j                  d
      }	|	d   |d<   d|	v r|	d   |d<   |d   j                  |       = |D ];  }|j                  d
      }	|	d   |d<   d|	v r|	d   |d<   |d	   j                  |       = t        d ddddt        |      d      S |j                  }
|
j                   j                  d      }g g d}|D ]E  }|j"                  xs i }	|	j%                  d      }||v s)||   j                  t'        |             G t        |
j(                  |
j*                  |
j,                  |
j.                  dt        |      d      S )Nr   r   template__fieldsTr   r   
main_guestadditional_guestr   rL   r   rf   r+   r_   Default Hotel Check-indefault-hotel-check-in!Default fields for hotel check-inr   rh   r&   ri   r   rK   
is_enabledrL   )r   r!   r   r   r   r   filterfirstr   r"   r#   popr<   r   rM   r   rA   rf   r/   r    r   rh   r&   ri   )r|   rn   rj   r   r   rK   main_fieldsadditional_fieldsrD   rf   r   rA   r3   rL   s                 r4   r/   z"GetStructureCheckInFormAPIView.get   s   %iLA	 %,,^J'01Vi4V8UW 	  $&H
 1)$K !7/*!
 $xx'#'
#3Z $&*9oDO&--d3 $ *xx'#'
#3Z $&*9oDO+,33D9 * 44#F	 6h?   ==''4'8  "

 E::#Dhhy)G("!((+E2  kk  '33	 2(;
  	rG   Nr   r   r   r   r   r/   r   rG   r4   r   r      s     #MrG   r   z Get check-in form by booking UIDziReturns check-in form fields based on booking structure. Falls back to defaults if no template is linked.c                       e Zd ZegZd Zy)!GetCheckInFormByBookingUIDAPIViewc           
         t        t        j                  j                  d      |      }t        j                  j                  d      j                  d      j                  |j                  d      j                         }|sg g d}t        t        d	      }t        t        d
	      }|D ];  }|j                  d      }	|	d   |d<   d|	v r|	d   |d<   |d   j                  |       = |D ];  }|j                  d      }	|	d   |d<   d|	v r|	d   |d<   |d
   j                  |       = t        t        |j                         |j                  j"                  dd dddd|d      S |j$                  }
|
j&                  j                  d      }g g d}|D ]E  }|j(                  xs i }	|	j+                  d      }||v s)||   j                  t-        |             G t        t        |j                         |j                  j"                  d|
j"                  |
j.                  |
j0                  |
j2                  dt5        |      d      S )Nr   uidr   r   Tr   r   r   r   r   rf   r+   r_   defaultr   r   r   r   )booking_uidrj   sourcer   rK   r   rL   )r   r   r   r   r   r   r   r   r   r   r"   r#   r   r<   r   strr   r   r   rA   rf   r/   r    rh   r&   ri   rM   )r|   rn   r   bookingr   rK   r   r   rD   rf   r   rA   r3   rL   s                 r4   r/   z%GetCheckInFormByBookingUIDAPIView.getF  sh   #OO**;7
 %,,^J'01V!++   UW 	  $&H
 1)$K !7/*!
 $xx'#'
#3Z $&*9oDO&--d3 $ *xx'#'
#3Z $&*9oDO+,33D9 * "7;;/ ' 1 1 4 4#44#F	 %   ==''4'8  "

 E::#Dhhy)G("!((+E2  w{{+#--00 kk  '33	 2(;
  	rG   Nr   r   rG   r4   r   r   >  s     #[rG   r   zCreate check-in form templaterR   r   r   rS   z
First namerU   Fr%   r8   r   )rh   ri   rK   Trk   )rm   r   rn   ro   rp   c                       e Zd ZegZd Zy)rO   c                     t        |j                        }|j                  d       |j                          t	        ddit
        j                        S )Nrr   Trt   rv   z"Check-in form created successfullyrw   )r   rs   rx   ry   r   r   rz   r{   s      r4   r~   z!CreateCheckInTemplateAPIView.post  sJ    4',,G
D1<=**
 	
rG   Nr   r   r   r   r   r~   r   rG   r4   rO   rO     s    J **
rG   zUpdate check-in form   zUpdate Check-in TemplatezUpdated Hotel Check-inz!Updated fields for hotel check-inrT   emailzEmail AddressContactc                       e Zd ZegZd Zy)UpdateCheckInTemplateAPIViewc                     t        t        |      }t        ||j                        }|j	                  d       |j                          t        ddit        j                        S )Npk)instancers   Trt   rv   z"Check-in form updated successfullyrw   )	r   r
   r   rs   rx   ry   r   r   HTTP_200_OK)r|   rn   r   r   r}   s        r4   putz UpdateCheckInTemplateAPIView.put  s^    $_<4

 	D1<=%%
 	
rG   N)r   r   r   r   r   r   r   rG   r4   r   r     s    X **
rG   r   zGet default check-in fieldszIReturns default fields in flat structure for creating a new check-in formc                       e Zd ZegZd Zy)DefaultCheckInFieldsAPIViewc           	      l    t        dd ddddt        t        d      t        t        d      d	d
      S )Nr   r   r   r   r   r   r   r   r   )r   r   rK   )r   r   r"   r#   )r|   rn   s     r4   r/   zDefaultCheckInFieldsAPIView.get  sM    00B	 5-( %;3.%	
  	rG   Nr   r   r   r   r   r/   r   rG   r4   r   r     s     **rG   r   zGet or update check-in template)rm   r   c                       e Zd ZegZd Zy)CheckInTemplateDetailAPIViewc           
      R   t        t        j                  j                  d      |      }g g d}|j                  j                  d      j                  dd      D ]  }|j                  xs i }|j                  d      }||v s)||   j                  |j                  |j                  |j                  |j                  |j                  d	      d
d|v rd|d   ini         t        |j                  |j                   |j                  |j"                  dt%        |      d      S )NrA   r   r   Tr   rZ   r   rL   r+   r8   r_   r   r   )r   r
   r   r   rA   r   order_byrf   r/   r<   r&   r)   rW   rY   r   r   rh   ri   rM   )r|   rn   r   r   rK   r3   rf   rL   s           r4   r/   z CheckInTemplateDetailAPIView.get5  s$   $##44X>
  "

 __++t+<EEgtTE::#Dhhy)G("!((!JJ"[[!,, % 1 1 $ 4* 8AD7H	4	?3b*  U kk  '33	 2(;
  	rG   Nr   r   rG   r4   r   r   -  s     **!rG   r   zDelete check-in templatez<Deletes a check-in form if it is not linked to any structurec                       e Zd ZegZd Zy)DeleteCheckInTemplateAPIViewc                    t        t        |      }t        j                  j	                  |      j                         rt        ddit        j                        S |j                          t        ddit        j                        S )Nr   )template_iderrorzMThis check-in form is linked to one or more structures and cannot be deleted.rw   rv   z"Check-in form deleted successfully)r   r
   r   r   r   existsr   r   HTTP_400_BAD_REQUESTdeleter   )r|   rn   r   r   s       r4   r   z#DeleteCheckInTemplateAPIView.delete`  s    $_E $++22# 3 

&( 1 22  	<=%%
 	
rG   N)r   r   r   r   r   r   r   rG   r4   r   r   X  s     **
rG   r   z'Unlink check-in template from structurez:Removes the check-in template association from a structurec                       e Zd ZegZd Zy)"UnlinkTemplateFromStructureAPIViewc                     t        |j                        }|j                  d       |j                          t	        ddit
        j                        S )Nrr   Trt   rv   z6Check-in template unlinked from structure successfullyrw   )r   rs   rx   ry   r   r   r   r{   s      r4   r~   z'UnlinkTemplateFromStructureAPIView.post  sJ    :M
D1PQ%%
 	
rG   Nr   r   rG   r4   r   r   x  s     **
rG   r   zGuest Check-InzSubmit guest check-in formz}Public endpoint to submit guest check-in details using a valid booking UID. Creates or replaces guests linked to the booking.zSubmit Check-Inguests	full_namezJohn Doeis_main_guestzjohn@example.comphonez+49123456789r-   z
1990-05-12gendermaledocument_typepassport	id_numberX1234567document_issue_datez
2018-01-01document_expiry_datez
2028-01-01document_issuing_countryra   r[   ItalianaddresszVia Roma 10r   00100r7   cityRomezJane Doez
1992-08-20female)r   r   r-   r   r[   )rm   r   ri   rn   ro   rp   c                       e Zd ZegZd Zy)SubmitCheckInAPIViewc           	         t        t        j                  j                  d      |      }|j                  |j
                  j                  dg       d}t        |      }|j                  d       |j                         }t        |d   |d	   |d
   t        |d   d      j
                  ddt        j                        S )Nr   r   r   )
booking_idr   rr   Trt   r  is_checked_inchecked_in_at)manyzCheck-in submitted successfully)r  r  r  r   rv   rw   )r   r   r   r   r   rs   r/   r   rx   ry   r   r   r   rz   )r|   rn   r   r   payloadr}   results          r4   r~   zSubmitCheckInAPIView.post  s    #OO**;7
 "**ll&&x4

 'G4
D1"$\2!'!8!'!8)&*:FKK< **	
 		
rG   N)r   r   r   r   r   r~   r   rG   r4   r  r    s    \ #
rG   r  )>rest_framework.genericsr   rest_framework.permissionsr   r   drf_spectacular.utilsr   django.db.modelsr   r   modelsr
   r   r   rest_framework.viewsr   rest_framework.responser   rest_frameworkr   r   r   properties.modelsr   bookings.modelsr   guests.serializersr   r   r   serializersr   r   r   r   r   r   r   django.shortcutsr   utilsr   r    structures.modelsr!   default_fieldsr"   r#   rF   rM   rO   r   r   r   r   r   r   r   r   r   r   r  r   rG   r4   <module>r     s   / @ / , S S ( , . ? & # K . ~  ~  ~ . B '.b4
7 4
l 
 	! L
 
 
 	!-@-Dk
W 

 
 	!0R
/"; /"
/"b 
 	!)e
PW P
Pd 
 	!.{
^ ^
^@ 
 	!++Dk&0B %1%1$*(-(7# %1%1$*(-(7)0 5	
#H

7 

I#H

 
 	!"+Dk&0B %1%1$*(,(7 %,%4$+(,(1#$ %1%1$*(,(7)#> C"	
$*V
7 
W*V
  
 	!)[
' 
2 
 	!-
$7 $
$L 
 	!&N

7 


6 
 	!5L1Dk
 

 
	(	< -.#Z'  !3  	
 ( !& ( $Z .| / 3G &y "= #G "7  !& &0).)5"*'0': ? 	
",Z
7 
[,Z
rG   