spree_cm_commissioner 2.5.13.pre.patch4 → 2.5.13.pre.pre.pre.1

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +0 -10
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +1 -1
  5. data/app/controllers/spree/admin/classifications_controller.rb +3 -11
  6. data/app/controllers/spree/admin/exports_controller.rb +1 -7
  7. data/app/controllers/spree/admin/import_existing_orders_controller.rb +1 -3
  8. data/app/controllers/spree/admin/import_new_orders_controller.rb +1 -3
  9. data/app/controllers/spree/admin/inventory_items_controller.rb +3 -3
  10. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -5
  11. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -6
  12. data/app/controllers/spree/admin/vendor_service_calendars_controller.rb +68 -7
  13. data/app/controllers/spree/api/v2/operator/check_ins_controller.rb +2 -15
  14. data/app/controllers/spree/api/v2/operator/guest_json_gzips_controller.rb +4 -27
  15. data/app/controllers/spree/api/v2/operator/guests_controller.rb +0 -6
  16. data/app/controllers/spree/api/v2/operator/recalculate_tickets_controller.rb +9 -4
  17. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +63 -0
  18. data/app/controllers/spree/api/v2/tenant/guests_controller.rb +0 -8
  19. data/app/controllers/spree_cm_commissioner/orders_controller.rb +2 -14
  20. data/app/helpers/spree/base_helper_decorator.rb +1 -1
  21. data/app/helpers/spree_cm_commissioner/admin/service_calendars_helper.rb +1 -8
  22. data/app/interactors/spree_cm_commissioner/conversion_pre_calculator.rb +64 -0
  23. data/app/interactors/spree_cm_commissioner/enqueue_cart/add_item.rb +43 -0
  24. data/app/interactors/spree_cm_commissioner/enqueue_cart/add_item_status_marker.rb +66 -0
  25. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +1 -11
  26. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +3 -7
  27. data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +138 -0
  28. data/app/jobs/spree_cm_commissioner/conversion_pre_calculator_job.rb +12 -0
  29. data/app/jobs/spree_cm_commissioner/enqueue_cart/add_item_job.rb +17 -0
  30. data/app/jobs/spree_cm_commissioner/import_order_job.rb +2 -2
  31. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +11 -16
  32. data/app/models/spree_cm_commissioner/export.rb +1 -12
  33. data/app/models/spree_cm_commissioner/exports/operator_guest_json_gzip.rb +38 -141
  34. data/app/models/spree_cm_commissioner/inventory_item.rb +3 -5
  35. data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -4
  36. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -8
  37. data/app/models/spree_cm_commissioner/pricing_model.rb +1 -1
  38. data/app/models/spree_cm_commissioner/product_decorator.rb +2 -5
  39. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -1
  40. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +6 -20
  41. data/app/serializables/spree_cm_commissioner/queue_item.rb +13 -0
  42. data/app/serializers/spree/v2/storefront/cart_serializer_decorator.rb +23 -0
  43. data/app/serializers/spree/v2/storefront/firestore_queue_serializer.rb +9 -0
  44. data/app/serializers/spree/v2/tenant/cart_serializer.rb +0 -4
  45. data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -1
  46. data/app/serializers/spree_cm_commissioner/v2/operator/export_serializer.rb +0 -2
  47. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +4 -10
  48. data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +2 -13
  49. data/app/services/spree_cm_commissioner/imports/base_import_order_service.rb +55 -0
  50. data/app/services/spree_cm_commissioner/imports/create_order_service.rb +99 -0
  51. data/app/services/spree_cm_commissioner/imports/update_order_service.rb +41 -0
  52. data/app/services/spree_cm_commissioner/integrations/base/sync_result.rb +1 -23
  53. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_matches.rb +2 -2
  54. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_zones.rb +8 -18
  55. data/app/services/spree_cm_commissioner/operator_guest_json_gzips/create.rb +10 -16
  56. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +0 -36
  57. data/app/services/spree_cm_commissioner/pricing_models/update_with_rule_groups.rb +6 -1
  58. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -2
  59. data/app/views/spree/admin/exports/_form.html.erb +7 -1
  60. data/app/views/spree/admin/exports/index.html.erb +4 -4
  61. data/app/views/spree/admin/homepage_background/index.html.erb +0 -1
  62. data/app/views/spree/admin/stock_managements/index.html.erb +1 -1
  63. data/app/views/spree/admin/taxon_childrens/index.html.erb +0 -4
  64. data/app/views/spree/admin/{shared/service_calendars → vendor_service_calendars}/_form.html.erb +1 -1
  65. data/app/views/spree/admin/vendor_service_calendars/new.html.erb +2 -2
  66. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +0 -15
  67. data/config/locales/en.yml +0 -7
  68. data/config/routes.rb +5 -12
  69. data/lib/spree_cm_commissioner/cached_inventory_item.rb +7 -8
  70. data/lib/spree_cm_commissioner/transit/trip_form.rb +0 -1
  71. data/lib/spree_cm_commissioner/version.rb +1 -1
  72. metadata +17 -34
  73. data/app/controllers/concerns/spree/admin/service_calendars_concern.rb +0 -93
  74. data/app/controllers/spree/admin/inventory_monitorings_controller.rb +0 -39
  75. data/app/controllers/spree/admin/product_service_calendars_controller.rb +0 -48
  76. data/app/finders/spree_cm_commissioner/inventory_items/recently_changed_finder.rb +0 -88
  77. data/app/jobs/spree_cm_commissioner/maintenance_tasks/orchestrate_job.rb +0 -28
  78. data/app/jobs/spree_cm_commissioner/maintenance_tasks/process_job.rb +0 -18
  79. data/app/models/concerns/spree_cm_commissioner/product_relation_type.rb +0 -29
  80. data/app/models/spree_cm_commissioner/maintenance_task.rb +0 -62
  81. data/app/models/spree_cm_commissioner/maintenance_tasks/event.rb +0 -61
  82. data/app/models/spree_cm_commissioner/product_relation.rb +0 -23
  83. data/app/overrides/spree/admin/shared/_product_tabs/service_calendars.html.erb.deface +0 -8
  84. data/app/overrides/spree/admin/shared/sub_menu/_stock/inventory_monitorings_tab.html.erb.deface +0 -3
  85. data/app/serializers/spree/api/v2/platform/create_guest_adjustment_serializer.rb +0 -10
  86. data/app/serializers/spree/api/v2/platform/create_line_item_adjustment_serializer.rb +0 -10
  87. data/app/serializers/spree/api/v2/platform/create_route_adjustment_serializer.rb +0 -10
  88. data/app/serializers/spree/api/v2/platform/pricing_action_serializer.rb +0 -15
  89. data/app/serializers/spree_cm_commissioner/v2/storefront/cart_serializer_decorator.rb +0 -39
  90. data/app/services/spree_cm_commissioner/imports/orders/base.rb +0 -67
  91. data/app/services/spree_cm_commissioner/imports/orders/create.rb +0 -135
  92. data/app/services/spree_cm_commissioner/imports/orders/update.rb +0 -77
  93. data/app/services/spree_cm_commissioner/trips/clone.rb +0 -195
  94. data/app/views/spree/admin/exports/show.html.erb +0 -132
  95. data/app/views/spree/admin/inventory_monitorings/index.html.erb +0 -119
  96. data/app/views/spree/admin/product_service_calendars/index.html.erb +0 -70
  97. data/app/views/spree/admin/product_service_calendars/new.html.erb +0 -9
  98. data/db/migrate/20260202095500_create_cm_product_relations.rb +0 -32
  99. data/db/migrate/20260207100000_add_index_created_at_to_cm_imports.rb +0 -5
  100. data/db/migrate/20260217162827_add_index_to_cm_guests_on_event_id_and_bib_prefix_and_bib_number.rb +0 -8
  101. data/db/migrate/20260218100000_create_cm_maintenance_tasks.rb +0 -23
  102. data/lib/spree_cm_commissioner/test_helper/factories/product_relation_factory.rb +0 -9
  103. /data/app/views/spree/admin/{shared/service_calendars → vendor_service_calendars}/_exception_rules.html.erb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0490748ea10626aebe6ebe48862a792f00c14ccc994923a20a8c47cd3b69c868'
