spree_cm_commissioner 2.3.2 → 2.4.1

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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb +52 -11
  4. data/app/controllers/spree/api/v2/storefront/popular_route_places_controller.rb +63 -0
  5. data/app/controllers/spree/api/v2/storefront/route_places_controller.rb +90 -0
  6. data/app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb +81 -0
  7. data/app/controllers/spree/api/v2/tenant/trip_places_controller.rb +42 -0
  8. data/app/controllers/spree/api/v2/tenant/trip_search_controller.rb +103 -0
  9. data/app/controllers/spree/api/v2/tenant/trips_controller.rb +32 -0
  10. data/app/factory/spree_cm_commissioner/order_telegram_message_factory.rb +12 -0
  11. data/app/finders/spree_cm_commissioner/places/find_with_route.rb +50 -0
  12. data/app/finders/spree_cm_commissioner/routes/find_popular.rb +25 -0
  13. data/app/mailers/spree/order_mailer_decorator.rb +8 -6
  14. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +34 -89
  15. data/app/models/concerns/spree_cm_commissioner/service_recommendations.rb +2 -2
  16. data/app/models/spree_cm_commissioner/adjustment_decorator.rb +1 -1
  17. data/app/models/spree_cm_commissioner/calculators/extra_drop_off_distance.rb +15 -0
  18. data/app/models/spree_cm_commissioner/calculators/extra_pick_up_distance.rb +15 -0
  19. data/app/models/spree_cm_commissioner/order_decorator.rb +1 -1
  20. data/app/models/spree_cm_commissioner/place.rb +7 -0
  21. data/app/models/spree_cm_commissioner/pricing_action.rb +27 -0
  22. data/app/models/spree_cm_commissioner/pricing_model.rb +18 -0
  23. data/app/models/spree_cm_commissioner/pricing_model_variant.rb +6 -0
  24. data/app/models/spree_cm_commissioner/pricing_rule.rb +15 -0
  25. data/app/models/spree_cm_commissioner/pricing_rule_group.rb +20 -0
  26. data/app/models/spree_cm_commissioner/pricing_rules/extra_drop_off_distance.rb +10 -0
  27. data/app/models/spree_cm_commissioner/pricing_rules/extra_pick_up_distance.rb +12 -0
  28. data/app/models/spree_cm_commissioner/pricing_rules/nationality.rb +35 -0
  29. data/app/models/spree_cm_commissioner/tenant.rb +4 -0
  30. data/app/models/spree_cm_commissioner/variant_decorator.rb +3 -0
  31. data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -0
  32. data/app/models/spree_cm_commissioner/vendor_place.rb +9 -0
  33. data/app/queries/spree_cm_commissioner/trip_query.rb +23 -17
  34. data/app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_schema.rb +10 -0
  35. data/app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_update_schema.rb +29 -0
  36. data/app/request_schemas/spree_cm_commissioner/route_places_request_schema.rb +13 -0
  37. data/app/serializers/spree/v2/storefront/place_serializer.rb +3 -2
  38. data/app/serializers/spree/v2/tenant/cart_serializer.rb +1 -0
  39. data/app/serializers/spree/v2/tenant/intercity_taxi_cart_serializer.rb +12 -0
  40. data/app/serializers/spree/v2/tenant/line_item_serializer.rb +1 -0
  41. data/app/serializers/spree/v2/tenant/trip_place_serializer.rb +8 -0
  42. data/app/serializers/spree/v2/tenant/trip_query_result_serializer.rb +8 -0
  43. data/app/serializers/spree/v2/tenant/trip_serializer.rb +8 -0
  44. data/app/serializers/spree_cm_commissioner/v2/storefront/intercity_taxi_line_item_serializer.rb +17 -18
  45. data/app/serializers/spree_cm_commissioner/v2/storefront/route_serializer.rb +12 -0
  46. data/app/services/spree_cm_commissioner/intercity_taxi_order/create.rb +20 -23
  47. data/app/services/spree_cm_commissioner/intercity_taxi_order/update.rb +36 -72
  48. data/app/services/spree_cm_commissioner/pricing_models/apply.rb +51 -0
  49. data/app/services/spree_cm_commissioner/pricing_rules/build_params.rb +53 -0
  50. data/app/services/spree_cm_commissioner/pricing_rules/build_template.rb +27 -0
  51. data/app/services/spree_cm_commissioner/pricing_rules/create.rb +10 -0
  52. data/app/services/spree_cm_commissioner/pricing_rules/update.rb +11 -0
  53. data/app/services/spree_cm_commissioner/vendor_places/base.rb +24 -0
  54. data/app/services/spree_cm_commissioner/vendor_places/bulk_create.rb +70 -0
  55. data/app/services/spree_cm_commissioner/vendor_places/create_with_google_map_data.rb +85 -0
  56. data/app/services/spree_cm_commissioner/vendor_places/update.rb +56 -0
  57. data/app/views/spree/order_mailer/confirm_email.html.erb +1 -1
  58. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +14 -13
  59. data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +6 -4
  60. data/config/routes.rb +11 -1
  61. data/db/migrate/20250915075830_create_spree_cm_commissioner_pricing_models.rb +17 -0
  62. data/db/migrate/20250915080733_create_spree_cm_commissioner_pricing_model_variants.rb +14 -0
  63. data/db/migrate/20251003082144_create_spree_cm_commissioner_pricing_rule_groups.rb +16 -0
  64. data/db/migrate/20251003093408_create_spree_cm_commissioner_pricing_rule.rb +19 -0
  65. data/db/migrate/20251003093643_create_spree_cm_commissioner_pricing_action.rb +14 -0
  66. data/db/migrate/20251119093000_add_tenant_id_to_cm_vendor_places.rb +8 -0
  67. data/lib/spree_cm_commissioner/intercity_taxi/distance.rb +38 -0
  68. data/lib/spree_cm_commissioner/intercity_taxi/map_place.rb +31 -0
  69. data/lib/spree_cm_commissioner/test_helper/factories/pricing_action_factory.rb +5 -0
  70. data/lib/spree_cm_commissioner/test_helper/factories/pricing_model_factory.rb +8 -0
  71. data/lib/spree_cm_commissioner/test_helper/factories/pricing_rule_factory.rb +17 -0
  72. data/lib/spree_cm_commissioner/test_helper/factories/pricing_rule_group_factory.rb +8 -0
  73. data/lib/spree_cm_commissioner/version.rb +1 -1
  74. data/lib/spree_cm_commissioner.rb +2 -0
  75. metadata +49 -2
