spree_cm_commissioner 2.0.0.pre.pre → 2.0.1.pre.pre

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +3 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/assets/images/cm-hangmeas-checkout_image.svg +63 -0
  5. data/app/assets/images/cm-hangmeas-failed.svg +56 -0
  6. data/app/assets/images/cm-hangmeas-loader.svg +50 -0
  7. data/app/assets/images/cm-hangmeas-success.svg +51 -0
  8. data/app/assets/javascripts/spree_cm_commissioner/backend.js +1 -0
  9. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +65 -0
  10. data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +1 -0
  11. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +60 -0
  12. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +2 -1
  13. data/app/controllers/spree/admin/event_blazer_queries_controller.rb +11 -4
  14. data/app/controllers/spree/admin/tenants_controller.rb +8 -0
  15. data/app/controllers/spree/admin/trip_blazer_queries_controller.rb +35 -0
  16. data/app/controllers/spree/api/v2/organizer/invite_crews_controller.rb +33 -0
  17. data/app/controllers/spree/api/v2/storefront/dynamic_field_options_controller.rb +5 -1
  18. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +31 -5
  19. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +2 -0
  20. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  21. data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb +11 -0
  22. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +31 -17
  23. data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +27 -0
  24. data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +27 -0
  25. data/app/interactors/spree_cm_commissioner/crew_invite_link_handler.rb +48 -0
  26. data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +144 -0
  27. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
  28. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
  29. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +2 -1
  30. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +4 -0
  31. data/app/models/spree_cm_commissioner/blazer_queryable.rb +8 -0
  32. data/app/models/spree_cm_commissioner/crew_invite_link.rb +4 -0
  33. data/app/models/spree_cm_commissioner/dynamic_field.rb +17 -3
  34. data/app/models/spree_cm_commissioner/dynamic_field_option.rb +7 -1
  35. data/app/models/spree_cm_commissioner/guest.rb +1 -1
  36. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +21 -3
  37. data/app/models/spree_cm_commissioner/invite.rb +4 -6
  38. data/app/models/spree_cm_commissioner/invite_team.rb +3 -1
  39. data/app/models/spree_cm_commissioner/pin_code.rb +3 -2
  40. data/app/models/spree_cm_commissioner/pin_code_telegram.rb +28 -0
  41. data/app/models/spree_cm_commissioner/place.rb +0 -1
  42. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -2
  43. data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +11 -0
  44. data/app/models/spree_cm_commissioner/taxon_decorator.rb +5 -2
  45. data/app/models/spree_cm_commissioner/telegram_chat.rb +6 -0
  46. data/app/models/spree_cm_commissioner/trip.rb +9 -13
  47. data/app/models/spree_cm_commissioner/trip_stop.rb +5 -23
  48. data/app/models/spree_cm_commissioner/user_taxon.rb +1 -0
  49. data/app/models/spree_cm_commissioner/variant_decorator.rb +1 -0
  50. data/app/models/spree_cm_commissioner/vendor_decorator.rb +9 -9
  51. data/app/models/spree_cm_commissioner/vendor_place.rb +8 -3
  52. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
  53. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
  54. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
  55. data/app/queries/spree_cm_commissioner/trip_query.rb +56 -27
  56. data/app/serializers/spree/v2/organizer/invite_crews_serializer.rb +11 -0
  57. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
  58. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
  59. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
  60. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
  61. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +23 -15
  62. data/app/views/blazer/queries/_content.html.erb +8 -0
  63. data/app/views/spree/admin/tenants/_form.html.erb +109 -42
  64. data/config/initializers/spree_permitted_attributes.rb +2 -0
  65. data/config/locales/en.yml +5 -0
  66. data/config/routes.rb +4 -1
  67. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
  68. data/db/migrate/20250630103536_create_cm_telegram_chats.rb +13 -0
  69. data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
  70. data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
  71. data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
  72. data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +7 -0
  73. data/db/migrate/20250711092937_add_position_to_cm_dynamic_fields.rb +11 -0
  74. data/db/migrate/20250711093045_add_position_to_cm_dynamic_field_options.rb +11 -0
  75. data/db/migrate/20250714121508_rename_cm_taxon_blazer_query_to_blazer_queryables.rb +7 -0
  76. data/db/migrate/20250714124323_make_cm_blazer_queryables_polymorphic.rb +19 -0
  77. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  78. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  79. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  80. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  81. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  82. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  83. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +9 -3
  84. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +6 -3
  85. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +11 -3
  86. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -2
  87. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +10 -0
  88. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +5 -0
  89. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  90. data/lib/spree_cm_commissioner/trip_query_result.rb +8 -0
  91. data/lib/spree_cm_commissioner/trip_result.rb +5 -3
  92. data/lib/spree_cm_commissioner/version.rb +1 -1
  93. metadata +39 -5
  94. data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +0 -8
  95. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -9
  96. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
