spree_cm_commissioner 2.0.3.pre.pre.pre7 → 2.1.0.pre.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_build_gem.yml +16 -2
- data/.gitignore +2 -1
- data/Gemfile.lock +39 -4
- data/Rakefile +33 -4
- data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +8 -11
- data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
- data/app/controllers/spree/admin/locations_controller.rb +62 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
- data/app/controllers/spree/api/v2/platform/places_controller.rb +4 -1
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
- data/app/controllers/spree/api/v2/storefront/dynamic_fields_controller.rb +1 -1
- data/app/controllers/spree/api/v2/storefront/guests_controller.rb +26 -18
- data/app/controllers/spree/api/v2/storefront/inventory_items_controller.rb +57 -0
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +46 -0
- data/app/controllers/spree/api/v2/storefront/trip_places_controller.rb +29 -0
- data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +62 -0
- data/app/controllers/spree/api/v2/storefront/trips_controller.rb +24 -0
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
- data/app/interactors/spree_cm_commissioner/billing_address_creator.rb +33 -0
- data/app/interactors/spree_cm_commissioner/customer_notification_sender.rb +7 -2
- data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
- data/app/interactors/spree_cm_commissioner/fetch_facebook_user_data.rb +45 -0
- data/app/interactors/spree_cm_commissioner/google_places_fetcher.rb +1 -0
- data/app/interactors/spree_cm_commissioner/intercity_taxi_order_creator.rb +106 -0
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
- data/app/interactors/spree_cm_commissioner/taxi_trip_creator.rb +66 -0
- data/app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb +136 -0
- data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +155 -0
- data/app/interactors/spree_cm_commissioner/user_fb_token_authenticator.rb +37 -0
- data/app/interactors/spree_cm_commissioner/user_fb_token_checker.rb +20 -0
- data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +8 -8
- data/app/interactors/spree_cm_commissioner/user_registration_with_fb_token.rb +62 -0
- data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +62 -0
- data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +41 -0
- data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
- data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
- data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
- data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +18 -15
- data/app/models/concerns/spree_cm_commissioner/line_item_guests_concern.rb +29 -15
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +144 -0
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -12
- data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
- data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
- data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/user_identity.rb +12 -4
- data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +11 -0
- data/app/models/spree_cm_commissioner/address_decorator.rb +36 -2
- data/app/models/spree_cm_commissioner/block.rb +43 -0
- data/app/models/spree_cm_commissioner/customer_notification.rb +6 -1
- data/app/models/spree_cm_commissioner/dynamic_field.rb +2 -0
- data/app/models/spree_cm_commissioner/guest.rb +39 -0
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +4 -0
- data/app/models/spree_cm_commissioner/inventory.rb +11 -0
- data/app/models/spree_cm_commissioner/inventory_item.rb +82 -0
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +47 -78
- data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
- data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
- data/app/models/spree_cm_commissioner/order/address_book_decorator.rb +30 -12
- data/app/models/spree_cm_commissioner/order_decorator.rb +38 -1
- data/app/models/spree_cm_commissioner/place.rb +3 -4
- data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
- data/app/models/spree_cm_commissioner/product_decorator.rb +13 -10
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
- data/app/models/spree_cm_commissioner/reserved_block.rb +31 -0
- data/app/models/spree_cm_commissioner/saved_guest.rb +21 -0
- data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
- data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
- data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
- data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
- data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
- data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
- data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -1
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
- data/app/models/spree_cm_commissioner/trip.rb +19 -10
- data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
- data/app/models/spree_cm_commissioner/trip_stop.rb +10 -21
- data/app/models/spree_cm_commissioner/variant_block.rb +17 -0
- data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -47
- data/app/models/spree_cm_commissioner/variant_options.rb +4 -23
- data/app/models/spree_cm_commissioner/vehicle.rb +12 -15
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +14 -14
- data/app/models/spree_cm_commissioner/vendor_place.rb +13 -3
- data/app/overrides/spree/admin/shared/sub_menu/_configuration/locations_tab.html.erb.deface +5 -0
- data/app/queries/spree_cm_commissioner/trip_query.rb +110 -131
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/request_schemas/spree_cm_commissioner/inventory_item_schema.rb +8 -0
- data/app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb +20 -0
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
- data/app/serializers/spree/v2/storefront/cart_serializer_decorator.rb +1 -0
- data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +3 -1
- data/app/serializers/spree/v2/storefront/user_serializer_decorator.rb +1 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +15 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/block_serializer.rb +11 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +5 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/inventory_item_serializer.rb +42 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +9 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/saved_guest_serializer.rb +21 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/seat_layout_serializer.rb +12 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/seat_section_serializer.rb +11 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_place_serializer.rb +10 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +14 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +17 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb +20 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +11 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_variant_serializer.rb +12 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_serializer.rb +16 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +16 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/variant_block_serializer.rb +9 -0
- data/app/services/spree_cm_commissioner/transit/legs_builder_service.rb +46 -0
- data/app/services/spree_cm_commissioner/user_authenticator.rb +10 -1
- data/app/views/shared/_map.html.erb +5 -4
- data/app/views/spree/admin/customer_notifications/_form.html.erb +3 -3
- data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
- data/app/views/spree/admin/locations/_form.html.erb +133 -0
- data/app/views/spree/admin/locations/edit.html.erb +11 -0
- data/app/views/spree/admin/locations/index.html.erb +67 -0
- data/app/views/spree/admin/locations/new.html.erb +11 -0
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
- data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
- data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
- data/config/initializers/paper_trail.rb +1 -0
- data/config/initializers/spree_permitted_attributes.rb +24 -4
- data/config/locales/en.yml +2 -0
- data/config/routes.rb +32 -2
- data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
- data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +7 -0
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
- data/db/migrate/20250428092706_add_active_to_cm_customer_notifications.rb +7 -0
- data/db/migrate/20250428103550_remove_tenant_id_and_vendor_id_from_cm_customer_notifications.rb +9 -0
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
- data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
- data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
- data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
- data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
- data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
- data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
- data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
- data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
- data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
- data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
- data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
- data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
- data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
- data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
- data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
- data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
- data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
- data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
- data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
- data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
- data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
- data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
- data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
- data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
- data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
- data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +7 -0
- data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +5 -0
- data/db/migrate/20250731062816_add_departure_time_and_arrival_time_to_trip_stop.rb +6 -0
- data/db/migrate/20250807033035_create_spree_cm_commissioner_saved_guests.rb +23 -0
- data/db/migrate/20250807040000_generate_pickup_time_integer_option_values.rb +71 -0
- data/db/migrate/20250808054835_add_saved_guest_reference_to_cm_blocks.rb +5 -0
- data/docker-compose.yml +1 -1
- data/lib/cm_app_logger.rb +17 -1
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
- data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
- data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +16 -0
- data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
- data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +20 -0
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
- data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
- data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
- data/lib/spree_cm_commissioner/test_helper/factories/saved_guest_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
- data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
- data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
- data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +13 -0
- data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
- data/lib/spree_cm_commissioner/transit/leg.rb +37 -0
- data/lib/spree_cm_commissioner/transit/seat_selection.rb +27 -0
- data/lib/spree_cm_commissioner/trip_query_result.rb +50 -0
- data/lib/spree_cm_commissioner/trip_result.rb +19 -10
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +37 -1
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
- data/lib/tasks/ensure_correct_product_type.rake +7 -0
- data/lib/tasks/generate_inventory_items.rake +7 -0
- data/spree_cm_commissioner.gemspec +7 -0
- metadata +195 -26
- data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
- data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
- data/app/models/spree_cm_commissioner/branch.rb +0 -12
- data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
- data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
- data/app/models/spree_cm_commissioner/stop.rb +0 -23
- data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
- data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
- data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
- data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
- data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
- data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
- data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
- data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
- data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
- data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -0,0 +1,49 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module Seats
|
3
|
+
class BlocksReserver
|
4
|
+
def initialize(line_item_ids:, reserve_by: nil)
|
5
|
+
@line_item_ids = line_item_ids
|
6
|
+
@reserve_by = reserve_by
|
7
|
+
end
|
8
|
+
|
9
|
+
# Mark blocks as reserved for the given line items.
|
10
|
+
#
|
11
|
+
# It ensures:
|
12
|
+
# - Raises an error if already reserved by same guest or other guest.
|
13
|
+
# - Raises an error if currently on_hold by someone else.
|
14
|
+
# - Otherwise, proceeds to reserve the given blocks.
|
15
|
+
def reserve_blocks!
|
16
|
+
line_items = Spree::LineItem.where(id: @line_item_ids).includes(:inventory_items, guests_with_blocks: :block)
|
17
|
+
guests_with_blocks = line_items.flat_map(&:guests_with_blocks).compact
|
18
|
+
inventory_items = line_items.flat_map(&:inventory_items).compact
|
19
|
+
|
20
|
+
ActiveRecord::Base.transaction do
|
21
|
+
guests_with_blocks.each do |guest|
|
22
|
+
inventory_items.each do |inventory_item|
|
23
|
+
reserve_specific_block!(inventory_item, guest)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def reserve_specific_block!(inventory_item, guest)
|
30
|
+
reserved_block = SpreeCmCommissioner::ReservedBlock.find_or_initialize_by(inventory_item_id: inventory_item.id, block_id: guest.block_id)
|
31
|
+
|
32
|
+
raise Errors::BlocksAreReservedByOtherGuest if reserved_block.reserved? && reserved_block.guest_id != guest.id
|
33
|
+
raise Errors::BlocksAreReservedBySameGuest if reserved_block.reserved? && reserved_block.guest_id == guest.id
|
34
|
+
raise Errors::BlocksAreOnHoldByOtherGuest if reserved_block.active_on_hold? && reserved_block.guest_id != guest.id
|
35
|
+
|
36
|
+
# mark the block as reserved if not on_hold or lock by anyone but already expired
|
37
|
+
reserved_block.assign_attributes(
|
38
|
+
guest: guest,
|
39
|
+
status: :reserved,
|
40
|
+
expired_at: nil,
|
41
|
+
inventory_date: inventory_item.inventory_date,
|
42
|
+
updated_by: @reserve_by
|
43
|
+
)
|
44
|
+
|
45
|
+
raise Errors::UnableToSaveReservedBlockRecord unless reserved_block.save
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -3,7 +3,6 @@ module SpreeCmCommissioner
|
|
3
3
|
def self.prepended(base)
|
4
4
|
base.whitelisted_ransackable_attributes |= %w[name abbr country_id]
|
5
5
|
base.has_many :vendors, foreign_key: 'default_state_id', class_name: 'Spree::Vendor', inverse_of: :default_state, dependent: :nullify
|
6
|
-
base.has_many :stops, class_name: 'SpreeCmCommissioner::Place'
|
7
6
|
|
8
7
|
def update_total_inventory
|
9
8
|
update(total_inventory: vendors.pluck(:total_inventory).compact.sum)
|
@@ -1,47 +1,48 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
module Stock
|
3
3
|
class AvailabilityChecker
|
4
|
-
attr_reader :variant, :error_message
|
4
|
+
attr_reader :variant, :options, :error_message
|
5
5
|
|
6
|
-
def initialize(variant)
|
6
|
+
def initialize(variant, options = {})
|
7
7
|
@variant = variant
|
8
|
+
@options = options
|
8
9
|
@error_message = nil
|
9
10
|
end
|
10
11
|
|
11
|
-
def can_supply?(quantity = 1
|
12
|
+
def can_supply?(quantity = 1)
|
12
13
|
return false unless variant.available?
|
13
14
|
return true unless variant.should_track_inventory?
|
14
15
|
return true if variant.backorderable?
|
15
16
|
return true if variant.need_confirmation?
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
return variant.stock_items.sum(:count_on_hand) >= quantity if variant.delivery_required?
|
18
|
+
variant_available?(quantity)
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def variant_available?(quantity = 1)
|
22
|
+
return false if cached_inventory_items.empty?
|
23
|
+
|
24
|
+
cached_inventory_items.all? do |cached_inventory_item|
|
25
|
+
cached_inventory_item.active? && cached_inventory_item.quantity_available >= quantity
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
def cached_inventory_items
|
30
|
+
return @cached_inventory_items if defined?(@cached_inventory_items)
|
31
|
+
|
32
|
+
if variant.permanent_stock?
|
33
|
+
return [] if options[:from_date].blank? || options[:to_date].blank?
|
34
|
+
|
35
|
+
dates = options[:from_date].to_date..options[:to_date].to_date
|
36
|
+
@cached_inventory_items = builder_klass.new(variant_id: variant.id, dates: dates).call
|
37
|
+
@cached_inventory_items = [] if @cached_inventory_items.size != dates.count
|
38
|
+
@cached_inventory_items
|
39
|
+
else
|
40
|
+
@cached_inventory_items = builder_klass.new(variant_id: variant.id).call
|
41
|
+
end
|
36
42
|
end
|
37
43
|
|
38
|
-
def
|
39
|
-
SpreeCmCommissioner::
|
40
|
-
variant: variant,
|
41
|
-
from_date: options[:from_date].to_date,
|
42
|
-
to_date: options[:to_date].to_date,
|
43
|
-
except_line_item_id: options[:except_line_item_id]
|
44
|
-
).available?(quantity)
|
44
|
+
def builder_klass
|
45
|
+
::SpreeCmCommissioner::RedisStock::VariantCachedInventoryItemsBuilder
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -3,7 +3,8 @@ module SpreeCmCommissioner
|
|
3
3
|
module AvailabilityValidatorDecorator
|
4
4
|
# override
|
5
5
|
def item_available?(line_item, quantity)
|
6
|
-
SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item)
|
6
|
+
SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item)
|
7
|
+
.can_supply?(quantity)
|
7
8
|
end
|
8
9
|
end
|
9
10
|
end
|
@@ -8,14 +8,14 @@ module SpreeCmCommissioner
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def can_supply?(quantity)
|
11
|
-
AvailabilityChecker.new(line_item.variant
|
11
|
+
::SpreeCmCommissioner::Stock::AvailabilityChecker.new(line_item.variant, options)
|
12
|
+
.can_supply?(quantity)
|
12
13
|
end
|
13
14
|
|
14
15
|
def options
|
15
16
|
{
|
16
17
|
from_date: line_item.from_date,
|
17
|
-
to_date: line_item.to_date
|
18
|
-
except_line_item_id: line_item.id
|
18
|
+
to_date: line_item.to_date
|
19
19
|
}
|
20
20
|
end
|
21
21
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# On top of SpreeCmCommissioner::Stock::AvailabilityChecker, this class does the same thing but in bulk check with redis.
|
2
|
+
# Which mean, it check basic condition with db first, once pass, it check with redis.
|
3
|
+
module SpreeCmCommissioner
|
4
|
+
module Stock
|
5
|
+
class OrderAvailabilityChecker
|
6
|
+
attr_reader :order
|
7
|
+
|
8
|
+
def initialize(order)
|
9
|
+
@order = order
|
10
|
+
end
|
11
|
+
|
12
|
+
def can_supply_all?
|
13
|
+
insufficient_stock_lines.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
def insufficient_stock_lines
|
17
|
+
cached_inventory_items_group_by_line_item_id.map do |line_item_id, cached_inventory_items|
|
18
|
+
line_item = order.line_items.find { |item| item.id == line_item_id }
|
19
|
+
line_item unless sufficient_stock_for?(line_item, cached_inventory_items)
|
20
|
+
end.compact
|
21
|
+
end
|
22
|
+
|
23
|
+
# {
|
24
|
+
# 1: [ {inventory_key: "inventory:1", active: true, quantity_available: 5, inventory_item_id: 1, variant_id: 1}],
|
25
|
+
# 2: [ {inventory_key: "inventory:2", active: true, quantity_available: 5, inventory_item_id: 2, variant_id: 2}],
|
26
|
+
# }
|
27
|
+
def cached_inventory_items_group_by_line_item_id
|
28
|
+
@cached_inventory_items_group_by_line_item_id ||=
|
29
|
+
::SpreeCmCommissioner::RedisStock::LineItemsCachedInventoryItemsBuilder.new(
|
30
|
+
line_item_ids: order.line_items.pluck(:id)
|
31
|
+
).call
|
32
|
+
end
|
33
|
+
|
34
|
+
def sufficient_stock_for?(line_item, cached_inventory_items)
|
35
|
+
return false unless line_item.variant.available?
|
36
|
+
return true unless line_item.variant.should_track_inventory?
|
37
|
+
return true if line_item.variant.backorderable?
|
38
|
+
return true if line_item.variant.need_confirmation?
|
39
|
+
|
40
|
+
cached_inventory_items.all? { |item| item.active? && item.quantity_available >= line_item.quantity }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -3,11 +3,28 @@ module SpreeCmCommissioner
|
|
3
3
|
def self.prepended(base)
|
4
4
|
base.has_one :vendor, through: :variant
|
5
5
|
base.after_save :update_vendor_total_inventory, if: :saved_change_to_count_on_hand?
|
6
|
+
|
7
|
+
base.after_commit :create_inventory_items, on: :create
|
8
|
+
base.after_commit :adjust_inventory_items_async, on: :destroy
|
6
9
|
end
|
7
10
|
|
8
11
|
def update_vendor_total_inventory
|
9
12
|
SpreeCmCommissioner::VendorJob.perform_later(vendor.id) if vendor.present?
|
10
13
|
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def create_inventory_items
|
18
|
+
SpreeCmCommissioner::Stock::InventoryItemsGeneratorJob.perform_later(variant_id: variant.id)
|
19
|
+
end
|
20
|
+
|
21
|
+
# When admin delete stock item, it will deduct stock from inventory item
|
22
|
+
def adjust_inventory_items_async
|
23
|
+
params = { variant_id: variant.id, quantity: -count_on_hand }
|
24
|
+
CmAppLogger.log(label: "#{self.class.name}#adjust_inventory_items_async", data: params) do
|
25
|
+
SpreeCmCommissioner::Stock::InventoryItemsAdjusterJob.perform_later(**params)
|
26
|
+
end
|
27
|
+
end
|
11
28
|
end
|
12
29
|
end
|
13
30
|
|
@@ -2,7 +2,6 @@ module SpreeCmCommissioner
|
|
2
2
|
module TaxonDecorator
|
3
3
|
def self.prepended(base) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
4
4
|
base.include SpreeCmCommissioner::TaxonKind
|
5
|
-
base.include SpreeCmCommissioner::Transit::TaxonBitwise
|
6
5
|
base.include SpreeCmCommissioner::ParticipationTypeBitwise
|
7
6
|
base.include SpreeCmCommissioner::EventCheckInFlowable
|
8
7
|
|
@@ -47,6 +46,7 @@ module SpreeCmCommissioner
|
|
47
46
|
base.validates_associated :category_icon
|
48
47
|
base.before_save :set_kind
|
49
48
|
base.before_save :set_slug
|
49
|
+
base.before_save :normalize_custom_redirect_url
|
50
50
|
|
51
51
|
base.after_update :sync_event_dates_to_line_items, if: -> { saved_change_to_from_date? || saved_change_to_to_date? }
|
52
52
|
|
@@ -141,6 +141,12 @@ module SpreeCmCommissioner
|
|
141
141
|
|
142
142
|
::SpreeCmCommissioner::EventLineItemsDateSyncerJob.perform_later(id)
|
143
143
|
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
def normalize_custom_redirect_url
|
148
|
+
self.custom_redirect_url = nil if custom_redirect_url.blank?
|
149
|
+
end
|
144
150
|
end
|
145
151
|
end
|
146
152
|
|
@@ -8,12 +8,6 @@ module SpreeCmCommissioner
|
|
8
8
|
Spree::Taxonomy.find_or_create_by(name: 'Businesses', kind: 'category', store: Spree::Store.default)
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
def base.place
|
13
|
-
ActiveRecord::Base.connected_to(role: :writing) do
|
14
|
-
Spree::Taxonomy.find_or_create_by(name: 'Place', kind: 'transit', store: Spree::Store.default)
|
15
|
-
end
|
16
|
-
end
|
17
11
|
end
|
18
12
|
end
|
19
13
|
end
|
@@ -1,31 +1,40 @@
|
|
1
|
-
require_dependency 'spree_cm_commissioner'
|
2
1
|
module SpreeCmCommissioner
|
3
|
-
class Trip <
|
2
|
+
class Trip < Base
|
3
|
+
include SpreeCmCommissioner::RouteType
|
4
|
+
|
4
5
|
attr_accessor :hours, :minutes, :seconds
|
5
6
|
|
6
7
|
before_validation :convert_duration_to_seconds
|
7
8
|
|
9
|
+
belongs_to :vendor, class_name: 'Spree::Vendor', inverse_of: :trips, optional: false
|
8
10
|
belongs_to :product, class_name: 'Spree::Product', inverse_of: :trip, optional: false
|
11
|
+
|
9
12
|
belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle', optional: false
|
10
|
-
|
11
|
-
belongs_to :
|
13
|
+
|
14
|
+
belongs_to :origin_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
15
|
+
belongs_to :destination_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
12
16
|
|
13
17
|
has_many :trip_blazer_queries, as: :queryable, class_name: 'SpreeCmCommissioner::BlazerQueryable'
|
14
18
|
has_many :blazer_queries, through: :trip_blazer_queries, source: :blazer_query, class_name: 'Blazer::Query'
|
15
19
|
|
16
20
|
has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy
|
21
|
+
has_many :boarding_trip_stops, -> { boarding.order('departure_time ASC NULLS LAST, id ASC') }, class_name: 'SpreeCmCommissioner::TripStop'
|
22
|
+
has_many :drop_off_trip_stops, -> { drop_off.order('arrival_time ASC NULLS LAST') }, class_name: 'SpreeCmCommissioner::TripStop'
|
23
|
+
|
17
24
|
has_many :variants, through: :product
|
18
25
|
has_many :inventory_items, through: :variants
|
19
|
-
|
20
|
-
|
21
|
-
belongs_to :route, class_name: 'Spree::Product'
|
22
|
-
belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle'
|
23
|
-
validates :departure_time, presence: true
|
26
|
+
has_many :variant_blocks, through: :variants
|
27
|
+
has_many :blocks, through: :variant_blocks
|
24
28
|
|
25
29
|
validates :departure_time, presence: true
|
26
30
|
validates :duration, numericality: { greater_than: 0 }
|
27
31
|
validate :origin_and_destination_cannot_be_the_same
|
28
32
|
|
33
|
+
accepts_nested_attributes_for :trip_stops, :product, allow_destroy: true
|
34
|
+
|
35
|
+
self.whitelisted_ransackable_associations = %w[product vehicle]
|
36
|
+
self.whitelisted_ransackable_attributes = %w[origin_place_id destination_place_id]
|
37
|
+
|
29
38
|
def convert_duration_to_seconds
|
30
39
|
return if hours.blank? && minutes.blank? && seconds.blank?
|
31
40
|
|
@@ -50,7 +59,7 @@ module SpreeCmCommissioner
|
|
50
59
|
private
|
51
60
|
|
52
61
|
def origin_and_destination_cannot_be_the_same
|
53
|
-
return unless
|
62
|
+
return unless origin_place_id == destination_place_id
|
54
63
|
|
55
64
|
errors.add(:base, 'Origin and destination cannot be the same')
|
56
65
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
|
-
class TripConnection <
|
3
|
-
belongs_to :from_trip, class_name: '
|
4
|
-
belongs_to :to_trip, class_name: '
|
2
|
+
class TripConnection < Base
|
3
|
+
belongs_to :from_trip, class_name: 'SpreeCmCommissioner::Trip'
|
4
|
+
belongs_to :to_trip, class_name: 'SpreeCmCommissioner::Trip'
|
5
5
|
|
6
6
|
validate :both_trip_cannot_be_the_same
|
7
7
|
before_validation :calculate_connection_time_minutes
|
@@ -12,8 +12,8 @@ module SpreeCmCommissioner
|
|
12
12
|
def calculate_connection_time_minutes
|
13
13
|
return if from_trip.nil? || to_trip.nil?
|
14
14
|
|
15
|
-
arrival_seconds = from_trip.
|
16
|
-
departure_seconds = to_trip.
|
15
|
+
arrival_seconds = from_trip.arrival_time.seconds_since_midnight
|
16
|
+
departure_seconds = to_trip.departure_time.seconds_since_midnight
|
17
17
|
|
18
18
|
layover_seconds = departure_seconds - arrival_seconds
|
19
19
|
layover_seconds += 86_400 if layover_seconds.negative?
|
@@ -1,36 +1,25 @@
|
|
1
|
-
require_dependency 'spree_cm_commissioner'
|
2
1
|
module SpreeCmCommissioner
|
3
|
-
class TripStop <
|
2
|
+
class TripStop < Base
|
4
3
|
acts_as_list column: :sequence, scope: :trip_id
|
5
4
|
enum :stop_type, { boarding: 0, drop_off: 1 }
|
6
5
|
|
7
|
-
belongs_to :trip, class_name: '
|
8
|
-
belongs_to :
|
6
|
+
belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
|
7
|
+
belongs_to :stop_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
8
|
+
belongs_to :location_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
9
9
|
|
10
10
|
before_validation :set_stop_name
|
11
|
-
|
12
|
-
after_commit :create_vendor_stop
|
13
|
-
validates :stop_id, uniqueness: { scope: :trip_id }
|
11
|
+
validates :stop_place_id, uniqueness: { scope: :trip_id }
|
14
12
|
|
15
13
|
def set_stop_name
|
16
|
-
self.stop_name =
|
14
|
+
self.stop_name = stop_place.name if stop_place.present?
|
17
15
|
end
|
18
16
|
|
19
|
-
def
|
20
|
-
|
21
|
-
vendor_stop.update(trip_count: vendor_stop.trip_count.to_i + 1)
|
17
|
+
def self.ransackable_attributes(_auth_object = nil)
|
18
|
+
%w[stop_name stop_type]
|
22
19
|
end
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
def decrement_trip_count
|
27
|
-
vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).find_each do |vendor_stop|
|
28
|
-
vendor_stop.update(trip_count: [vendor_stop.trip_count - 1, 0].max)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def vendor
|
33
|
-
Spree::Product.find(trip&.product_id).vendor
|
21
|
+
def self.ransackable_associations(_auth_object = nil)
|
22
|
+
['stop_place']
|
34
23
|
end
|
35
24
|
end
|
36
25
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
class VariantBlock < Base
|
3
|
+
belongs_to :variant, class_name: 'Spree::Variant', optional: false
|
4
|
+
belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
|
5
|
+
belongs_to :block, class_name: 'SpreeCmCommissioner::Block', optional: false
|
6
|
+
|
7
|
+
validates :block_id, uniqueness: { scope: %i[variant_id trip_id] }
|
8
|
+
|
9
|
+
before_validation :set_trip, if: -> { trip_id.blank? }
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def set_trip
|
14
|
+
self.trip = variant&.product&.trip
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
module VariantDecorator
|
3
|
-
def self.prepended(base)
|
3
|
+
def self.prepended(base) # rubocop:disable Metrics/AbcSize
|
4
|
+
base.include SpreeCmCommissioner::ProductType
|
4
5
|
base.include SpreeCmCommissioner::ProductDelegation
|
5
6
|
base.include SpreeCmCommissioner::VariantOptionsConcern
|
6
7
|
base.include SpreeCmCommissioner::KycBitwise
|
@@ -20,24 +21,21 @@ module SpreeCmCommissioner
|
|
20
21
|
base.has_many :video_on_demands, class_name: 'SpreeCmCommissioner::VideoOnDemand', dependent: :destroy
|
21
22
|
base.has_many :complete_line_items, -> { complete }, class_name: 'Spree::LineItem'
|
22
23
|
|
24
|
+
base.has_many :variant_blocks, class_name: 'SpreeCmCommissioner::VariantBlock', dependent: :destroy
|
25
|
+
base.has_many :blocks, class_name: 'SpreeCmCommissioner::Block', through: :variant_blocks
|
26
|
+
|
23
27
|
base.has_many :variant_guest_card_class, class_name: 'SpreeCmCommissioner::VariantGuestCardClass'
|
24
28
|
base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variant_guest_card_class
|
25
29
|
|
30
|
+
base.has_many :inventory_items, class_name: 'SpreeCmCommissioner::InventoryItem'
|
31
|
+
|
26
32
|
base.scope :subscribable, -> { active.joins(:product).where(product: { subscribable: true, status: :active }) }
|
27
|
-
base.
|
28
|
-
|
29
|
-
base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy, foreign_key: :trip_id
|
30
|
-
base.accepts_nested_attributes_for :option_values
|
31
|
-
base.after_commit :sync_trip, if: :transit?
|
32
|
-
base.accepts_nested_attributes_for :trip_stops, allow_destroy: true
|
33
|
-
base.after_commit :create_trip_stops, if: :transit?
|
34
|
-
end
|
33
|
+
base.scope :with_permanent_stock, -> { where(product_type: base::PERMANENT_STOCK_PRODUCT_TYPES) }
|
34
|
+
base.scope :with_non_permanent_stock, -> { where.not(product_type: base::PERMANENT_STOCK_PRODUCT_TYPES) }
|
35
35
|
|
36
|
-
|
37
|
-
return if is_master?
|
36
|
+
base.accepts_nested_attributes_for :option_values
|
38
37
|
|
39
|
-
|
40
|
-
trip_stops.find_or_create_by(stop_type: :drop_off, stop_id: options.destination)
|
38
|
+
base.before_save -> { self.product_type = product.product_type }, if: -> { product_type.nil? }
|
41
39
|
end
|
42
40
|
|
43
41
|
def delivery_required?
|
@@ -53,8 +51,20 @@ module SpreeCmCommissioner
|
|
53
51
|
super || product.discontinued?
|
54
52
|
end
|
55
53
|
|
56
|
-
def
|
57
|
-
|
54
|
+
def default_inventory_item_exist?
|
55
|
+
inventory_items.exists?(inventory_date: nil)
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_default_non_permanent_inventory_item!(quantity_available: nil, max_capacity: nil)
|
59
|
+
return if product_type.blank? # handle in case product not exist for variant.
|
60
|
+
return unless should_track_inventory?
|
61
|
+
return if default_inventory_item_exist?
|
62
|
+
|
63
|
+
inventory_items.create!(
|
64
|
+
product_type: product_type,
|
65
|
+
quantity_available: [0, quantity_available || total_on_hand].max,
|
66
|
+
max_capacity: [0, max_capacity || total_on_hand].max
|
67
|
+
)
|
58
68
|
end
|
59
69
|
|
60
70
|
# override
|
@@ -72,30 +82,26 @@ module SpreeCmCommissioner
|
|
72
82
|
"#{display_sku} - #{display_price}"
|
73
83
|
end
|
74
84
|
|
75
|
-
def transit?
|
76
|
-
product.product_type == 'transit'
|
77
|
-
end
|
78
|
-
|
79
85
|
# override
|
80
|
-
def in_stock?
|
81
|
-
|
86
|
+
def in_stock?(options = {})
|
87
|
+
SpreeCmCommissioner::Stock::AvailabilityChecker.new(self, options).can_supply?
|
82
88
|
end
|
83
89
|
|
84
|
-
|
90
|
+
def price_for_date(currency:, date:)
|
91
|
+
currency = currency.upcase
|
85
92
|
|
86
|
-
|
87
|
-
|
93
|
+
prices.joins(:inventory_item)
|
94
|
+
.find_by(
|
95
|
+
currency: currency,
|
96
|
+
inventory_item: { inventory_date: date }
|
97
|
+
)
|
88
98
|
end
|
89
99
|
|
90
|
-
|
91
|
-
stock_count = stock_items.sum(&:count_on_hand)
|
92
|
-
return stock_count if delivery_required?
|
93
|
-
|
94
|
-
stock_count - total_purchases
|
95
|
-
end
|
100
|
+
private
|
96
101
|
|
97
102
|
def update_vendor_price
|
98
|
-
return unless vendor.present? &&
|
103
|
+
return unless vendor.present? && product_type == vendor&.primary_product_type
|
104
|
+
return if price.blank?
|
99
105
|
|
100
106
|
vendor.update(min_price: price) if vendor.min_price.nil? || price < vendor.min_price
|
101
107
|
vendor.update(max_price: price) if vendor.max_price.nil? || price > vendor.max_price
|
@@ -119,22 +125,6 @@ module SpreeCmCommissioner
|
|
119
125
|
end
|
120
126
|
end
|
121
127
|
end
|
122
|
-
|
123
|
-
def sync_trip
|
124
|
-
return unless product.product_type == 'transit'
|
125
|
-
|
126
|
-
trip = SpreeCmCommissioner::Trip.find_or_initialize_by(variant_id: id)
|
127
|
-
|
128
|
-
trip.assign_attributes(
|
129
|
-
product_id: product_id,
|
130
|
-
origin_id: options.origin,
|
131
|
-
destination_id: options.destination,
|
132
|
-
departure_time: options.departure_time,
|
133
|
-
duration: options.total_duration_in_seconds,
|
134
|
-
vehicle_id: options.vehicle
|
135
|
-
)
|
136
|
-
trip.save
|
137
|
-
end
|
138
128
|
end
|
139
129
|
end
|
140
130
|
|
@@ -139,32 +139,13 @@ module SpreeCmCommissioner
|
|
139
139
|
@seat_number_layouts ||= option_value_name_for(option_type_name: 'seat-number-layouts')&.split(',')
|
140
140
|
end
|
141
141
|
|
142
|
+
def seat_type
|
143
|
+
@seat_type ||= option_value_name_for(option_type_name: 'seat-type')
|
144
|
+
end
|
145
|
+
|
142
146
|
# can consider as customers.
|
143
147
|
def number_of_guests
|
144
148
|
number_of_adults + number_of_kids
|
145
149
|
end
|
146
|
-
|
147
|
-
def origin
|
148
|
-
@origin ||= option_value_name_for(option_type_name: 'origin')&.to_i
|
149
|
-
end
|
150
|
-
|
151
|
-
def destination
|
152
|
-
@destination ||= option_value_name_for(option_type_name: 'destination')&.to_i
|
153
|
-
end
|
154
|
-
|
155
|
-
def vehicle
|
156
|
-
@vehicle ||= option_value_name_for(option_type_name: 'vehicle')&.to_i
|
157
|
-
end
|
158
|
-
|
159
|
-
def allow_seat_selection
|
160
|
-
@allow_seat_selection ||= option_value_name_for(option_type_name: 'allow-seat-selection')&.to_i
|
161
|
-
end
|
162
|
-
|
163
|
-
def departure_time
|
164
|
-
@departure_time ||= begin
|
165
|
-
time = option_value_name_for(option_type_name: 'departure-time')
|
166
|
-
Time.zone.parse(time) if time.present?
|
167
|
-
end
|
168
|
-
end
|
169
150
|
end
|
170
151
|
end
|