@@ -74,7 +74,9 @@
74
74
  background-position: center;
75
75
  background-repeat: no-repeat;
76
76
  border-radius: 1.5625rem 1.5625rem 0 0;
77
- background: <%= @brand_color %>;
77
+ <% if @brand_color.present? %>
78
+ background: <%= @brand_color %>;
79
+ <% end %>
78
80
  }
79
81
  #confirm-email #greeting-card-1 p,
80
82
  #confirm-email #greeting-card-1 .header,
@@ -93,21 +95,20 @@
93
95
  margin-bottom: 0.625rem;
94
96
  }
95
97
  #confirm-email .icon-hang-meas {
96
- width: 6.25rem;
97
- height: 6.25rem;
98
- border-radius: 50%;
99
- background-color: #fff;
100
- display: flex;
101
- align-items: center;
102
- justify-content: center;
103
- overflow: hidden;
98
+ width: 50%;
99
+ text-align: right;
104
100
  }
105
-
106
101
  #confirm-email .icon-hang-meas img {
107
- width: 100%;
108
- height: 100%;
109
- object-fit: cover;
102
+ width: 6.25rem;
103
+ height: 6.25rem;
110
104
  border-radius: 50%;
105
+ background-color: #fff;
106
+ display: inline-block;
107
+ }
108
+ #confirm-email .header h1 {
109
+ margin: 0;
110
+ color: #fff;
111
+ width: 50%;
111
112
  }
112
113
 
113
114
  #confirm-email .header {
@@ -1,9 +1,11 @@
1
1
  <div id="greeting-card-1">
2
2
  <div>
3
3
  <div class="header">