@@ -3,17 +3,21 @@
3
3
  <div class="col-6">
4
4
  <%= f.field_container :name do %>
5
5
  <%= f.label :name, raw(Spree.t(:name) + required_span_tag) %>
6
- <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus'%>
7
- <%= f.error_message_on :name %>
6
+ <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus' %>
7
+ <% if f.object.errors[:name].any? %>
8
+ <div class="error text-danger"><%= f.object.errors[:name].join(', ') %></div>
9
+ <% end %>
8
10
  <% end %>
9
11
  </div>
10
12
 
11
- <!-- Slug Field (only show if editing) -->
13
+ <!-- Slug Field -->
12
14
  <div class="col-6">
13
15
  <%= f.field_container :slug do %>
14
16
  <%= f.label :slug, raw(Spree.t(:slug)) %>
15
17
  <%= f.text_field :slug, class: 'form-control', placeholder: 'slug' %>
16
- <%= f.error_message_on :slug %>
18
+ <% if f.object.errors[:slug].any? %>
19
+ <div class="error text-danger"><%= f.object.errors[:slug].join(', ') %></div>
20
+ <% end %>
17
21
  <% end %>
18
22
  </div>
19
23
 
@@ -22,16 +26,20 @@
22
26
  <%= f.field_container :description do %>
23
27
  <%= f.label :description, raw(Spree.t(:description)) %>
24
28
  <%= f.text_area :description, class: 'form-control', placeholder: 'description' %>
25
- <%= f.error_message_on :description %>
29
+ <% if f.object.errors[:description].any? %>
30
+ <div class="error text-danger"><%= f.object.errors[:description].join(', ') %></div>
31
+ <% end %>
26
32
  <% end %>
27
33
  </div>
28
34
 
29
- <!-- Host Field -->
35
+ <!-- Host Field -->
30
36
  <div class="col-12">
31
37
  <%= f.field_container :host do %>
32
38
  <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
33
39
  <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
34
- <%= f.error_message_on :host %>
40
+ <% if f.object.errors[:host].any? %>
41
+ <div class="error text-danger"><%= f.object.errors[:host].join(', ') %></div>
42
+ <% end %>
35
43
  <% end %>
36
44
  </div>
37
45
 
@@ -39,21 +47,26 @@
39
47
  <div class="col-12">
40
48
  <%= f.field_container :preferred_assetlinks do %>
41
49
  <%= f.label :preferred_assetlinks, raw(Spree.t(:assetlinks)) %>
42
- <%= f.text_area :preferred_assetlinks, class: 'form-control',
43
- placeholder: 'example:
44
- [
45
- {
46
- "relation": ["delegate_permission/common.handle_all_urls"],
47
- "target": {
48
- "namespace": "android_app",
49
- "package_name": "com.yourapp.app",
50
- "sha256_cert_fingerprints": [
51
- "SHA256_CERTIFICATE_FINGERPRINT_HERE"
52
- ]
53
- }
54
- }
55
- ]', rows: 5 %>
56
- <%= f.error_message_on :preferred_assetlinks %>
50
+ <%= f.text_area :preferred_assetlinks, class: 'form-control', rows: 5,
51
+ placeholder: <<~JSON.strip
52
+ example:
53
+ [
54
+ {
55
+ "relation": ["delegate_permission/common.handle_all_urls"],
56
+ "target": {
57
+ "namespace": "android_app",
58
+ "package_name": "com.yourapp.app",
59
+ "sha256_cert_fingerprints": [
60
+ "SHA256_CERTIFICATE_FINGERPRINT_HERE"
61
+ ]
62
+ }
63
+ }
64
+ ]
65
+ JSON
66
+ %>
67
+ <% if f.object.errors[:preferred_assetlinks].any? %>
68
+ <div class="error text-danger"><%= f.object.errors[:preferred_assetlinks].join(', ') %></div>
69
+ <% end %>
57
70
  <% end %>
