spree_cm_commissioner 2.3.0.pre.pre21 → 2.3.1.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/spree/admin/product_completion_steps_controller.rb +17 -1
  4. data/app/controllers/spree/admin/tenants_controller.rb +1 -1
  5. data/app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb +0 -1
  6. data/app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb +41 -0
  7. data/app/controllers/spree/api/v2/tenant/trip_places_controller.rb +48 -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/interactors/spree_cm_commissioner/create_ticket.rb +2 -0
  11. data/app/interactors/spree_cm_commissioner/host_matcher.rb +1 -1
  12. data/app/interactors/spree_cm_commissioner/vendor_creation_telegram_alert_sender.rb +1 -1
  13. data/app/mailers/spree/order_mailer_decorator.rb +8 -9
  14. data/app/models/concerns/spree_cm_commissioner/service_recommendations.rb +2 -2
  15. data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
  16. data/app/models/spree_cm_commissioner/product_completion_step.rb +4 -1
  17. data/app/models/spree_cm_commissioner/product_completion_step_banner.rb +12 -0
  18. data/app/models/spree_cm_commissioner/product_completion_steps/social_entry_url.rb +86 -19
  19. data/app/models/spree_cm_commissioner/tenant.rb +10 -1
  20. data/app/models/spree_cm_commissioner/vendor_place.rb +10 -1
  21. data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +9 -0
  22. data/app/queries/spree_cm_commissioner/trip_query.rb +23 -17
  23. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_serializer.rb +1 -1
  24. data/app/services/spree_cm_commissioner/intercity_taxi_order/create.rb +8 -0
  25. data/app/services/spree_cm_commissioner/intercity_taxi_order/update.rb +35 -45
  26. data/app/views/shared/_asset_field.html.erb +13 -0
  27. data/app/views/spree/admin/product_completion_steps/_form.html.erb +28 -2
  28. data/app/views/spree/admin/product_completion_steps/_supported_fields.html.erb +33 -0
  29. data/app/views/spree/admin/tenants/_form.html.erb +1 -1
  30. data/config/initializers/spree_permitted_attributes.rb +1 -0
  31. data/config/locales/en.yml +4 -0
  32. data/config/locales/km.yml +65 -61
  33. data/config/routes.rb +16 -0
  34. data/db/migrate/20251119093000_add_tenant_id_to_cm_vendor_places.rb +7 -0
  35. data/lib/spree_cm_commissioner/test_helper/factories/product_completion_step_banner_factory.rb +7 -0
  36. data/lib/spree_cm_commissioner/version.rb +1 -1
  37. metadata +10 -2
@@ -1,12 +1,13 @@
1
1
  module SpreeCmCommissioner
2
2
  class TripQuery
3
- attr_reader :origin_id, :destination_id, :date, :vendor_id, :number_of_guests, :route_type, :params
3
+ attr_reader :origin_id, :destination_id, :date, :vendor_id, :tenant_id, :number_of_guests, :route_type, :params
4
4
 
5
- def initialize(origin_id:, destination_id:, date:, route_type: nil, vendor_id: nil, number_of_guests: nil, params: {}) # rubocop:disable Metrics/ParameterLists
5
+ def initialize(origin_id:, destination_id:, date:, route_type: nil, vendor_id: nil, tenant_id: nil, number_of_guests: nil, params: {}) # rubocop:disable Metrics/ParameterLists
6
6
  @origin_id = origin_id
7
7
  @destination_id = destination_id
8
8
  @date = date.to_date == Time.zone.now.to_date ? Time.zone.now : Time.zone.parse(date.to_s)
9
9
  @vendor_id = vendor_id
10
+ @tenant_id = tenant_id
10
11
  @number_of_guests = number_of_guests || 1
11
12
  @route_type = route_type
12
13
  @params = params
@@ -36,8 +37,9 @@ module SpreeCmCommissioner
36
37
 
37
38
  def direct_trips
38
39
  result = trip_scope
