Class: SevenRooms::Reservations::Create

Inherits:
Object
  • Object
show all
Includes:
DefaultErrorContainer, ApiHelpers
Defined in:
app/services/seven_rooms/reservations/create.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from DefaultErrorContainer

#error, #error_message_simple, #merge_errors

Methods included from ApiHelpers

#api_uri, #auth_headers, #common_headers, #find_seven_rooms_vendor_application, #parse_user_or_guest_full_name, #parsed_vendor_name, #send_error_availability_notification_to_staff, #sevenrooms_credit_card_error?, #standardize_or_default_phone

Constructor Details

#initialize(reservation = nil, actor = nil, is_vendor_prepaid_reservation = false, reference_id = nil, reseller_reference_id = nil) ⇒ Create

Returns a new instance of Create.



13
14
15
16
17
18
19
20
21
22
# File 'app/services/seven_rooms/reservations/create.rb', line 13

def initialize(reservation = nil, actor = nil, is_vendor_prepaid_reservation = false, reference_id = nil, reseller_reference_id = nil)
  @reservation = reservation.decorate if reservation.present?
  @is_vendor_prepaid_reservation = is_vendor_prepaid_reservation
  @reference_id = reference_id
  @reseller_reference_id = reseller_reference_id
  if actor.is_a?(String) && actor.to_sym == :user
    @blockage_id = @reservation&.inventory_sevenrooms_blockage&.blockage_id
  end
  BUSINESS_LOGGER.set_business_context({ reservation_id: reservation&.id, blockage_id: @blockage_id })
end

Instance Attribute Details

#blockage_idObject (readonly)

Returns the value of attribute blockage_id.



11
12
13
# File 'app/services/seven_rooms/reservations/create.rb', line 11

def blockage_id
  @blockage_id
end

#reservationObject (readonly)

Returns the value of attribute reservation.



11
12
13
# File 'app/services/seven_rooms/reservations/create.rb', line 11

def reservation
  @reservation
end

Instance Method Details

#executeObject

Executes the creation of a reservation in SevenRooms.

Returns a ServiceResult object with the following attributes:

  • data: The result of creating the SevenRoomsReservation record.

  • errors: Any errors that occurred during the execution.

  • message: A message indicating the result of the execution.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'app/services/seven_rooms/reservations/create.rb', line 30

def execute
  errors.clear
  error_message = SevenRooms::ErrorMessages::DEFAULT_ERROR

  # Validate reservation
  validation_result = validate_reservation
  unless validation_result.success?
    error_message = validation_result.message
    errors.add(:base, error_message)

    return ServiceResult.new errors: errors, message: error_message
  end

  # Create reservation in SevenRooms
  seven_rooms_reservation = create_reservation(validation_result.data[:concierge_id],
                                               validation_result.data[:venue_id], reservation_params)

  unless seven_rooms_reservation.success?
    # retry logic for known errors
    if seven_rooms_reservation.message == SevenRooms::ErrorMessages::INVALID_PHONE_NUMBER_ERROR
      error_message = "#{self.class}: SevenRooms rejected booking due to invalid phone number, retrying now with default phone"
      BUSINESS_LOGGER.error(error_message, errors: seven_rooms_reservation.message,
                                           reservation_params: reservation_params)
      APMErrorHandler.report(error_message, errors: seven_rooms_reservation.message,
                                            reservation_params: reservation_params)

      updated_res_params = reservation_params.dup
      updated_res_params[:phone] = Phonelib.parse(AdminSetting.support_phone).full_e164
      seven_rooms_reservation = create_reservation(validation_result.data[:concierge_id],
                                                   validation_result.data[:venue_id], updated_res_params)
    elsif seven_rooms_reservation.message == SevenRooms::ErrorMessages::NOT_ALLOWED_MULTIPLE_BOOKINGS_ERROR
      error_message = "#{self.class}: SevenRooms rejected booking due to not allowed multiple bookings, retrying now with edited name"
      BUSINESS_LOGGER.error(error_message, errors: seven_rooms_reservation.message,
                                           reservation_params: reservation_params)
      APMErrorHandler.report(error_message, errors: seven_rooms_reservation.message,
                                            reservation_params: reservation_params)

      updated_res_params = reservation_params.dup
      updated_res_params[:first_name] = "#{reservation_params[:first_name]}-#{reservation.id}"
      seven_rooms_reservation = create_reservation(validation_result.data[:concierge_id],
                                                   validation_result.data[:venue_id], updated_res_params)
    end
  end

  unless seven_rooms_reservation.success?
    error_message = seven_rooms_reservation.message

    if SevenRooms::ErrorMessages::INVENTORY_ERRORS.include?(error_message)
      Vendors::SevenRooms::ReservationInventorySyncWorker.perform_async(reservation.restaurant_id,
                                                                        reservation.date,
                                                                        :inv_mismatch)
    end

    errors.add(:base, error_message)
    BUSINESS_LOGGER.error("#{self.class}: #{seven_rooms_reservation.message}",
                          reservation_params: reservation_params)
    APMErrorHandler.report("#{self.class}: #{seven_rooms_reservation.message}",
                           reservation_params: reservation_params)
    # send notif to ops team if error related to inventory
    if reservation.created_by.to_sym == :user
      send_error_availability_notification_to_staff(reservation,
                                                    error_message,
                                                    reservation.date.to_s,
                                                    reservation.start_time_format,
                                                    reservation.party_size,
                                                    :create)
    end

    return ServiceResult.new errors: errors, message: error_message
  end

  # Create SevenRoomsReservation record
  result = create_seven_rooms_reservation(seven_rooms_reservation.data)
  if result.blank?
    error_message = "Error creating SevenRooms reservation #{seven_rooms_reservation.data['reservation_id']} for reservation #{reservation.id}"
    unless SevenRooms::ErrorMessages::KNOWN_ERRORS.include?(error_message)
      APMErrorHandler.report("#{self.class} #{error_message}", reservation_id: reservation.id,
                                                               restaurant_id: reservation.restaurant_id)
    end
    errors.add(:base, error_message)

    return ServiceResult.new errors: errors, message: error_message
  end
  VendorsService::VendorPaymentService.new(reservation).save_vendor_payment if [:admin,
                                                                                :owner].include?(reservation.created_by.to_sym)

  ServiceResult.new data: result
end