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

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +48 -26
  3. data/.gitignore +1 -2
  4. data/.vscode/settings.json +1 -1
  5. data/Gemfile.lock +1 -22
  6. data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
  7. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -17
  8. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  9. data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
  11. data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
  12. data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
  13. data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
  14. data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
  15. data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
  16. data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
  17. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
  18. data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
  19. data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
  20. data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
  21. data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
  22. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +2 -2
  23. data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
  24. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -2
  25. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -26
  26. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  27. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
  28. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
  29. data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -1
  30. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
  31. data/app/models/spree_cm_commissioner/place.rb +11 -2
  32. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
  33. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
  34. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  35. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  36. data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
  37. data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
  38. data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
  39. data/app/models/spree_cm_commissioner/trip.rb +0 -11
  40. data/app/models/spree_cm_commissioner/trip_connection.rb +1 -0
  41. data/app/models/spree_cm_commissioner/trip_stop.rb +12 -5
  42. data/app/models/spree_cm_commissioner/variant_decorator.rb +28 -25
  43. data/app/models/spree_cm_commissioner/variant_options.rb +0 -14
  44. data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
  45. data/app/models/spree_cm_commissioner/vendor_decorator.rb +2 -1
  46. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  47. data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +7 -0
  48. data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
  49. data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
  50. data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
  51. data/app/queries/spree_cm_commissioner/trip_query.rb +11 -11
  52. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  53. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  54. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
  55. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  56. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  57. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  58. data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
  59. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
  60. data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
  61. data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
  62. data/app/views/spree/admin/stock_managements/index.html.erb +5 -31
  63. data/config/routes.rb +4 -11
  64. data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
  65. data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +9 -0
  66. data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +9 -0
  67. data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
  68. data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
  69. data/docker-compose.yml +1 -1
  70. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +2 -2
  71. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  72. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  73. data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
  74. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -28
  75. data/lib/spree_cm_commissioner/version.rb +1 -1
  76. data/lib/spree_cm_commissioner.rb +0 -34
  77. data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
  78. data/lib/tasks/update_orphan_root_places.rake +7 -0
  79. data/spree_cm_commissioner.gemspec +0 -5
  80. metadata +22 -69
  81. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  82. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
  83. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
  84. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  85. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -71
  86. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  87. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  88. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  89. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -37
  90. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
  91. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -114
  92. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -42
  93. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
  94. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  95. data/app/models/spree_cm_commissioner/stock_movement_decorator.rb +0 -34
  96. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  97. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -17
  98. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -32
  99. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  100. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  101. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  102. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  103. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  104. data/lib/tasks/generate_inventory_items.rake +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e91babac12da4e1fc7e8083b3cb07936fd5a7b7af45217ef38b2a47fc3bed9ca
4
- data.tar.gz: b5831b6964e0ea47ac4a6c7c2355330c9ed8386c160ec482ab8201100321a0cf
3
+ metadata.gz: 9c251d1cc34649b5f829ebbc62bda4569e1a6358fa05ff26f44f39455de799e6
4
+ data.tar.gz: bee3ddf20b6cfb452f8d17eaa166d3e8f7b31d7d2be1d71160275f40527164e1
5
5
  SHA512:
6
- metadata.gz: 8f229d110a73433c448dece4554dfc99f60e0b9208e5260282b7b48c2f2869a9431700b8f418ba0ed0f00a6369924acf370506dc22234d678c157a4984b6d49d
7
- data.tar.gz: b0913cc8c5bfc42042bd78bc23a3e13050b7cd39e9cbf315ae6f0f99dad38ce3984c1f042d34b95d29688c51ce9c9f67b38c450a857063659f395c297233bb3f
6
+ metadata.gz: 734bb93b3cad9b411ced875bf2d05b23ca837534e630f358e3eb15687d0daed05486e82225fd78505f8a71583127e6cbadac9fb0d3a4e3f0492903e36bf5a2b0
7
+ data.tar.gz: f3b0d288ba9cd62d5d79ee8cae5b514b9d126d29c7563a40b14abf0b5342416940eac9c93a8a7c7aea90eb8c4e4f08f490a2bad22ad82bb86c435c2010686dbd
@@ -3,6 +3,11 @@ name: Commissioner Gem
3
3
 
