spree_cm_commissioner 1.10.0.pre.hotfix.pre.sms → 1.10.0

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +24 -48
  3. data/.vscode/settings.json +1 -1
  4. data/Gemfile.lock +1 -1
  5. data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
  6. data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
  7. data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
  8. data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
  9. data/app/interactors/spree_cm_commissioner/create_event.rb +0 -23
  10. data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
  11. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
  12. data/app/interactors/spree_cm_commissioner/sms.rb +0 -14
  13. data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +1 -2
  14. data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +1 -2
  15. data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +2 -4
  16. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +8 -27
  17. data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +1 -3
  18. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +4 -7
  19. data/app/models/spree_cm_commissioner/place.rb +2 -11
  20. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -11
  21. data/app/models/spree_cm_commissioner/trip.rb +11 -0
  22. data/app/models/spree_cm_commissioner/trip_stop.rb +4 -11
  23. data/app/models/spree_cm_commissioner/variant_decorator.rb +2 -9
  24. data/app/models/spree_cm_commissioner/vehicle.rb +7 -0
  25. data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -2
  26. data/app/models/spree_cm_commissioner/vendor_stop.rb +1 -2
  27. data/app/overrides/spree/admin/users/index/body.html.erb.deface +0 -3
  28. data/app/overrides/spree/admin/users/index/headers.html.erb.deface +0 -3
  29. data/app/serializers/spree/v2/tenant/guest_serializer.rb +0 -1
  30. data/app/services/spree_cm_commissioner/aes_encryption_service.rb +4 -6
  31. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +0 -2
  32. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -3
  33. data/config/routes.rb +0 -2
  34. data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +1 -11
  35. data/lib/spree_cm_commissioner/version.rb +1 -1
  36. metadata +4 -21
  37. data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +0 -32
  38. data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +0 -41
  39. data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +0 -18
  40. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +0 -9
  41. data/app/models/spree_cm_commissioner/taxon_option_type.rb +0 -8
  42. data/app/models/spree_cm_commissioner/taxon_option_value.rb +0 -8
  43. data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +0 -7
  44. data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +0 -21
  45. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  46. data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +0 -20
  47. data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +0 -10
  48. data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +0 -9
  49. data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +0 -9
  50. data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +0 -5
  51. data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +0 -6
  52. data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +0 -9
  53. data/lib/tasks/update_orphan_root_places.rake +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c251d1cc34649b5f829ebbc62bda4569e1a6358fa05ff26f44f39455de799e6
4
- data.tar.gz: bee3ddf20b6cfb452f8d17eaa166d3e8f7b31d7d2be1d71160275f40527164e1
3
+ metadata.gz: 634d4cd6a4373be586e59598dab82c2440eb292abe53abeeb1161e6bfca85da2
4
+ data.tar.gz: 3e0e4f5293ce46f30d227269baf174b7b8b3a32ac269a30b733f3e7ea1065aca
5
5
  SHA512:
6
- metadata.gz: 734bb93b3cad9b411ced875bf2d05b23ca837534e630f358e3eb15687d0daed05486e82225fd78505f8a71583127e6cbadac9fb0d3a4e3f0492903e36bf5a2b0
7
- data.tar.gz: f3b0d288ba9cd62d5d79ee8cae5b514b9d126d29c7563a40b14abf0b5342416940eac9c93a8a7c7aea90eb8c4e4f08f490a2bad22ad82bb86c435c2010686dbd
6
+ metadata.gz: 7830251cadb15def91fb9d7bc6c6c68dacb3af529d941f6c1d17364f3dd621c2e3539bf24d7d870d0b82e88f2309d78ab895de19219144192dd8924f1a1943b1
7
+ data.tar.gz: 64bbba3e3a8227f1788748ac27ee108d8f3ad93d89829336f53817556eb6a7e67fd4c43263ce6aa57e087df046139db1c9a665f57411634e1648d8dbd55b9f33
@@ -3,11 +3,6 @@ name: Commissioner Gem
3
3
 
4
4
  on:
5
5
  pull_request:
6
- types:
7
- - opened
8
- - edited
9
- - synchronize
10
- - reopened
11
6
  branches:
12
7
  - develop
13
8
  push:
@@ -19,8 +14,8 @@ jobs:
19
14
 
20
15
  steps:
21
16
  - name: Check PR title format
22
- if: github.event_name == 'pull_request'
23
17
  uses: actions/github-script@v7
18
+ if: github.event_name == 'pull_request'
24
19
  with:
25
20
  script: |
26
21
  const title = context.payload.pull_request.title.trim();
@@ -37,8 +32,8 @@ jobs:
37
32
  console.log("PR title format is correct.");
38
33
  }
39
34
  - name: Check commit messages format
40
- if: github.event_name == 'pull_request'
41
35
  uses: actions/github-script@v7
36
+ if: github.event_name == 'pull_request'
42
37
  with:
43
38
  script: |
44
39
  const pr = context.payload.pull_request;
@@ -69,52 +64,33 @@ jobs:
69
64
  console.log("All commit messages are correctly formatted.");
70
65
  }
71
66
  - name: Check for unresolved review threads
72
- if: github.event_name == 'pull_request'
73
67
  uses: actions/github-script@v7
68
+ if: github.event_name == 'pull_request'
74
69
  with:
75
70
  script: |
