spree_cm_commissioner 2.0.2.pre.pre → 2.0.3.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 +2 -16
- data/.gitignore +1 -2
- data/Gemfile.lock +1 -28
- data/Rakefile +4 -33
- data/app/assets/images/mailer/mail.png +0 -0
- data/app/assets/images/mailer/tenant_phone.png +0 -0
- data/app/assets/images/mailer/tenant_user.png +0 -0
- data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +11 -8
- data/app/controllers/blazer/queries_controller_decorator.rb +11 -0
- data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +44 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -63
- data/app/controllers/spree/api/v2/operator/event_charts_controller.rb +59 -0
- data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
- data/app/controllers/spree/api/v2/storefront/guests_controller.rb +13 -13
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +24 -81
- data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +20 -0
- data/app/interactors/spree_cm_commissioner/create_event.rb +5 -0
- data/app/interactors/spree_cm_commissioner/create_ticket.rb +6 -5
- data/app/interactors/spree_cm_commissioner/create_vendor.rb +44 -0
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +0 -1
- data/app/interactors/spree_cm_commissioner/reports_assigner.rb +17 -0
- data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
- data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +7 -3
- data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +11 -3
- data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +12 -6
- data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +7 -1
- data/app/jobs/spree_cm_commissioner/application_job.rb +0 -20
- data/app/jobs/spree_cm_commissioner/application_unique_job.rb +0 -20
- data/app/jobs/spree_cm_commissioner/reports_assigner_job.rb +7 -0
- data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
- data/app/mailers/spree/order_mailer_decorator.rb +18 -3
- data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +33 -9
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +12 -1
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -39
- data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +3 -1
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +4 -2
- data/app/models/spree_cm_commissioner/branch.rb +12 -0
- data/app/models/spree_cm_commissioner/dynamic_field.rb +20 -0
- data/app/models/spree_cm_commissioner/guest.rb +56 -18
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +41 -1
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +78 -46
- data/app/models/spree_cm_commissioner/line_item_seat.rb +10 -0
- data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
- data/app/models/spree_cm_commissioner/option_type_decorator.rb +11 -1
- data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +8 -0
- data/app/models/spree_cm_commissioner/order_decorator.rb +1 -30
- data/app/models/spree_cm_commissioner/place.rb +4 -1
- data/app/models/spree_cm_commissioner/product_decorator.rb +28 -10
- data/app/models/spree_cm_commissioner/service_calendar.rb +2 -0
- data/app/models/spree_cm_commissioner/state_decorator.rb +1 -0
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -26
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -17
- data/app/models/spree_cm_commissioner/stop.rb +23 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +6 -0
- data/app/models/spree_cm_commissioner/trip.rb +10 -10
- data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
- data/app/models/spree_cm_commissioner/trip_stop.rb +25 -6
- data/app/models/spree_cm_commissioner/user_decorator.rb +6 -0
- data/app/models/spree_cm_commissioner/user_identity_provider.rb +26 -4
- data/app/models/spree_cm_commissioner/variant_decorator.rb +47 -37
- data/app/models/spree_cm_commissioner/variant_options.rb +23 -0
- data/app/models/spree_cm_commissioner/vehicle.rb +15 -10
- data/app/models/spree_cm_commissioner/vehicle_seat.rb +11 -0
- data/app/models/spree_cm_commissioner/vehicle_type.rb +76 -0
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +17 -11
- data/app/models/spree_cm_commissioner/vendor_place.rb +3 -9
- data/app/models/spree_cm_commissioner/vendor_stop.rb +10 -0
- data/app/queries/spree_cm_commissioner/event_chart_queries.rb +179 -0
- data/app/queries/spree_cm_commissioner/trip_query.rb +44 -70
- data/app/queries/spree_cm_commissioner/trip_search_query.rb +76 -0
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
- data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/serializables/spree_cm_commissioner/event_chart.rb +11 -0
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
- data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +0 -1
- data/app/serializers/spree/v2/tenant/user_serializer.rb +1 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
- data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
- data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +11 -0
- data/app/views/blazer/queries/_content.html.erb +2 -0
- data/app/views/blazer/queries/_preset.html.erb +11 -0
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +2 -7
- data/app/views/spree/admin/stock_managements/index.html.erb +6 -55
- data/app/views/spree/admin/tenant_vendors/index.html.erb +9 -2
- data/app/views/spree/admin/tenants/_form.html.erb +9 -0
- data/app/views/spree/admin/tenants/edit.html.erb +2 -1
- data/app/views/spree/admin/tenants/index.html.erb +7 -1
- data/app/views/spree/admin/vendors/_form.html.erb +14 -0
- data/app/views/spree/order_mailer/confirm_email.html.erb +27 -16
- data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +5 -1
- data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +41 -4
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +42 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +25 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +19 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +33 -0
- data/config/initializers/spree_permitted_attributes.rb +0 -5
- data/config/locales/en.yml +5 -1
- data/config/routes.rb +3 -21
- data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +1 -3
- data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +6 -0
- data/db/migrate/20250710082132_add_preset_to_blazer_queries.rb +5 -0
- data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +13 -0
- data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +5 -0
- data/docker-compose.yml +1 -1
- data/lib/cm_app_logger.rb +4 -11
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -14
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
- data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
- data/lib/spree_cm_commissioner/test_helper/factories/blazer_query_factory.rb +17 -0
- data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +12 -0
- data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +0 -10
- data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +7 -0
- data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +30 -6
- data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +36 -0
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +34 -18
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +14 -0
- data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -11
- data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +19 -41
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +96 -0
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -6
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +1 -13
- data/lib/spree_cm_commissioner/trip_query_result.rb +0 -8
- data/lib/spree_cm_commissioner/trip_result.rb +3 -5
- data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +11 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -35
- data/spree_cm_commissioner.gemspec +0 -7
- metadata +46 -145
- data/app/controllers/spree/admin/inventory_items_controller.rb +0 -83
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -37
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -32
- data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
- data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +0 -44
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -32
- data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +0 -62
- data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +0 -41
- data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
- data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +0 -44
- data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +0 -11
- data/app/models/spree_cm_commissioner/block.rb +0 -39
- data/app/models/spree_cm_commissioner/inventory.rb +0 -11
- data/app/models/spree_cm_commissioner/inventory_item.rb +0 -69
- data/app/models/spree_cm_commissioner/price_decorator.rb +0 -9
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -41
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -25
- data/app/models/spree_cm_commissioner/reserved_block.rb +0 -30
- data/app/models/spree_cm_commissioner/seat_layout.rb +0 -20
- data/app/models/spree_cm_commissioner/seat_section.rb +0 -16
- data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +0 -30
- data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +0 -53
- data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +0 -49
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +0 -4
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
- data/app/models/spree_cm_commissioner/variant_block.rb +0 -9
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
- data/app/views/spree/admin/inventory_items/show.html.erb +0 -72
- data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -56
- data/config/initializers/paper_trail.rb +0 -1
- data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +0 -7
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
- data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
- data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
- data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
- data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +0 -7
- data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +0 -5
- data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +0 -5
- data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +0 -9
- data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +0 -5
- data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +0 -9
- data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +0 -5
- data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +0 -5
- data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +0 -5
- data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +0 -6
- data/db/migrate/20250620090001_create_cm_seat_layouts.rb +0 -17
- data/db/migrate/20250620090002_create_cm_seat_sections.rb +0 -18
- data/db/migrate/20250620090003_create_cm_blocks.rb +0 -18
- data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +0 -29
- data/db/migrate/20250626083642_create_cm_variant_blocks.rb +0 -24
- data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +0 -13
- data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +0 -5
- data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +0 -5
- data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +0 -5
- data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +0 -5
- data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +0 -7
- data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +0 -11
- data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +0 -7
- data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +0 -5
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +0 -15
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
- data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +0 -27
- data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +0 -11
- data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +0 -16
- data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
- data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +0 -10
- data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +0 -7
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
- data/lib/tasks/ensure_correct_product_type.rake +0 -7
- data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -6,6 +6,7 @@ module SpreeCmCommissioner
|
|
6
6
|
base.include SpreeCmCommissioner::KycBitwise
|
7
7
|
base.include SpreeCmCommissioner::Metafield
|
8
8
|
base.include SpreeCmCommissioner::TenantUpdatable
|
9
|
+
base.include SpreeCmCommissioner::RouteType
|
9
10
|
|
10
11
|
base.has_many :variant_kind_option_types, -> { where(kind: :variant).order(:position) },
|
11
12
|
through: :product_option_types, source: :option_type
|
@@ -32,7 +33,6 @@ module SpreeCmCommissioner
|
|
32
33
|
base.has_one :google_wallet, class_name: 'SpreeCmCommissioner::GoogleWallet', dependent: :destroy
|
33
34
|
|
34
35
|
base.has_many :complete_line_items, through: :classifications, source: :line_items
|
35
|
-
base.has_many :inventory_items, through: :variants
|
36
36
|
base.has_many :guests, through: :line_items
|
37
37
|
|
38
38
|
base.has_many :product_places, class_name: 'SpreeCmCommissioner::ProductPlace', dependent: :destroy
|
@@ -64,17 +64,20 @@ module SpreeCmCommissioner
|
|
64
64
|
base.before_validation :set_event_id
|
65
65
|
|
66
66
|
base.validate :validate_event_taxons, if: -> { taxons.event.present? }
|
67
|
+
|
67
68
|
base.validate :validate_product_date, if: -> { available_on.present? && discontinue_on.present? }
|
68
|
-
|
69
|
+
|
69
70
|
base.validates :commission_rate, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }, allow_nil: true
|
70
71
|
|
71
|
-
base.whitelisted_ransackable_attributes = %w[description name slug discontinue_on status vendor_id short_name]
|
72
|
+
base.whitelisted_ransackable_attributes = %w[description name slug discontinue_on status vendor_id short_name route_type]
|
72
73
|
|
73
74
|
base.after_update :update_variants_vendor_id, if: :saved_change_to_vendor_id?
|
74
75
|
base.after_update :sync_event_id_to_children, if: :saved_change_to_event_id?
|
75
76
|
|
76
77
|
base.enum purchasable_on: { both: 0, web: 1, app: 2 }
|
77
78
|
|
79
|
+
base.accepts_nested_attributes_for :trip, allow_destroy: true
|
80
|
+
|
78
81
|
base.multi_tenant :tenant, class_name: 'SpreeCmCommissioner::Tenant'
|
79
82
|
base.before_save :set_tenant
|
80
83
|
end
|
@@ -83,6 +86,28 @@ module SpreeCmCommissioner
|
|
83
86
|
"#{Spree::Store.default.formatted_url}/tickets/#{slug}"
|
84
87
|
end
|
85
88
|
|
89
|
+
def dynamic_fields_by_collection_phase
|
90
|
+
{
|
91
|
+
pre_registration: dynamic_fields.pre_registration.order(:position),
|
92
|
+
post_registration: dynamic_fields.post_registration.order(:position),
|
93
|
+
during_check_in: dynamic_fields.during_check_in.order(:position)
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def required_dynamic_fields_completed?(guest, phase)
|
98
|
+
required_fields = dynamic_fields.where(data_fill_stage: phase)
|
99
|
+
return true if required_fields.empty?
|
100
|
+
|
101
|
+
filled_ids = guest.guest_dynamic_fields.where(dynamic_field_id: required_fields.select(:id)).pluck(:dynamic_field_id)
|
102
|
+
(required_fields.pluck(:id) - filled_ids).empty?
|
103
|
+
end
|
104
|
+
|
105
|
+
def required_fields_for_guest(guest)
|
106
|
+
dynamic_fields_by_collection_phase.transform_values do |fields|
|
107
|
+
fields.select { |field| guest.guest_dynamic_fields.where(dynamic_field: field).empty? }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
86
111
|
private
|
87
112
|
|
88
113
|
def set_tenant
|
@@ -111,13 +136,6 @@ module SpreeCmCommissioner
|
|
111
136
|
|
112
137
|
errors.add(:discontinue_on, 'must be after the available on date')
|
113
138
|
end
|
114
|
-
|
115
|
-
def product_type_unchanged
|
116
|
-
return if product_type_was.nil?
|
117
|
-
return unless product_type_changed?
|
118
|
-
|
119
|
-
errors.add(:product_type, 'cannot be changed once set')
|
120
|
-
end
|
121
139
|
end
|
122
140
|
end
|
123
141
|
|
@@ -3,6 +3,7 @@ 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'
|
6
7
|
|
7
8
|
def update_total_inventory
|
8
9
|
update(total_inventory: vendors.pluck(:total_inventory).compact.sum)
|
@@ -1,48 +1,47 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
module Stock
|
3
3
|
class AvailabilityChecker
|
4
|
-
attr_reader :variant, :
|
4
|
+
attr_reader :variant, :error_message
|
5
5
|
|
6
|
-
def initialize(variant
|
6
|
+
def initialize(variant)
|
7
7
|
@variant = variant
|
8
|
-
@options = options
|
9
8
|
@error_message = nil
|
10
9
|
end
|
11
10
|
|
12
|
-
def can_supply?(quantity = 1)
|
11
|
+
def can_supply?(quantity = 1, options = {})
|
13
12
|
return false unless variant.available?
|
14
13
|
return true unless variant.should_track_inventory?
|
15
14
|
return true if variant.backorderable?
|
16
15
|
return true if variant.need_confirmation?
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def cached_inventory_items
|
30
|
-
return @cached_inventory_items if defined?(@cached_inventory_items)
|
17
|
+
# when delivery required, shipment will dynamically add / remove unit from stock item.
|
18
|
+
# so we can directly check can_supply with stock items directly.
|
19
|
+
return variant.stock_items.sum(:count_on_hand) >= quantity if variant.delivery_required?
|
31
20
|
|
32
21
|
if variant.permanent_stock?
|
33
|
-
|
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
|
22
|
+
permanent_stock_variant_available?(quantity, options)
|
39
23
|
else
|
40
|
-
|
24
|
+
variant_available?(quantity, options)
|
41
25
|
end
|
42
26
|
end
|
43
27
|
|
44
|
-
def
|
45
|
-
|
28
|
+
def variant_available?(quantity = 1, options = {})
|
29
|
+
query = SpreeCmCommissioner::VariantAvailability::NonPermanentStockQuery.new(
|
30
|
+
variant: variant,
|
31
|
+
except_line_item_id: options[:except_line_item_id]
|
32
|
+
)
|
33
|
+
result = query.available?(quantity)
|
34
|
+
@error_message = query.error_message unless result
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
38
|
+
def permanent_stock_variant_available?(quantity = 1, options = {})
|
39
|
+
SpreeCmCommissioner::VariantAvailability::PermanentStockQuery.new(
|
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)
|
46
45
|
end
|
47
46
|
end
|
48
47
|
end
|
@@ -3,8 +3,7 @@ module SpreeCmCommissioner
|
|
3
3
|
module AvailabilityValidatorDecorator
|
4
4
|
# override
|
5
5
|
def item_available?(line_item, quantity)
|
6
|
-
SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item)
|
7
|
-
.can_supply?(quantity)
|
6
|
+
SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item).can_supply?(quantity)
|
8
7
|
end
|
9
8
|
end
|
10
9
|
end
|
@@ -8,14 +8,14 @@ module SpreeCmCommissioner
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def can_supply?(quantity)
|
11
|
-
|
12
|
-
.can_supply?(quantity)
|
11
|
+
AvailabilityChecker.new(line_item.variant).can_supply?(quantity, options)
|
13
12
|
end
|
14
13
|
|
15
14
|
def options
|
16
15
|
{
|
17
16
|
from_date: line_item.from_date,
|
18
|
-
to_date: line_item.to_date
|
17
|
+
to_date: line_item.to_date,
|
18
|
+
except_line_item_id: line_item.id
|
19
19
|
}
|
20
20
|
end
|
21
21
|
end
|
@@ -3,28 +3,11 @@ 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
|
9
6
|
end
|
10
7
|
|
11
8
|
def update_vendor_total_inventory
|
12
9
|
SpreeCmCommissioner::VendorJob.perform_later(vendor.id) if vendor.present?
|
13
10
|
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
|
28
11
|
end
|
29
12
|
end
|
30
13
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_dependency 'spree_cm_commissioner'
|
2
|
+
|
3
|
+
module SpreeCmCommissioner
|
4
|
+
class Stop < SpreeCmCommissioner::Place
|
5
|
+
belongs_to :branch, class_name: 'SpreeCmCommissioner::Branch'
|
6
|
+
belongs_to :state, class_name: 'Spree::State', optional: true
|
7
|
+
belongs_to :vendor, class_name: 'Spree::Vendor'
|
8
|
+
|
9
|
+
after_save :add_to_option_value
|
10
|
+
|
11
|
+
def validate_reference?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_to_option_value
|
16
|
+
origin = Spree::OptionType.find_by(attr_type: 'origin')&.id
|
17
|
+
destination = Spree::OptionType.find_by(attr_type: 'destination')&.id
|
18
|
+
|
19
|
+
Spree::OptionValue.create(option_type_id: origin, name: name, presentation: id)
|
20
|
+
Spree::OptionValue.create(option_type_id: destination, name: name, presentation: id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -2,6 +2,7 @@ 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
|
5
6
|
base.include SpreeCmCommissioner::ParticipationTypeBitwise
|
6
7
|
base.include SpreeCmCommissioner::EventCheckInFlowable
|
7
8
|
|
@@ -8,6 +8,12 @@ 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
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
@@ -1,17 +1,14 @@
|
|
1
|
+
require_dependency 'spree_cm_commissioner'
|
1
2
|
module SpreeCmCommissioner
|
2
|
-
class Trip < Base
|
3
|
-
include SpreeCmCommissioner::RouteType
|
4
|
-
|
3
|
+
class Trip < SpreeCmCommissioner::Base
|
5
4
|
attr_accessor :hours, :minutes, :seconds
|
6
5
|
|
7
6
|
before_validation :convert_duration_to_seconds
|
8
7
|
|
9
|
-
belongs_to :vendor, class_name: 'Spree::Vendor', inverse_of: :trips, optional: false
|
10
8
|
belongs_to :product, class_name: 'Spree::Product', inverse_of: :trip, optional: false
|
11
9
|
belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle', optional: false
|
12
|
-
|
13
|
-
belongs_to :
|
14
|
-
belongs_to :destination_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
10
|
+
belongs_to :origin, class_name: 'SpreeCmCommissioner::Place', optional: true
|
11
|
+
belongs_to :destination, class_name: 'SpreeCmCommissioner::Place', optional: true
|
15
12
|
|
16
13
|
has_many :trip_blazer_queries, as: :queryable, class_name: 'SpreeCmCommissioner::BlazerQueryable'
|
17
14
|
has_many :blazer_queries, through: :trip_blazer_queries, source: :blazer_query, class_name: 'Blazer::Query'
|
@@ -19,13 +16,16 @@ module SpreeCmCommissioner
|
|
19
16
|
has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy
|
20
17
|
has_many :variants, through: :product
|
21
18
|
has_many :inventory_items, through: :variants
|
19
|
+
belongs_to :variant, class_name: 'Spree::Variant'
|
20
|
+
|
21
|
+
belongs_to :route, class_name: 'Spree::Product'
|
22
|
+
belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle'
|
23
|
+
validates :departure_time, presence: true
|
22
24
|
|
23
25
|
validates :departure_time, presence: true
|
24
26
|
validates :duration, numericality: { greater_than: 0 }
|
25
27
|
validate :origin_and_destination_cannot_be_the_same
|
26
28
|
|
27
|
-
accepts_nested_attributes_for :trip_stops, :product, allow_destroy: true
|
28
|
-
|
29
29
|
def convert_duration_to_seconds
|
30
30
|
return if hours.blank? && minutes.blank? && seconds.blank?
|
31
31
|
|
@@ -50,7 +50,7 @@ module SpreeCmCommissioner
|
|
50
50
|
private
|
51
51
|
|
52
52
|
def origin_and_destination_cannot_be_the_same
|
53
|
-
return unless
|
53
|
+
return unless origin_id == destination_id
|
54
54
|
|
55
55
|
errors.add(:base, 'Origin and destination cannot be the same')
|
56
56
|
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 < ApplicationRecord
|
3
|
+
belongs_to :from_trip, class_name: 'Spree::Variant'
|
4
|
+
belongs_to :to_trip, class_name: 'Spree::Variant'
|
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.arrival_time.seconds_since_midnight
|
16
|
-
departure_seconds = to_trip.departure_time.seconds_since_midnight
|
15
|
+
arrival_seconds = from_trip.trip.arrival_time.seconds_since_midnight
|
16
|
+
departure_seconds = to_trip.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,17 +1,36 @@
|
|
1
|
+
require_dependency 'spree_cm_commissioner'
|
1
2
|
module SpreeCmCommissioner
|
2
|
-
class TripStop < Base
|
3
|
+
class TripStop < SpreeCmCommissioner::Base
|
3
4
|
acts_as_list column: :sequence, scope: :trip_id
|
4
5
|
enum :stop_type, { boarding: 0, drop_off: 1 }
|
5
6
|
|
6
|
-
belongs_to :trip, class_name: '
|
7
|
-
belongs_to :
|
8
|
-
belongs_to :location_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
7
|
+
belongs_to :trip, class_name: 'Spree::Variant'
|
8
|
+
belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
|
9
9
|
|
10
10
|
before_validation :set_stop_name
|
11
|
-
|
11
|
+
after_destroy :decrement_trip_count
|
12
|
+
after_commit :create_vendor_stop
|
13
|
+
validates :stop_id, uniqueness: { scope: :trip_id }
|
12
14
|
|
13
15
|
def set_stop_name
|
14
|
-
self.stop_name =
|
16
|
+
self.stop_name = stop.name if stop.present?
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_vendor_stop
|
20
|
+
vendor_stop = vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).first_or_create
|
21
|
+
vendor_stop.update(trip_count: vendor_stop.trip_count.to_i + 1)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
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
|
15
34
|
end
|
16
35
|
end
|
17
36
|
end
|
@@ -88,6 +88,12 @@ module SpreeCmCommissioner
|
|
88
88
|
has_spree_role?('operator')
|
89
89
|
end
|
90
90
|
|
91
|
+
def vendor_organizer?(vendor)
|
92
|
+
spree_roles.any? do |role|
|
93
|
+
role.name == "#{vendor.name.downcase.parameterize(separator: '-')}-organizer"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
91
97
|
def full_name
|
92
98
|
[first_name, last_name].compact_blank.join(' ')
|
93
99
|
end
|
@@ -3,15 +3,17 @@ module SpreeCmCommissioner
|
|
3
3
|
enum identity_type: { :google => 0, :apple => 1, :facebook => 2, :telegram => 3, :vattanac_bank => 4 }
|
4
4
|
|
5
5
|
belongs_to :user, class_name: Spree.user_class.to_s, optional: false
|
6
|
+
has_one :tenant, through: :user
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
has_many :user_identity_provider_telegram_bots
|
9
|
+
has_many :telegram_bots, through: :user_identity_provider_telegram_bots
|
9
10
|
|
11
|
+
validates :sub, presence: true
|
10
12
|
validates :identity_type, presence: true
|
11
13
|
validates :identity_type, uniqueness: { scope: :user_id }
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
# custom validation to ensure that the sub is unique per identity_type and spree_users.tenant
|
16
|
+
validate :unique_sub_per_identity_type_and_tenant
|
15
17
|
|
16
18
|
# sub is a telegram uid, which telegram considered a chatID if
|
17
19
|
# user have /started with bot.
|
@@ -20,5 +22,25 @@ module SpreeCmCommissioner
|
|
20
22
|
|
21
23
|
nil
|
22
24
|
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def unique_sub_per_identity_type_and_tenant
|
29
|
+
return if user.nil? || sub.blank? || identity_type.blank?
|
30
|
+
|
31
|
+
tenant_id = user.tenant_id
|
32
|
+
|
33
|
+
# Check for duplicates in the same tenant
|
34
|
+
scope = self.class
|
35
|
+
.joins(:user)
|
36
|
+
.where(sub: sub, identity_type: identity_type)
|
37
|
+
.where(spree_users: { tenant_id: tenant_id })
|
38
|
+
|
39
|
+
scope = scope.where.not(id: id) if persisted?
|
40
|
+
|
41
|
+
return unless scope.exists?
|
42
|
+
|
43
|
+
errors.add(:sub, 'must be unique per identity_type and tenant')
|
44
|
+
end
|
23
45
|
end
|
24
46
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
module VariantDecorator
|
3
|
-
def self.prepended(base)
|
4
|
-
base.include SpreeCmCommissioner::ProductType
|
3
|
+
def self.prepended(base)
|
5
4
|
base.include SpreeCmCommissioner::ProductDelegation
|
6
5
|
base.include SpreeCmCommissioner::VariantOptionsConcern
|
7
6
|
base.include SpreeCmCommissioner::KycBitwise
|
@@ -21,21 +20,24 @@ module SpreeCmCommissioner
|
|
21
20
|
base.has_many :video_on_demands, class_name: 'SpreeCmCommissioner::VideoOnDemand', dependent: :destroy
|
22
21
|
base.has_many :complete_line_items, -> { complete }, class_name: 'Spree::LineItem'
|
23
22
|
|
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
|
-
|
27
23
|
base.has_many :variant_guest_card_class, class_name: 'SpreeCmCommissioner::VariantGuestCardClass'
|
28
24
|
base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variant_guest_card_class
|
29
25
|
|
30
|
-
base.has_many :inventory_items, class_name: 'SpreeCmCommissioner::InventoryItem'
|
31
|
-
|
32
26
|
base.scope :subscribable, -> { active.joins(:product).where(product: { subscribable: true, status: :active }) }
|
33
|
-
base.
|
34
|
-
|
35
|
-
|
27
|
+
base.has_one :trip,
|
28
|
+
class_name: 'SpreeCmCommissioner::Trip'
|
29
|
+
base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy, foreign_key: :trip_id
|
36
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
|
35
|
+
|
36
|
+
def create_trip_stops
|
37
|
+
return if is_master?
|
37
38
|
|
38
|
-
|
39
|
+
trip_stops.find_or_create_by(stop_type: :boarding, stop_id: options.origin)
|
40
|
+
trip_stops.find_or_create_by(stop_type: :drop_off, stop_id: options.destination)
|
39
41
|
end
|
40
42
|
|
41
43
|
def delivery_required?
|
@@ -51,20 +53,8 @@ module SpreeCmCommissioner
|
|
51
53
|
super || product.discontinued?
|
52
54
|
end
|
53
55
|
|
54
|
-
def
|
55
|
-
|
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
|
-
)
|
56
|
+
def permanent_stock?
|
57
|
+
accommodation?
|
68
58
|
end
|
69
59
|
|
70
60
|
# override
|
@@ -82,26 +72,30 @@ module SpreeCmCommissioner
|
|
82
72
|
"#{display_sku} - #{display_price}"
|
83
73
|
end
|
84
74
|
|
75
|
+
def transit?
|
76
|
+
product.product_type == 'transit'
|
77
|
+
end
|
78
|
+
|
85
79
|
# override
|
86
|
-
def in_stock?
|
87
|
-
|
80
|
+
def in_stock?
|
81
|
+
available_quantity.positive?
|
88
82
|
end
|
89
83
|
|
90
|
-
|
91
|
-
currency = currency.upcase
|
84
|
+
private
|
92
85
|
|
93
|
-
|
94
|
-
|
95
|
-
currency: currency,
|
96
|
-
inventory_item: { inventory_date: date }
|
97
|
-
)
|
86
|
+
def total_purchases
|
87
|
+
Spree::LineItem.complete.where(variant_id: id).sum(:quantity).to_i
|
98
88
|
end
|
99
89
|
|
100
|
-
|
90
|
+
def available_quantity
|
91
|
+
stock_count = stock_items.sum(&:count_on_hand)
|
92
|
+
return stock_count if delivery_required?
|
93
|
+
|
94
|
+
stock_count - total_purchases
|
95
|
+
end
|
101
96
|
|
102
97
|
def update_vendor_price
|
103
|
-
return unless vendor.present? && product_type == vendor&.primary_product_type
|
104
|
-
return if price.blank?
|
98
|
+
return unless vendor.present? && product&.product_type == vendor&.primary_product_type
|
105
99
|
|
106
100
|
vendor.update(min_price: price) if vendor.min_price.nil? || price < vendor.min_price
|
107
101
|
vendor.update(max_price: price) if vendor.max_price.nil? || price > vendor.max_price
|
@@ -125,6 +119,22 @@ module SpreeCmCommissioner
|
|
125
119
|
end
|
126
120
|
end
|
127
121
|
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
|
128
138
|
end
|
129
139
|
end
|
130
140
|
|
@@ -143,5 +143,28 @@ module SpreeCmCommissioner
|
|
143
143
|
def number_of_guests
|
144
144
|
number_of_adults + number_of_kids
|
145
145
|
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
|
146
169
|
end
|
147
170
|
end
|
@@ -1,24 +1,29 @@
|
|
1
|
+
require_dependency 'spree_cm_commissioner'
|
2
|
+
|
1
3
|
module SpreeCmCommissioner
|
2
|
-
class Vehicle < Base
|
3
|
-
include SpreeCmCommissioner::
|
4
|
+
class Vehicle < SpreeCmCommissioner::Base
|
5
|
+
include SpreeCmCommissioner::RouteType
|
4
6
|
|
7
|
+
belongs_to :vehicle_type, class_name: 'SpreeCmCommissioner::VehicleType'
|
8
|
+
has_one :primary_photo, -> { order(position: :asc) }, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
|
5
9
|
belongs_to :vendor, class_name: 'Spree::Vendor'
|
6
10
|
|
7
|
-
|
8
|
-
has_one :seat_layout, as: :layoutable, class_name: 'SpreeCmCommissioner::SeatLayout', dependent: :destroy
|
11
|
+
after_commit :create_vehicle_option_value
|
9
12
|
|
10
|
-
has_many :
|
13
|
+
has_many :vehicle_photo, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
|
14
|
+
has_many :vehicle_seats, class_name: 'SpreeCmCommissioner::VehicleSeat', through: :vehicle_type
|
11
15
|
|
12
16
|
has_many :vehicle_option_types, class_name: 'SpreeCmCommissioner::VehicleOptionType', dependent: :destroy
|
13
17
|
has_many :option_value_vehicles, class_name: 'SpreeCmCommissioner::OptionValueVehicle', dependent: :destroy
|
14
18
|
|
15
19
|
validates :code, uniqueness: { scope: :vendor_id }, presence: true
|
16
|
-
validates :license_plate, uniqueness:
|
20
|
+
validates :license_plate, uniqueness: {}, allow_blank: true
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
def display_name
|
21
|
-
"#{code} (#{license_plate})"
|
22
|
+
def create_vehicle_option_value
|
23
|
+
SpreeCmCommissioner::VehicleOptionValueCreator.call(self)
|
22
24
|
end
|
25
|
+
|
26
|
+
self.whitelisted_ransackable_attributes = %w[license_plate code]
|
27
|
+
self.whitelisted_ransackable_associations = %w[vehicle_type]
|
23
28
|
end
|
24
29
|
end
|