4
4
  on:
5
5
  pull_request:
6
+ types:
7
+ - opened
8
+ - edited
9
+ - synchronize
10
+ - reopened
6
11
  branches:
7
12
  - develop
8
13
  push:
@@ -14,8 +19,8 @@ jobs:
14
19
 
15
20
  steps:
16
21
  - name: Check PR title format
17
- uses: actions/github-script@v7
18
22
  if: github.event_name == 'pull_request'
23
+ uses: actions/github-script@v7
19
24
  with:
20
25
  script: |
21
26
  const title = context.payload.pull_request.title.trim();
@@ -32,8 +37,8 @@ jobs:
32
37
  console.log("PR title format is correct.");
33
38
  }
34
39
  - name: Check commit messages format
35
- uses: actions/github-script@v7
36
40
  if: github.event_name == 'pull_request'
41
+ uses: actions/github-script@v7
37
42
  with:
38
43
  script: |
39
44
  const pr = context.payload.pull_request;
@@ -64,33 +69,52 @@ jobs:
64
69
  console.log("All commit messages are correctly formatted.");
65
70
  }
66
71
  - name: Check for unresolved review threads
67
- uses: actions/github-script@v7
68
72
  if: github.event_name == 'pull_request'
73
+ uses: actions/github-script@v7
69
74
  with:
70
75
  script: |
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
81
- });
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.");
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
+ }
89
98
  }
90
- } catch (error) {
91
- console.error("Error fetching review comments:", error.message);
92
- core.setFailed("Failed to check for unresolved review threads.");
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
+ }
112
+ });
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.");
93
116
  }
117
+
94
118
  test_and_build_gem:
95
119
  needs: [validate-commits]
96
120
  # if: github.head_ref != '2572-enforce-pr-workflow' || github.base_ref != 'develop'
@@ -133,14 +157,12 @@ jobs:
133
157
  bundle install --jobs 4 --retry 3
134
158
 
135
159
  - name: Quality
136
- if: github.event_name == 'pull_request'
137
160
  env:
138
161
  DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
139
162
  run: |
140
163
  bundle exec rubocop
141
164
 
142
165
  - name: Security
143
- if: github.event_name == 'pull_request'
144
166
  env:
145
167
  DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
146
168
  run: |
data/.gitignore CHANGED
@@ -28,5 +28,4 @@ node_modules
28
28
  # VScode
29
29
  .vscode
30
30
  !.vscode/.settings.json
31
- .env
32
- vendor/bundle/
31
+ .env
@@ -3,6 +3,6 @@
3
3
  "files.trimTrailingWhitespace": true,
4
4
  "editor.formatOnSave": true,
5
5
  "[yaml]": {
6
- "editor.defaultFormatter": "aaron-bond.better-comments"
6
+ "editor.defaultFormatter": "redhat.vscode-yaml"
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.pre1)
37
+ spree_cm_commissioner (1.10.0.pre.hotfix.pre.sms)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -42,7 +42,6 @@ PATH
42
42
  aws-sdk-s3
43
43
  blazer (~> 3.0.4)
44
44
  byebug
45
- connection_pool
46
45
  counter_culture (~> 3.2)
47
46
  dry-validation (~> 1.10)
48
47
  elasticsearch (~> 8.5)
@@ -58,8 +57,6 @@ PATH
58
57
  phonelib
59
58
  premailer-rails
60
59
  rails (~> 7.0.4)
61
- redis
62
- redis-rails
63
60
  rqrcode (~> 2.0)
64
61
  searchkick (~> 5.1)
65
62
  simple_calendar (~> 2.4)
@@ -620,8 +617,6 @@ GEM
620
617
  activesupport (>= 2.3.14)