76
- const prNumber = context.payload.pull_request.number;
77
- const { owner, repo } = context.repo;
78
-
79
- const query = `
80
- query($owner: String!, $repo: String!, $prNumber: Int!) {
81
- repository(owner: $owner, name: $repo) {
82
- pullRequest(number: $prNumber) {
83
- reviewThreads(first: 100) {
84
- nodes {
85
- isResolved
86
- comments(first: 1) {
87
- nodes {
88
- body
89
- author {
90
- login
91
- }
92
- }
93
- }
94
- }
95
- }
96
- }
97
- }
98
- }
99
- `;
100
- const variables = { owner, repo, prNumber };
101
- const result = await github.graphql(query, variables);
102
- const threads = result.repository.pullRequest.reviewThreads.nodes;
103
-
104
- const unresolved = threads.filter(t => !t.isResolved);
105
-
106
- if (unresolved.length > 0) {
107
- unresolved.forEach(thread => {
108
- const comments = thread.comments.nodes;
109
- if (comments.length > 0) {
110
- console.log(`💬 Comment by ${comments[0].author.login}: ${comments[0].body}`);
111
- }
71
+ const pr = context.payload.pull_request;
72
+ const owner = context.repo.owner;
73
+ const repo = context.repo.repo;
74
+
75
+ try {
76
+ const response = await github.rest.pulls.listReviewComments({
77
+ owner,
78
+ repo,
79
+ pull_number: pr.number,
80
+ per_page: 100
112
81
  });
113
- core.setFailed(`❌ There are ${unresolved.length} unresolved review thread(s). Please resolve them before merging.`);
114
- } else {
115
- console.log("✅ All review threads are resolved.");
116
- }
117
82
 
83
+ const unresolved = response.data.filter(comment => comment.in_reply_to_id && !comment.resolved);
84
+
85
+ if (unresolved.length > 0) {
86
+ core.setFailed(`There are ${unresolved.length} unresolved review comment(s). Please resolve all threads before merging.`);
87
+ } else {
88
+ console.log("All review comments are resolved.");
89
+ }
90
+ } catch (error) {
91
+ console.error("Error fetching review comments:", error.message);
92
+ core.setFailed("Failed to check for unresolved review threads.");
93
+ }
118
94
  test_and_build_gem:
119
95
  needs: [validate-commits]
120
96
  # if: github.head_ref != '2572-enforce-pr-workflow' || github.base_ref != 'develop'
@@ -3,6 +3,6 @@
3
3
  "files.trimTrailingWhitespace": true,
4
4
  "editor.formatOnSave": true,
5
5
  "[yaml]": {
6
- "editor.defaultFormatter": "redhat.vscode-yaml"
6
+ "editor.defaultFormatter": "aaron-bond.better-comments"
7
7
  },
8
8
  }
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (1.10.0.pre.hotfix.pre.sms)
37
+ spree_cm_commissioner (1.10.0)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -14,7 +14,7 @@ module Spree
14
14
  end
15
15
 
16
16
  def filter_params
17
- params.permit(:login, :locale, :format).merge(tenant_id: MultiTenant.current_tenant_id)
17
+ params.permit(:login, :locale, :format)
18
18
  end
19
19
  end
20
20
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  module Tenant
5
5
  class AccountRecoversController < BaseController
6
6
  def update
7
- context = SpreeCmCommissioner::AccountRecover.call(**filter_params.slice(:id_token, :login, :password, :tenant_id))
7
+ context = SpreeCmCommissioner::AccountRecover.call(**filter_params.slice(:id_token, :login, :password))
8
8
  if context.success?
9
9
  render json: { message: 'Account Recovered successfully' }, status: :ok
10
10
  else
@@ -15,7 +15,7 @@ module Spree
15
15
  private
16
16
 
17
17
  def filter_params
18
- params.permit(:id_token, :login, :password).merge(tenant_id: MultiTenant.current_tenant_id)
18
+ params.permit(:id_token, :login, :password)
19
19
  end
20
20
  end
21
21
  end
@@ -26,7 +26,7 @@ module Spree
26
26
  :pin_code_token,
27
27
  :password,
28
28
  :password_confirmation
29
- ).merge(tenant_id: MultiTenant.current_tenant_id)
29
+ )
30
30
  end
31
31
  end
32
32
  end
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class AccountRecover < BaseInteractor
3
- delegate :id_token, :login, :password, :tenant_id, to: :context
3
+ delegate :id_token, :login, :password, to: :context
4
4
 
5
5
  def call
6
6
  validate_user
@@ -15,7 +15,7 @@ module SpreeCmCommissioner
15
15
  def validate_user
16
16
  # get email password user
17
17
  if login.present? && password.present?
18
- context.user = Spree.user_class.find_user_by_login(login, tenant_id)
18
+ context.user = Spree.user_class.find_user_by_login(login)
19
19
  # get social user
20
20
  elsif id_token.present?
21
21
  checker_context = SpreeCmCommissioner::UserIdTokenChecker.call(id_token: id_token)
@@ -10,8 +10,6 @@ module SpreeCmCommissioner
10
10
  assign_prototype
11
11
  create_child_taxon
12
12
  build_home_banner
13
- assign_option_types
14
- assign_option_values
15
13
  end
16
14
  end
17
15
 
@@ -63,26 +61,5 @@ module SpreeCmCommissioner
63
61
 
64
62
  context.fail!(message: 'Home banner upload failed') unless banner.persisted?
65
63
  end
66
-
67
- def assign_options(model_class, param_key, foreign_key)
68
- return unless params[param_key]
69
-
70
- params[param_key].each do |id|
71
- record = model_class.new(
72
- taxon_id: @parent_taxon.id,
73
- foreign_key => id
74
- )
75
-
76
- context.fail!(message: record.errors.full_messages.join(', ')) unless record.save
77
- end
78
- end
79
-
80
- def assign_option_types
81
- assign_options(SpreeCmCommissioner::TaxonOptionType, :option_type_id, :option_type_id)
82
- end
83
-
84
- def assign_option_values
85
- assign_options(SpreeCmCommissioner::TaxonOptionValue, :option_value_id, :option_value_id)
86
- end
87
64
  end
88
65
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  include Interactor
4
4
 
5
5
  def call
6
- user = Spree.user_class.find_user_by_login(context.login, context.tenant_id) if context.login.present?
6
+ user = Spree.user_class.find_user_by_login(context.login) if context.login.present?
7
7
 
8
8
  context.fail!(message: I18n.t('account_checker.verify.already_exist', login: context.login)) if user.present?
9
9
  end
@@ -1,7 +1,5 @@
1
1
  module SpreeCmCommissioner
2
2
  class PinCodeSender < BaseInteractor
3
- include SpreeCmCommissioner::PinCodeSenderHelper
4
-
5
3
  def call
6
4
  context.fail!(message: I18n.t('pincode_sender.pincode.blank')) if context.pin_code.nil?
7
5
 
@@ -17,8 +15,10 @@ module SpreeCmCommissioner
17
15
  private
18
16
 
19
17
  def send_sms
18
+ from = context.tenant || Spree::Store.default
19
+
20
20
  options = {
21
- from: sender_name(context.tenant),
21
+ from: from,
22
22
  to: context.pin_code.contact,
23
23
  body: I18n.t('pincode_sender.sms.body', code: context.pin_code.code, readable_type: context.pin_code.readable_type)
24
24
  }
@@ -11,8 +11,6 @@ module SpreeCmCommissioner
11
11
  context.sms_log.error = e.message
12
12
  context.sms_log.save
13
13
  context.fail!(message: e.message)
14
-
15
- log_error_to_telegram(e.message)
16
14
  end
17
15
  end
18
16
 
@@ -59,17 +57,5 @@ module SpreeCmCommissioner
59
57
  result = SpreeCmCommissioner::InternationalMobileFormatter.call(phone_number: number)
