spree_cm_commissioner 1.13.0 → 1.15.0.pre.beta1

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +12 -1
  3. data/README.md +43 -1
  4. data/app/assets/images/category_icons/art_icon.png +0 -0
  5. data/app/assets/images/category_icons/concert_icon.png +0 -0
  6. data/app/assets/images/category_icons/fundraising_icon.png +0 -0
  7. data/app/assets/images/category_icons/marathon_icon.png +0 -0
  8. data/app/assets/images/category_icons/online_icon.png +0 -0
  9. data/app/assets/images/category_icons/workshop_icon.png +0 -0
  10. data/app/controllers/spree/admin/users_controller_decorator.rb +13 -0
  11. data/app/controllers/spree/api/chatrace/guests_controller.rb +2 -1
  12. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +21 -0
  13. data/app/controllers/spree/api/v2/storefront/cart_payment_method_groups_controller.rb +12 -1
  14. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +3 -1
  15. data/app/controllers/spree/api/v2/tenant/cart_controller.rb +11 -0
  16. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +1 -0
  17. data/app/controllers/spree/api/v2/tenant/order_histories_controller.rb +65 -0
  18. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  19. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +46 -0
  20. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +120 -0
  21. data/app/finders/spree_cm_commissioner/products/find_decorator.rb +16 -0
  22. data/app/helpers/spree_cm_commissioner/transit/order_query_helper.rb +17 -0
  23. data/app/helpers/spree_cm_commissioner/transit/trip_helper.rb +12 -0
  24. data/app/interactors/spree_cm_commissioner/create_event.rb +31 -6
  25. data/app/interactors/spree_cm_commissioner/create_ticket.rb +36 -1
  26. data/app/interactors/spree_cm_commissioner/host_matcher.rb +28 -0
  27. data/app/interactors/spree_cm_commissioner/place_decoder.rb +16 -0
  28. data/app/interactors/spree_cm_commissioner/place_service.rb +32 -0
  29. data/app/interactors/spree_cm_commissioner/user_pin_code_authenticator.rb +9 -0
  30. data/app/models/concerns/spree_cm_commissioner/json_preference_validator.rb +23 -0
  31. data/app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb +3 -1
  32. data/app/models/concerns/spree_cm_commissioner/store_preference.rb +2 -0
  33. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +11 -0
  34. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +16 -1
  35. data/app/models/spree_cm_commissioner/guest.rb +11 -2
  36. data/app/models/spree_cm_commissioner/invite_guest.rb +8 -0
  37. data/app/models/spree_cm_commissioner/order_decorator.rb +5 -0
  38. data/app/models/spree_cm_commissioner/payment_method_decorator.rb +8 -1
  39. data/app/models/spree_cm_commissioner/place.rb +3 -0
  40. data/app/models/spree_cm_commissioner/store_decorator.rb +2 -1
  41. data/app/models/spree_cm_commissioner/taxon_decorator.rb +4 -0
  42. data/app/models/spree_cm_commissioner/taxon_place.rb +12 -0
  43. data/app/models/spree_cm_commissioner/tenant.rb +5 -0
  44. data/app/models/spree_cm_commissioner/user_decorator.rb +14 -3
  45. data/app/models/spree_cm_commissioner/vendor_decorator.rb +7 -3
  46. data/app/models/spree_cm_commissioner/vendor_place.rb +11 -3
  47. data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +85 -12
  48. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +3 -4
  49. data/app/queries/spree_cm_commissioner/reservation_query.rb +12 -0
  50. data/app/queries/spree_cm_commissioner/trip_query.rb +35 -25
  51. data/app/serializers/spree/v2/organizer/invite_guest_serializer.rb +1 -1
  52. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -0
  53. data/app/serializers/spree/v2/tenant/cart_serializer.rb +8 -0
  54. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +1 -1
  55. data/app/services/spree_cm_commissioner/organizer/export_invite_guest_csv_service.rb +63 -0
  56. data/app/services/spree_cm_commissioner/payment_method_type_mapper.rb +11 -0
  57. data/app/views/spree/admin/tenants/_form.html.erb +68 -2
  58. data/config/initializers/spree_permitted_attributes.rb +3 -0
  59. data/config/routes.rb +7 -0
  60. data/db/migrate/20250127081646_add_preferences_to_cm_tenants.rb +7 -0
  61. data/db/migrate/20250527043231_create_spree_commissioner_taxon_places.rb +15 -0
  62. data/db/migrate/20250528073748_remove_unique_slug_index_on_spree_cms_pages.rb +12 -0
  63. data/db/migrate/20250528074043_add_unique_index_on_slug_tenant_id_deleted_at_to_spree_cms_pages.rb +13 -0
  64. data/db/migrate/20250528090330_add_place_type_to_cm_vendor_place.rb +6 -0
  65. data/db/migrate/20250602094751_add_host_to_cm_tenants.rb +6 -0
  66. data/db/migrate/20250609015216_remove_claimed_at_and_expires_at_from_cm_invite_guest.rb +6 -0
  67. data/db/migrate/20250610080108_add_contact_to_cm_guests.rb +5 -0
  68. data/db/migrate/20250611023548_add_country_code_to_guests.rb +5 -0
  69. data/db/migrate/20250612035937_add_intel_phone_number_to_guests.rb +5 -0
  70. data/lib/spree_cm_commissioner/test_helper/factories/cms_page_factory.rb +11 -0
  71. data/lib/spree_cm_commissioner/test_helper/factories/invite_guests_factory.rb +6 -0
  72. data/lib/spree_cm_commissioner/test_helper/factories/tenant_factory.rb +1 -0
  73. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +17 -4
  74. data/lib/spree_cm_commissioner/version.rb +1 -1
  75. data/lib/spree_cm_commissioner.rb +1 -0
  76. data/spree_cm_commissioner.gemspec +2 -0
  77. metadata +66 -4