621
618
  racc (1.7.1)
622
619
  rack (2.2.8)
623
- rack-session (1.0.2)
624
- rack (< 3)
625
620
  rack-test (2.1.0)
626
621
  rack (>= 1.3)
627
622
  rails (7.0.8)
@@ -665,24 +660,8 @@ GEM
665
660
  rbtree (0.4.6)
666
661
  redis (5.0.7)
667
662
  redis-client (>= 0.9.0)
668
- redis-actionpack (5.5.0)
669
- actionpack (>= 5)
670
- redis-rack (>= 2.1.0, < 4)
671
- redis-store (>= 1.1.0, < 2)
672
- redis-activesupport (5.3.0)
673
- activesupport (>= 3, < 8)
674
- redis-store (>= 1.3, < 2)
675
663
  redis-client (0.17.0)
676
664
  connection_pool
677
- redis-rack (3.0.0)
678
- rack-session (>= 0.2.0)
679
- redis-store (>= 1.2, < 2)
680
- redis-rails (5.0.2)
681
- redis-actionpack (>= 5.0, < 6)
682
- redis-activesupport (>= 5.0, < 6)
683
- redis-store (>= 1.2, < 2)
684
- redis-store (1.11.0)
685
- redis (>= 4, < 6)
686
665
  regexp_parser (2.8.2)
687
666
  representable (3.2.0)
688
667
  declarative (< 0.1.0)
@@ -0,0 +1,32 @@
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
@@ -12,25 +12,9 @@ module Spree
12
12
  def index
13
13
  @variants = @product.variants.includes(:images, stock_items: :stock_location, option_values: :option_type)
14
14
  @variants = [@product.master] if @variants.empty?
15
- @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
16
-
17
- load_inventories unless @product.permanent_stock?
18
- end
19
-
20
- def calendar
21
- @year = params[:year].present? ? params[:year].to_i : Time.zone.today.year
22
15
 
23
- from_date = Date.new(@year, 1, 1).beginning_of_year
24
- to_date = Date.new(@year, 1, 1).end_of_year
25
-
26
- @inventory_items = @product.inventory_items.includes(:variant).where(inventory_date: from_date..to_date).to_a
27
- @events = SpreeCmCommissioner::CalendarEvent.from_inventory_items(@inventory_items)
28
- end
29
-
30
- private
16
+ @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
31
17
 
32
- def load_inventories
33
- @inventory_items = @product.inventory_items.group_by { |item| item.variant.id }
34
18
  @reserved_stocks = Spree::LineItem
35
19
  .complete
36
20
  .where(variant_id: @variants.pluck(:id))
@@ -5,38 +5,55 @@ module Spree
5
5
  class AccommodationsController < ::Spree::Api::V2::ResourceController
6
6
  private
7
7
 
8
- # override
9
8
  def collection
10
- @collection ||= SpreeCmCommissioner::Accommodations::Find.new(
11
- from_date: params[:from_date]&.to_date,
12
- to_date: params[:to_date]&.to_date,
13
- state_id: params[:state_id],
14
- number_of_adults: params[:number_of_adults].to_i,
15
- number_of_kids: params[:number_of_kids].to_i
16
- ).execute
9
+ @collection ||= collection_finder.call(params: params).value
10
+ end
11
+
12
+ def paginated_collection
13
+ return @paginated_collection if defined?(@paginated_collection)
14
+
15
+ @paginated_collection = super
16
+ @paginated_collection = apply_service_availability(@paginated_collection)
17
17
  end
18
18
 
19
- # override
20
19
  def resource
21
- @resource ||= collection.find(params[:id])
20
+ resource = resource_finder.call(params: params).value
21
+ raise ActiveRecord::RecordNotFound if resource.nil?
22
+
23
+ apply_service_availability(resource)
24
+ end
25
+
26
+ def apply_service_availability(resource)
27
+ SpreeCmCommissioner::ApplyServiceAvailability.call(calendarable: resource,
28
+ from_date: params[:from_date].to_date,
29
+ to_date: params[:to_date].to_date
30
+ ).value
22
31
  end