60
58
  result.formatted_phone_number
61
59
  end
62
-
63
- def log_error_to_telegram(message)
64
- return unless ENV['PIN_CODE_DEBUG_NOTIFIY_TELEGRAM_ENABLE'] == 'yes'
65
-
66
- options = {
67
- pin_code_id: context.pin_code.id,
68
- tenant_id: context.tenant&.id,
69
- error_message: message
70
- }
71
-
72
- SpreeCmCommissioner::TelegramDebugPinCodeSenderJob.perform_later(options)
73
- end
74
60
  end
75
61
  end
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class TelegramDebugPinCodeSender < BaseInteractor
3
- delegate :pin_code, :name, :error_message, to: :context
3
+ delegate :pin_code, :name, to: :context
4
4
 
5
5
  def call
6
6
  telegram_client.send_message(
@@ -16,7 +16,6 @@ module SpreeCmCommissioner
16
16
  text << "<b>From: #{name}</b>"
17
17
  text << "<b>PIN CODE sent to #{pin_code.contact}</b>"
18
18
  text << "<code>#{pin_code.code}</code> is your #{pin_code.readable_type}"
19
- text << "⚠️ Error: <code>#{error_message}<code> ⚠️" if error_message.present?
20
19
 
21
20
  text.compact.join("\n")
22
21
  end
@@ -1,7 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class UserForgottenPasswordUpdater < BaseInteractor
3
3
  # :email, :phone_number, :country_code :pin_code, :pin_code_token, :password, :password_confirmation
4
- delegate :tenant_id, to: :context
5
4
 
6
5
  def call
7
6
  find_user_by_login!
@@ -20,7 +19,7 @@ module SpreeCmCommissioner
20
19
  def find_user_by_login!
21
20
  login = phone_number || email
22
21
 
23
- context.user = Spree.user_class.find_user_by_login(login, tenant_id)
22
+ context.user = Spree.user_class.find_user_by_login(login)
24
23
  context.fail!(message: I18n.t('account_checker.verify.not_exist', login: login)) if context.user.blank?
25
24
  end
26
25
 
@@ -1,15 +1,13 @@
1
1
  module SpreeCmCommissioner
2
2
  class UserPasswordAuthenticator < BaseInteractor
3
- delegate :login, :password, :tenant_id, to: :context
3
+ delegate :login, :password, to: :context
4
4
 
5
5
  def call
6
- context.user = Spree.user_class.find_user_by_login(login, tenant_id)
6
+ context.user = Spree.user_class.find_user_by_login(login)
7
7
  context.fail!(message: I18n.t('authenticator.incorrect_login')) if context.user.nil?
8
-
9
8
  if spree_confirmable? && active_for_authentication? && !validate_password(user)
10
9
  context.fail!(message: I18n.t('authenticator.incorrect_password'))
11
10
  end
12
-
13
11
  context.fail!(message: I18n.t('authenticator.incorrect_password')) unless validate_password(context.user)
14
12
  context.fail!(message: 'account_temporarily_deleted') if context.user.soft_deleted?
15
13
  end
@@ -25,8 +25,10 @@ module SpreeCmCommissioner
25
25
  end
26
26
 
27
27
  def verify_signature
28
+ public_key = ENV['VATTANAC_PUBLIC_KEY'].presence || Rails.application.credentials.vattanac.public_key
29
+
28
30
  rsa_service = SpreeCmCommissioner::RsaService.new(
29
- public_key: vattanac_public_key
31
+ public_key: public_key
30
32
  )
31
33
 
32
34
  return if rsa_service.verify(context.encrypted_data, context.signature)
@@ -35,6 +37,8 @@ module SpreeCmCommissioner
35
37
  end
36
38
 
37
39
  def decrypt_payload
40
+ aes_key = ENV['VATTANAC_AES_SECRET_KEY'].presence || Rails.application.credentials.vattanac.aes_secret_key
41
+
38
42
  context.fail!(message: 'Invalid AES key length', status: :unprocessable_entity) unless aes_key
39
43
 
40
44
  begin
@@ -53,7 +57,7 @@ module SpreeCmCommissioner
53
57
  user_data = context.user_data
54
58
 
55
59
  identity = SpreeCmCommissioner::UserIdentityProvider.vattanac_bank
56
- .find_or_initialize_by(sub: user_data['phoneNum'])
60
+ .find_or_initialize_by(sub: user_data['id'])
57
61
 
58
62
  if identity.persisted?
59
63
  context.user = identity.user
@@ -78,7 +82,7 @@ module SpreeCmCommissioner
78
82
  identity = context.identity
79
83
 
80
84
  identity.name = full_name
81
- identity.email = user_data['email']
85
+
82
86
  context.user = Spree::User.new(
83
87
  first_name: user_data['firstName'],
84
88
  last_name: user_data['lastName'],
@@ -95,41 +99,18 @@ module SpreeCmCommissioner
95
99
 
96
100
  def construct_data
97
101
  user = context.user
98
-
99
- raw_data = {
102
+ context.data = {
100
103
  sessionId: session_id,
101
104
  name: user.full_name,
102
105
  phone: user.phone_number,
103
106
  email: user.email,
104
107
  webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}"
105
108
  }
106
-
107
- json_data = raw_data.to_json
108
-
109
- encrypted_data = SpreeCmCommissioner::AesEncryptionService.encrypt(json_data, aes_key)
110
-
111
- rsa_service = SpreeCmCommissioner::RsaService.new(private_key: bookmeplus_private_key)
112
-
113
- signed_data = rsa_service.sign(encrypted_data)
114
-
115
- context.data = signed_data
116
109
  end
117
110
 
118
111
  def session_id
119
112
  payload = { user_id: context.user.id }
120
113
  SpreeCmCommissioner::UserSessionJwtToken.encode(payload, context.user.reload.secure_token)
121
114
  end
122
-
123
- def aes_key
124
- ENV['VATTANAC_AES_SECRET_KEY'].presence || Rails.application.credentials.vattanac.aes_secret_key
125
- end
126
-
127
- def bookmeplus_private_key
128
- ENV['BOOKMEPLUS_PRIVATE_KEY'].presence || Rails.application.credentials.bookmeplus.private_key
129
- end
130
-
131
- def vattanac_public_key
132
- ENV['VATTANAC_PUBLIC_KEY'].presence || Rails.application.credentials.vattanac.public_key
133
- end
134
115
  end
135
116
  end
@@ -5,14 +5,12 @@ module SpreeCmCommissioner
5
5
  def perform(options)
6
6
  pin_code = SpreeCmCommissioner::PinCode.find(options[:pin_code_id])
7
7
  tenant = SpreeCmCommissioner::Tenant.find_by(id: options[:tenant_id])
8
- error_message = options[:error_message]
9
8
 
10
9
  name = sender_name(tenant)
11
10
 
12
11
  SpreeCmCommissioner::TelegramDebugPinCodeSender.call(
13
12
  pin_code: pin_code,
14
- name: name,
15
- error_message: error_message
13
+ name: name
16
14
  )
17
15
  end
18
16
  end
@@ -25,21 +25,18 @@ module SpreeCmCommissioner
25
25
  end
26
26
 
27
27
  class_methods do
28
- def find_user_by_login(login, tenant_id)
28
+ def find_user_by_login(login)
29
29
  return nil if login.blank?
30
30
 
31
31
  login = login.downcase
32
32
  parser = PhoneNumberParser.call(phone_number: login)
33
33
 
34
- scope = Spree.user_class.all
35
- scope = scope.where(tenant_id: tenant_id) if tenant_id.present?
36
-
37
34
  if parser.intel_phone_number.present?
38
- scope.find_by(intel_phone_number: parser.intel_phone_number)
35
+ find_by(intel_phone_number: parser.intel_phone_number)
39
36
  elsif login =~ URI::MailTo::EMAIL_REGEXP
40
- scope.find_by(email: login)
37
+ find_by(email: login)
41
38
  else
42
- scope.find_by(login: login)
39
+ find_by(login: login)
43
40
  end
44
41
  end
45
42
  end
@@ -2,8 +2,6 @@ require_dependency 'spree_cm_commissioner'
2
2
 
3
3
  module SpreeCmCommissioner
4
4
  class Place < ApplicationRecord
5
- acts_as_nested_set
6
-
7
5
  validates :reference, presence: true, if: :validate_reference?
8
6
  validates :lat, presence: true, if: :validate_lat?
9
7
  validates :lon, presence: true, if: :validate_lon?
@@ -15,22 +13,15 @@ module SpreeCmCommissioner
15
13
 
16
14
  has_many :product_places, class_name: 'SpreeCmCommissioner::ProductPlace', dependent: :destroy
17
15
  has_many :products, through: :product_places
16
+ has_many :children, class_name: 'SpreeCmCommissioner::Place', foreign_key: :parent_id, dependent: :destroy
17
+ belongs_to :parent, class_name: 'SpreeCmCommissioner::Place', optional: true
18
18
 
19
- has_many :children, -> { order(:lft) }, class_name: 'SpreeCmCommissioner::Place', foreign_key: :parent_id, dependent: :destroy
20
19
  has_many :vendor_stops, class_name: 'SpreeCmCommissioner::VendorStop', dependent: :destroy
21
20
 
22
21
  def self.ransackable_attributes(auth_object = nil)
23
22
  super & %w[name code]
24
23
  end
25
24
 
26
- def full_path_name
27
- self_and_ancestors.map(&:name).reverse.join(', ')
28
- end
29
-
30
- def path_ids
31
- self_and_ancestors.map(&:id)
32
- end
33
-
34
25
  def validate_reference?
35
26
  Spree::Store.default.code.exclude?('billing')
36
27
  end
@@ -57,9 +57,6 @@ module SpreeCmCommissioner
57
57
  base.has_many :event_blazer_queries, class_name: 'SpreeCmCommissioner::TaxonBlazerQuery'
58
58
  base.has_many :blazer_queries, through: :event_blazer_queries, class_name: 'Blazer::Query'
59
59
 
60
- base.has_many :taxon_option_types, class_name: 'SpreeCmCommissioner::TaxonOptionType'
61
- base.has_many :taxon_option_values, class_name: 'SpreeCmCommissioner::TaxonOptionValue'
62
-
63
60
  def base.active_homepage_events
64
61
  joins(:homepage_section_relatables)
65
62
  .joins("INNER JOIN spree_taxons taxon ON taxon.id = cm_homepage_section_relatables.relatable_id
@@ -99,14 +96,6 @@ module SpreeCmCommissioner
99
96
  .uniq
100
97
  end
101
98
 
102
- def selected_option_types
103
- taxon_option_types.pluck(:option_type_id)
104
- end
105
-
106
- def selected_option_values
107
- taxon_option_values.pluck(:option_value_id)
108
- end
109
-
110
99
  def event_url
111
100
  "https://#{Spree::Store.default.url}/t/#{permalink}"
112
101
  end
@@ -14,12 +14,23 @@ module SpreeCmCommissioner
14
14
  validates :duration, numericality: { greater_than: 0 }
15
15
  validate :origin_and_destination_cannot_be_the_same
16
16
 
17
+ has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy
18
+
19
+ after_commit :create_trip_stops
20
+
21
+ accepts_nested_attributes_for :trip_stops, allow_destroy: true
22
+
17
23
  def convert_duration_to_seconds
18
24
  return if hours.blank? && minutes.blank? && seconds.blank?
19
25
 
20
26
  self.duration = (hours.to_i * 3600) + (minutes.to_i * 60) + seconds.to_i
21
27
  end
22
28
 
29
+ def create_trip_stops
30
+ trip_stops.create(stop_type: :boarding, stop_id: origin_id)
31
+ trip_stops.create(stop_type: :drop_off, stop_id: destination_id)
32
+ end
33
+
23
34
  def duration_in_hms
24
35
  return { hours: 0, minutes: 0, seconds: 0 } if duration.nil?
25
36
 
@@ -8,8 +8,8 @@ module SpreeCmCommissioner
8
8
  belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
9
9
 
10
10
  before_validation :set_stop_name
11
- after_destroy :decrement_trip_count
12
- after_commit :create_vendor_stop
11
+ after_create :create_vendor_stop
12
+
13
13
  validates :stop_id, uniqueness: { scope: :trip_id }
14
14
 
15
15
  def set_stop_name
@@ -17,20 +17,13 @@ module SpreeCmCommissioner
17
17
  end
18
18
 
19
19
  def create_vendor_stop
20
- vendor_stop = vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).first_or_create
21
- vendor_stop.update(trip_count: vendor_stop.trip_count.to_i + 1)
20
+ vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).first_or_create if trip.present?
22
21
  end
23
22
 
24
23
  private
25
24
 
26
- def decrement_trip_count
27
- vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).find_each do |vendor_stop|
28
- vendor_stop.update(trip_count: [vendor_stop.trip_count - 1, 0].max)
29
- end
30
- end
31
-
32
25
  def vendor