4
- data.tar.gz: 01655e182fa6a3b2fef4a7d86464cc3e70ef3d11676a5671a27242552a8ebc4c
3
+ metadata.gz: 2c40684e0f70119578189d382a9276fb63cec8fa0883962e1958e8d43f2f2524
4
+ data.tar.gz: 5912fd46420192f4b0e0165714f877bd27bac0cefdd9442f94d11bbd11d70f37
5
5
  SHA512:
6
- metadata.gz: c01ab4f2d158ab227147086d2da8689b7a5c10504760c5ffe2865ad8ad7382f5d45a4b3f60599afcf68c0b8a131621248f521a5a7b24c3b24ed600c15aad79b8
7
- data.tar.gz: 60493b89228813004a8ec359ce05d5ad184e85361d44a2e252982913a360e4984f8c073c6efdb413075ccdb242709a6ba240865d1165a0df2f3173a12eb2c2f2
6
+ metadata.gz: d70eb4325cf0ba929be7823f03e6fb879c900c3351cb3733b2d2065bd540a695ab529f3c200a64db14a3dc53850eff7bf6f71e40f4f8af84a365c22decb1296c
7
+ data.tar.gz: ea2ef001e5d54b7ce416afbcfb796dc90c7c5a6283291bef20bbcca6a08f9351769325015f87d3b6507aeeebf3a875d24d37d3128c1078437c3a47956f7cc7ce
data/.env.example CHANGED
@@ -40,13 +40,3 @@ CACHE_SEMI_STATIC_MAX_AGE=3600 # Semi-static content (menus, homepage background
40
40
  CACHE_MODERATE_MAX_AGE=1800 # Moderate freshness (products, events, vendors) - 30 minutes