4
- <h1><%=@order.tenant.name %></h1>
5
- <% if @vendor_logo_url.present? %>
6
- <img src="<%= @vendor_logo_url %>" alt="Vendor Logo" class="icon-hang-meas">
4
+ <h1><%= name %></h1>
5
+ <% if logo.present? %>
6
+ <div class="icon-hang-meas">
7
+ <img src="<%= logo %>" alt="<%= name %> Logo">
8
+ </div>
7
9
  <% end %>
8
10
  </div>
9
11
  <div class="booking-confirm">
@@ -13,7 +15,7 @@
13
15
  <%= I18n.t('mail.order_mailer.hello', full_name: user_full_name(order)) %>
14
16
  </div>
15
17
  <div class="description">
16
- <%= I18n.t('mail.order_mailer.booking_event', order_number: @order.number || 'NA') %>
18
+ <%= I18n.t('mail.order_mailer.booking_event', order_number: order.number || 'NA') %>
17
19
  </div>
18
20
  </div>
19
21
  </div>
data/config/routes.rb CHANGED
@@ -550,6 +550,14 @@ Spree::Core::Engine.add_routes do
550
550
  resources :guest_card_classes
551
551
  resources :tickets, only: :index
552
552
 
553
+ resources :trip_places, only: :index
554
+ resources :trip_search, only: [:index]
555
+ resources :trips, only: %i[show]
556
+
557
+ namespace :intercity_taxi do
558
+ resource :draft_orders, only: %i[create update]
559
+ end
560
+
553
561
  resource :reset_passwords, only: [:update]
554
562
  resource :change_passwords, only: [:update]
555
563
  resource :user_contacts, only: [:update]
@@ -575,6 +583,8 @@ Spree::Core::Engine.add_routes do
575
583
  resources :trip_places
576
584
  resources :trip_search, only: [:index]
577
585
  resources :trips, only: %i[show]
586
+ resources :route_places, only: [:index]
587
+ resources :popular_route_places, only: [:index]
578
588
 
579
589
  namespace :queue_cart do
580
590
  resources :line_items, only: [:create]
@@ -689,7 +699,7 @@ Spree::Core::Engine.add_routes do
689
699
  resources :draft_orders, only: %i[create]
690
700
  end
691
701
  namespace :intercity_taxi do
692
- resources :draft_orders, only: %i[create update]
702
+ resource :draft_orders, only: %i[create update]
693
703
  end
694
704
  end
695
705
 