58
71
  </div>
59
72
 
@@ -61,25 +74,30 @@
61
74
  <div class="col-12">
62
75
  <%= f.field_container :preferred_apple_app_site_association do %>
63
76
  <%= f.label :preferred_apple_app_site_association, raw(Spree.t(:apple_app_site_association)) %>
64
- <%= f.text_area :preferred_apple_app_site_association, class: 'form-control',
65
- placeholder: 'example:
66
- {
67
- "webcredentials": {
68
- "apps": [
69
- "TEAM_ID.com.yourapp.app"
70
- ]
71
- },
72
- "applinks": {
73
- "apps": [],
74
- "details": [
75
- {
76
- "appID": "TEAM_ID.com.yourapp.app",
77
- "paths": ["*"]
77
+ <%= f.text_area :preferred_apple_app_site_association, class: 'form-control', rows: 5,
78
+ placeholder: <<~JSON.strip
79
+ example:
80
+ {
81
+ "webcredentials": {
82
+ "apps": [
83
+ "TEAM_ID.com.yourapp.app"
84
+ ]
85
+ },
86
+ "applinks": {
87
+ "apps": [],
88
+ "details": [
89
+ {
90
+ "appID": "TEAM_ID.com.yourapp.app",
91
+ "paths": ["*"]
92
+ }
93
+ ]
78
94
  }
79
- ]
80
- }
81
- }', rows: 5 %>
82
- <%= f.error_message_on :preferred_apple_app_site_association %>
95
+ }
96
+ JSON
97
+ %>
98
+ <% if f.object.errors[:preferred_apple_app_site_association].any? %>
99
+ <div class="error text-danger"><%= f.object.errors[:preferred_apple_app_site_association].join(', ') %></div>
100
+ <% end %>
83
101
  <% end %>
84
102
  </div>
85
103
 
@@ -87,8 +105,57 @@
87
105
  <div class="col-6">
88
106
  <%= f.field_container :state do %>
89
107
  <%= f.label :state, raw(Spree.t(:state)) %>
90
- <%= f.select :state, options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], @object.state), { required: true }, class: 'select2 form-control' %>
91
- <%= f.error_message_on :state %>
108
+ <%= f.select :state,
109
+ options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], f.object&.state),
110
+ { required: true },
111
+ class: 'select2 form-control' %>
112
+ <% if f.object.errors[:state].any? %>
113
+ <div class="error text-danger"><%= f.object.errors[:state].join(', ') %></div>
114
+ <% end %>
92
115
  <% end %>
93
116
  </div>
94
117
  </div>
118
+
119
+ <div data-hook="admin_tenant_form_fields" class="row">
120
+ <div class="col-12">
121
+ <div class="row gy-4">
122
+ <% payment_icon_fields = [
123
+ { field: :preferred_payment_checkout_image, label: Spree.t(:payment_checkout_image), target: 'checkout' },
124
+ { field: :preferred_payment_failed_image, label: Spree.t(:payment_failed_image), target: 'failed' },
125
+ { field: :preferred_payment_success_image, label: Spree.t(:payment_success_image), target: 'success' },
126
+ { field: :preferred_payment_loader, label: Spree.t(:payment_loader), target: 'loader' }
127
+ ] %>
128
+
129
+ <% payment_icon_fields.each do |icon| %>
130
+ <div class="col-md-3">
131
+ <%= f.field_container icon[:field] do %>
132
+ <div class="d-flex flex-column align-items-center text-center">
133
+ <label class="form-label fw-bold mb-2" for="tenant_<%= icon[:field] %>">
134
+ <%= icon[:label] %>
135
+ </label>
136
+
137
+ <div class="icon-preview-container mb-2" id="icon-preview-container-<%= icon[:field] %>">
138
+ <span class="payment-icon-preview" id="icon-preview-<%= icon[:field] %>">
139
+ <% if f.object.send(icon[:field]).present? %>
140
+ <%= render_vector_icon(f.object.send(icon[:field])) %>
141
+ <% else %>
142
+ <span class="no-icon-placeholder"></span>
143
+ <% end %>
144
+ </span>
145
+ <span class="remove-icon-btn <%= 'hidden' unless f.object.send(icon[:field]).present? %>" data-target="<%= icon[:field] %>">&times;</span>
146
+ </div>
147
+ </div>
148
+
149
+ <%= f.collection_select icon[:field],
150
+ @vector_icons, :path, :path,
151
+ { include_blank: 'None' },
152
+ { class: 'select2 form-control tenant-payment-icon-select mt-2', data: { target: icon[:target] } } %>
153
+ <% if f.object.errors[icon[:field]].any? %>
154
+ <div class="text-danger small mt-1"><%= f.object.errors[icon[:field]].join(', ') %></div>
155
+ <% end %>
156
+ <% end %>
157
+ </div>
158
+ <% end %>
159
+ </div>
160
+ </div>
161
+ </div>
@@ -31,6 +31,8 @@ module Spree
31
31
  subtitle