39
- result = result.where({ vendor_id: vendor_id }.compact)
40
+ result = result.where({ vendor_id: vendor_id }.compact) if vendor_id.present?
40
41
  result = result.where(route_type: route_type) if route_type.present?
42
+ result = result.where(spree_vendors: { tenant_id: tenant_id }) if tenant_id.present?
41
43
  paginate(result)
42
44
  end
43
45
 
@@ -56,20 +58,24 @@ module SpreeCmCommissioner
56
58
  private
57
59
 
58
60
  def trip_scope
59
- SpreeCmCommissioner::Trip
60
- .select(<<~SQL.squish)
61
- cm_trips.*,
62
- boarding.departure_time AS boarding_departure_time,
63
- boarding.stop_place_id AS boarding_stop_id, boarding.stop_name AS boarding_stop_name,
64
- drop_off.stop_name AS drop_off_stop_name, drop_off.stop_place_id AS drop_off_stop_id,
65
- drop_off.arrival_time AS drop_off_arrival_time,
66
- COALESCE(iv.quantity_available, 0) AS quantity_available,
67
- COALESCE(iv.max_capacity, 0) AS max_capacity,
68
- origin_places.name AS origin_place_name, dest_places.name AS destination_place_name,
69
- prices.amount AS amount, prices.compare_at_amount AS compare_at_amount,
70
- prices.currency AS currency
71
- SQL
72
- .includes(vendor: :logo, vehicle: :option_values)
61
+ scope = SpreeCmCommissioner::Trip
62
+ .select(<<~SQL.squish)
63
+ cm_trips.*,
64
+ boarding.departure_time AS boarding_departure_time,
65
+ boarding.stop_place_id AS boarding_stop_id, boarding.stop_name AS boarding_stop_name,
66
+ drop_off.stop_name AS drop_off_stop_name, drop_off.stop_place_id AS drop_off_stop_id,
67
+ drop_off.arrival_time AS drop_off_arrival_time,
68
+ COALESCE(iv.quantity_available, 0) AS quantity_available,
69
+ COALESCE(iv.max_capacity, 0) AS max_capacity,
70
+ origin_places.name AS origin_place_name, dest_places.name AS destination_place_name,
71
+ prices.amount AS amount, prices.compare_at_amount AS compare_at_amount,
72
+ prices.currency AS currency
73
+ SQL
74
+ .includes(vendor: :logo, vehicle: :option_values)
75
+
76
+ scope = scope.joins(:vendor) if tenant_id.present?
77
+
78
+ scope
73
79
  .joins(<<~SQL.squish)
74
80
  INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = cm_trips.id AND boarding.stop_type = 0
75
81
  INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = cm_trips.id AND drop_off.stop_type = 1
@@ -4,7 +4,7 @@ module SpreeCmCommissioner
4
4
  class TripVehicleSerializer < BaseSerializer
5
5
  set_type :vehicle
6
6
 
7
- attributes :id, :code, :vehicle_type
7
+ attributes :id, :code, :vehicle_type, :number_of_seats
8
8
 
9
9
  has_many :vehicle_photos, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
10
10
  has_many :amenities, serializer: ::SpreeCmCommissioner::V2::Storefront::AmenitySerializer
@@ -42,6 +42,7 @@ module SpreeCmCommissioner
42
42
  )
43
43
 
44
44
  build_guests_for!(line_item, quantity)
45
+ assign_saved_guests_to_line_item(line_item)
45
46
 
46
47
  order.save!
47
48
  order.update_with_updater!
@@ -62,6 +63,13 @@ module SpreeCmCommissioner
62
63
  def build_guests_for!(line_item, qty)
63
64
  Array.new(qty) { line_item.guests.new }
64
65
  end
66
+
67
+ def assign_saved_guests_to_line_item(line_item)
68
+ line_item.guests.each do |guest|
69
+ saved_guest = SpreeCmCommissioner::SavedGuest.new
70
+ guest.saved_guest = saved_guest
71
+ end
72
+ end
65
73
  end