33
- Spree::Product.find(trip&.product_id).vendor
26
+ Spree::Product.find(trip.product_id).vendor
34
27
  end
35
28
  end
36
29
  end
@@ -26,16 +26,9 @@ module SpreeCmCommissioner
26
26
  class_name: 'SpreeCmCommissioner::Trip'
27
27
  base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy, foreign_key: :trip_id
28
28
  base.accepts_nested_attributes_for :option_values
29
- base.after_commit :sync_trip, if: :transit?
29
+ base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', foreign_key: :trip_id, dependent: :destroy
30
+ base.after_commit :sync_trip, if: -> { product.product_type == 'transit' }
30
31
  base.accepts_nested_attributes_for :trip_stops, allow_destroy: true
31
- base.after_commit :create_trip_stops, if: :transit?
32
- end
33
-
34
- def create_trip_stops
35
- return if is_master?
36
-
37
- trip_stops.find_or_create_by(stop_type: :boarding, stop_id: options.origin)
38
- trip_stops.find_or_create_by(stop_type: :drop_off, stop_id: options.destination)
39
32
  end
40
33
 
41
34
  def delivery_required?
@@ -8,6 +8,7 @@ module SpreeCmCommissioner
8
8
  has_one :primary_photo, -> { order(position: :asc) }, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