@@ -0,0 +1,17 @@
1
+ class CreateSpreeCmCommissionerPricingModels < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_pricing_models, if_not_exists: true do |t|
4
+ t.string :name, null: false
5
+ t.text :description
6
+ t.integer :status, default: 0, null: false
7
+ t.integer :position, null: false, default: 0
8
+
9
+ t.references :vendor, null: false, foreign_key: { to_table: :spree_vendors }
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :cm_pricing_models, :position unless index_exists?(:cm_pricing_models, :position)
15
+ add_index :cm_pricing_models, :vendor_id unless index_exists?(:cm_pricing_models, :vendor_id)
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSpreeCmCommissionerPricingModelVariants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_pricing_model_variants, if_not_exists: true do |t|
4
+ t.references :pricing_model, null: false, foreign_key: { to_table: :cm_pricing_models }
5
+ t.references :variant, null: false, foreign_key: { to_table: :spree_variants }
6
+ t.references :product, null: true, foreign_key: { to_table: :spree_products }
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :cm_pricing_model_variants, [:pricing_model_id, :variant_id], name: 'idx_pm_variants_on_model_variant'
12
+ add_index :cm_pricing_model_variants, [:pricing_model_id, :product_id], name: 'idx_pm_variants_on_model_product'
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ class CreateSpreeCmCommissionerPricingRuleGroups < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_pricing_rule_groups, if_not_exists: true do |t|
4
+ t.references :pricing_model, null: false, foreign_key: { to_table: :cm_pricing_models }
5
+ t.string :name
6
+ t.integer :position, default: 0
7
+ t.integer :status, default: 0, null: false
8
+ t.jsonb :public_metadata
9
+ t.jsonb :private_metadata
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :cm_pricing_rule_groups, :pricing_model_id, name: 'idx_rule_groups_on_model'
14
+ add_index :cm_pricing_rule_groups, [:pricing_model_id, :position], name: 'idx_rule_groups_on_model_position'
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ class CreateSpreeCmCommissionerPricingRule < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_pricing_rules, if_not_exists: true do |t|
4
+ t.references :pricing_rule_group, null: false, foreign_key: { to_table: :cm_pricing_rule_groups }
5
+ t.references :product, null: true, foreign_key: { to_table: :spree_products }
6
+ t.references :variant, null: true, foreign_key: { to_table: :spree_variants }
7
+ t.string :type, null: false
8
+ t.jsonb :public_metadata
9
+ t.jsonb :private_metadata
10
+ t.integer :position, null: false, default: 0
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :cm_pricing_rules, :position, name: 'idx_pricing_rules_on_position'
16
+ add_index :cm_pricing_rules, [:pricing_rule_group_id, :product_id], name: 'idx_pricing_rules_on_group_product'
17
+ add_index :cm_pricing_rules, [:pricing_rule_group_id, :variant_id], name: 'idx_pricing_rules_on_group_variant'
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSpreeCmCommissionerPricingAction < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_pricing_actions, if_not_exists: true do |t|
4
+ t.references :pricing_rule_group, null: false, foreign_key: { to_table: :cm_pricing_rule_groups }
5
+ t.references :product, null: true, foreign_key: { to_table: :spree_products }
6
+ t.references :variant, null: true, foreign_key: { to_table: :spree_variants }
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :cm_pricing_actions, [:pricing_rule_group_id, :product_id], name: 'idx_pricing_actions_on_group_product'
12
+ add_index :cm_pricing_actions, [:pricing_rule_group_id, :variant_id], name: 'idx_pricing_actions_on_group_variant'
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ class AddTenantIdToCmVendorPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_places, :tenant_id, :integer, if_not_exists: true
4
+ # Why: VendorPlace#before_save sets tenant_id from vendor; tenant APIs (TripPlacesController) and TripQuery
5
+ # join on vendor_places scoped by tenant, so this speeds tenant-scoped lookups
6
+ add_index :cm_vendor_places, :tenant_id, if_not_exists: true
7
+ end
8
+ end
@@ -0,0 +1,38 @@
1
+ module SpreeCmCommissioner
2
+ module IntercityTaxi
3
+ class Distance
4
+ attr_accessor :distance_km, :ordered_points, :estimated_time_minutes, :base_km,
5
+ :detour_pickup_km, :detour_dropoff_km, :extra_pickup_km, :extra_dropoff_km
6
+
7
+ def initialize(options = {})
8
+ options = options.stringify_keys if options.is_a?(Hash)
9
+
10
+ @distance_km = options['distance_km']&.to_f
11
+ @ordered_points = options['ordered_points']
12
+ @estimated_time_minutes = options['estimated_time_minutes']&.to_i
13
+ @base_km = options['base_km']&.to_f
14
+ @detour_pickup_km = options['detour_pickup_km']&.to_f
15
+ @detour_dropoff_km = options['detour_dropoff_km']&.to_f
16
+ @extra_pickup_km = options['extra_pickup_km']&.to_f
17
+ @extra_dropoff_km = options['extra_dropoff_km']&.to_f
18
+ end
19
+
20
+ def self.from_hash(hash)
21
+ new(hash || {})
22
+ end
23
+
24
+ def to_h
25
+ {
26
+ 'distance_km' => @distance_km,
27
+ 'ordered_points' => @ordered_points,
28
+ 'estimated_time_minutes' => @estimated_time_minutes,
29
+ 'base_km' => @base_km,
30
+ 'detour_pickup_km' => @detour_pickup_km,
31
+ 'detour_dropoff_km' => @detour_dropoff_km,
32
+ 'extra_pickup_km' => @extra_pickup_km,
33
+ 'extra_dropoff_km' => @extra_dropoff_km
34
+ }.compact
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeCmCommissioner
2
+ module IntercityTaxi
3
+ class MapPlace
4
+ attr_accessor :place_name, :lat, :lng, :oob_confirmed
5
+
6
+ def initialize(options = {})
7
+ options = options.stringify_keys if options.is_a?(Hash)
8
+
9
+ @place_name = options['place_name']
10
+ @lat = options['lat']&.to_f
11
+ @lng = options['lng']&.to_f
12
+
13
+ # Normalize truthy/falsey values ("true", "1", 1, etc.) to a real boolean.
14
+ @oob_confirmed = ActiveModel::Type::Boolean.new.cast(options['oob_confirmed'])
15
+ end
16
+
17
+ def self.from_hash(hash)
18
+ new(hash || {})
19
+ end
20
+
21
+ def to_h
22
+ {
23
+ 'place_name' => @place_name,
24
+ 'lat' => @lat,
25
+ 'lng' => @lng,
26
+ 'oob_confirmed' => @oob_confirmed
27
+ }.compact
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :pricing_action, class: 'SpreeCmCommissioner::PricingAction' do
3
+ association :pricing_rule_group, factory: :pricing_rule_group
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :cm_pricing_model, class: "SpreeCmCommissioner::PricingModel" do
3
+ association :vendor, factory: :cm_vendor
4
+ sequence(:name) { |n| "Pricing Model #{n}" }
5
+ description { "Test pricing model description" }
6
+ status { 'active' }
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ FactoryBot.define do
2
+ factory :pricing_rule_nationality, class: 'SpreeCmCommissioner::PricingRules::Nationality' do
3
+ association :pricing_rule_group, factory: :pricing_rule_group
4
+ rule_type { 'must' }
5
+ nationalities { ["Cambodian"] }
6
+ end
7
+
8
+ factory :pricing_rule_extra_pick_up_distance, class: 'SpreeCmCommissioner::PricingRules::ExtraPickUpDistance' do
9
+ association :pricing_rule_group, factory: :pricing_rule_group
10
+ min_distance { 5 }
11
+ end
12
+
13
+ factory :pricing_rule_extra_drop_off_distance, class: 'SpreeCmCommissioner::PricingRules::ExtraDropOffDistance' do
14
+ association :pricing_rule_group, factory: :pricing_rule_group
15
+ min_distance { 5 }
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :pricing_rule_group, class: 'SpreeCmCommissioner::PricingRuleGroup' do
3
+ association :pricing_model, factory: :cm_pricing_model
4
+ sequence(:name) { |n| "Rule Group #{n}" }
5
+ match_type { 'all' }
6
+ position { 0 }
7
+ end
8
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.3.2'.freeze
2
+ VERSION = '2.4.1'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -23,6 +23,8 @@ require 'spree_cm_commissioner/trip_query_result'
23
23
  require 'spree_cm_commissioner/cached_inventory_item'
