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.
- checksums.yaml +4 -4
- data/.env.example +0 -10
- data/Gemfile.lock +1 -1
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +1 -1
- data/app/controllers/spree/admin/classifications_controller.rb +3 -11
- data/app/controllers/spree/admin/exports_controller.rb +1 -7
- data/app/controllers/spree/admin/import_existing_orders_controller.rb +1 -3
- data/app/controllers/spree/admin/import_new_orders_controller.rb +1 -3
- data/app/controllers/spree/admin/inventory_items_controller.rb +3 -3
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -5
- data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -6
- data/app/controllers/spree/admin/vendor_service_calendars_controller.rb +68 -7
- data/app/controllers/spree/api/v2/operator/check_ins_controller.rb +2 -15
- data/app/controllers/spree/api/v2/operator/guest_json_gzips_controller.rb +4 -27
- data/app/controllers/spree/api/v2/operator/guests_controller.rb +0 -6
- data/app/controllers/spree/api/v2/operator/recalculate_tickets_controller.rb +9 -4
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +63 -0
- data/app/controllers/spree/api/v2/tenant/guests_controller.rb +0 -8
- data/app/controllers/spree_cm_commissioner/orders_controller.rb +2 -14
- data/app/helpers/spree/base_helper_decorator.rb +1 -1
- data/app/helpers/spree_cm_commissioner/admin/service_calendars_helper.rb +1 -8
- data/app/interactors/spree_cm_commissioner/conversion_pre_calculator.rb +64 -0
- data/app/interactors/spree_cm_commissioner/enqueue_cart/add_item.rb +43 -0
- data/app/interactors/spree_cm_commissioner/enqueue_cart/add_item_status_marker.rb +66 -0
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +1 -11
- data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +3 -7
- data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +138 -0
- data/app/jobs/spree_cm_commissioner/conversion_pre_calculator_job.rb +12 -0
- data/app/jobs/spree_cm_commissioner/enqueue_cart/add_item_job.rb +17 -0
- data/app/jobs/spree_cm_commissioner/import_order_job.rb +2 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +11 -16
- data/app/models/spree_cm_commissioner/export.rb +1 -12
- data/app/models/spree_cm_commissioner/exports/operator_guest_json_gzip.rb +38 -141
- data/app/models/spree_cm_commissioner/inventory_item.rb +3 -5
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -4
- data/app/models/spree_cm_commissioner/order_decorator.rb +0 -8
- data/app/models/spree_cm_commissioner/pricing_model.rb +1 -1
- data/app/models/spree_cm_commissioner/product_decorator.rb +2 -5
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -1
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +6 -20
- data/app/serializables/spree_cm_commissioner/queue_item.rb +13 -0
- data/app/serializers/spree/v2/storefront/cart_serializer_decorator.rb +23 -0
- data/app/serializers/spree/v2/storefront/firestore_queue_serializer.rb +9 -0
- data/app/serializers/spree/v2/tenant/cart_serializer.rb +0 -4
- data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/operator/export_serializer.rb +0 -2
- data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +4 -10
- data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +2 -13
- data/app/services/spree_cm_commissioner/imports/base_import_order_service.rb +55 -0
- data/app/services/spree_cm_commissioner/imports/create_order_service.rb +99 -0
- data/app/services/spree_cm_commissioner/imports/update_order_service.rb +41 -0
- data/app/services/spree_cm_commissioner/integrations/base/sync_result.rb +1 -23
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_matches.rb +2 -2
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_zones.rb +8 -18
- data/app/services/spree_cm_commissioner/operator_guest_json_gzips/create.rb +10 -16
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +0 -36
- data/app/services/spree_cm_commissioner/pricing_models/update_with_rule_groups.rb +6 -1
- data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -2
- data/app/views/spree/admin/exports/_form.html.erb +7 -1
- data/app/views/spree/admin/exports/index.html.erb +4 -4
- data/app/views/spree/admin/homepage_background/index.html.erb +0 -1
- data/app/views/spree/admin/stock_managements/index.html.erb +1 -1
- data/app/views/spree/admin/taxon_childrens/index.html.erb +0 -4
- data/app/views/spree/admin/{shared/service_calendars → vendor_service_calendars}/_form.html.erb +1 -1
- data/app/views/spree/admin/vendor_service_calendars/new.html.erb +2 -2
- data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +0 -15
- data/config/locales/en.yml +0 -7
- data/config/routes.rb +5 -12
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +7 -8
- data/lib/spree_cm_commissioner/transit/trip_form.rb +0 -1
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +17 -34
- data/app/controllers/concerns/spree/admin/service_calendars_concern.rb +0 -93
- data/app/controllers/spree/admin/inventory_monitorings_controller.rb +0 -39
- data/app/controllers/spree/admin/product_service_calendars_controller.rb +0 -48
- data/app/finders/spree_cm_commissioner/inventory_items/recently_changed_finder.rb +0 -88
- data/app/jobs/spree_cm_commissioner/maintenance_tasks/orchestrate_job.rb +0 -28
- data/app/jobs/spree_cm_commissioner/maintenance_tasks/process_job.rb +0 -18
- data/app/models/concerns/spree_cm_commissioner/product_relation_type.rb +0 -29
- data/app/models/spree_cm_commissioner/maintenance_task.rb +0 -62
- data/app/models/spree_cm_commissioner/maintenance_tasks/event.rb +0 -61
- data/app/models/spree_cm_commissioner/product_relation.rb +0 -23
- data/app/overrides/spree/admin/shared/_product_tabs/service_calendars.html.erb.deface +0 -8
- data/app/overrides/spree/admin/shared/sub_menu/_stock/inventory_monitorings_tab.html.erb.deface +0 -3
- data/app/serializers/spree/api/v2/platform/create_guest_adjustment_serializer.rb +0 -10
- data/app/serializers/spree/api/v2/platform/create_line_item_adjustment_serializer.rb +0 -10
- data/app/serializers/spree/api/v2/platform/create_route_adjustment_serializer.rb +0 -10
- data/app/serializers/spree/api/v2/platform/pricing_action_serializer.rb +0 -15
- data/app/serializers/spree_cm_commissioner/v2/storefront/cart_serializer_decorator.rb +0 -39
- data/app/services/spree_cm_commissioner/imports/orders/base.rb +0 -67
- data/app/services/spree_cm_commissioner/imports/orders/create.rb +0 -135
- data/app/services/spree_cm_commissioner/imports/orders/update.rb +0 -77
- data/app/services/spree_cm_commissioner/trips/clone.rb +0 -195
- data/app/views/spree/admin/exports/show.html.erb +0 -132
- data/app/views/spree/admin/inventory_monitorings/index.html.erb +0 -119
- data/app/views/spree/admin/product_service_calendars/index.html.erb +0 -70
- data/app/views/spree/admin/product_service_calendars/new.html.erb +0 -9
- data/db/migrate/20260202095500_create_cm_product_relations.rb +0 -32
- data/db/migrate/20260207100000_add_index_created_at_to_cm_imports.rb +0 -5
- data/db/migrate/20260217162827_add_index_to_cm_guests_on_event_id_and_bib_prefix_and_bib_number.rb +0 -8
- data/db/migrate/20260218100000_create_cm_maintenance_tasks.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/product_relation_factory.rb +0 -9
- /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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2c40684e0f70119578189d382a9276fb63cec8fa0883962e1958e8d43f2f2524
|
|
4
|
+
data.tar.gz: 5912fd46420192f4b0e0165714f877bd27bac0cefdd9442f94d11bbd11d70f37
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
@@ -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',
|
|
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
|
-
|
|
8
|
-
SpreeCmCommissioner::
|
|
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
|
-
|
|
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.
|
|
46
|
-
flash[:error] = "Target quantity (#{target_quantity}) must
|
|
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
|
-
|
|
9
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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
|