Class: SpreeCmCommissioner::Integrations::Larryta::Inventory::UnstockInventory
- Inherits:
-
Object
- Object
- SpreeCmCommissioner::Integrations::Larryta::Inventory::UnstockInventory
- Includes:
- Spree::ServiceModule::Base
- Defined in:
- app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb
Instance Method Summary collapse
-
#call(integration:, order:, line_items:) ⇒ Object
Larryta booking confirmation flow (per guest): This service handles: 1.
-
#confirm_guest!(integration, order, guest) ⇒ Object
Confirm a single guest’s booking with Larryta.
-
#confirm_line_item!(integration, order, line_item) ⇒ Object
Confirm a single line item with Larryta Each guest in the line item gets their booking confirmed.
Instance Method Details
#call(integration:, order:, line_items:) ⇒ Object
Larryta booking confirmation flow (per guest): This service handles:
-
Update booking info (POST /gateway/update_info) - payment details
-
Confirm booking (POST /gateway/confirm_booking)
-
Check transaction (POST /gateway/check_transaction) - fallback verification
Each guest’s booking is confirmed with payment information
14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb', line 14 def call(integration:, order:, line_items:) ApplicationRecord.transaction do line_items.each do |line_item| raise SpreeCmCommissioner::Integrations::SyncError, 'Invalid guests' if line_item.guests.size != line_item.quantity confirm_line_item!(integration, order, line_item) end success(order: order, line_items: line_items) end rescue SpreeCmCommissioner::Integrations::SyncError, SpreeCmCommissioner::Integrations::ExternalClientError => e failure(nil, e.) end |
#confirm_guest!(integration, order, guest) ⇒ Object
Confirm a single guest’s booking with Larryta
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 |
# File 'app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb', line 45 def confirm_guest!(integration, order, guest) # rubocop:disable Metrics/AbcSize guest_mapping = guest.integration_mappings.find_by(integration: integration, status: :active) raise SpreeCmCommissioner::Integrations::SyncError, "Seat not held for guest ##{guest.id}" if guest_mapping.nil? guest_payload = guest_mapping.external_payload # Skip if already confirmed (idempotent for retries) return if guest_payload['seat_status'] == 'reserved' # Ensure seat is in 'hold' state before confirming raise SpreeCmCommissioner::Integrations::SyncError, "Seat not in hold state for guest ##{guest.id}" if guest_payload['seat_status'] != 'hold' session_token = guest_payload['session_token'] booking_code = guest_payload['booking_code'] passenger_id = guest_payload['passenger_id'] raise SpreeCmCommissioner::Integrations::SyncError, "Invalid session_token for guest ##{guest.id}" if session_token.blank? raise SpreeCmCommissioner::Integrations::SyncError, "Invalid booking_code for guest ##{guest.id}" if booking_code.blank? raise SpreeCmCommissioner::Integrations::SyncError, "Invalid passenger_id for guest ##{guest.id}" if passenger_id.blank? # Step 1: Update booking info with payment details payment = order.payments.last raise SpreeCmCommissioner::Integrations::SyncError, 'No completed payment found for order' if payment.nil? integration.client.update_booking_info!( session_token: session_token, customer_id: passenger_id, payment_type: 'wallet', payment_id: payment.number, remark: booking_code, internal_order: order ) # Step 2: Confirm booking integration.client.confirm_booking!( session_token: session_token, internal_order: order ) # Verify confirmation via check_transaction and get full transaction details inventory_status = SpreeCmCommissioner::Integrations::Larryta::Inventory::ExternalInventoryItemStatus.new result = inventory_status.call( integration: integration, order: order, options: { session_token: session_token } ) raise_sync_error(result.error) unless result.success? item_status = result.value[:item_status] guest_payload['booking_status'] = item_status.status ? 'confirmed' : 'pending' guest_payload['payment_status'] = item_status.payment_type guest_payload['confirmed'] = item_status.status guest_payload['seat_status'] = 'reserved' guest_payload['transaction_status'] = item_status.to_h guest_mapping.mark_as_active!(external_payload: guest_payload) end |
#confirm_line_item!(integration, order, line_item) ⇒ Object
Confirm a single line item with Larryta Each guest in the line item gets their booking confirmed
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb', line 31 def confirm_line_item!(integration, order, line_item) line_item_mapping = line_item.integration_mappings.find_by(integration: integration) raise SpreeCmCommissioner::Integrations::SyncError, "Seats not held for line item ##{line_item.id}" if line_item_mapping.nil? # Confirm each guest's booking individually line_item.guests.each do |guest| confirm_guest!(integration, order, guest) end # Mark line item as active (fully confirmed) line_item_mapping.mark_as_active!(external_payload: line_item_mapping.external_payload) end |