@@ -1,21 +1,23 @@
1
1
  module SpreeCmCommissioner
2
2
  class TripQuery
3
- attr_reader :origin_id, :destination_id, :travel_date
3
+ include SpreeCmCommissioner::Transit::TripHelper
4
4
 
5
- def initialize(origin_id:, destination_id:, travel_date: Time.zone.now)
5
+ attr_reader :origin_id, :destination_id, :travel_date, :params
6
+
7
+ def initialize(origin_id:, destination_id:, travel_date:, params: {})
6
8
  @origin_id = origin_id
7
9
  @destination_id = destination_id
8
10
  @travel_date = travel_date
11
+ @travel_date = Time.zone.now if travel_date.to_date == Time.zone.now.to_date
12
+ @params = params
9
13
  end
10
14
 
11
15
  def call
12
- trips = direct_trips
13
- connections = connected_trips if trips.size < 3
14
-
15
- trip_results = trips.map { |trip| SpreeCmCommissioner::TripQueryResult.new([trip]) }
16
+ return [] if travel_date.to_date < Date.current
16
17
 
17
- trip_results += connections if connections
18
- trip_results
18
+ direct_results = direct_trips.map { |trip| SpreeCmCommissioner::TripQueryResult.new([trip]) }
19
+ connected_results = connected_trips || []
20
+ direct_results + connected_results
19
21
  end
20
22
 
21
23
  def direct_trips
@@ -38,7 +40,12 @@ module SpreeCmCommissioner
38
40
  .joins('INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = spree_variants.id AND drop_off.stop_type = 1')
39
41
  .joins('INNER JOIN spree_vendors AS vendors ON vendors.id = spree_variants.vendor_id')
40
42
  .joins('INNER JOIN spree_products AS routes ON routes.id = spree_variants.product_id')