24
24
  require 'spree_cm_commissioner/transit/leg'
25
25
  require 'spree_cm_commissioner/transit/seat_selection'
26
+ require 'spree_cm_commissioner/intercity_taxi/map_place'
27
+ require 'spree_cm_commissioner/intercity_taxi/distance'
26
28
 
27
29
  require 'activerecord_multi_tenant'
28
30
  require 'google/cloud/recaptcha_enterprise'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-11-26 00:00:00.000000000 Z
11
+ date: 2025-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -969,11 +969,13 @@ files:
969
969
  - app/controllers/spree/api/v2/storefront/pin_code_generators_controller.rb
970
970
  - app/controllers/spree/api/v2/storefront/pin_code_otp_checkers_controller.rb
971
971
  - app/controllers/spree/api/v2/storefront/pin_code_otp_generators_controller.rb
972
+ - app/controllers/spree/api/v2/storefront/popular_route_places_controller.rb
972
973
  - app/controllers/spree/api/v2/storefront/profile_images_controller.rb
973
974
  - app/controllers/spree/api/v2/storefront/provinces_controller.rb
974
975
  - app/controllers/spree/api/v2/storefront/qr_urls_controller.rb
975
976
  - app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb
976
977
  - app/controllers/spree/api/v2/storefront/reset_passwords_controller.rb
978
+ - app/controllers/spree/api/v2/storefront/route_places_controller.rb
977
979
  - app/controllers/spree/api/v2/storefront/s3_signed_urls_controller.rb
978
980
  - app/controllers/spree/api/v2/storefront/seat_layouts_controller.rb
979
981
  - app/controllers/spree/api/v2/storefront/self_check_in_controller.rb
@@ -1013,6 +1015,7 @@ files:
1013
1015
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
1014
1016
  - app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