66
74
  end
67
75
  end
@@ -1,23 +1,20 @@
1
1
  module SpreeCmCommissioner
2
2
  module IntercityTaxiOrder
3
3
  class Update
4
- attr_reader :order_number, :params
4
+ attr_reader :params
5
5
 
6
- def self.call(order_number:, params:)
7
- new(order_number: order_number, params: params).call
6
+ def self.call(params:)
7
+ new(params: params).call
8
8
  end
9
9
 
10
- def initialize(order_number:, params:)
11
- @order_number = order_number
10
+ def initialize(params:)
12
11
  @params = ensure_parameters(params)
13
12
  end
14
13
 
15
14
  def call
16
- order = Spree::Order.find_by!(number: order_number)
15
+ order = find_order!
17
16
  order.update!(order_params)
18
17
 
19
- create_billing_address_if_missing(order)
20
-
21
18
  order
22
19
  end
23
20
 
@@ -29,48 +26,41 @@ module SpreeCmCommissioner
29
26
  ::ActionController::Parameters.new(params)
30
27
  end
31
28
 
32
- def create_billing_address_if_missing(order)
33
- return if order.bill_address.present?
29
+ def find_order!
30
+ raise(ArgumentError, 'Order token is required') if order_token.blank?
31
+
32
+ Spree::Order.find_by!(token: order_token)
33
+ end
34
34
 
35
- SpreeCmCommissioner::BillingAddressCreator.call(order: order)
35
+ def order_token
36
+ params[:order_token]
36
37
  end
37
38
 
38
39
  def order_params
39
40
  params.require(:order).permit(
40
- :intel_phone_number,
41
- :email,
42
- line_items_attributes: [
43
- :id,
44
- :pickup_place_name,
45
- :drop_off_place_name,
46
- :from_date,
47
- :pickup_lat,
48
- :pickup_lng,
49
- :pickup_oob_confirmed,
50
- :drop_off_lat,
51
- :drop_off_lng,
52
- :drop_off_oob_confirmed,
53
- :distance_km,
54
- :ordered_points,
55
- :base_km,
56
- :detour_pickup_km,
57
- :detour_dropoff_km,
58
- :extra_pickup_km,
59
- :extra_dropoff_km,
60
- :extra_pickup_charge_usd,
61
- :extra_dropoff_charge_usd,
62
- :estimated_time_minutes,
63
- :remark,
64
- :passenger_count,
65
- { guests_attributes: %i[
66
- id
67
- first_name
68
- last_name
69
- gender
70
- nationality_id
71
- age
72
- ]
73
- }
41
+ line_items_attributes: %i[
42
+ id
43
+ pickup_place_name
44
+ drop_off_place_name
45
+ from_date
46
+ pickup_lat
47
+ pickup_lng
48
+ pickup_oob_confirmed
49
+ drop_off_lat
50
+ drop_off_lng
51
+ drop_off_oob_confirmed
52
+ distance_km
53
+ ordered_points
54
+ base_km
55
+ detour_pickup_km
56
+ detour_dropoff_km
57
+ extra_pickup_km
58
+ extra_dropoff_km
59
+ extra_pickup_charge_usd
60
+ extra_dropoff_charge_usd
61
+ estimated_time_minutes
62
+ remark
63
+ passenger_count
74
64
  ]
75
65
  )
76
66
  end
@@ -3,6 +3,8 @@
3
3
  <%# :asset %>
4
4
  <%# :remove_url, optional %>
5
5
  <%# :classes, optional %>
6
+ <%# :aspect_ratio, optional %>
7
+ <%# :size_info, optional %>
6
8
  <%# :form %>
7
9
  <%# :required, optional, default: false %>
8
10
 
@@ -16,6 +18,17 @@
16
18
  class: 'rounded border mb-4 mw-100',
17
19
  style: 'max-height: 100px') if asset.present? && asset.attachment.present? %>