41
41
  CACHE_REALTIME_MAX_AGE=300 # High freshness (trips, trip search) - 5 minutes
42
42
  CACHE_DEFAULT_MAX_AGE=300 # Default for unlisted controllers - 5 minutes
43
-
44
- # Batch size for processing maintenance tasks in app/jobs/spree_cm_commissioner/maintenance_tasks/orchestrate_job.rb
45
- MAINTENANCE_TASKS_BATCH_SIZE=100
46
-
47
- # Export related:
48
- OPERATOR_GUEST_JSON_GZIP_CACHE_HOURS=24
49
- EXPORT_PRESIGNED_URL_EXPIRATION_MINUTES=15
50
-
51
- # import order batch size
52
- IMPORT_ORDERS_BATCH_SIZE=50
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.5.13.pre.patch4)
37
+ spree_cm_commissioner (2.5.13.pre.pre.pre.1)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -64,7 +64,7 @@ module SpreeCmCommissioner
64
64
  elsif HIGH_FRESHNESS_CONTROLLERS.include?(controller_name)
65
65
  ENV.fetch('CACHE_REALTIME_MAX_AGE', 5.minutes.to_i).to_i
66
66
  else
67
- ENV.fetch('CACHE_DEFAULT_MAX_AGE', 0.minutes.to_i).to_i
67
+ ENV.fetch('CACHE_DEFAULT_MAX_AGE', 5.minutes.to_i).to_i
68
68
  end
69
69
  end
70
70
 
@@ -4,19 +4,11 @@ module Spree
4
4
  before_action :load_taxon_and_products
5
5
 
6
6
  def recalculate_conversions
7
- if @taxon.parent.event?
8
- SpreeCmCommissioner::MaintenanceTasks::Event.pending.find_or_create_by(
9
- maintainable_type: 'Spree::Taxon',
10
- maintainable_id: @taxon.parent.id
11
- ) do |task|
12
- task.manually_triggered = true
13
- end.async_execute
14
-
15
- flash[:success] = flash_message_for(@taxon, :successfully_updated)
16
- else
17
- flash[:error] = 'Conversion recalculation can only be performed for taxons under an event.' # rubocop:disable Rails/I18nLocaleTexts
7
+ @taxon.products.each do |product|
8
+ SpreeCmCommissioner::ConversionPreCalculatorJob.perform_later(product_id: product.id)
18
9
  end
19
10
 
11
+ flash[:success] = flash_message_for(@taxon, :successfully_updated)
20
12
  redirect_to collection_url
21
13
  end
22
14
 
@@ -1,9 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ExportsController < Spree::Admin::ResourceController
4
- include ActiveStorage::SetCurrent
5
-
6
- before_action :load_export, only: %i[show destroy]
4
+ before_action :load_export, only: [:destroy]
7
5
 