23
32
 
24
- # override
25
33
  def allowed_sort_attributes
26
34
  super << :min_price << :max_price
27
35
  end
28
36
 
29
- # override
37
+ def model_class
38
+ Spree::Vendor
39
+ end
40
+
30
41
  def resource_serializer
31
42
  Spree::V2::Storefront::AccommodationSerializer
32
43
  end
33
44
 
34
- # override
35
45
  def collection_serializer
36
46
  Spree::V2::Storefront::AccommodationSerializer
37
47
  end
38
48
 
39
- # override
49
+ def collection_finder
50
+ SpreeCmCommissioner::AccommodationSearchDetail
51
+ end
52
+
53
+ def resource_finder
54
+ SpreeCmCommissioner::AccommodationSearchDetail
55
+ end
56
+
40
57
  def required_schema
41
58
  SpreeCmCommissioner::AccommodationRequestSchema
42
59
  end
@@ -14,7 +14,7 @@ module Spree
14
14
  end
15
15
 
16
16
  def filter_params
17
- params.permit(:login, :locale, :format)
17
+ params.permit(:login, :locale, :format).merge(tenant_id: MultiTenant.current_tenant_id)
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))
7
+ context = SpreeCmCommissioner::AccountRecover.call(**filter_params.slice(:id_token, :login, :password, :tenant_id))
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)
18
+ params.permit(:id_token, :login, :password).merge(tenant_id: MultiTenant.current_tenant_id)
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,41 @@
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
@@ -26,7 +26,7 @@ module Spree
26
26
  :pin_code_token,
27
27
  :password,
28
28
  :password_confirmation
29
- )
29
+ ).merge(tenant_id: MultiTenant.current_tenant_id)
30
30
  end
31
31
  end
32
32
  end
@@ -0,0 +1,18 @@
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,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class AccountRecover < BaseInteractor
3
- delegate :id_token, :login, :password, to: :context
3
+ delegate :id_token, :login, :password, :tenant_id, 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)
18
+ context.user = Spree.user_class.find_user_by_login(login, tenant_id)
19
19
  # get social user
20
20
  elsif id_token.present?
21
21
  checker_context = SpreeCmCommissioner::UserIdTokenChecker.call(id_token: id_token)
@@ -10,6 +10,8 @@ module SpreeCmCommissioner
10
10
  assign_prototype
11
11
  create_child_taxon
12
12
  build_home_banner
13
+ assign_option_types
14
+ assign_option_values
13
15
  end
14
16
  end
15
17
 
@@ -61,5 +63,26 @@ module SpreeCmCommissioner
61
63
 
62
64
  context.fail!(message: 'Home banner upload failed') unless banner.persisted?
63
65
  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
64
87
  end
65
88
  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) if context.login.present?
6
+ user = Spree.user_class.find_user_by_login(context.login, context.tenant_id) 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,5 +1,7 @@
1
1
  module SpreeCmCommissioner
2
2
  class PinCodeSender < BaseInteractor
3
+ include SpreeCmCommissioner::PinCodeSenderHelper
4
+
3
5
  def call
4
6
  context.fail!(message: I18n.t('pincode_sender.pincode.blank')) if context.pin_code.nil?
5
7
 
@@ -15,10 +17,8 @@ module SpreeCmCommissioner
15
17
  private
16
18
 
17
19
  def send_sms
18
- from = context.tenant || Spree::Store.default
19
-
20
20
  options = {
21
- from: from,
21
+ from: sender_name(context.tenant),
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,6 +11,8 @@ 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)
14
16
  end
15
17
  end
16
18
 
@@ -57,5 +59,17 @@ module SpreeCmCommissioner
57
59
  result = SpreeCmCommissioner::InternationalMobileFormatter.call(phone_number: number)
58
60
  result.formatted_phone_number
59
61
  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