41
- .where('boarding.stop_id = ? AND drop_off.stop_id = ?', origin_id, destination_id)
43
+ result = result.where(vendors: { id: params[:vendor_id] }) if params[:vendor_id].present?
44
+ result = result.where('boarding.stop_id = ? AND drop_off.stop_id = ?', origin_id, destination_id)
45
+ .where('trips.departure_time > ? AND trips.departure_time <= ?',
46
+ travel_date.strftime('%H:%M:%S'),
47
+ travel_date.end_of_day.strftime('%H:%M:%S')
48
+ )
42
49
 
43
50
  result.map do |trip|
44
51
  trip_result_options = {
@@ -53,7 +60,7 @@ module SpreeCmCommissioner
53
60
  destination_id: trip[:destination_id],
54
61
  destination: trip[:destination],
55
62
  vehicle_id: trip[:vehicle_id],
56
- departure_time: trip[:departure_time],
63
+ departure_time: parse_time(trip[:departure_time]),
57
64
  duration: trip[:duration]
58
65
  }
59
66
  SpreeCmCommissioner::TripResult.new(trip_result_options)
@@ -63,17 +70,17 @@ module SpreeCmCommissioner
63
70
  def connected_trips # rubocop:disable Metrics/MethodLength
64
71
  result = SpreeCmCommissioner::TripConnection
65
72
  .joins('
66
- INNER JOIN spree_variants variant1 ON variant1.id = cm_trip_connections.from_trip_id
67
- INNER JOIN spree_variants variant2 ON variant2.id = cm_trip_connections.to_trip_id
68
- INNER JOIN spree_products AS routes1 ON routes1.id = variant1.product_id
69
- INNER JOIN spree_products AS routes2 ON routes2.id = variant2.product_id
70
- INNER JOIN cm_trips AS trip1 ON trip1.variant_id = cm_trip_connections.from_trip_id
71
- INNER JOIN cm_trips AS trip2 ON trip2.variant_id = cm_trip_connections.to_trip_id
72
- INNER JOIN cm_trip_stops trip1_origin ON trip1_origin.trip_id = variant1.id AND trip1_origin.stop_type = 0
73
- INNER JOIN cm_trip_stops trip2_origin ON trip2_origin.trip_id = variant2.id AND trip2_origin.stop_type = 0
74
- INNER JOIN cm_trip_stops trip2_destination ON trip2_destination.trip_id = variant2.id AND trip2_destination.stop_type = 1
75
- INNER JOIN spree_vendors AS vendor1 ON vendor1.id = variant1.vendor_id
76
- INNER JOIN spree_vendors AS vendor2 ON vendor2.id = variant2.vendor_id'
73
+ INNER JOIN spree_variants variant1 ON variant1.id = cm_trip_connections.from_trip_id
74
+ INNER JOIN spree_variants variant2 ON variant2.id = cm_trip_connections.to_trip_id
75
+ INNER JOIN spree_products AS routes1 ON routes1.id = variant1.product_id
76
+ INNER JOIN spree_products AS routes2 ON routes2.id = variant2.product_id
77
+ INNER JOIN cm_trips AS trip1 ON trip1.variant_id = cm_trip_connections.from_trip_id
78
+ INNER JOIN cm_trips AS trip2 ON trip2.variant_id = cm_trip_connections.to_trip_id
79
+ INNER JOIN cm_trip_stops trip1_origin ON trip1_origin.trip_id = variant1.id AND trip1_origin.stop_type = 0
80
+ INNER JOIN cm_trip_stops trip2_origin ON trip2_origin.trip_id = variant2.id AND trip2_origin.stop_type = 0
81
+ INNER JOIN cm_trip_stops trip2_destination ON trip2_destination.trip_id = variant2.id AND trip2_destination.stop_type = 1
82
+ INNER JOIN spree_vendors AS vendor1 ON vendor1.id = variant1.vendor_id
83
+ INNER JOIN spree_vendors AS vendor2 ON vendor2.id = variant2.vendor_id'
77
84
  )