8
6
  def index
9
7
  @exports = SpreeCmCommissioner::Export
@@ -12,10 +10,6 @@ module Spree
12
10
  .per(params[:per_page] || 25)
13
11
  end
14
12
 
15
- def show
16
- # @export is loaded by before_action
17
- end
18
-
19
13
  def new
20
14
  @export = SpreeCmCommissioner::Export.new
21
15
  end
@@ -3,9 +3,7 @@ module Spree
3
3
  class ImportExistingOrdersController < BaseImportOrdersController
4
4
  # override
5
5
  def collection
6
- @collection ||= model_class.existing_order
7
- .order(created_at: :desc)
8
- .page(params[:page])
6
+ @collection ||= model_class.existing_order.page(params[:page])
9
7
  .per(params[:per_page])
10
8
  end
11
9
 
@@ -3,9 +3,7 @@ module Spree
3
3
  class ImportNewOrdersController < BaseImportOrdersController
4
4
  # override
5
5
  def collection
6
- @collection ||= model_class.new_order
7
- .order(created_at: :desc)
8
- .page(params[:page])
6
+ @collection ||= model_class.new_order.page(params[:page])
9
7
  .per(params[:per_page])
10
8
  end
11
9
 
@@ -42,8 +42,8 @@ module Spree
42
42
  inventory_items = @product.inventory_items.where(id: inventory_item_ids)
43
43
  target_quantity = params[:quantity].to_i
44
44
 
45
- if target_quantity.negative?
46
- flash[:error] = "Target quantity (#{target_quantity}) must not be negative"
45
+ if target_quantity.zero?
46
+ flash[:error] = "Target quantity (#{target_quantity}) must be greater than zero"
47
47
  return redirect_back(fallback_location: admin_product_stock_managements_path(@product))
48
48
  end
49
49
 
@@ -52,7 +52,7 @@ module Spree
52
52
  quantity_change = target_quantity - inventory_item.quantity_available
53
53
 
54
54
  # Use adjust_quantity! to update max_capacity, quantity_available, and sync to Redis
55
- inventory_item.adjust_quantity!(quantity_change)
55
+ inventory_item.adjust_quantity!(quantity_change) if quantity_change != 0
56
56
  end
57
57
 
58
58
  flash[:success] = "Successfully updated stocks for #{inventory_items.count} items"
@@ -14,11 +14,7 @@ module Spree
14
14
  def index
15
15
  @variants = @product.variants.includes(:images, :default_price, stock_items: :stock_location, option_values: :option_type)
16
16
  @variants = [@product.master] if @variants.empty?
17
-
18
- vendor_stock_locations = @product.vendor&.stock_locations || []
19
- variant_stock_locations = @variants.flat_map(&:stock_locations).uniq
20
-
21
- @stock_locations = (variant_stock_locations + vendor_stock_locations).uniq
17
+ @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
22
18
 
23
19
  load_inventories unless @product.permanent_stock?
24
20
  end
@@ -5,12 +5,6 @@ module Spree
5
5
  base.before_action :build_assets, only: %i[create update]
6
6
  end
7
7
 
8
- # override
9
- def new
10
- @taxon.parent_id = params[:parent_id] if params[:parent_id].present?
11
- super
12
- end
13
-
14
8
  def remove_category_icon
15
9
  remove_asset(@taxon.category_icon)
16
10
  end
@@ -1,31 +1,92 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class VendorServiceCalendarsController < Spree::Admin::ResourceController
4
- include Spree::Admin::ServiceCalendarsConcern
5
-
6
4
  before_action :load_vendor
5
+ new_action.before :set_exception_rules
6
+
7
+ create.before :set_vendor
8
+ update.before :set_vendor
9
+
10
+ helper 'spree_cm_commissioner/admin/service_calendars'
7
11
 
8
- create.before :set_calendarable
9
- update.before :set_calendarable
12
+ def update_status
13
+ if @object.update(active: !@object.active)
14
+ flash[:success] = flash_message_for(@object, :successfully_updated)
15
+ else
16
+ flash[:error] = @object.errors.full_messages.to_sentence
17
+ end
18
+
19
+ redirect_to admin_vendor_vendor_service_calendars_url
20
+ rescue ActiveRecord::RecordInvalid => e
21
+ flash[:error] = e.message
22
+ redirect_to admin_vendor_vendor_service_calendars_url
23
+ end
10
24
 