9
9
  belongs_to :vendor, class_name: 'Spree::Vendor'
10
10
 
11
+ before_save :set_attributes
11
12
  after_commit :create_vehicle_option_value
12
13
 
13
14
  has_many :vehicle_photo, class_name: 'SpreeCmCommissioner::VehiclePhoto', as: :viewable, dependent: :destroy
@@ -16,6 +17,12 @@ module SpreeCmCommissioner
16
17
  validates :code, uniqueness: { scope: :vendor_id }, presence: true
17
18
  validates :license_plate, uniqueness: {}, allow_blank: true
18
19
 
20
+ def set_attributes
21
+ self.route_type = vehicle_type.route_type
22
+ self.number_of_seats = vehicle_type.vehicle_seats_count
23
+ self.allow_seat_selection = vehicle_type.allow_seat_selection
24
+ end
25
+
19
26
  def create_vehicle_option_value
20
27
  SpreeCmCommissioner::VehicleOptionValueCreator.call(self)
21
28
  end
@@ -79,8 +79,7 @@ module SpreeCmCommissioner
79
79
  dependent: :destroy, inverse_of: :relatable
80
80
 
81
81
  base.has_many :vehicle_types, class_name: 'SpreeCmCommissioner::VehicleType', dependent: :destroy
82
- base.has_many :vehicles, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
83
- # base.has_many :vehicles, through: :vehicle_types, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
82
+ base.has_many :vehicles, through: :vehicle_types, class_name: 'SpreeCmCommissioner::Vehicle', dependent: :destroy
84
83
 