78
85
  .select('cm_trip_connections.id AS id,
79
86
  trip1.variant_id AS trip1_id,
@@ -97,8 +104,11 @@ module SpreeCmCommissioner
97
104
  trip2_origin.stop_name AS trip2_origin,
98
105
  trip2_destination.stop_name AS trip2_destination,
99
106
  vendor2.name AS trip2_vendor_name'
100
- ).where('trip1_origin.stop_id = ? AND trip2_destination.stop_id = ?', origin_id, destination_id
101
- ).uniq
107
+ ).where('trip1_origin.stop_id = ? AND trip2_destination.stop_id = ?', origin_id, destination_id)
108
+ result = result.where('vendor1.id = ? OR vendor2.id = ?', params[:vendor_id], params[:vendor_id]) if params[:vendor_id].present?
109
+ result = result.where('trip1.departure_time > ? AND trip1.departure_time <= ?', travel_date.strftime('%H:%M:%S'),
110
+ travel_date.end_of_day.strftime('%H:%M:%S')
111
+ ).uniq
102
112
 
103
113
  return [] if result.blank?
104
114
 
@@ -113,7 +123,7 @@ module SpreeCmCommissioner
113
123
  trip_id: trip[:trip1_id],
114
124
  origin_id: trip[:trip1_origin_id],
115
125
  destination_id: trip[:trip1_destination_id],
116
- departure_time: trip[:trip1_departure_time],
126
+ departure_time: parse_time(trip[:trip1_departure_time]),
117
127
  duration: trip[:trip1_duration],
118
128
  vendor_name: trip[:trip1_vendor_name],
119
129
  route_name: trip[:route1_name],
@@ -126,7 +136,7 @@ module SpreeCmCommissioner
126
136
  trip_id: trip[:trip2_id],
127
137
  origin_id: trip[:trip2_origin_id],
128
138
  destination_id: trip[:trip2_destination_id],
129
- departure_time: trip[:trip2_departure_time],
139
+ departure_time: parse_time(trip[:trip2_departure_time]),
130
140
  duration: trip[:trip2_duration],
131
141
  vendor_name: trip[:trip2_vendor_name],
132
142
  route_name: trip[:route2_name],
@@ -3,7 +3,7 @@ module Spree
3
3
  module Organizer
4
4
  class InviteGuestSerializer < BaseSerializer
5
5
  attributes :email, :quantity, :token, :invite_type, :claimed_status, :issued_to, :expiration_date,
6
- :claimed_at, :email_send_at, :created_at, :updated_at, :remark
6
+ :email_send_at, :created_at, :updated_at, :remark
7
7
  belongs_to :variant, serializer: SpreeCmCommissioner::V2::Storefront::EventVariantSerializer
8
8
  belongs_to :order, serializer: Spree::V2::Storefront::OrderSerializer
9
9
  belongs_to :event, serializer: Spree::V2::Storefront::TaxonSerializer
@@ -5,6 +5,7 @@ module Spree
5
5
  def self.prepended(base)
6
6
  base.has_many :vendors, serializer: ::Spree::V2::Storefront::VendorSerializer
7
7
  base.has_many :visible_products, serializer: ::Spree::V2::Storefront::ProductSerializer
8
+ base.has_many :places, serializer: ::Spree::V2::Storefront::PlaceSerializer
8
9
 
9
10
  base.has_one :category_icon, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
10
11
  base.has_one :app_banner, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class CartSerializer < Spree::V2::Storefront::CartSerializer
5
+ end
6
+ end
7
+ end
8
+ end
@@ -7,7 +7,7 @@ module SpreeCmCommissioner
7
7
  attributes :first_name, :last_name, :dob, :gender, :kyc_fields, :other_occupation, :created_at, :updated_at,
8
8
  :qr_data, :social_contact_platform, :social_contact, :available_social_contact_platforms,
9
9
  :age, :emergency_contact, :other_organization, :expectation, :upload_later, :address, :formatted_bib_number, :phone_number,