1015
1017
  - app/controllers/spree/api/v2/tenant/id_cards_controller.rb
1018
+ - app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb
1016
1019
  - app/controllers/spree/api/v2/tenant/line_items_controller.rb
1017
1020
  - app/controllers/spree/api/v2/tenant/notifications_controller.rb
1018
1021
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
@@ -1025,6 +1028,9 @@ files:
1025
1028
  - app/controllers/spree/api/v2/tenant/s3_signed_urls_controller.rb
1026
1029
  - app/controllers/spree/api/v2/tenant/taxons_controller.rb
1027
1030
  - app/controllers/spree/api/v2/tenant/tickets_controller.rb
1031
+ - app/controllers/spree/api/v2/tenant/trip_places_controller.rb
1032
+ - app/controllers/spree/api/v2/tenant/trip_search_controller.rb
1033
+ - app/controllers/spree/api/v2/tenant/trips_controller.rb
1028
1034
  - app/controllers/spree/api/v2/tenant/user_account_linkages_controller.rb
1029
1035
  - app/controllers/spree/api/v2/tenant/user_contacts_controller.rb
1030
1036
  - app/controllers/spree/api/v2/tenant/user_device_tokens_controller.rb
@@ -1124,7 +1130,9 @@ files:
1124
1130
  - app/finders/spree_cm_commissioner/orders/find.rb
1125
1131
  - app/finders/spree_cm_commissioner/orders/find_by_state.rb
1126
1132
  - app/finders/spree_cm_commissioner/payment_methods/group_by_bank.rb
1133
+ - app/finders/spree_cm_commissioner/places/find_with_route.rb
1127
1134
  - app/finders/spree_cm_commissioner/products/find_decorator.rb
1135
+ - app/finders/spree_cm_commissioner/routes/find_popular.rb
1128
1136
  - app/helpers/spree/admin/base_helper_decorator.rb
1129
1137
  - app/helpers/spree/admin/google_wallets_helper.rb
1130
1138
  - app/helpers/spree/base_helper_decorator.rb
@@ -1398,6 +1406,8 @@ files:
1398
1406
  - app/models/spree_cm_commissioner/base.rb
1399
1407
  - app/models/spree_cm_commissioner/blazer_queryable.rb
1400
1408
  - app/models/spree_cm_commissioner/block.rb
1409
+ - app/models/spree_cm_commissioner/calculators/extra_drop_off_distance.rb
1410
+ - app/models/spree_cm_commissioner/calculators/extra_pick_up_distance.rb
1401
1411
  - app/models/spree_cm_commissioner/check_in.rb
1402
1412
  - app/models/spree_cm_commissioner/check_in_ability.rb
1403
1413
  - app/models/spree_cm_commissioner/check_in_record.rb
@@ -1483,6 +1493,14 @@ files:
1483
1493
  - app/models/spree_cm_commissioner/pin_code_update_user_login.rb
1484
1494
  - app/models/spree_cm_commissioner/place.rb
1485
1495
  - app/models/spree_cm_commissioner/price_decorator.rb
1496
+ - app/models/spree_cm_commissioner/pricing_action.rb
1497
+ - app/models/spree_cm_commissioner/pricing_model.rb
1498
+ - app/models/spree_cm_commissioner/pricing_model_variant.rb
1499
+ - app/models/spree_cm_commissioner/pricing_rule.rb
1500
+ - app/models/spree_cm_commissioner/pricing_rule_group.rb
1501
+ - app/models/spree_cm_commissioner/pricing_rules/extra_drop_off_distance.rb
1502
+ - app/models/spree_cm_commissioner/pricing_rules/extra_pick_up_distance.rb
1503
+ - app/models/spree_cm_commissioner/pricing_rules/nationality.rb
1486
1504
  - app/models/spree_cm_commissioner/product_completion_step.rb
1487
1505
  - app/models/spree_cm_commissioner/product_completion_step_banner.rb
1488
1506
  - app/models/spree_cm_commissioner/product_completion_steps/chatrace_telegram.rb
@@ -1749,8 +1767,11 @@ files:
1749
1767
  - app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
1750
1768
  - app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
1751
1769
  - app/request_schemas/spree_cm_commissioner/application_request_schema.rb