18
20
 
21
+ <% if defined?(aspect_ratio) || defined?(size_info) %>
22
+ <small class="mb-2 form-text text-muted d-block">
23
+ <% if defined?(aspect_ratio) && aspect_ratio.present? %>
24
+ <strong>Aspect Ratio:</strong> <%= aspect_ratio %><br>
25
+ <% end %>
26
+ <% if defined?(size_info) && size_info.present? %>
27
+ <strong>Recommended Size:</strong> <%= size_info %>
28
+ <% end %>
29
+ </small>
30
+ <% end %>
31
+
19
32
  <div data-hook="file" class="form-group">
20
33
  <%= form.label field, label || Spree.t(field) %>
21
34
  <%= form.file_field field, required: required %>
@@ -1,7 +1,7 @@
1
1
  <div data-hook="admin_product_completion_step_form_fields">
2
2
  <div data-hook="product_completion_step" class="row">
3
3
  <div class="col-12 col-md-6">
4
- <div class="card mb-3">
4
+ <div class="mb-3 card">
5
5
  <div class="card-header">
6
6
  <h5 class="mb-0"><%= Spree.t(:settings) %></h5>
7
7
  </div>
@@ -32,7 +32,7 @@
32
32
  </div>
33
33
 
34
34
  <div class="col-12 col-md-6">
35
- <div class="card mb-3">
35
+ <div class="mb-3 card">
36
36
  <div class="card-header">
37
37
  <h5 class="mb-0"><%= Spree.t(:completion_settings) %></h5>
38
38
  </div>
@@ -49,6 +49,32 @@
49
49
  </div>
50
50
  </div>
51
51
  </div>
52
+
53
+ <div class="mb-3 card">
54
+ <div class="card-header">
55
+ <h5 class="mb-0"><%= Spree.t(:banner) %></h5>
56
+ </div>
57
+ <div class="card-body">
58
+ <%= render 'shared/asset_field',
59
+ field: :banner,
60
+ label: Spree.t(:banner),
61
+ asset: @object.banner,
62
+ remove_url: (@object.banner.present? ? remove_banner_admin_product_product_completion_step_url(@object.product, @object) : nil),
63
+ form: f,
64
+ size_info: 'Min: 480x270, Max: 960x540',
65
+ aspect_ratio: '16x9',
66
+ classes: ['col-md-12']
67
+ %>
68
+ </div>
69
+ </div>
52
70
  </div>
53
71
  </div>
72
+
73
+ <% if @object.is_a?(SpreeCmCommissioner::ProductCompletionSteps::SocialEntryUrl) %>
74
+ <div class="row mt-3">
75
+ <div class="col-12">
76
+ <%= render 'supported_fields' %>
77
+ </div>
78
+ </div>
79
+ <% end %>
54
80
  </div>
@@ -0,0 +1,33 @@
1
+ <div class="mb-3 card">
2
+ <div class="card-header">
3
+ <h5 class="mb-0">Supported Placeholder Fields</h5>
4
+ </div>
5
+ <div class="card-body">
6
+ <p class="text-muted mb-3">Use these placeholders in your entry point link template:</p>
7
+
8
+ <% if @object.is_a?(SpreeCmCommissioner::ProductCompletionSteps::SocialEntryUrl) && @object.supported_fields.present? %>
9
+ <% @object.supported_fields.each do |category, fields| %>
10
+ <div class="mb-3">
11
+ <h6 class="fw-bold text-capitalize">
12
+ <%= category.to_s.humanize %>
13
+ <span class="badge bg-secondary"><%= fields.count %></span>
14
+ </h6>
15
+ <div class="field-list">
16
+ <% fields.each do |field| %>
17
+ <div class="field-item d-inline-block me-2 mb-2">
18
+ <code class="bg-light p-2 rounded">
19
+ {<%= category %><%= category == :guests ? '[index]' : '' %>.<%=field %>}
20
+ </code>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ </div>
25
+ <% end %>
26
+
27
+ <div class="alert alert-info mt-3">
28
+ <strong>Example:</strong><br>
29
+ <code>https://example.com?order={order.number}&name={bill_address.first_name}&guest={guests[0].first_name}</code>
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ </div>
@@ -36,7 +36,7 @@
36
36
  <div class="col-12">