32
32
  preferred_background_color
33
33
  preferred_foreground_color
34
+ preferred_group_check_in_enabled
35
+ preferred_individual_check_in_enabled
34
36
  show_badge_status
35
37
  purchasable_on
36
38
  available_on
@@ -459,6 +459,10 @@ en:
459
459
  businesses_cant_be_blank: "Businesses can't be blank"
460
460
  phone_number_cant_be_blank: "Phone number can't be blank"
461
461
  quantity_cant_be_less_than_or_equal_to_zero: "Quantity can't be less or equal than 0"
462
+ spree_cm_commissioner/vendor_place:
463
+ attributes:
464
+ place_id:
465
+ taken: "has already existed with this place type"
462
466
 
463
467
  mail:
464
468
  order_mailer:
@@ -543,6 +547,7 @@ en:
543
547
  update_user_login: "update user code"
544
548
  contact_update: "update contact code"
545
549
  otp_code: "OTP code"
550
+ telegram_verification: "telegram code"
546
551
 
547
552
  notifications:
548
553
  spree_cm_commissioner:
data/config/routes.rb CHANGED
@@ -288,6 +288,7 @@ Spree::Core::Engine.add_routes do
288
288
  resources :vendors, controller: :tenant_vendors
289
289
  end
290
290
  resources :event_blazer_queries
291
+ resources :trip_blazer_queries
291
292
  end
292
293
 
293
294
  resources :events, controller: 'events/base' do
@@ -464,6 +465,7 @@ Spree::Core::Engine.add_routes do
464
465
  resources :images
465
466
  resource :s3_signed_urls
466
467
  resources :invites
468
+ resources :invite_crews, only: %i[show update]
467
469
  resources :invite_guests, only: %i[show update]
468
470
  end
469
471
 
@@ -688,5 +690,6 @@ Rails.application.routes.draw do
688
690
  get 'o/:id', to: 'spree_cm_commissioner/orders#show', as: 'order'
689
691
  get 'li/:id', to: 'spree_cm_commissioner/line_item_qr_images#show', as: 'line_item_qr_image'
690
692
  get 'g/:id', to: 'spree_cm_commissioner/guest_cards#show', as: 'guest_cards'
691
- get '.well-known/:id', to: 'spree_cm_commissioner/well_known#show', constraints: { id: /(assetlinks\.json|apple-app-site-association)/ }
693
+ get '.well-known/assetlinks.json', to: 'spree_cm_commissioner/well_known#assetlinks_json'
694
+ get '.well-known/apple-app-site-association', to: 'spree_cm_commissioner/well_known#apple_app_site_association'
692
695
  end
