diff --git a/src/alpine_bits_python/alpine_bits_helpers.py b/src/alpine_bits_python/alpine_bits_helpers.py index 6eeee3b..618c521 100644 --- a/src/alpine_bits_python/alpine_bits_helpers.py +++ b/src/alpine_bits_python/alpine_bits_helpers.py @@ -672,141 +672,146 @@ def create_xml_from_db(list: list[Tuple[Reservation, Customer]]): for reservation, customer in list: _LOGGER.info(f"Creating XML for reservation {reservation.form_id} and customer {customer.given_name}") - phone_numbers = [(customer.phone, PhoneTechType.MOBILE)] if customer.phone is not None else [] - customer_data = CustomerData( - given_name=customer.given_name, - surname=customer.surname, - name_prefix=customer.name_prefix, - name_title=customer.name_title, - phone_numbers=phone_numbers, - email_address=customer.email_address, - email_newsletter=customer.email_newsletter, - address_line=customer.address_line, - city_name=customer.city_name, - postal_code=customer.postal_code, - country_code=customer.country_code, - address_catalog=customer.address_catalog, - gender=customer.gender, - birth_date=customer.birth_date, - language=customer.language, - ) - alpine_bits_factory = AlpineBitsFactory() - res_guests = alpine_bits_factory.create_res_guests( - customer_data, OtaMessageType.RETRIEVE - ) + try: - # Guest counts - children_ages = [int(a) for a in reservation.children_ages.split(",") if a] - guest_counts = GuestCountsFactory.create_retrieve_guest_counts( - reservation.num_adults, children_ages - ) - - - unique_id_string = reservation.form_id - - - if len(unique_id_string) > 32: - unique_id_string = unique_id_string[:32] # Truncate to 32 characters - - # UniqueID - unique_id = OtaResRetrieveRs.ReservationsList.HotelReservation.UniqueId( - type_value=UniqueIdType2.VALUE_14, id=unique_id_string - ) - - # TimeSpan - time_span = OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay.TimeSpan( - start=reservation.start_date.isoformat() if reservation.start_date else None, - end=reservation.end_date.isoformat() if reservation.end_date else None, - ) - room_stay = ( - OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay( - time_span=time_span, - guest_counts=guest_counts, + phone_numbers = [(customer.phone, PhoneTechType.MOBILE)] if customer.phone is not None else [] + customer_data = CustomerData( + given_name=customer.given_name, + surname=customer.surname, + name_prefix=customer.name_prefix, + name_title=customer.name_title, + phone_numbers=phone_numbers, + email_address=customer.email_address, + email_newsletter=customer.email_newsletter, + address_line=customer.address_line, + city_name=customer.city_name, + postal_code=customer.postal_code, + country_code=customer.country_code, + address_catalog=customer.address_catalog, + gender=customer.gender, + birth_date=customer.birth_date, + language=customer.language, ) - ) - room_stays = OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays( - room_stay=[room_stay], - ) - hotel_res_id_data = HotelReservationIdData( - res_id_type="13", - res_id_value=reservation.fbclid or reservation.gclid, - res_id_source=None, - res_id_source_context="99tales", - ) - - hotel_res_id = alpine_bits_factory.create( - hotel_res_id_data, OtaMessageType.RETRIEVE - ) - hotel_res_ids = OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.HotelReservationIds( - hotel_reservation_id=[hotel_res_id] - ) - basic_property_info = OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.BasicPropertyInfo( - hotel_code=reservation.hotel_code, - hotel_name=reservation.hotel_name, - ) - # Comments - - offer_comment = None - if reservation.offer is not None: - offer_comment = CommentData( - name=CommentName2.ADDITIONAL_INFO, - text="Angebot/Offerta", - list_items=[ - CommentListItemData( - value=reservation.offer, - language=customer.language, - list_item="1", - ) - ], + alpine_bits_factory = AlpineBitsFactory() + res_guests = alpine_bits_factory.create_res_guests( + customer_data, OtaMessageType.RETRIEVE ) - comment = None - if reservation.user_comment: - comment = CommentData( - name=CommentName2.CUSTOMER_COMMENT, - text=reservation.user_comment, - list_items=[ - CommentListItemData( - value="Landing page comment", - language=customer.language, - list_item="1", - ) - ], + + # Guest counts + children_ages = [int(a) for a in reservation.children_ages.split(",") if a] + guest_counts = GuestCountsFactory.create_retrieve_guest_counts( + reservation.num_adults, children_ages ) - comments = [offer_comment, comment] - # filter out None comments - comments = [c for c in comments if c is not None] - comments_xml = None - if comments: + unique_id_string = reservation.form_id - for c in comments: - _LOGGER.info(f"Creating comment: name={c.name}, text={c.text}, list_items={len(c.list_items)}") - - comments_data = CommentsData(comments=comments) - comments_xml = alpine_bits_factory.create(comments_data, OtaMessageType.RETRIEVE) - res_global_info = ( - OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo( - hotel_reservation_ids=hotel_res_ids, - basic_property_info=basic_property_info, - comments=comments_xml, + if len(unique_id_string) > 32: + unique_id_string = unique_id_string[:32] # Truncate to 32 characters + + # UniqueID + unique_id = OtaResRetrieveRs.ReservationsList.HotelReservation.UniqueId( + type_value=UniqueIdType2.VALUE_14, id=unique_id_string ) - ) - + # TimeSpan + time_span = OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay.TimeSpan( + start=reservation.start_date.isoformat() if reservation.start_date else None, + end=reservation.end_date.isoformat() if reservation.end_date else None, + ) + room_stay = ( + OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay( + time_span=time_span, + guest_counts=guest_counts, + ) + ) + room_stays = OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays( + room_stay=[room_stay], + ) + hotel_res_id_data = HotelReservationIdData( + res_id_type="13", + res_id_value=reservation.fbclid or reservation.gclid, + res_id_source=None, + res_id_source_context="99tales", + ) - hotel_reservation = OtaResRetrieveRs.ReservationsList.HotelReservation( - create_date_time=datetime.now(timezone.utc).isoformat(), - res_status=HotelReservationResStatus.REQUESTED, - room_stay_reservation="true", - unique_id=unique_id, - room_stays=room_stays, - res_guests=res_guests, - res_global_info=res_global_info, - ) + hotel_res_id = alpine_bits_factory.create( + hotel_res_id_data, OtaMessageType.RETRIEVE + ) + hotel_res_ids = OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.HotelReservationIds( + hotel_reservation_id=[hotel_res_id] + ) + basic_property_info = OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.BasicPropertyInfo( + hotel_code=reservation.hotel_code, + hotel_name=reservation.hotel_name, + ) + # Comments - reservations_list.append(hotel_reservation) + offer_comment = None + if reservation.offer is not None: + offer_comment = CommentData( + name=CommentName2.ADDITIONAL_INFO, + text="Angebot/Offerta", + list_items=[ + CommentListItemData( + value=reservation.offer, + language=customer.language, + list_item="1", + ) + ], + ) + comment = None + if reservation.user_comment: + comment = CommentData( + name=CommentName2.CUSTOMER_COMMENT, + text=reservation.user_comment, + list_items=[ + CommentListItemData( + value="Landing page comment", + language=customer.language, + list_item="1", + ) + ], + ) + comments = [offer_comment, comment] + + # filter out None comments + comments = [c for c in comments if c is not None] + + comments_xml = None + if comments: + + for c in comments: + _LOGGER.info(f"Creating comment: name={c.name}, text={c.text}, list_items={len(c.list_items)}") + + comments_data = CommentsData(comments=comments) + comments_xml = alpine_bits_factory.create(comments_data, OtaMessageType.RETRIEVE) + + res_global_info = ( + OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo( + hotel_reservation_ids=hotel_res_ids, + basic_property_info=basic_property_info, + comments=comments_xml, + ) + ) + + + + hotel_reservation = OtaResRetrieveRs.ReservationsList.HotelReservation( + create_date_time=datetime.now(timezone.utc).isoformat(), + res_status=HotelReservationResStatus.REQUESTED, + room_stay_reservation="true", + unique_id=unique_id, + room_stays=room_stays, + res_guests=res_guests, + res_global_info=res_global_info, + ) + + reservations_list.append(hotel_reservation) + + except Exception as e: + _LOGGER.error(f"Error creating XML for reservation {reservation.form_id} and customer {customer.given_name}: {e}") retrieved_reservations = OtaResRetrieveRs.ReservationsList( hotel_reservation=reservations_list