37
37
  <%= f.field_container :host do %>
38
38
  <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
39
- <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
39
+ <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'example.com' %>
40
40
  <% if f.object.errors[:host].any? %>
41
41
  <div class="error text-danger"><%= f.object.errors[:host].join(', ') %></div>
42
42
  <% end %>
@@ -48,6 +48,7 @@ module Spree
48
48
  :preferred_sms_sender_id,
49
49
  :preferred_telegram_order_alert_chat_id,
50
50
  :preferred_telegram_order_request_alert_chat_id,
51
+ :preferred_telegram_new_vendor_alert_chat_id,
51
52
  :preferred_assetlinks,
52
53
  :preferred_apple_app_site_association,
53
54
  { default_notification_image_attributes: {} },
@@ -509,6 +509,10 @@ en:
509
509
  attributes:
510
510
  place_id:
511
511
  taken: "has already existed with this place type"
512
+ spree_cm_commissioner/tenant:
513
+ attributes:
514
+ host:
515
+ format: "must not include protocol (http:// or https://)"
512
516
 
513
517
  mail:
514
518
  order_mailer:
@@ -370,6 +370,10 @@ km:
370
370
  attributes:
371
371
  exception_rules:
372
372
  invalid_json: "Format មិនត្រឹមត្រូវ"
373
+ spree_cm_commissioner/tenant:
374
+ attributes:
375
+ host:
376
+ format: "មិនអនុញ្ញាតឱ្យបញ្ចូលឈ្មោះដែលភ្ជាប់ជាមួយ (http:// ឬ https://)"
373
377
 
374
378
  mail:
375
379
  order_mailer:
@@ -469,64 +473,64 @@ km:
469
473
 
470
474
  blazer:
471
475
  columns:
472
- 'No.': "លេខរៀង"
473
- 'Reservation No.': "លេខកក់"
474
- 'Direction': "ទិសដៅ"
475
- 'Vehicle type': "ប្រភេទយានយន្ត"
476
- 'Seller': "អ្នកលក់"
477
- 'Paid to': "បង់ទៅ"
478
- 'Branch': "សាខា"
479
- 'Gateway': "ច្រកទ្វារ"
480
- 'Departure': "ចេញដំណើរ"
481
- 'Issued': "ចេញឲ្យ"
482
- 'Paid': "បានបង់"
483
- '# of seats': "ចំនួនកៅអី"
484
- 'Source': "ប្រភព"
485
- 'Status': "ស្ថានភាព"
486
- 'Fare': "តម្លៃឈ្នួល"
487
- 'Discount': "ការបញ្ចុះតម្លៃ"
488
- 'Commission': "កម្រៃជើងសារ"
489
- 'Amount': "ចំនួនទឹកប្រាក់"
490
- 'Metric': "រង្វាស់"
491
- 'Value': "តម្លៃ"
492
- 'Group': "ក្រុម"
493
- 'Orders': "ការបញ្ជាទិញ"
494
- 'Passengers': "អ្នកដំណើរ"
495
- 'Total fare': "តម្លៃឈ្នួលសរុប"
496
- 'Total discount': "ការបញ្ចុះតម្លៃសរុប"
497
- 'Total commission': "កម្រៃជើងសារសរុប"
498
- 'Total amount': "ចំនួនទឹកប្រាក់សរុប"
499
- 'Trip ID': "លេខសម្គាល់ជើងដំណើរ"
500
- 'Route': "ផ្លូវ"
501
- 'Origin': "ទីតាំងដើម"
502
- 'Destination': "ទីតាំងគោលដៅ"
503
- 'Departure Time': "ម៉ោងចេញដំណើរ"
504
- 'Vehicle': "យានយន្ត"
505
- 'Total Seats': "ចំនួនកៅអីសរុប"
506
- 'Bookings': "ការកក់"
507
- 'Seats Sold': "កៅអីលក់បាន"
508
- 'Occupancy %': "ភាគរយនៃការកាន់កាប់"
509
- 'Total Revenue': "ចំណូលសរុប"
510
- 'Avg Ticket Price': "តម្លៃសំបុត្រជាមធ្យម"
511
- 'Date': "កាលបរិច្ឆេទ"
512
- 'Time': "ម៉ោង"
513
- 'From': "ពី"
514
- 'To': "ទៅ"
515
- 'Capacity': "ចំណុះ"
516
- 'Available': "ទំនេរ"
517
- 'Filled %': "ភាគរយនៃការបំពេញ"
518
- 'Vehicle Code': "លេខកូដយានយន្ត"
519
- 'Plate': "ស្លាកលេខ"
520
- 'Type': "ប្រភេទ"
521
- 'Total Trips': "ចំនួនជើងដំណើរ​សរុប"
522
- 'Trips with Bookings': "ជើងដំណើរ​មានការកក់"
523
- 'Total Bookings': "ចំនួនការកក់​សរុប"
524
- 'Total Passengers': "ចំនួនអ្នកដំណើរ​សរុប"
525
- 'Avg Occupancy %': "ភាគរយនៃការកាន់កាប់​ជាមធ្យម"
526
- 'Lead Time': "រយៈពេលនៃការរង់ចាំ"
527
- 'Revenue': "ចំណូល"
528
- 'Avg Days in Advance': "ចំនួនថ្ងៃជាមធ្យមមុន"
529
- 'Current Period': "រយៈពេលបច្ចុប្បន្ន"
530
- 'Previous Period': "រយៈពេលមុន"
531
- 'Change': "បំលាស់ប្តូរ"
532
- 'Change %': "ភាគរយនៃបំលាស់ប្តូរ"
476
+ "No.": "លេខរៀង"
477
+ "Reservation No.": "លេខកក់"
478
+ "Direction": "ទិសដៅ"
479
+ "Vehicle type": "ប្រភេទយានយន្ត"
480
+ "Seller": "អ្នកលក់"
481
+ "Paid to": "បង់ទៅ"
482
+ "Branch": "សាខា"
483
+ "Gateway": "ច្រកទ្វារ"
484
+ "Departure": "ចេញដំណើរ"
485
+ "Issued": "ចេញឲ្យ"
486
+ "Paid": "បានបង់"
487
+ "# of seats": "ចំនួនកៅអី"
488
+ "Source": "ប្រភព"
489
+ "Status": "ស្ថានភាព"
490
+ "Fare": "តម្លៃឈ្នួល"
491
+ "Discount": "ការបញ្ចុះតម្លៃ"
492
+ "Commission": "កម្រៃជើងសារ"
493
+ "Amount": "ចំនួនទឹកប្រាក់"
494
+ "Metric": "រង្វាស់"
495
+ "Value": "តម្លៃ"
496
+ "Group": "ក្រុម"
497
+ "Orders": "ការបញ្ជាទិញ"
498
+ "Passengers": "អ្នកដំណើរ"
499
+ "Total fare": "តម្លៃឈ្នួលសរុប"
500
+ "Total discount": "ការបញ្ចុះតម្លៃសរុប"
501
+ "Total commission": "កម្រៃជើងសារសរុប"
502
+ "Total amount": "ចំនួនទឹកប្រាក់សរុប"
503
+ "Trip ID": "លេខសម្គាល់ជើងដំណើរ"
504
+ "Route": "ផ្លូវ"
505
+ "Origin": "ទីតាំងដើម"
506
+ "Destination": "ទីតាំងគោលដៅ"
507
+ "Departure Time": "ម៉ោងចេញដំណើរ"
508
+ "Vehicle": "យានយន្ត"
509
+ "Total Seats": "ចំនួនកៅអីសរុប"
510
+ "Bookings": "ការកក់"
511
+ "Seats Sold": "កៅអីលក់បាន"
512
+ "Occupancy %": "ភាគរយនៃការកាន់កាប់"
513
+ "Total Revenue": "ចំណូលសរុប"
514
+ "Avg Ticket Price": "តម្លៃសំបុត្រជាមធ្យម"
515
+ "Date": "កាលបរិច្ឆេទ"
516
+ "Time": "ម៉ោង"
517
+ "From": "ពី"
518
+ "To": "ទៅ"
519
+ "Capacity": "ចំណុះ"
520
+ "Available": "ទំនេរ"
521
+ "Filled %": "ភាគរយនៃការបំពេញ"
522
+ "Vehicle Code": "លេខកូដយានយន្ត"
523
+ "Plate": "ស្លាកលេខ"
524
+ "Type": "ប្រភេទ"
525
+ "Total Trips": "ចំនួនជើងដំណើរ​សរុប"
526
+ "Trips with Bookings": "ជើងដំណើរ​មានការកក់"
527
+ "Total Bookings": "ចំនួនការកក់​សរុប"
528
+ "Total Passengers": "ចំនួនអ្នកដំណើរ​សរុប"
529
+ "Avg Occupancy %": "ភាគរយនៃការកាន់កាប់​ជាមធ្យម"
530
+ "Lead Time": "រយៈពេលនៃការរង់ចាំ"
531
+ "Revenue": "ចំណូល"
532
+ "Avg Days in Advance": "ចំនួនថ្ងៃជាមធ្យមមុន"
533
+ "Current Period": "រយៈពេលបច្ចុប្បន្ន"
534
+ "Previous Period": "រយៈពេលមុន"
535
+ "Change": "បំលាស់ប្តូរ"
536
+ "Change %": "ភាគរយនៃបំលាស់ប្តូរ"
data/config/routes.rb CHANGED
@@ -163,6 +163,10 @@ Spree::Core::Engine.add_routes do
163
163
  collection do