@@ -0,0 +1,5 @@
1
+ class AddDescriptionToCmVendorPlace < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_places, :description, :string, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateCmTelegramChats < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_telegram_chats, if_not_exists: true do |t|
4
+ t.bigint :chat_id, null: false
5
+ t.string :chat_title
6
+ t.string :chat_type
7
+ t.boolean :active, default: false
8
+ t.references :vendor, foreign_key: { to_table: :spree_vendors }
9
+ t.timestamps
10
+ end
11
+ add_index :cm_telegram_chats, :chat_id, unique: true, if_not_exists: true
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ class AddConfigurationsToCmDynamicField < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_dynamic_fields, :configurations, :jsonb, default: {}, null: false, if_not_exists: true
4
+ add_index :cm_dynamic_fields, :configurations, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddDynamicFieldOptionToGuestDynamicField < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_guest_dynamic_fields, :dynamic_field_option, index: true, foreign_key: { to_table: :cm_dynamic_field_options }, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddStatusToDynamicFieldOption < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_dynamic_field_options, :status, :integer, default: 0, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddVendorIdToSpreeCategory < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:spree_promotion_categories, :vendor_id)
4
+ add_reference :spree_promotion_categories, :vendor, index: true, foreign_key: { to_table: :spree_vendors }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class AddPositionToCmDynamicFields < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:cm_dynamic_fields, :position)
4
+ add_column :cm_dynamic_fields, :position, :integer, default: 0, null: false
5
+ end
6
+
7
+ unless index_exists?(:cm_dynamic_fields, :position, name: 'index_dynamic_fields_on_position')
8
+ add_index :cm_dynamic_fields, :position, name: 'index_dynamic_fields_on_position'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class AddPositionToCmDynamicFieldOptions < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:cm_dynamic_field_options, :position)
4
+ add_column :cm_dynamic_field_options, :position, :integer, default: 0, null: false
5
+ end
6
+
7
+ unless index_exists?(:cm_dynamic_field_options, :position, name: 'index_dynamic_field_options_on_position')
8
+ add_index :cm_dynamic_field_options, :position, name: 'index_dynamic_field_options_on_position'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class RenameCmTaxonBlazerQueryToBlazerQueryables < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if table_exists?(:cm_taxon_blazer_queries)
4
+ rename_table :cm_taxon_blazer_queries, :cm_blazer_queryables
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ class MakeCmBlazerQueryablesPolymorphic < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_blazer_queryables, :taxon_id) && !column_exists?(:cm_blazer_queryables, :queryable_id)
4
+ rename_column :cm_blazer_queryables, :taxon_id, :queryable_id
5
+ end
6
+
7
+ unless column_exists?(:cm_blazer_queryables, :queryable_type)
8
+ add_column :cm_blazer_queryables, :queryable_type, :string, default: 'Spree::Taxon'
9
+ end
10
+
11
+ if foreign_key_exists?(:cm_blazer_queryables, column: :queryable_id)
12
+ remove_foreign_key :cm_blazer_queryables, column: :queryable_id
13
+ end
14
+
15
+ unless index_exists?(:cm_blazer_queryables, [:queryable_type, :queryable_id], name: 'index_cm_blazer_queryables_on_queryable_type_and_id')
16
+ add_index :cm_blazer_queryables, [:queryable_type, :queryable_id], name: 'index_cm_blazer_queryables_on_queryable_type_and_id'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocationReferenceToCmVendorPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_vendor_places, :location, foreign_key: { to_table: :cm_vendor_places }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmVendorStops < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_vendor_stops, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddVendorReferenceToCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_trips, :vendor, foreign_key: { to_table: :spree_vendors }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocationPlaceReferenceToCmTripStops < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_trip_stops, :location_place, foreign_key: { to_table: :cm_places }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class RenameCmTripStopsStopIdColumnToStopPlaceId < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_trip_stops, :stop_id)
4
+ rename_column :cm_trip_stops, :stop_id, :stop_place_id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class RenameCmTripsOriginAndDestinationToOriginPlaceAndDestinationPlace < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_trips, :origin_id)
4
+ rename_column :cm_trips, :origin_id, :origin_place_id
5
+ end
6
+
7
+ if column_exists?(:cm_trips, :destination_id)
8
+ rename_column :cm_trips, :destination_id, :destination_place_id
9
+ end
10
+ end
11
+ end
@@ -1,9 +1,15 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_block, class: SpreeCmCommissioner::Block do
3
+ label { "Block #{rand(1.0..100.0)}" }
4
+
3
5
  association :seat_section, factory: :cm_seat_section
4
6
 
5
- label { "A1" }
6
- row_index { 1 }
7
- column_index { 1 }
7
+ width { rand(10.0..100.0) }
8
+ height { rand(10.0..100.0) }
9
+
10
+ x { rand(0.0..500.0) }
11
+ y { rand(0.0..500.0) }
12
+
13
+ rotation { rand(-180.0..180.0) }
8
14
  end
9
15
  end
@@ -1,8 +1,11 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_seat_layout, class: SpreeCmCommissioner::SeatLayout do
3
- name { "VIP Layout" }
4
- layout_type { :grid }
5
- status { :active }
6
3
  association :layoutable, factory: :cm_vehicle