60
74
  end
61
75
  end
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class TelegramDebugPinCodeSender < BaseInteractor
3
- delegate :pin_code, :name, to: :context
3
+ delegate :pin_code, :name, :error_message, to: :context
4
4
 
5
5
  def call
6
6
  telegram_client.send_message(
@@ -16,6 +16,7 @@ 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?
19
20
 
20
21
  text.compact.join("\n")
21
22
  end
@@ -1,6 +1,7 @@
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
4
5
 
5
6
  def call
6
7
  find_user_by_login!
@@ -19,7 +20,7 @@ module SpreeCmCommissioner
19
20
  def find_user_by_login!
20
21
  login = phone_number || email
21
22
 
22
- context.user = Spree.user_class.find_user_by_login(login)
23
+ context.user = Spree.user_class.find_user_by_login(login, tenant_id)
23
24
  context.fail!(message: I18n.t('account_checker.verify.not_exist', login: login)) if context.user.blank?
24
25
  end
25
26
 
@@ -1,13 +1,15 @@
1
1
  module SpreeCmCommissioner
2
2
  class UserPasswordAuthenticator < BaseInteractor
3
- delegate :login, :password, to: :context
3
+ delegate :login, :password, :tenant_id, to: :context
4
4
 
5
5
  def call
6
- context.user = Spree.user_class.find_user_by_login(login)
6
+ context.user = Spree.user_class.find_user_by_login(login, tenant_id)
7
7
  context.fail!(message: I18n.t('authenticator.incorrect_login')) if context.user.nil?
8
+
8
9
  if spree_confirmable? && active_for_authentication? && !validate_password(user)
9
10
  context.fail!(message: I18n.t('authenticator.incorrect_password'))
10
11
  end
12
+
11
13
  context.fail!(message: I18n.t('authenticator.incorrect_password')) unless validate_password(context.user)
12
14
  context.fail!(message: 'account_temporarily_deleted') if context.user.soft_deleted?
13
15
  end
@@ -53,7 +53,7 @@ module SpreeCmCommissioner
53
53
  user_data = context.user_data
54
54
 
55
55
  identity = SpreeCmCommissioner::UserIdentityProvider.vattanac_bank
56
- .find_or_initialize_by(sub: user_data['id'])
56
+ .find_or_initialize_by(sub: user_data['phoneNum'])
57
57
 
58
58
  if identity.persisted?
59
59
  context.user = identity.user
@@ -78,7 +78,7 @@ module SpreeCmCommissioner
78
78
  identity = context.identity
79
79
 
80
80
  identity.name = full_name
81
-
81
+ identity.email = user_data['email']
82
82
  context.user = Spree::User.new(
83
83
  first_name: user_data['firstName'],
84
84
  last_name: user_data['lastName'],
@@ -5,12 +5,14 @@ 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]
8
9
 
9
10
  name = sender_name(tenant)
10
11
 
11
12
  SpreeCmCommissioner::TelegramDebugPinCodeSender.call(
12
13
  pin_code: pin_code,
13
- name: name
14
+ name: name,
15
+ error_message: error_message
14
16
  )
15
17
  end
16
18
  end
@@ -20,6 +20,7 @@ module SpreeCmCommissioner
20
20
  vehicle_id
21
21
  origin
22
22
  destination
23
+ place_id
23
24
  ].freeze
24
25
 
25
26
  RESERVED_OPTIONS = {
@@ -47,8 +48,8 @@ module SpreeCmCommissioner
47
48
  'bib-display-prefix' => 'boolean',
48
49
  'bib-pre-generation-on-create' => 'boolean',
49
50
  'seat-number-positions' => 'array',
50
- 'origin' => 'origin',
51
- 'destination' => 'destination',
51
+ 'origin' => 'place_id',
52
+ 'destination' => 'place_id',
52
53
  'departure-time' => 'time',
53
54
  'vehicle' => 'vehicle_id',
54
55
  'allow-seat-selection' => 'boolean'