11
25
  protected
12
26
 
27
+ def model_class
28
+ SpreeCmCommissioner::ServiceCalendar
29
+ end
30
+
31
+ def object_name
32
+ 'spree_cm_commissioner_service_calendars'
33
+ end
34
+
13
35
  def collection_url(options = {})
14
36
  admin_vendor_vendor_service_calendars_url(options)
15
37
  end
16
38
 
39
+ def permitted_resource_params
40
+ service_calendar_params = params.require(:spree_cm_commissioner_service_calendar)
41
+ .permit(:calendarable_id, :calendarable_type, :start_date, :end_date,
42
+ :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday
43
+ )
44
+ service_calendar_params[:exception_rules] = build_exception_rules(params[:spree_cm_commissioner_service_calendar][:exception_rules])
45
+ service_calendar_params
46
+ end
47
+
17
48
  private
18
49
 
19
50
  def load_vendor
20
51
  @vendor ||= (Spree::Vendor.find_by(slug: params[:vendor_id]) || Spree::Vendor.find_by(id: params[:vendor_id]))
21
52
  end
22
53
 
23
- def load_calendarable
54
+ def set_vendor
55
+ @object.calendarable_type = calendarable_type
56
+ @object.calendarable_id = calendarable_id
57
+ end
58
+
59
+ def build_exception_rules(exception_rules)
60
+ exception_rules.values.reject! { |rule| rule['from'].blank? || rule['to'].blank? || rule['type'].blank? } || exception_rules.values
61
+ end
62
+
63
+ def collection
24
64
  load_vendor
65
+
66
+ @objects = model_class.where(
67
+ calendarable_type: calendarable_type,
68
+ calendarable_id: calendarable_id
69
+ ).order(id: :desc)
70
+ end
71
+
72
+ def set_exception_rules
73
+ @exception_rules = [{ from: DateTime.now, to: DateTime.now, type: 'exclusion', reason: nil }]
74
+ end
75
+
76
+ # it load before :load_vendor
77
+ def build_resource
78
+ today = Time.zone.today
79
+ model_class.new(start_date: today, end_date: today.next_year(3),
80
+ exception_rules: [{ from: nil, to: nil, type: 'inclusion' }]
81
+ )
82
+ end
83
+
84
+ def calendarable_id
85
+ @vendor.id
25
86
  end
26
87
 
27
- def calendarable
28
- @vendor
88
+ def calendarable_type
89
+ @vendor.class.name
29
90
  end
30
91
  end
31
92
  end
@@ -5,23 +5,10 @@ module Spree
5
5
  class CheckInsController < ::Spree::Api::V2::ResourceController
6
6
  before_action :require_spree_current_user, only: %i[index create]
7
7
 
8
- # Check-in history data requires fresh/recent data for operator dashboards
9
- # Short cache duration ensures operators see near real-time check-in activity
10
- CACHE_EXPIRES_IN = 1.minute
11
-
12
8
  def collection
13
- @collection ||= SpreeCmCommissioner::CheckIn
14
- .where(checkinable_type: 'Spree::Taxon', checkinable_id: params[:taxon_id])
15
- .page(params[:page])
16
- .per(params[:per_page])
17
- end
9
+ @collection = SpreeCmCommissioner::CheckIn.where(checkinable: params[:taxon_id])
18
10
 
19
- # override
20
- def collection_cache_opts
21
- {
22
- namespace: Spree::Api::Config[:api_v2_collection_cache_namespace],
23
- expires_in: CACHE_EXPIRES_IN
24
- }
11
+ @collection = @collection.page(params[:page]).per(params[:per_page])
25
12
  end
26
13
 
27
14
  def create
@@ -3,22 +3,12 @@ module Spree
3
3
  module V2
4
4
  module Operator
5
5
  class GuestJsonGzipsController < ::Spree::Api::V2::ResourceController
6
- include ActiveStorage::SetCurrent
7
-
8
6
  before_action :require_spree_current_user