4
+
5
+ name { "Layout #{rand(1.0..50.0)}" }
6
+ status { :active }
7
+
8
+ width { rand(200.0..1000.0) }
9
+ height { rand(200.0..1000.0) }
7
10
  end
8
11
  end
@@ -1,8 +1,16 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_seat_section, class: SpreeCmCommissioner::SeatSection do
3
+ name { "Section #{rand(1.0..50.0)}" }
4
+
3
5
  association :seat_layout, factory: :cm_seat_layout
4
- name { "Front Section" }
5
- row { 10 }
6
- column { 10 }
6
+
7
+ width { rand(50.0..500.0) }
8
+ height { rand(50.0..500.0) }
9
+
10
+ x { rand(0.0..500.0) }
11
+ y { rand(0.0..500.0) }
12
+
13
+ rotation { rand(-180.0..180.0) }
14
+ shape_path { "M0,0 L10,0 L10,10 L0,10 Z" }
7
15
  end
8
16
  end
@@ -6,8 +6,9 @@ FactoryBot.define do
6
6
 
7
7
  product { create(:cm_product, product_type: :transit) }
8
8
 
9
+ association :vendor, factory: :cm_transit_vendor
9
10
  association :vehicle, factory: :cm_vehicle
10
- association :origin, factory: :cm_place
11
- association :destination, factory: :cm_place
11
+ association :origin_place, factory: :cm_place
12
+ association :destination_place, factory: :cm_place
12
13
  end
13
14
  end
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+ factory :cm_trip_stop, class: SpreeCmCommissioner::TripStop do
3
+ association :trip, factory: :cm_trip
4
+ association :stop_place, factory: :cm_place
5
+ association :location_place, factory: :cm_place
6
+
7
+ stop_type { :boarding }
8
+ stop_name { stop_place.name }
9
+ end
10
+ end
@@ -1,4 +1,9 @@
1
1
  FactoryBot.define do
2
+ factory :cm_transit_vendor, parent: :vendor do
3
+ state { :active }
4
+ primary_product_type { :transit }
5
+ end
6
+
2
7
  factory :cm_vendor, parent: :vendor do
3
8
  state { :active }
4
9
  default_state_id { Spree::State.first&.id }
@@ -1,7 +1,19 @@
1
1
  FactoryBot.define do
2
- factory :vendor_place, class: SpreeCmCommissioner::VendorPlace do
2
+ factory :cm_location_vendor_place, class: SpreeCmCommissioner::VendorPlace do
3
3
  association :vendor, factory: :vendor
4
4
  association :place, factory: :cm_place
5
+
6
+ distance { FFaker::Number.decimal }
7
+ position { FFaker::Number.number }
8
+
9
+ place_type { :location }
10
+ end
11
+
12
+ factory :cm_vendor_place, class: SpreeCmCommissioner::VendorPlace do
13
+ association :vendor, factory: :vendor
14
+ association :place, factory: :cm_place
15
+ association :location, factory: :cm_location_vendor_place
16
+
5
17
  distance { FFaker::Number.decimal }
6
18
  position { FFaker::Number.number }
7
19
  place_type { :branch }
@@ -10,5 +10,13 @@ module SpreeCmCommissioner
10
10
  def direct?
11
11
  @trips.size == 1
12
12
  end
13
+
14
+ def quantity_available
15
+ @trips.map(&:quantity_available).compact.min
16
+ end
17
+
18
+ def max_capacity
19
+ @trips.map(&:max_capacity).compact.min
20
+ end
13
21
  end
14
22
  end
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  class TripResult
3
3
  attr_accessor :trip_id, :vendor_id, :vendor_name, :short_name, :route_name,
4
4
  :origin_id, :origin, :destination_id, :destination,
5
- :total_sold, :total_seats,
5
+ :quantity_available, :max_capacity,
6
6
  :duration, :vehicle_id, :departure_time
7
7
 
8
8
  def initialize(options = {})
@@ -11,8 +11,10 @@ module SpreeCmCommissioner
11
11
  end
12
12
  end
13
13
 
14
- def remaining_seats
15
- total_seats - total_sold
14
+ def total_sold
15
+ return if max_capacity.nil? || quantity_available.nil?
16
+
17
+ max_capacity - quantity_available
16
18
  end
17
19
 
18
20
  def arrival_time
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.0.0-pre'.freeze
2
+ VERSION = '2.0.1-pre'.freeze
3
3
 
4
4
  module_function
5
5