164
164
  post :update_positions
165
165
  end
166
+
167
+ member do
168
+ delete :remove_banner
169
+ end
166
170
  end
167
171
 
168
172
  resources :product_places do
@@ -546,6 +550,18 @@ Spree::Core::Engine.add_routes do
546
550
  resources :guest_card_classes
547
551
  resources :tickets, only: :index
548
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
+ resources :draft_orders, only: [:create] do
559
+ collection do
560
+ patch :update
561
+ end
562
+ end
563
+ end
564
+
549
565
  resource :reset_passwords, only: [:update]
550
566
  resource :change_passwords, only: [:update]
551
567
  resource :user_contacts, only: [:update]
@@ -0,0 +1,7 @@
1
+ class AddTenantIdToCmVendorPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_places, :tenant_id, :integer, if_not_exists: true
4
+ add_index :cm_vendor_places, :tenant_id, if_not_exists: true
5
+ add_index :cm_vendor_places, %i[tenant_id vendor_id], if_not_exists: true, name: 'index_cm_vendor_places_on_tenant_and_vendor'
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :cm_product_completion_step_banner, class: SpreeCmCommissioner::ProductCompletionStepBanner do
3
+ viewable_type { 'SpreeCmCommissioner::ProductCompletionStep' }
4
+ viewable_id { nil }
5
+ attachment { Rack::Test::UploadedFile.new(Spree::Core::Engine.root.join('spec', 'fixtures', 'files', 'icon_256x256.png'), 'image/*') }
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.3.0-pre21'.freeze
2
+ VERSION = '2.3.1.pre.pre1'.freeze
3
3
 
4
4
  module_function
5
5
 
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.0.pre.pre21
4
+ version: 2.3.1.pre.pre1
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-14 00:00:00.000000000 Z
11
+ date: 2025-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -1013,6 +1013,7 @@ files:
1013
1013
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
1014
1014
  - app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