9
- before_action :require_event_user
10
-
11
- # Override index to disable server-side caching.
12
- # We always want to show the latest exports and their download status.
13
- # The app will cache files on its side to avoid unnecessary server requests once files are ready.
14
- def index
15
- render_serialized_payload do
16
- serialize_collection(paginated_collection)
17
- end
18
- end
19
7
 
20
8
  # POST /api/v2/operator/guest_json_gzips
21
9
  # - taxon_id=1
10
+ # - resource_includes[]=[check_ins,check_ins.check_in_by]
11
+ # - force_create=true (optional, to bypass recent export check)
22
12
  def create
23
13
  spree_authorize! :create, SpreeCmCommissioner::Exports::OperatorGuestJsonGzip
24
14
 
@@ -26,17 +16,8 @@ module Spree
26
16
 
27
17
  result = SpreeCmCommissioner::OperatorGuestJsonGzips::Create.call(
28
18
  exportable: exportable,
29
- force_create: false,
30
- options: {
31
- created_by_id: spree_current_user.id.to_s,
32
- created_by_login: spree_current_user.login,
33
- ip_address: request.remote_ip,
34
- user_agent: request.user_agent,
35
- request_id: request.request_id,
36
- client_version: request.headers['X-Cm-App-Version'],
37
- client_os: request.headers['X-Cm-OperatingSystem'],
38
- client_platform: request.headers['X-Cm-App-Platform']
39
- }
19
+ resource_includes: params[:resource_includes] || [],
20
+ force_create: params[:force_create] == 'true'
40
21
  )
41
22
 
42
23
  if result.success?
@@ -48,10 +29,6 @@ module Spree
48
29
  end
49
30
  end
50
31
 
51
- def require_event_user
52
- raise CanCan::AccessDenied unless spree_current_user.events.exists?(id: params[:taxon_id])
53
- end
54
-
55
32
  # override
56
33
  def scope
57
34
  SpreeCmCommissioner::Exports::OperatorGuestJsonGzip.where(
@@ -15,12 +15,6 @@ module Spree
15
15
  SpreeCmCommissioner::GuestSearcherQuery.new(params).call
16
16
  end
17
17
 
18
- # override
19
- # use same includes as export for consistent response.
20
- def resource_includes
21
- SpreeCmCommissioner::Exports::OperatorGuestJsonGzip::RESOURCE_INCLUDES
22
- end
23
-
24
18
  private
25
19
 
26
20
  def model_class
@@ -7,9 +7,13 @@ module Spree
7
7
  before_action :load_taxon, only: :create
8
8
 
9
9
  def create
10
- SpreeCmCommissioner::MaintenanceTasks::Event.pending.find_or_create_by(
11
- maintainable: @taxon
12
- ).async_execute
10
+ classification_ids = Spree::Classification.joins(:taxon)
11
+ .where(spree_taxons: { id: @taxons.pluck(:id) })
12
+ .pluck(:id)
13
+
14
+ classification_ids.each do |classification_id|
15
+ SpreeCmCommissioner::ConversionPreCalculator.call(product_taxon: Spree::Classification.find(classification_id))
16
+ end
13
17
 
14
18
  render json: { message: 'Conversions recalculated successfully' }, status: :ok
15
19
  end
@@ -17,7 +21,8 @@ module Spree
17
21
  private
18
22
 
19
23
  def load_taxon
20
- @taxon = Spree::Taxon.find(params[:taxon_id])
24
+ parent_taxon = Spree::Taxon.find(params[:taxon_id])
25
+ @taxons = parent_taxon.children
21
26
  end
22
27
  end
23
28
  end
@@ -0,0 +1,63 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ module QueueCart
6
+ class LineItemsController < CartController
7
+ before_action :ensure_order, only: :create
8
+ before_action :load_variant, only: :create
9
+
10
+ # override
11
+ def create
12
+ spree_authorize! :update, spree_current_order, order_token
13
+ spree_authorize! :show, @variant
14
+
15
+ availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant, add_item_params[:options])
16
+
17
+ unless availability_checker.can_supply?(add_item_params[:quantity].to_i)
18
+ return render_error_payload(availability_checker.error_message || I18n.t('variant_availability.items_out_of_stock'))
19
+ end
20
+
21
+ job = SpreeCmCommissioner::EnqueueCart::AddItemJob.perform_later(
22
+ order_id: spree_current_order.id,
23
+ variant_id: @variant.id,
24
+ quantity: add_item_params[:quantity],
25
+ public_metadata: add_item_params[:public_metadata],
26
+ private_metadata: add_item_params[:private_metadata],
27
+ options: add_item_params[:options]
28
+ )
29
+
30
+ return render_error_payload('Failed to enqueue the job') unless job
31
+
32
+ result = SpreeCmCommissioner::EnqueueCart::AddItemStatusMarker.call(
33
+ order_number: spree_current_order.number,
34
+ job_id: job.job_id,
35
+ status: 'processing',
36
+ queued_at: Time.current,
37
+ variant_id: @variant.id,
38
+ quantity: add_item_params[:quantity]
39
+ )
40
+
41
+ line_item_queue = SpreeCmCommissioner::QueueItem.new(
42
+ id: job.job_id,
43
+ status: result.firestore_status,
44
+ queued_at: result.firestore_queued_at,
45
+ collection_reference: result.firestore_collection_reference,
46
+ document_reference: result.firestore_document_reference
47
+ )
48
+
49
+ render_serialized_payload do
50
+ serialize_resource(line_item_queue)
51
+ end
52
+ end
53
+
54
+ # override
55
+ def resource_serializer
56
+ Spree::V2::Storefront::FirestoreQueueSerializer
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -34,7 +34,6 @@ module Spree
34
34
 