10
- :token
10
+ :token, :country_code, :contact
11
11
 
12
12
  # temporary, once app release after cm-app v1.9.1, we no longer need this.
13
13
  attribute :seat_number do |object|
@@ -0,0 +1,63 @@
1
+ module SpreeCmCommissioner
2
+ module Organizer
3
+ class ExportInviteGuestCsvService
4
+ attr_reader :invite_guest_id, :columns
5
+
6
+ def initialize(invite_guest_id, columns)
7
+ @invite_guest_id = invite_guest_id
8
+ @columns = (columns + %w[created_at ticket_url]).uniq
9
+ end
10
+
11
+ def call
12
+ CSV.generate(headers: true) do |csv|
13
+ csv << (['No.'] + headers)
14
+ guests.each_with_index do |guest, index|
15
+ csv << ([index + 1] + build_row(guest))
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def headers
23
+ columns.map(&:humanize).uniq
24
+ end
25
+
26
+ def build_row(guest)
27
+ columns.map { |column| fetch_value(guest, column) }
28
+ end
29
+
30
+ def fetch_value(guest, column)
31
+ column_mappings(guest)[column] || ''
32
+ end
33
+
34
+ def column_mappings(guest)
35
+ {
36
+ 'guest_name' => "#{guest.first_name} #{guest.last_name}".strip,
37
+ 'guest_phone_number' => guest.phone_number,
38
+ 'guest_gender' => guest.gender,
39
+ 'guest_dob' => guest.dob.to_s,
40
+ 'guest_occupation' => guest.occupation&.name || guest.other_occupation,
41
+ 'guest_nationality' => guest.nationality&.name,
42
+ 'guest_age' => guest.age.to_s,
43
+ 'guest_emergency_contact' => guest.emergency_contact,
44
+ 'guest_organization' => guest.other_organization,
45
+ 'guest_social_contact' => guest.social_contact,
46
+ 'guest_address' => guest.address,
47
+ 'guest_expectation' => guest.expectation,
48
+ 'entry_type' => guest.entry_type,
49
+ 'created_at' => guest.created_at.strftime('%Y-%m-%d %H:%M:%S'),
50
+ 'ticket_url' => invite_guest.ticket_url(guest.token)
51
+ }
52
+ end
53
+
54
+ def invite_guest
55
+ SpreeCmCommissioner::InviteGuest.find(invite_guest_id)
56
+ end
57
+
58
+ def guests
59
+ invite_guest.order.line_items.first.guests
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ module SpreeCmCommissioner
2
+ class PaymentMethodTypeMapper
3
+ TYPES = {
4
+ 'vattanac_mini_app' => 'Spree::Gateway::VattanacMiniApp'
5
+ }.freeze
6
+
7
+ def self.call(type)
8
+ TYPES[type.to_s.downcase]
9
+ end
10
+ end
11
+ end
@@ -20,12 +20,78 @@
20
20
  <!-- Description Field -->
21
21
  <div class="col-12">
22
22
  <%= f.field_container :description do %>
23
- <%= f.label :description, raw(Spree.t(:description) + required_span_tag) %>
24
- <%= f.text_area :description, required: true, class: 'form-control', placeholder: 'description' %>
23
+ <%= f.label :description, raw(Spree.t(:description)) %>
24
+ <%= f.text_area :description, class: 'form-control', placeholder: 'description' %>
25
25
  <%= f.error_message_on :description %>
26
26
  <% end %>
27
27
  </div>
28
28
 