1015
1015
  - app/controllers/spree/api/v2/tenant/id_cards_controller.rb
1016
+ - app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb
1016
1017
  - app/controllers/spree/api/v2/tenant/line_items_controller.rb
1017
1018
  - app/controllers/spree/api/v2/tenant/notifications_controller.rb
1018
1019
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
@@ -1025,6 +1026,9 @@ files:
1025
1026
  - app/controllers/spree/api/v2/tenant/s3_signed_urls_controller.rb
1026
1027
  - app/controllers/spree/api/v2/tenant/taxons_controller.rb
1027
1028
  - app/controllers/spree/api/v2/tenant/tickets_controller.rb
1029
+ - app/controllers/spree/api/v2/tenant/trip_places_controller.rb
1030
+ - app/controllers/spree/api/v2/tenant/trip_search_controller.rb
1031
+ - app/controllers/spree/api/v2/tenant/trips_controller.rb
1028
1032
  - app/controllers/spree/api/v2/tenant/user_account_linkages_controller.rb
1029
1033
  - app/controllers/spree/api/v2/tenant/user_contacts_controller.rb
1030
1034
  - app/controllers/spree/api/v2/tenant/user_device_tokens_controller.rb
@@ -1484,6 +1488,7 @@ files:
1484
1488
  - app/models/spree_cm_commissioner/place.rb
1485
1489
  - app/models/spree_cm_commissioner/price_decorator.rb
1486
1490
  - app/models/spree_cm_commissioner/product_completion_step.rb
1491
+ - app/models/spree_cm_commissioner/product_completion_step_banner.rb
1487
1492
  - app/models/spree_cm_commissioner/product_completion_steps/chatrace_telegram.rb
1488
1493
  - app/models/spree_cm_commissioner/product_completion_steps/social_entry_url.rb
1489
1494
  - app/models/spree_cm_commissioner/product_decorator.rb
@@ -2101,6 +2106,7 @@ files:
2101
2106
  - app/views/spree/admin/orders/notifications.html.erb
2102
2107
  - app/views/spree/admin/product_commissions/index.html.erb
2103
2108
  - app/views/spree/admin/product_completion_steps/_form.html.erb
2109
+ - app/views/spree/admin/product_completion_steps/_supported_fields.html.erb
2104
2110
  - app/views/spree/admin/product_completion_steps/edit.html.erb
2105
2111
  - app/views/spree/admin/product_completion_steps/index.html.erb
2106
2112
  - app/views/spree/admin/product_completion_steps/new.html.erb
@@ -2850,6 +2856,7 @@ files:
2850
2856
  - db/migrate/20251009073040_add_lock_version_to_cm_routes.rb
2851
2857
  - db/migrate/20251009073929_add_lock_version_to_cm_vendor_routes.rb
2852
2858
  - db/migrate/20251113081853_add_index_to_spree_orders_updated_at.rb
2859
+ - db/migrate/20251119093000_add_tenant_id_to_cm_vendor_places.rb
2853
2860
  - docker-compose.yml
2854
2861
  - docs/api/scoped-access-token-endpoints.md
2855
2862
  - docs/option_types/attr_types.md
@@ -2922,6 +2929,7 @@ files:
2922
2929
  - lib/spree_cm_commissioner/test_helper/factories/permission.rb
2923
2930
  - lib/spree_cm_commissioner/test_helper/factories/pin_code_factory.rb
2924
2931
  - lib/spree_cm_commissioner/test_helper/factories/place_factory.rb
2932
+ - lib/spree_cm_commissioner/test_helper/factories/product_completion_step_banner_factory.rb
2925
2933
  - lib/spree_cm_commissioner/test_helper/factories/product_completion_step_factory.rb
2926
2934
  - lib/spree_cm_commissioner/test_helper/factories/product_factory.rb
2927
2935
  - lib/spree_cm_commissioner/test_helper/factories/products_taxons_factory.rb