85
84
  base.validates :account_name, :account_number, presence: true, if: lambda {
86
85
  payment_qrcode.present? && Spree::Store.default.code.include?('billing')
@@ -4,7 +4,6 @@ module SpreeCmCommissioner
4
4
  belongs_to :vendor, class_name: 'Spree::Vendor'
5
5
  belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
6
6
 
7
- validates :trip_count, numericality: { greater_than_or_equal_to: 0 }
8
- enum :stop_type, { boarding: 0, drop_off: 1 }
7
+ enum stop_type: { boarding: 0, drop_off: 1 }
9
8
  end
10
9
  end
@@ -23,9 +23,6 @@
23
23
  <td class='phone_number'>
24
24
  <%= user.phone_number%>
25
25
  </td>
26
- <td class='tenant'>
27
- <%= user.tenant&.name || Spree::Store.default.name %>
28
- </td>
29
26
  <td class='created_at'>
30
27
  <%= user.created_at %>
31
28
  </td>
@@ -19,9 +19,6 @@
19
19
  <th>
20
20
  <%= sort_link @search, :phone_number, I18n.t('activerecord.attributes.spree/order.phone_number'), {}, {title: 'phone_number_title'} %>
21
21
  </th>
22
- <th>
23
- <%= Spree.t(:tenant) %>
24
- </th>
25
22
  <th>
26
23
  <%= sort_link @search, :created_at, Spree.t(:create_at), {}, {title: 'create_at_title'} %>
27
24
  </th>
@@ -13,7 +13,6 @@ module Spree
13
13
 
14
14
  belongs_to :occupation, serializer: Spree::V2::Tenant::TaxonSerializer
15
15
  belongs_to :nationality, serializer: Spree::V2::Tenant::TaxonSerializer
16
- has_one :id_card, serializer: Spree::V2::Tenant::IdCardSerializer
17
16
 
18
17
  # allowed_checkout updates frequently
19
18
  cache_options store: nil
@@ -8,13 +8,12 @@ module SpreeCmCommissioner
8
8
  IV_LENGTH = 12
9
9
  TAG_LENGTH = 16
10
10
 
11
- def self.encrypt(plaintext, base64_key)
12
- key = Base64.decode64(base64_key)
11
+ def self.encrypt(plaintext, key)
13
12
  validate_key!(key)
14
13
 
15
14
  cipher = OpenSSL::Cipher.new(ALGORITHM)
16
15
  cipher.encrypt
17
- cipher.key = key[0, KEY_LENGTH]
16
+ cipher.key = key.b[0, KEY_LENGTH]
18
17
  iv = cipher.random_iv
19
18
  cipher.iv = iv
20
19
 
@@ -25,8 +24,7 @@ module SpreeCmCommissioner
25
24
  Base64.strict_encode64(combined)
26
25
  end
27
26
 
28
- def self.decrypt(encrypted_text, base64_key)
29
- key = Base64.decode64(base64_key)
27
+ def self.decrypt(encrypted_text, key)
30
28
  validate_key!(key)
31
29
 
32
30
  combined = Base64.decode64(encrypted_text)
@@ -36,7 +34,7 @@ module SpreeCmCommissioner
36
34
 
37
35
  cipher = OpenSSL::Cipher.new(ALGORITHM)
38
36
  cipher.decrypt
39
- cipher.key = key[0, KEY_LENGTH]
37
+ cipher.key = key.b[0, KEY_LENGTH]
40
38
  cipher.iv = iv
41
39
  cipher.auth_tag = tag
42
40
 
@@ -48,8 +48,6 @@ module SpreeCmCommissioner
48
48
  end
49
49
 
50
50
  def fetch_option_value(guest, option_type_name)
51
- return guest.formatted_bib_number if option_type_name == 'bib-prefix'
52
-
53
51
  guest.line_item&.variant&.find_option_value_name_for(option_type_name: option_type_name)
54
52
  end
55
53
 
@@ -25,11 +25,9 @@ module SpreeCmCommissioner
25
25
  end
26
26
 
27
27
  def self.auth_context(params)
28
- tenant_id = find_oauth_application(params)&.tenant_id
29
-
30
28
  case flow_type(params)
31
29
  when 'login_auth'
32
- options = { login: params[:username], password: params[:password], tenant_id: tenant_id }
30
+ options = { login: params[:username], password: params[:password] }
33
31
  SpreeCmCommissioner::UserPasswordAuthenticator.call(options)
34
32
  when 'social_auth'
35
33
  options = { id_token: params[:id_token] }
data/config/routes.rb CHANGED
@@ -516,8 +516,6 @@ Spree::Core::Engine.add_routes do
516
516
  resource :reset_passwords, only: [:update]
517
517
  resource :change_passwords, only: [:update]
518
518
  resource :user_contacts, only: [:update]
519
-
520
- resources :cms_pages, only: %i[index show]
521
519
  end
522
520
 
523
521
  namespace :storefront do
@@ -10,15 +10,5 @@ FactoryBot.define do
10
10
  address_components { FFaker::Address.street_address }
11
11
  lat { FFaker::Geolocation.lat }
12
12
  lon { FFaker::Geolocation.lng }
13
- trait :with_parent do
14
- association :parent, factory: :cm_place
15
- end
16
- transient do
17
- children_count { 0 }
18
- end
19
-
20
- after(:create) do |place, evaluator|
21
- create_list(:cm_place, evaluator.children_count, parent: place)
22
- end
23
13
  end
24
- end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.10.0-hotfix-sms'.freeze
2
+ VERSION = '1.10.0'.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: 1.10.0.pre.hotfix.pre.sms
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-14 00:00:00.000000000 Z
11
+ date: 2025-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -702,7 +702,6 @@ files:
702
702
  - app/controllers/spree/admin/calendars/base_controller.rb
703
703
  - app/controllers/spree/admin/calendars/orders_controller.rb
704
704
  - app/controllers/spree/admin/classifications_controller.rb
705
- - app/controllers/spree/admin/cms_pages_controller_decorator.rb
706
705
  - app/controllers/spree/admin/customer_notifications_controller.rb
707
706
  - app/controllers/spree/admin/device_tokens_controller.rb
708
707
  - app/controllers/spree/admin/event_blazer_queries_controller.rb
@@ -860,7 +859,6 @@ files:
860
859
  - app/controllers/spree/api/v2/tenant/cart_payment_method_groups_controller.rb
861
860
  - app/controllers/spree/api/v2/tenant/change_passwords_controller.rb
862
861
  - app/controllers/spree/api/v2/tenant/checkout_controller.rb
863
- - app/controllers/spree/api/v2/tenant/cms_pages_controller.rb
864
862
  - app/controllers/spree/api/v2/tenant/customer_notifications_controller.rb
865
863
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
866
864
  - app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
@@ -944,7 +942,6 @@ files:
944
942
  - app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb
945
943
  - app/controllers/spree_cm_commissioner/api/v2/storefront/cart_controller_decorator.rb
946
944
  - app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb
947
- - app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb
948
945
  - app/controllers/spree_cm_commissioner/application_controller_decorator.rb
949
946
  - app/controllers/spree_cm_commissioner/guest_cards_controller.rb
950
947
  - app/controllers/spree_cm_commissioner/line_item_qr_images_controller.rb
@@ -1159,7 +1156,6 @@ files:
1159
1156
  - app/models/spree_cm_commissioner/check_in_ability.rb
1160
1157
  - app/models/spree_cm_commissioner/check_in_record.rb
1161
1158
  - app/models/spree_cm_commissioner/classification_decorator.rb
1162
- - app/models/spree_cm_commissioner/cms_page_decorator.rb
1163
1159
  - app/models/spree_cm_commissioner/configuration.rb
1164
1160
  - app/models/spree_cm_commissioner/crew_invite.rb
1165
1161
  - app/models/spree_cm_commissioner/customer.rb
@@ -1271,8 +1267,6 @@ files:
1271
1267
  - app/models/spree_cm_commissioner/taxon_category_icon.rb
1272
1268
  - app/models/spree_cm_commissioner/taxon_decorator.rb
1273
1269
  - app/models/spree_cm_commissioner/taxon_home_banner.rb
1274
- - app/models/spree_cm_commissioner/taxon_option_type.rb
1275
- - app/models/spree_cm_commissioner/taxon_option_value.rb
1276
1270
  - app/models/spree_cm_commissioner/taxon_vendor.rb
1277
1271
  - app/models/spree_cm_commissioner/taxon_video_banner.rb
1278
1272
  - app/models/spree_cm_commissioner/taxon_web_banner.rb
@@ -1326,8 +1320,6 @@ files:
1326
1320
  - app/notifications/spree_cm_commissioner/order_requested_notification.rb
1327
1321
  - app/overrides/spree/admin/adjustments/_adjustment/payable_table_body.html.erb.deface
1328
1322
  - app/overrides/spree/admin/adjustments/_adjustments_table/payable_table_header.html.erb.deface
1329
- - app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface
1330
- - app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface
1331
1323
  - app/overrides/spree/admin/menu_items/_form/badge_field.html.erb.deface
1332
1324
  - app/overrides/spree/admin/oauth_applications/_form/tenant_fields.html.erb.deface
1333
1325
  - app/overrides/spree/admin/option_types/_form/attr_type.html.erb.deface
@@ -1470,7 +1462,6 @@ files:
1470
1462
  - app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
1471
1463
  - app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb
1472
1464
  - app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb
1473
- - app/queries/spree_cm_commissioner/vendor_stop_place_query.rb
1474
1465
  - app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
1475
1466
  - app/request_schemas/spree_cm_commissioner/application_request_schema.rb
1476
1467
  - app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
@@ -1785,7 +1776,6 @@ files:
1785
1776
  - app/views/spree/admin/promotions/rules/_guest_occupations.html.erb
1786
1777
  - app/views/spree/admin/promotions/rules/_vendors.html.erb
1787
1778
  - app/views/spree/admin/promotions/rules/_weekend.html.erb
1788
- - app/views/spree/admin/shared/_cms_pages_tabs.html.erb
1789
1779
  - app/views/spree/admin/shared/_customer_notification_tabs.html.erb
1790
1780
  - app/views/spree/admin/shared/_direct_upload.html.erb
1791
1781
  - app/views/spree/admin/shared/_import_order_tabs.html.erb
@@ -2382,14 +2372,9 @@ files:
2382
2372
  - db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
2383
2373
  - db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
2384
2374
  - db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
2385
- - db/migrate/20250418072528_add_nested_set_columns_to_places.rb
2386
2375
  - db/migrate/20250425084929_add_description_to_spree_prototypes.rb
2387
2376
  - db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
2388
2377
  - db/migrate/20250428025645_add_slug_to_spree_prototypes.rb
2389
- - db/migrate/20250430091742_create_cm_taxon_option_types.rb
2390
- - db/migrate/20250430092928_create_cm_taxon_option_values.rb
2391
- - db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb
2392
- - db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb
2393
2378
  - docker-compose.yml
2394
2379
  - docs/option_types/attr_types.md
2395
2380
  - docs/private_key.pem
@@ -2503,11 +2488,9 @@ files:
2503
2488
  - lib/tasks/fetch_email.rake
2504
2489
  - lib/tasks/kh_location_option_values.rake
2505
2490
  - lib/tasks/kh_provinces.rake
2506
- - lib/tasks/migrate_and_rebuild_place_hierarchy.rake
2507
2491
  - lib/tasks/remove_duplicate_device_tokens.rake
2508
2492
  - lib/tasks/subscriptions_order_creator.rake
2509
2493
  - lib/tasks/update_gateway_status.rake
2510
- - lib/tasks/update_orphan_root_places.rake
2511
2494
  - lib/tasks/update_taxons.rake
2512
2495
  - lib/tasks/variants_public_metadata_updater.rake
2513
2496
  - lib/tasks/vendor_updater.rake
@@ -2535,9 +2518,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2535
2518
  version: '2.7'
2536
2519
  required_rubygems_version: !ruby/object:Gem::Requirement
2537
2520
  requirements:
2538
- - - ">"
2521
+ - - ">="
2539
2522
  - !ruby/object:Gem::Version
2540
- version: 1.3.1
2523
+ version: '0'
2541
2524
  requirements:
2542
2525
  - none
2543
2526
  rubygems_version: 3.4.1
@@ -1,32 +0,0 @@
1
- module Spree
2
- module Admin
3
- module CmsPagesControllerDecorator
4
- def scope
5
- return Spree::CmsPage.none unless current_store&.cms_pages
6
-
7
- scope = current_store.cms_pages
8
-
9
- case params[:tab]
10
- when 'default'
11
- scope = scope.where(tenant_id: nil)
12
- when 'tenants'
13
- scope = if params[:tenant_id].present?
14
- scope.where(tenant_id: params[:tenant_id])
15
- else
16
- scope.where.not(tenant_id: nil)
17
- end
18
- end
19
-
20
- scope
21
- end
22
-
23
- def permitted_resource_params
24
- super.merge(tenant_id: params[:cms_page][:tenant_id])
25
- end
26
- end
27
- end
28
- end
29
-
30
- unless Spree::Admin::CmsPagesController.included_modules.include?(Spree::Admin::CmsPagesControllerDecorator)
31
- Spree::Admin::CmsPagesController.prepend(Spree::Admin::CmsPagesControllerDecorator)
32
- end
@@ -1,41 +0,0 @@
1
- module Spree
2
- module Api
3
- module V2
4
- module Tenant
5
- class CmsPagesController < BaseController
6
- private
7
-
8
- def model_class
9
- Spree::CmsPage
10
- end
11
-
12
- def resource
13
- @resource ||= scope.find_by(slug: params[:id]) || scope.find(params[:id])
14
- end
15
-
16
- def resource_serializer
17
- Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
18
- end
19
-
20
- def collection_serializer
21
- Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
22
- end
23
-
24
- def collection_finder
25
- Spree::Api::Dependencies.storefront_cms_page_finder.constantize
26
- end
27
-
28
- def scope
29
- model_class.by_locale(I18n.locale).where(tenant_id: MultiTenant.current_tenant_id)
30
- end
31
-
32
- def scope_includes
33
- {
34
- cms_sections: :linked_resource
35
- }
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,18 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Api
3
- module V2
4
- module Storefront
5
- module CmsPagesControllerDecorator
6
- def scope
7
- super.by_locale(I18n.locale).where(tenant_id: nil)
8
- end
9
- end
10
- end
11
- end
12
- end
13
- end
14
-
15
- # Prepend the decorator to the CmsPagesController
16
- unless Spree::Api::V2::Storefront::CmsPagesController.ancestors.include?(SpreeCmCommissioner::Api::V2::Storefront::CmsPagesControllerDecorator)
17
- Spree::Api::V2::Storefront::CmsPagesController.prepend(SpreeCmCommissioner::Api::V2::Storefront::CmsPagesControllerDecorator)
18
- end
@@ -1,9 +0,0 @@
1
- module SpreeCmCommissioner
2
- module CmsPageDecorator
3
- def self.prepended(base)
4
- base.multi_tenant :tenant, class_name: 'SpreeCmCommissioner::Tenant'
5
- end
6
- end
7
- end
8
-
9
- Spree::CmsPage.prepend(SpreeCmCommissioner::CmsPageDecorator) unless Spree::CmsPage.included_modules.include?(SpreeCmCommissioner::CmsPageDecorator)
@@ -1,8 +0,0 @@
1
- require_dependency 'spree_cm_commissioner'
2
-
3
- module SpreeCmCommissioner
4
- class TaxonOptionType < ApplicationRecord
5
- belongs_to :taxon, class_name: 'Spree::Taxon', dependent: :destroy
6
- belongs_to :option_type, class_name: 'Spree::OptionType', dependent: :destroy
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- require_dependency 'spree_cm_commissioner'
2
-
3
- module SpreeCmCommissioner
4
- class TaxonOptionValue < ApplicationRecord
5
- belongs_to :taxon, class_name: 'Spree::Taxon', dependent: :destroy
6
- belongs_to :option_value, class_name: 'Spree::OptionValue', dependent: :destroy
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- <!-- insert_before "erb[loud]:contains('f.field_container :title')" -->
2
-
3
- <%= f.field_container :tenant_id, class: ['col-12'] do %>
4
- <%= f.label :tenant_id, raw(Spree.t(:tenant) + ' (optional)') %>
5
- <%= f.collection_select :tenant_id, SpreeCmCommissioner::Tenant.all, :id, :name, { prompt: Spree.t('select_tenant') }, { class: 'form-control select2' } %>
6
- <%= f.error_message_on :tenant_id %>
7
- <% end %>
@@ -1,21 +0,0 @@
1
- <!-- insert_before "erb[silent]:contains('content_for :page_actions')" -->
2
-
3
- <%= render partial: 'spree/admin/shared/cms_pages_tabs' %>
4
-
5
- <% if params[:tab] == 'default' %>
6
- <div class="alert alert-info mb-3">
7
- <%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
8
- CMS Pages for the default store. These pages are shared globally and are not tied to any specific tenant.
9
- </div>
10
- <% elsif params[:tab] == 'tenants' && params[:tenant_id].present? %>
11
- <div class="alert alert-info mb-3">
12
- <%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
13
- CMS Pages for the tenant: <strong><%= SpreeCmCommissioner::Tenant.find(params[:tenant_id]).name %></strong>.
14
- These pages are displayed only to users associated with this tenant.
15
- </div>
16
- <% elsif params[:tab] == 'tenants' %>
17
- <div class="alert alert-info mb-3">
18
- <%= svg_icon name: "info-circle.svg", classes: 'mr-2', width: '16', height: '16' %>
19
- CMS Pages for all tenants. These pages are displayed only to users associated with specific tenants.
20
- </div>
21
- <% end %>
@@ -1,54 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VendorStopPlaceQuery
3
- attr_reader :query, :vendor_id, :stop_type, :reference_stop_id
4
-
5
- def initialize(query:, vendor_id:, stop_type: :boarding, reference_stop_id: nil)
6
- @query = query.to_s.strip
7
- @vendor_id = vendor_id
8
- @stop_type = stop_type
9
- @reference_stop_id = reference_stop_id
10
- end
11
-
12
- def call
13
- results = vendor_stops
14
- return [] if results.empty?
15
-
16
- places = results.includes(:stop).map(&:stop).compact.uniq
17
-
18
- format_places(places)
19
- end
20
-
21
- private
22
-
23
- def vendor_stops
24
- scope = base_scope
25
- return scope if query.blank?
26
-
27
- scope = scope.where.not(stop_id: reference_stop_id) if reference_stop_id.present?
28
- scope.where('cm_places.name ILIKE ?', "%#{query}%")
29
- end
30
-
31
- def base_scope
32
- SpreeCmCommissioner::VendorStop
33
- .joins(:stop)
34
- .where(vendor_id: vendor_id)
35
- .where(stop_type: stop_type)
36
- .order(trip_count: :desc)
37
- .where.not(trip_count: 0)
38
- end
39
-
40
- def format_places(places)
41
- places
42
- .sort_by { |p| [-p.depth, -p.lft] }
43
- .filter_map do |place|
44
- next if place.depth.zero?
45
-
46
- {
47
- id: place.id,
48
- parent_id: place.parent_id,
49
- name: place.self_and_ancestors.map(&:name).reverse.join(', ')
50
- }
51
- end
52
- end
53
- end
54
- end
@@ -1,20 +0,0 @@
1
- <% content_for(:page_tabs) do %>
2
- <% if can?(:admin, Spree::CmsPage) %>
3
- <%= content_tag :li, class: 'nav-item' do %>
4
- <%= link_to_with_icon 'building.svg',
5
- Spree::Store.default&.name || Spree.t(:store),
6
- admin_cms_pages_url(tab: :default),
7
- class: "nav-link #{'active' if params[:tab].blank? || params[:tab] == 'default'}" %>
8
- <% end %>
9
-
10
- <!-- Tenant Tabs -->
11
- <% SpreeCmCommissioner::Tenant.all.each do |tenant| %>
12
- <%= content_tag :li, class: 'nav-item' do %>
13
- <%= link_to_with_icon 'building.svg',
14
- tenant.name,
15
- admin_cms_pages_url(tab: :tenants, tenant_id: tenant.id),
16
- class: "nav-link #{'active' if params[:tenant_id].to_s == tenant.id.to_s}" %>
17
- <% end %>
18
- <% end %>
19
- <% end %>
20
- <% end %>
@@ -1,10 +0,0 @@
1
- class AddNestedSetColumnsToPlaces < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_places, :parent_id, :integer if !column_exists?(:cm_places, :parent_id)
4
- add_column :cm_places, :lft, :integer if !column_exists?(:cm_places, :lft)
5
- add_column :cm_places, :rgt, :integer if !column_exists?(:cm_places, :rgt)
6
-
7
- add_column :cm_places, :depth, :integer if !column_exists?(:cm_places, :depth)
8
- add_column :cm_places, :children_count, :integer if !column_exists?(:cm_places, :children_count)
9
- end
10
- end
@@ -1,9 +0,0 @@
1
- class CreateCmTaxonOptionTypes < ActiveRecord::Migration[7.0]
2
- def change
3
- create_table :cm_taxon_option_types do |t|
4
- t.references :taxon, null: false, if_not_exists: true
5
- t.references :option_type, null: false, if_not_exists: true
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class CreateCmTaxonOptionValues < ActiveRecord::Migration[7.0]
2
- def change
3
- create_table :cm_taxon_option_values do |t|
4
- t.references :taxon, null: false, if_not_exists: true
5
- t.references :option_value, null: false, if_not_exists: true
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,5 +0,0 @@
1
- class AddTripCountToCmVendorStops < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :cm_vendor_stops, :trip_count, :integer, default: 0, if_not_exists: true
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- class AddTenantIdToSpreeCmsPages < ActiveRecord::Migration[7.0]
2
- def change
3
- add_column :spree_cms_pages, :tenant_id, :integer, if_not_exists: true
4
- add_index :spree_cms_pages, :tenant_id, if_not_exists: true
5
- end
6
- end
@@ -1,9 +0,0 @@
1
- namespace :spree_cm_commissioner do
2
- desc 'Migrate and Rebuild place hierarchy..'
3
- task migrate_and_rebuild_place_hierarchy: :environment do
4
- puts 'Resetting column information :lft and :rgt columns...'
5
- SpreeCmCommissioner::Place.reset_column_information
6
- SpreeCmCommissioner::Place.rebuild!
7
- puts 'Place hierarchy rebuild completed successfully!'
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- namespace :spree_cm_commissioner do
2
- desc 'Update orphan root places...'
3
- task update_orphan_root_places: :environment do
4
- count = SpreeCmCommissioner::Place.where(parent_id: 0).update_all(parent_id: nil) # rubocop:disable Rails/SkipsModelValidations
5
- puts "#{count} orphan root places updated."
6
- end
7
- end