29
+ <!-- Host Field -->
30
+ <div class="col-12">
31
+ <%= f.field_container :host do %>
32
+ <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
33
+ <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
34
+ <%= f.error_message_on :host %>
35
+ <% end %>
36
+ </div>
37
+
38
+ <!-- Assetlinks Field -->
39
+ <div class="col-12">
40
+ <%= f.field_container :preferred_assetlinks do %>
41
+ <%= 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 %>
57
+ <% end %>
58
+ </div>
59
+
60
+ <!-- Apple App Site Association Field -->
61
+ <div class="col-12">
62
+ <%= f.field_container :preferred_apple_app_site_association do %>
63
+ <%= 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": ["*"]
78
+ }
79
+ ]
80
+ }
81
+ }', rows: 5 %>
82
+ <%= f.error_message_on :preferred_apple_app_site_association %>
83
+ <% end %>
84
+ </div>
85
+
86
+ <!-- Brand Primary Color Field -->
87
+ <div class="col-md-6">
88
+ <%= f.label :preferred_brand_primary_color, Spree.t(:brand_primary_color), class: 'form-label' %>
89
+ <%= f.text_field :preferred_brand_primary_color, class: 'form-control color-picker', placeholder: '#FF5733', value: @object.preferred_brand_primary_color %>
90
+ <div class="color-preview" style="margin-top: 10px;">
91
+ <%= content_tag :div, nil, style: "background-color: #{@object.preferred_brand_primary_color}; width: 60px; height: 60px; border: 1px solid #ccc; box-sizing: border-box; display: block;" %>
92
+ </div>
93
+ </div>
94
+
29
95
  <!-- State Field -->
30
96
  <div class="col-6">
31
97
  <%= f.field_container :state do %>
@@ -39,8 +39,11 @@ module Spree
39
39
  ]
40
40
 
41
41
  @@store_attributes += [
42
+ :preferred_sms_sender_id,
42
43
  :preferred_telegram_order_alert_chat_id,
43
44
  :preferred_telegram_order_request_alert_chat_id,
45
+ :preferred_assetlinks,
46
+ :preferred_apple_app_site_association,
44
47
  { default_notification_image_attributes: {} },
45
48
  :term_and_condition_promotion
46
49
  ]
data/config/routes.rb CHANGED
@@ -520,6 +520,12 @@ Spree::Core::Engine.add_routes do
520
520
 
521
521
  resources :cms_pages, only: %i[index show]
522
522
  resources :waiting_room_sessions, only: :create
523
+
524
+ resources :order_histories, only: %i[index] do
525
+ member do
526
+ patch :archive
527
+ end
528
+ end
523
529
  end
524
530
 
525
531
  namespace :storefront do
@@ -662,4 +668,5 @@ Rails.application.routes.draw do
662
668
  get 'o/:id', to: 'spree_cm_commissioner/orders#show', as: 'order'
663
669
  get 'li/:id', to: 'spree_cm_commissioner/line_item_qr_images#show', as: 'line_item_qr_image'
664
670
  get 'g/:id', to: 'spree_cm_commissioner/guest_cards#show', as: 'guest_cards'
671
+ get '.well-known/:id', to: 'spree_cm_commissioner/well_known#show', constraints: { id: /(assetlinks\.json|apple-app-site-association)/ }
665
672
  end