1770
+ - app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_schema.rb
1771
+ - app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_update_schema.rb
1752
1772
  - app/request_schemas/spree_cm_commissioner/inventory_item_schema.rb
1753
1773
  - app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
1774
+ - app/request_schemas/spree_cm_commissioner/route_places_request_schema.rb
1754
1775
  - app/request_schemas/spree_cm_commissioner/seat_layout_schema.rb
1755
1776
  - app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb
1756
1777
  - app/request_schemas/spree_cm_commissioner/user_account_linkage_request_schema.rb
@@ -1819,6 +1840,7 @@ files:
1819
1840
  - app/serializers/spree/v2/tenant/homepage_section_serializer.rb
1820
1841
  - app/serializers/spree/v2/tenant/id_card_serializer.rb
1821
1842
  - app/serializers/spree/v2/tenant/image_serializer.rb
1843
+ - app/serializers/spree/v2/tenant/intercity_taxi_cart_serializer.rb
1822
1844
  - app/serializers/spree/v2/tenant/line_item_serializer.rb
1823
1845
  - app/serializers/spree/v2/tenant/notification_serializer.rb
1824
1846
  - app/serializers/spree/v2/tenant/option_type_serializer.rb
@@ -1836,6 +1858,9 @@ files:
1836
1858
  - app/serializers/spree/v2/tenant/taxon_serializer.rb
1837
1859
  - app/serializers/spree/v2/tenant/taxonomy_serializer.rb
1838
1860
  - app/serializers/spree/v2/tenant/ticket_serializer.rb
1861
+ - app/serializers/spree/v2/tenant/trip_place_serializer.rb
1862
+ - app/serializers/spree/v2/tenant/trip_query_result_serializer.rb
1863
+ - app/serializers/spree/v2/tenant/trip_serializer.rb
1839
1864
  - app/serializers/spree/v2/tenant/user_contact_serializer.rb
1840
1865
  - app/serializers/spree/v2/tenant/user_device_token_serializer.rb
1841
1866
  - app/serializers/spree/v2/tenant/user_identity_provider_serializer.rb
@@ -1900,6 +1925,7 @@ files:
1900
1925
  - app/serializers/spree_cm_commissioner/v2/storefront/qr_url_serializer.rb
1901
1926
  - app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb
1902
1927
  - app/serializers/spree_cm_commissioner/v2/storefront/reset_password_serializer.rb
1928
+ - app/serializers/spree_cm_commissioner/v2/storefront/route_serializer.rb
1903
1929
  - app/serializers/spree_cm_commissioner/v2/storefront/saved_guest_serializer.rb
1904
1930
  - app/serializers/spree_cm_commissioner/v2/storefront/seat_layout_serializer.rb
1905
1931
  - app/serializers/spree_cm_commissioner/v2/storefront/seat_section_serializer.rb
@@ -1965,6 +1991,11 @@ files:
1965
1991
  - app/services/spree_cm_commissioner/organizer/export_invite_guest_csv_service.rb
1966
1992
  - app/services/spree_cm_commissioner/payment_method_type_mapper.rb
1967
1993
  - app/services/spree_cm_commissioner/penalty_calculator.rb
1994
+ - app/services/spree_cm_commissioner/pricing_models/apply.rb
1995
+ - app/services/spree_cm_commissioner/pricing_rules/build_params.rb
1996
+ - app/services/spree_cm_commissioner/pricing_rules/build_template.rb
1997
+ - app/services/spree_cm_commissioner/pricing_rules/create.rb
1998
+ - app/services/spree_cm_commissioner/pricing_rules/update.rb
1968
1999
  - app/services/spree_cm_commissioner/role_permissions_constructor.rb
1969
2000
  - app/services/spree_cm_commissioner/role_permissions_loader.rb
1970
2001
  - app/services/spree_cm_commissioner/routes/base_update_order_metrics.rb
@@ -1982,6 +2013,10 @@ files:
1982
2013
  - app/services/spree_cm_commissioner/user_authenticator.rb
1983
2014
  - app/services/spree_cm_commissioner/user_roles_assigner.rb
1984
2015
  - app/services/spree_cm_commissioner/users/incomplete_guest_checker_service.rb