35
35
  ActiveRecord::Base.transaction do
36
36
  resource.save!
37
- recalculate_cart(resource.line_item)
38
37
  run_dynamic_fields(resource)
39
38
  resource.save_and_move_to_next_stage
40
39
  end
@@ -49,7 +48,6 @@ module Spree
49
48
  run_dynamic_fields(resource) if guest_params[:guest_dynamic_fields_attributes]
50
49
  resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
51
50
  resource.save!
52
- recalculate_cart(resource.line_item)
53
51
  resource.save_and_move_to_next_stage
54
52
  end
55
53
 
@@ -89,8 +87,6 @@ module Spree
89
87
  :other_organization,
90
88
  :expectation,
91
89
  :upload_later,
92
- :age_group,
93
- :nationality_group,
94
90
  guest_dynamic_fields_attributes: %i[
95
91
  id
96
92
  dynamic_field_id
@@ -115,10 +111,6 @@ module Spree
115
111
  def handle_record_not_found(exception)
116
112
  render_error_payload({ base: [exception.message] }, 404)
117
113
  end
118
-
119
- def recalculate_cart(line_item)
120
- ::Spree::Dependencies.cart_recalculate_service.constantize.call(line_item: line_item, order: spree_current_order)
121
- end
122
114
  end
123
115
  end
124
116
  end
@@ -3,26 +3,14 @@ module SpreeCmCommissioner
3
3
  layout 'spree_cm_commissioner/layouts/order_mailer'
4
4
  helper 'spree/mail'
5
5
 
6
- def show # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
6
+ def show
7
7
  @order = if params[:id].match?(/^R\d{9,}-([A-Za-z0-9_\-]+)$/)
8
8
  Spree::Order.search_by_qr_data!(params[:id])
9
9
  else
10
- result = SpreeCmCommissioner::Orders::JwtToken::Verify.call(token: params[:t])
11
- unless result.success?
12
- @title = I18n.t('views.sign_in.errors.request_invalid')
13
- @message = I18n.t('views.sign_in.errors.request_invalid_message')
14
-
15
- return render(
16
- template: 'shared_console/errors/request_invalid',
17
- layout: 'error'
18
- )
19
- end
20
-
21
- result.value[:order]
10
+ SpreeCmCommissioner::Orders::JwtToken::Verify.call(token: params[:t]).value[:order]
22
11
  end
23
12
 
24
13
  @product_type = @order.products.first&.product_type || 'accommodation'
25
- @expired_at = Time.zone.at(result&.value&.dig(:payload, 'exp')) if result&.value&.dig(:payload, 'exp')
26
14
 
27
15
  if @order.tenant.present?
28
16
  @name = @order.tenant.name
@@ -21,7 +21,7 @@ module Spree
21
21
  end
22
22
 
23
23
  def custom_product_line_item_url(line_item)
24
- main_app.url_for("/a/#{line_item.internal_qr_data}")
24
+ main_app.url_for("/a/#{line_item.qr_data}")
25
25
  end
26
26
  end
27
27
  end
@@ -5,16 +5,9 @@ module SpreeCmCommissioner
5
5
  label = resource.active ? 'Active' : 'Disabled'
6
6
  btn_active_class = resource.active ? 'btn-primary' : 'btn-warning'
7
7
 
8
- # Determine the correct URL based on the calendarable type
9
- url = if resource.calendarable_type == 'Spree::Product'
10
- update_status_admin_product_product_service_calendar_path(resource.calendarable, resource)
11
- else
12
- update_status_admin_vendor_vendor_service_calendar_url(resource.calendarable, resource)
13
- end
14
-
15
8
  button_to(
16
9
  label,
17
- url,
10
+ update_status_admin_vendor_vendor_service_calendar_url(resource.calendarable, resource),
18
11
  form: { data: { confirm: 'Are you sure?' }, class: "btn btn-sm btn-active #{btn_active_class}" },
19
12
  method: :patch
20
13
  )
@@ -0,0 +1,64 @@
1
+ module SpreeCmCommissioner
2
+ class ConversionPreCalculator < BaseInteractor
3
+ delegate :product_taxon, to: :context
4
+
5
+ def call
6
+ update_conversion
7
+ reassign_guests_event_id
8
+ refinalize_guests
9
+ end
10
+
11
+ def update_conversion
12
+ product_taxon.update(
13
+ total_count: total_count,
14
+ revenue: revenue
15
+ )
16
+ end
17
+
18
+ # reassign event_id if it's wrong.
19
+ def reassign_guests_event_id
20
+ return if event_id.blank?
21
+
22
+ SpreeCmCommissioner::Guest
23
+ .where(line_item_id: product_taxon.line_items.pluck(:id))
24
+ .where('event_id IS NULL OR event_id != ?', event_id)
25
+ .find_each do |guest|
26
+ guest.event_id = event_id
27
+ guest.save!
28
+ end
29
+ end
30
+
31
+ def refinalize_guests
32
+ return if event_id.blank?
33
+
34
+ SpreeCmCommissioner::Guest
35
+ .complete
36
+ .where(event_id: event_id)
37
+ .none_bib
38
+ .find_each do |guest|
39
+ result = SpreeCmCommissioner::Guests::Finalize.call(
40
+ guest: guest,
41
+ user: guest.line_item.order.user,
42
+ event: guest.event,
43
+ variant: guest.variant
44
+ )
45
+
46
+ result.success? || raise(ActiveRecord::RecordInvalid, guest)
47
+ end
48
+ end
49
+
50
+ def event_id
51
+ return nil unless product_taxon.taxon&.event?
52
+
53
+ context.event_id ||= product_taxon.taxon&.parent_id
54
+ end
55
+
56
+ def total_count
57
+ product_taxon.complete_line_items.pluck(:quantity).compact.sum
58
+ end
59
+
60
+ def revenue
61
+ product_taxon.complete_line_items.map(&:amount).compact.sum
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,43 @@
1
+ module SpreeCmCommissioner
2
+ module EnqueueCart
3
+ class AddItem < BaseInteractor
4
+ delegate :order_id, :variant_id, :job_id, :quantity, :public_metadata, :private_metadata, :options, to: :context
5
+
6
+ def call
7
+ result = add_item_to_cart
8
+ if result.success?
9
+ update_status('completed')
10
+ else
11
+ update_status('failed')
12
+ end
13
+ end
14
+
15
+ def add_item_to_cart
16
+ Spree::Cart::AddItem.call(
17
+ order: order,
18
+ variant: variant,
19
+ quantity: quantity,
20
+ public_metadata: public_metadata,
21
+ private_metadata: private_metadata,
22
+ options: options
23
+ )
24
+ end
25
+
26
+ def update_status(status)
27
+ SpreeCmCommissioner::EnqueueCart::AddItemStatusMarker.call(
28
+ order_number: order.number,
29
+ job_id: job_id,
30
+ status: status
31
+ )
32
+ end
33
+
34
+ def order
35
+ @order ||= Spree::Order.find(order_id)
36
+ end
37
+
38
+ def variant
39
+ @variant ||= Spree::Variant.find(variant_id)
40
+ end
41
+ end
42
+ end
43
+ end