@@ -0,0 +1,7 @@
1
+ class AddPreferencesToCmTenants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:cm_tenants, :preferences)
4
+ add_column :cm_tenants, :preferences, :text
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ class CreateSpreeCommissionerTaxonPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_taxon_places, if_not_exists: true do |t|
4
+ t.references :place, null: false, foreign_key: { to_table: :cm_places }
5
+ t.references :taxon, null: false, foreign_key: { to_table: :spree_taxons }
6
+ t.integer :type, default: 0, null: false
7
+ t.integer :position, default: 0, null: false
8
+ t.text :description
9
+
10
+ t.index [:place_id, :taxon_id], unique: true
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ class RemoveUniqueSlugIndexOnSpreeCmsPages < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if index_exists?(:spree_cms_pages,
4
+ [:slug, :store_id, :deleted_at],
5
+ unique: true,
6
+ name: "index_spree_cms_pages_on_slug_and_store_id_and_deleted_at")
7
+
8
+ remove_index :spree_cms_pages,
9
+ name: "index_spree_cms_pages_on_slug_and_store_id_and_deleted_at"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ class AddUniqueIndexOnSlugTenantIdDeletedAtToSpreeCmsPages < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless index_exists?(:spree_cms_pages,
4
+ [:slug, :tenant_id, :deleted_at],
5
+ unique: true,
6
+ name: "index_spree_cms_pages_on_slug_and_tenant_id_and_deleted_at")
7
+
8
+ add_index :spree_cms_pages, [:slug, :tenant_id, :deleted_at],
9
+ unique: true,
10
+ name: "index_spree_cms_pages_on_slug_and_tenant_id_and_deleted_at"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ class AddPlaceTypeToCmVendorPlace < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_places, :place_type, :integer, default: 0, null: false, if_not_exists: true
4
+ add_index :cm_vendor_places, :place_type, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddHostToCmTenants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_tenants, :host, :string, if_not_exists: true
4
+ add_index :cm_tenants, :host, unique: true, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class RemoveClaimedAtAndExpiresAtFromCmInviteGuest < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :cm_invite_guests, :claimed_at, :datetime, if_exists: true
4
+ remove_column :cm_invite_guests, :expires_at, :datetime, if_exists: true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddContactToCmGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_guests, :contact, :string, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddCountryCodeToGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_guests, :country_code, :string, limit: 5, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIntelPhoneNumberToGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_guests, :intel_phone_number, :string, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ FactoryBot.define do
2
+ factory :cm_cms_page, class: 'Spree::CmsPage' do
3
+ sequence(:slug) { |n| "page-slug-#{n}" }
4
+ title { "Sample Page Title" }
5
+ association :store, factory: :store
6
+ locale { 'en' }
7
+ type { 'Spree::Cms::Pages::StandardPage' }
8
+ tenant { nil }
9
+ deleted_at { nil }
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :invite_guest, class: SpreeCmCommissioner::InviteGuest do
3
+ association :order, factory: :order
4
+ token { SecureRandom.hex(16) }
5
+ end
6
+ end
@@ -1,5 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_tenant, class: 'SpreeCmCommissioner::Tenant' do
3
3
  name { "Tenant_a" }
4
+ host { "tenant_a.example.com" }
4
5
  end
5
6
  end
@@ -1,8 +1,21 @@
1
1
  FactoryBot.define do
2
- factory :cm_vendor_place, class: SpreeCmCommissioner::VendorPlace do
3
- vendor { vendor}
4
- place { place }
2
+ factory :vendor_place, class: SpreeCmCommissioner::VendorPlace do
3
+ association :vendor, factory: :vendor
4
+ association :place, factory: :cm_place
5
5
  distance { FFaker::Number.decimal }
6
6
  position { FFaker::Number.number }
7
+ place_type { :branch }
8
+
9
+ trait :branch do
10
+ place_type { :branch }
11
+ end
12
+
13
+ trait :stop do
14
+ place_type { :stop }
15
+ end
16
+
17
+ trait :locations do
18
+ place_type { :locations }
19
+ end
7
20
  end
8
- end
21
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.13.0'.freeze
2
+ VERSION = '1.15.0-beta1'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -5,6 +5,7 @@ require 'spree_auth_devise'
5
5
  require 'spree_multi_vendor'
6
6
  require 'blazer'
7
7
  require 'spree_extension'
8
+ require 'spree_vpago'
8
9
 
9
10
  require 'spree_cm_commissioner/engine'
10
11
  require 'spree_cm_commissioner/version'
@@ -57,5 +57,7 @@ Gem::Specification.new do |s|
57
57
  s.add_development_dependency 'pg'
58
58
  s.add_development_dependency 'spree_dev_tools'
59
59
  s.add_dependency 'blazer', '~> 3.0.4'
60
+ s.add_dependency 'strong_password', '~> 0.0.10'
61
+ s.add_dependency 'spree_vpago'
60
62
  s.metadata['rubygems_mfa_required'] = 'true'
61
63
  end