2016
+ - app/services/spree_cm_commissioner/vendor_places/base.rb
2017
+ - app/services/spree_cm_commissioner/vendor_places/bulk_create.rb
2018
+ - app/services/spree_cm_commissioner/vendor_places/create_with_google_map_data.rb
2019
+ - app/services/spree_cm_commissioner/vendor_places/update.rb
1985
2020
  - app/services/spree_cm_commissioner/waiting_room_system_metadata_fetcher.rb
1986
2021
  - app/services/spree_cm_commissioner/waiting_room_system_metadata_setter.rb
1987
2022
  - app/services/spree_cm_commissioner/webhooks/subscribers/handle_request_decorator.rb
@@ -2845,13 +2880,19 @@ files:
2845
2880
  - db/migrate/20250911174607_add_metadata_columns_to_cm_vehicles.rb
2846
2881
  - db/migrate/20250911174653_add_metadata_columns_to_cm_trips.rb
2847
2882
  - db/migrate/20250912084944_add_send_type_to_sms_log.rb
2883
+ - db/migrate/20250915075830_create_spree_cm_commissioner_pricing_models.rb
2884
+ - db/migrate/20250915080733_create_spree_cm_commissioner_pricing_model_variants.rb
2848
2885
  - db/migrate/20250930094228_add_application_id_to_cm_pin_codes.rb
2849
2886
  - db/migrate/20250930100657_add_settings_to_spree_oauth_applications.rb
2887
+ - db/migrate/20251003082144_create_spree_cm_commissioner_pricing_rule_groups.rb
2888
+ - db/migrate/20251003093408_create_spree_cm_commissioner_pricing_rule.rb
2889
+ - db/migrate/20251003093643_create_spree_cm_commissioner_pricing_action.rb
2850
2890
  - db/migrate/20251008064344_add_route_id_to_cm_trips.rb
2851
2891
  - db/migrate/20251009033331_add_registered_by_to_spree_users.rb
2852
2892
  - db/migrate/20251009073040_add_lock_version_to_cm_routes.rb
2853
2893
  - db/migrate/20251009073929_add_lock_version_to_cm_vendor_routes.rb
2854
2894
  - db/migrate/20251113081853_add_index_to_spree_orders_updated_at.rb
2895
+ - db/migrate/20251119093000_add_tenant_id_to_cm_vendor_places.rb
2855
2896
  - docker-compose.yml
2856
2897
  - docs/api/scoped-access-token-endpoints.md
2857
2898
  - docs/option_types/attr_types.md
@@ -2876,6 +2917,8 @@ files:
2876
2917
  - lib/spree_cm_commissioner/calendar_event.rb
2877
2918
  - lib/spree_cm_commissioner/engine.rb
2878
2919
  - lib/spree_cm_commissioner/factories.rb
2920
+ - lib/spree_cm_commissioner/intercity_taxi/distance.rb
2921
+ - lib/spree_cm_commissioner/intercity_taxi/map_place.rb
2879
2922
  - lib/spree_cm_commissioner/jwt_token.rb
2880
2923
  - lib/spree_cm_commissioner/line_item_jwt_token.rb
2881
2924
  - lib/spree_cm_commissioner/order_jwt_token.rb
@@ -2924,6 +2967,10 @@ files:
2924
2967
  - lib/spree_cm_commissioner/test_helper/factories/permission.rb
2925
2968
  - lib/spree_cm_commissioner/test_helper/factories/pin_code_factory.rb
2926
2969
  - lib/spree_cm_commissioner/test_helper/factories/place_factory.rb
2970
+ - lib/spree_cm_commissioner/test_helper/factories/pricing_action_factory.rb
2971
+ - lib/spree_cm_commissioner/test_helper/factories/pricing_model_factory.rb
2972
+ - lib/spree_cm_commissioner/test_helper/factories/pricing_rule_factory.rb
2973
+ - lib/spree_cm_commissioner/test_helper/factories/pricing_rule_group_factory.rb
2927
2974
  - lib/spree_cm_commissioner/test_helper/factories/product_completion_step_banner_factory.rb
2928
2975
  - lib/spree_cm_commissioner/test_helper/factories/product_completion_step_factory.rb
2929
2976
  - lib/spree_cm_commissioner/test_helper/factories/product_factory.rb