spree_cm_commissioner 2.5.15 → 2.5.16.pre.pre1
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/Gemfile.lock +1 -1
- data/app/controllers/spree/api/v2/storefront/invite_guests_controller.rb +12 -3
- data/app/controllers/spree/api/v2/tenant/guests_controller.rb +0 -6
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/cart_controller_decorator.rb +7 -0
- data/app/interactors/spree_cm_commissioner/create_ticket.rb +12 -8
- data/app/jobs/spree_cm_commissioner/invite_guests/bulk_create_job.rb +18 -0
- data/app/models/spree_cm_commissioner/exports/invite_guest_group_csv.rb +84 -0
- data/app/models/spree_cm_commissioner/invite_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/invite_guest_group.rb +15 -0
- data/app/models/spree_cm_commissioner/pricing_rules/age_group.rb +1 -1
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
- data/app/services/spree_cm_commissioner/cart/recalculate_decorator.rb +1 -3
- data/app/services/spree_cm_commissioner/checkout/update_decorator.rb +8 -3
- data/app/services/spree_cm_commissioner/invite_guest_groups/create.rb +50 -0
- data/app/services/spree_cm_commissioner/invite_guests/bulk_create.rb +101 -0
- data/app/services/spree_cm_commissioner/invite_guests/create.rb +73 -0
- data/db/migrate/20260115032932_add_mobile_claim_only_to_cm_invite_guests.rb +5 -0
- data/db/migrate/20260117131017_create_cm_invite_guest_groups.rb +24 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +12 -5
- data/app/serializers/spree/v2/organizer/invite_guest_serializer.rb +0 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1108e15325ac66e0b4dd939138b9c8feea61b6d8f5fd26f01161022e96c3de43
|
|
4
|
+
data.tar.gz: 1047db11e7948e2c3bc2e803b1029344ea2d5d5423d75e23316df80e987d399d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a95118b541b10f0b32b8d1b2b0ac20b6d137a478d50d5b0a66250cacb7aa237f97c4fdbf0b778715d560b764744ab2dce633d0943e6669f8cb78ce9fddeed939
|
|
7
|
+
data.tar.gz: fdd81c70ef7e1c01c58814bedb034ad888a6266d8ef0a349e1f6c7cc18102f247f443d0e030a4eac8c75477b6309ee9164c5ded3db34c3633107c35480eafcba
|
data/Gemfile.lock
CHANGED
|
@@ -3,8 +3,15 @@ module Spree
|
|
|
3
3
|
module V2
|
|
4
4
|
module Storefront
|
|
5
5
|
class InviteGuestsController < ::Spree::Api::V2::ResourceController
|
|
6
|
-
before_action :
|
|
7
|
-
before_action :
|
|
6
|
+
before_action :require_spree_current_user, only: %i[show update]
|
|
7
|
+
before_action :load_invite_guest_by_token, only: %i[show update]
|
|
8
|
+
|
|
9
|
+
def show
|
|
10
|
+
return if invite_unavailable?
|
|
11
|
+
|
|
12
|
+
order = @invite_guest.order
|
|
13
|
+
render_serialized_payload { serialize_resource(order) }
|
|
14
|
+
end
|
|
8
15
|
|
|
9
16
|
def update
|
|
10
17
|
return if invite_unavailable?
|
|
@@ -42,7 +49,9 @@ module Spree
|
|
|
42
49
|
end
|
|
43
50
|
|
|
44
51
|
def load_invite_guest_by_token
|
|
45
|
-
|
|
52
|
+
qr_data = params[:id].to_s
|
|
53
|
+
token = qr_data.start_with?('IVG-') ? qr_data.sub(/\AIVG-/, '') : qr_data
|
|
54
|
+
@invite_guest = SpreeCmCommissioner::InviteGuest.find_by!(token: token)
|
|
46
55
|
rescue ActiveRecord::RecordNotFound
|
|
47
56
|
render_error_payload(I18n.t('invite.url_not_found'))
|
|
48
57
|
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
|
|
|
@@ -115,10 +113,6 @@ module Spree
|
|
|
115
113
|
def handle_record_not_found(exception)
|
|
116
114
|
render_error_payload({ base: [exception.message] }, 404)
|
|
117
115
|
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
116
|
end
|
|
123
117
|
end
|
|
124
118
|
end
|
|
@@ -7,6 +7,13 @@ module SpreeCmCommissioner
|
|
|
7
7
|
base.include SpreeCmCommissioner::OrderConcern
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
+
# override
|
|
11
|
+
def show
|
|
12
|
+
spree_authorize! :show, spree_current_order, order_token
|
|
13
|
+
response.headers['Cache-Control'] = 'no-store'
|
|
14
|
+
render_serialized_payload { serialized_current_order }
|
|
15
|
+
end
|
|
16
|
+
|
|
10
17
|
# Restart the checkout flow to bring the order back to the cart view
|
|
11
18
|
def restart_checkout_flow
|
|
12
19
|
spree_authorize! :update, spree_current_order, order_token
|
|
@@ -33,14 +33,18 @@ module SpreeCmCommissioner
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def assign_event
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
event = Spree::Taxon.find_event(params[:event_id])
|
|
37
|
+
context.fail!(message: 'Event not found.') unless event
|
|
38
|
+
|
|
39
|
+
@section =
|
|
40
|
+
if params[:section_id].present?
|
|
41
|
+
event.children.find_by(id: params[:section_id])
|
|
42
|
+
else
|
|
43
|
+
event.children.first
|
|
44
|
+
end
|
|
45
|
+
context.fail!(message: 'Section not found.') unless @section
|
|
46
|
+
|
|
47
|
+
@ticket.taxons << @section
|
|
44
48
|
end
|
|
45
49
|
|
|
46
50
|
def set_option_value
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module InviteGuests
|
|
3
|
+
class BulkCreateJob < ApplicationJob
|
|
4
|
+
def perform(options = {})
|
|
5
|
+
SpreeCmCommissioner::InviteGuests::BulkCreate.call(
|
|
6
|
+
invite_guest_group_id: options[:invite_guest_group_id] || options[:id],
|
|
7
|
+
quantity: options[:quantity],
|
|
8
|
+
invite_guest_attributes: options[:invite_guest_attributes] || options[:invite_guest_params],
|
|
9
|
+
invite_context: {
|
|
10
|
+
variant_id: options[:variant_id],
|
|
11
|
+
event_id: options[:event_id],
|
|
12
|
+
user_id: options[:user_id]
|
|
13
|
+
}
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module Exports
|
|
3
|
+
class InviteGuestGroupCsv < ::SpreeCmCommissioner::Export
|
|
4
|
+
store_public_metadata :invite_guests_count, :integer, default: 0
|
|
5
|
+
|
|
6
|
+
def export
|
|
7
|
+
setup_tracking
|
|
8
|
+
group = exportable
|
|
9
|
+
assign_group_metadata(group)
|
|
10
|
+
|
|
11
|
+
file = Tempfile.new(['invite-guest-group', '.csv'])
|
|
12
|
+
export_csv(file, group)
|
|
13
|
+
attach_export(file, group)
|
|
14
|
+
finalize_export(file.size)
|
|
15
|
+
rescue StandardError => e
|
|
16
|
+
handle_export_error(e)
|
|
17
|
+
ensure
|
|
18
|
+
cleanup_tempfile(file)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def setup_tracking
|
|
24
|
+
self.track_messages = []
|
|
25
|
+
track_messages << "Export started at #{Time.current.iso8601}"
|
|
26
|
+
update(status: :progress, track_messages: track_messages)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def assign_group_metadata(group)
|
|
30
|
+
self.invite_guests_count = group.invite_guests.active.count
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def export_csv(file, group)
|
|
34
|
+
CSV.open(file.path, 'w') do |csv|
|
|
35
|
+
csv << ['Invite Guest QR Data']
|
|
36
|
+
group.invite_guests.active.find_each do |invite_guest|
|
|
37
|
+
csv << [invite_guest.qr_data]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def attach_export(file, group)
|
|
43
|
+
file.rewind
|
|
44
|
+
exported_file.attach(
|
|
45
|
+
io: file,
|
|
46
|
+
filename: exported_filename(group),
|
|
47
|
+
content_type: 'text/csv'
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def finalize_export(file_size_bytes)
|
|
52
|
+
track_messages << "Completed at #{Time.current.iso8601}"
|
|
53
|
+
update(
|
|
54
|
+
status: :done,
|
|
55
|
+
file_size_bytes: file_size_bytes,
|
|
56
|
+
track_messages: track_messages,
|
|
57
|
+
public_metadata: public_metadata
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def handle_export_error(error)
|
|
62
|
+
CmAppLogger.error(
|
|
63
|
+
label: "#{self.class.name}#export",
|
|
64
|
+
data: { export_id: id, error: error.message, backtrace: error.backtrace }
|
|
65
|
+
)
|
|
66
|
+
track_errors = []
|
|
67
|
+
track_errors << "Error: #{error.message} at #{Time.current.iso8601}"
|
|
68
|
+
track_errors << error.backtrace.take(5).join("\n") if error.backtrace.present?
|
|
69
|
+
update(status: :failed, track_errors: track_errors)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def cleanup_tempfile(file)
|
|
73
|
+
return if file.nil?
|
|
74
|
+
|
|
75
|
+
file.close
|
|
76
|
+
file.unlink
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def exported_filename(group)
|
|
80
|
+
"invite_guest_group_#{group.id}_#{Time.current.strftime('%Y-%m-%d_%H-%M')}.csv"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
class InviteGuestGroup < SpreeCmCommissioner::Base
|
|
3
|
+
belongs_to :event, class_name: 'Spree::Taxon', optional: true
|
|
4
|
+
|
|
5
|
+
has_many :invite_guests, class_name: 'SpreeCmCommissioner::InviteGuest', dependent: :destroy
|
|
6
|
+
|
|
7
|
+
self.whitelisted_ransackable_attributes = %w[quantity]
|
|
8
|
+
|
|
9
|
+
validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 }
|
|
10
|
+
|
|
11
|
+
def expired?
|
|
12
|
+
expiration_date.present? && expiration_date < Time.current
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -35,8 +35,8 @@ module SpreeCmCommissioner
|
|
|
35
35
|
private
|
|
36
36
|
|
|
37
37
|
def resolve_guest_age_group(guest)
|
|
38
|
-
return guest.age_group if guest.age_group.present?
|
|
39
38
|
return guest.saved_guest.age_group if guest.saved_guest&.age_group.present?
|
|
39
|
+
return guest.age_group if guest.age_group.present?
|
|
40
40
|
|
|
41
41
|
nil
|
|
42
42
|
end
|
|
@@ -62,6 +62,7 @@ module SpreeCmCommissioner
|
|
|
62
62
|
base.has_many :crew_invite_links, class_name: 'SpreeCmCommissioner::CrewInviteLink', dependent: :destroy
|
|
63
63
|
|
|
64
64
|
base.has_many :invite_guests, class_name: 'SpreeCmCommissioner::InviteGuest', foreign_key: :event_id
|
|
65
|
+
base.has_many :invite_guest_groups, class_name: 'SpreeCmCommissioner::InviteGuestGroup', foreign_key: :event_id
|
|
65
66
|
|
|
66
67
|
base.has_many :line_items, through: :products
|
|
67
68
|
base.has_many :event_line_items, class_name: 'Spree::LineItem', foreign_key: :event_id
|
|
@@ -26,9 +26,7 @@ module SpreeCmCommissioner
|
|
|
26
26
|
end
|
|
27
27
|
# SPREE: Original Spree::Cart::Recalculate code ends here
|
|
28
28
|
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
SpreeCmCommissioner::PricingModelHandler::Order.new(order).activate
|
|
29
|
+
# to ensure they're called at the right business logic points.
|
|
32
30
|
|
|
33
31
|
# SPREE: Original Spree::Cart::Recalculate code continues here
|
|
34
32
|
::Spree::PromotionHandler::Cart.new(order, line_item).activate
|
|
@@ -17,9 +17,14 @@ module SpreeCmCommissioner
|
|
|
17
17
|
# order.state = 'address' if (ship_changed || bill_changed) && order.has_checkout_step?('address')
|
|
18
18
|
# order.state = 'delivery' if selected_shipping_rate_present?(params) && order.has_checkout_step?('delivery')
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
if order.update_from_params(params, permitted_attributes, request_env)
|
|
21
|
+
# Apply pricing model after successful update
|
|
22
|
+
SpreeCmCommissioner::PricingModelHandler::Order.new(order).activate
|
|
23
|
+
order.update_with_updater!
|
|
24
|
+
success(order)
|
|
25
|
+
else
|
|
26
|
+
failure(order)
|
|
27
|
+
end
|
|
23
28
|
end
|
|
24
29
|
end
|
|
25
30
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module InviteGuestGroups
|
|
3
|
+
class Create
|
|
4
|
+
prepend ::Spree::ServiceModule::Base
|
|
5
|
+
|
|
6
|
+
# This service will create the group and enqueue a background job to create sub invite guests.
|
|
7
|
+
def call(invite_guest_group_attributes:, invite_guest_attributes:, variant_id:, event_id:, user_id: nil)
|
|
8
|
+
@variant_id = variant_id
|
|
9
|
+
@event_id = event_id
|
|
10
|
+
@invite_guest_params = invite_guest_attributes.to_h
|
|
11
|
+
@user_id = user_id
|
|
12
|
+
|
|
13
|
+
begin
|
|
14
|
+
@invite_guest_group = create_invite_guest_group!(invite_guest_group_attributes)
|
|
15
|
+
# Enqueue background job to create sub invite guests and orders
|
|
16
|
+
# Pass the group's quantity so the background job can call the BulkCreate service
|
|
17
|
+
SpreeCmCommissioner::InviteGuests::BulkCreateJob.perform_later(
|
|
18
|
+
invite_guest_group_id: @invite_guest_group.id,
|
|
19
|
+
quantity: @invite_guest_group.quantity,
|
|
20
|
+
variant_id: @variant_id,
|
|
21
|
+
event_id: @event_id,
|
|
22
|
+
invite_guest_params: @invite_guest_params,
|
|
23
|
+
user_id: @user_id
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
success(invite_guest_group: @invite_guest_group)
|
|
27
|
+
rescue StandardError => e
|
|
28
|
+
failure(nil, e.message)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def create_invite_guest_group!(invite_guest_group_attributes)
|
|
35
|
+
attrs = invite_guest_group_attributes.to_h
|
|
36
|
+
|
|
37
|
+
create_attrs = {
|
|
38
|
+
quantity: attrs[:quantity] || attrs['quantity'],
|
|
39
|
+
expiration_date: attrs[:expiration_date] || attrs['expiration_date'],
|
|
40
|
+
event_id: attrs[:event_id] || attrs['event_id'] || @event_id,
|
|
41
|
+
mobile_claim_only: attrs[:mobile_claim_only] || attrs['mobile_claim_only'] ||
|
|
42
|
+
@invite_guest_params[:mobile_claim_only] || @invite_guest_params['mobile_claim_only'],
|
|
43
|
+
processing_status: attrs[:processing_status] || attrs['processing_status']
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
SpreeCmCommissioner::InviteGuestGroup.create!(create_attrs)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module InviteGuests
|
|
3
|
+
class BulkCreate
|
|
4
|
+
prepend ::Spree::ServiceModule::Base
|
|
5
|
+
|
|
6
|
+
def call(invite_guest_group_id:, quantity:, invite_guest_attributes:, invite_context:)
|
|
7
|
+
invite_guest_group = SpreeCmCommissioner::InviteGuestGroup.find_by(id: invite_guest_group_id)
|
|
8
|
+
return failure(nil, 'Invite guest group not found') unless invite_guest_group
|
|
9
|
+
return failure(nil, 'Quantity must be greater than 0') if quantity.to_i <= 0
|
|
10
|
+
|
|
11
|
+
context = invite_context.respond_to?(:to_h) ? invite_context.to_h : {}
|
|
12
|
+
variant_id = context[:variant_id] || context['variant_id']
|
|
13
|
+
event_id = context[:event_id] || context['event_id']
|
|
14
|
+
|
|
15
|
+
invite_guest_group.update!(processing_status: :processing)
|
|
16
|
+
|
|
17
|
+
invite_guest_params = invite_guest_attributes.respond_to?(:to_h) ? invite_guest_attributes.to_h : {}
|
|
18
|
+
created_invite_guests = create_invite_guests_in_transaction(
|
|
19
|
+
invite_guest_group_id: invite_guest_group.id,
|
|
20
|
+
quantity: quantity,
|
|
21
|
+
invite_guest_params: invite_guest_params,
|
|
22
|
+
invite_context: context
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
mark_group_completed(invite_guest_group, created_invite_guests, quantity, variant_id, event_id)
|
|
26
|
+
success(invite_guests: created_invite_guests)
|
|
27
|
+
rescue StandardError => e
|
|
28
|
+
mark_group_failed(invite_guest_group, e, quantity, variant_id, event_id)
|
|
29
|
+
failure(nil, e.message)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def create_invite_guests_in_transaction(invite_guest_group_id:, quantity:, invite_guest_params:, invite_context:)
|
|
35
|
+
created_list = []
|
|
36
|
+
context = invite_context.respond_to?(:to_h) ? invite_context.to_h : {}
|
|
37
|
+
variant_id = context[:variant_id] || context['variant_id']
|
|
38
|
+
event_id = context[:event_id] || context['event_id']
|
|
39
|
+
user_id = context[:user_id] || context['user_id']
|
|
40
|
+
|
|
41
|
+
ActiveRecord::Base.transaction do
|
|
42
|
+
quantity.to_i.times do
|
|
43
|
+
service_result = SpreeCmCommissioner::InviteGuests::Create.call(
|
|
44
|
+
invite_guest_group_id: invite_guest_group_id,
|
|
45
|
+
variant_id: variant_id,
|
|
46
|
+
event_id: event_id,
|
|
47
|
+
invite_guest_params: invite_guest_params,
|
|
48
|
+
user_id: user_id
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
raise StandardError, "Failed to create invite guest: #{service_result.error}" unless service_result.success?
|
|
52
|
+
|
|
53
|
+
created_list << service_result.value[:invite_guest]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
created_list
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def mark_group_completed(invite_guest_group, created_invite_guests, quantity, variant_id, event_id)
|
|
61
|
+
attrs = { processing_status: :completed, completed_at: Time.current }
|
|
62
|
+
if invite_guest_group.has_attribute?(:private_metadata)
|
|
63
|
+
metadata = invite_guest_group.private_metadata
|
|
64
|
+
metadata = JSON.parse(metadata.presence || '{}') if metadata.is_a?(String)
|
|
65
|
+
|
|
66
|
+
attrs[:private_metadata] = metadata.merge(
|
|
67
|
+
requested_quantity: quantity.to_i,
|
|
68
|
+
created_count: created_invite_guests.size,
|
|
69
|
+
variant_id: variant_id,
|
|
70
|
+
event_id: event_id
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
invite_guest_group.update!(attrs)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def mark_group_failed(invite_guest_group, error, quantity, variant_id, event_id)
|
|
78
|
+
return unless invite_guest_group
|
|
79
|
+
|
|
80
|
+
attrs = { processing_status: :failed, completed_at: Time.current }
|
|
81
|
+
if invite_guest_group.has_attribute?(:private_metadata)
|
|
82
|
+
metadata = invite_guest_group.private_metadata
|
|
83
|
+
metadata = JSON.parse(metadata.presence || '{}') if metadata.is_a?(String)
|
|
84
|
+
|
|
85
|
+
attrs[:private_metadata] = metadata.merge(
|
|
86
|
+
requested_quantity: quantity.to_i,
|
|
87
|
+
created_count: 0,
|
|
88
|
+
variant_id: variant_id,
|
|
89
|
+
event_id: event_id,
|
|
90
|
+
error_class: error.class.name,
|
|
91
|
+
error_message: error.message
|
|
92
|
+
)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
invite_guest_group.update!(attrs)
|
|
96
|
+
rescue ActiveRecord::ActiveRecordError
|
|
97
|
+
false
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module InviteGuests
|
|
3
|
+
class Create
|
|
4
|
+
prepend ::Spree::ServiceModule::Base
|
|
5
|
+
|
|
6
|
+
def call(invite_guest_group_id:, variant_id:, event_id: nil, invite_guest_params: {}, user_id: nil)
|
|
7
|
+
@invite_guest_group_id = invite_guest_group_id
|
|
8
|
+
@variant_id = variant_id
|
|
9
|
+
@event_id = event_id
|
|
10
|
+
@invite_guest_params = invite_guest_params.to_h
|
|
11
|
+
@user_id = user_id
|
|
12
|
+
|
|
13
|
+
begin
|
|
14
|
+
order_context = ensure_order!
|
|
15
|
+
invite_guest = build_invite_guest(order_context.order.id)
|
|
16
|
+
persist_invite_guest(invite_guest)
|
|
17
|
+
rescue StandardError => e
|
|
18
|
+
failure(nil, e.message)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def user
|
|
25
|
+
@user ||= Spree.user_class.find_by(id: @user_id) if @user_id
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create_order
|
|
29
|
+
SpreeCmCommissioner::OrderImporter::MultiGuest.call(
|
|
30
|
+
guest_token: SecureRandom.uuid,
|
|
31
|
+
quantity: 1,
|
|
32
|
+
params: {
|
|
33
|
+
order_email: user&.email || @invite_guest_params[:email] || @invite_guest_params['email'],
|
|
34
|
+
order_phone_number: user&.phone_number,
|
|
35
|
+
variant_id: @variant_id
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def build_invite_guest(order_id)
|
|
41
|
+
params = @invite_guest_params
|
|
42
|
+
SpreeCmCommissioner::InviteGuest.new(
|
|
43
|
+
token: SecureRandom.hex(16),
|
|
44
|
+
expiration_date: params[:expiration_date] || params['expiration_date'] || 3.days.from_now,
|
|
45
|
+
order_id: order_id,
|
|
46
|
+
quantity: 1,
|
|
47
|
+
variant_id: @variant_id,
|
|
48
|
+
event_id: @event_id,
|
|
49
|
+
invite_guest_group_id: @invite_guest_group_id,
|
|
50
|
+
email: params[:email] || params['email'],
|
|
51
|
+
issued_to: params[:issued_to] || params['issued_to'],
|
|
52
|
+
remark: params[:remark] || params['remark'],
|
|
53
|
+
mobile_claim_only: params[:mobile_claim_only] || params['mobile_claim_only']
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def persist_invite_guest(invite_guest)
|
|
58
|
+
if invite_guest.save
|
|
59
|
+
success(invite_guest: invite_guest)
|
|
60
|
+
else
|
|
61
|
+
failure(nil, invite_guest.errors.full_messages.to_sentence)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def ensure_order!
|
|
66
|
+
order_context = create_order
|
|
67
|
+
raise StandardError, (order_context[:message] || 'Failed to create order') unless order_context&.order && order_context.order.persisted?
|
|
68
|
+
|
|
69
|
+
order_context
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class CreateCmInviteGuestGroups < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :cm_invite_guest_groups, if_not_exists: true do |t|
|
|
4
|
+
t.integer :quantity, default: 1
|
|
5
|
+
t.datetime :expiration_date
|
|
6
|
+
t.bigint :event_id
|
|
7
|
+
t.boolean :mobile_claim_only, default: false
|
|
8
|
+
t.string :processing_status, default: 'pending'
|
|
9
|
+
t.jsonb :public_metadata, default: '{}'
|
|
10
|
+
t.jsonb :private_metadata, default: '{}'
|
|
11
|
+
t.datetime :completed_at
|
|
12
|
+
t.timestamps
|
|
13
|
+
end
|
|
14
|
+
add_index :cm_invite_guest_groups, :event_id, if_not_exists: true
|
|
15
|
+
add_foreign_key :cm_invite_guest_groups, :spree_taxons, column: :event_id
|
|
16
|
+
|
|
17
|
+
# Add foreign key to InviteGuest pointing to InviteGuestGroup
|
|
18
|
+
unless column_exists?(:cm_invite_guests, :invite_guest_group_id)
|
|
19
|
+
add_column :cm_invite_guests, :invite_guest_group_id, :bigint
|
|
20
|
+
add_index :cm_invite_guests, :invite_guest_group_id, if_not_exists: true
|
|
21
|
+
add_foreign_key :cm_invite_guests, :cm_invite_guest_groups, column: :invite_guest_group_id
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
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: 2.5.
|
|
4
|
+
version: 2.5.16.pre.pre1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- You
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-02-
|
|
11
|
+
date: 2026-02-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: spree
|
|
@@ -1329,6 +1329,7 @@ files:
|
|
|
1329
1329
|
- app/jobs/spree_cm_commissioner/integrations/polling_scheduler_job.rb
|
|
1330
1330
|
- app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb
|
|
1331
1331
|
- app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb
|
|
1332
|
+
- app/jobs/spree_cm_commissioner/invite_guests/bulk_create_job.rb
|
|
1332
1333
|
- app/jobs/spree_cm_commissioner/line_items/sync_event_date_job.rb
|
|
1333
1334
|
- app/jobs/spree_cm_commissioner/maintenance_tasks/orchestrate_job.rb
|
|
1334
1335
|
- app/jobs/spree_cm_commissioner/maintenance_tasks/process_job.rb
|
|
@@ -1449,6 +1450,7 @@ files:
|
|
|
1449
1450
|
- app/models/spree_cm_commissioner/dynamic_field_option.rb
|
|
1450
1451
|
- app/models/spree_cm_commissioner/event_ticket_google_wallet.rb
|
|
1451
1452
|
- app/models/spree_cm_commissioner/export.rb
|
|
1453
|
+
- app/models/spree_cm_commissioner/exports/invite_guest_group_csv.rb
|
|
1452
1454
|
- app/models/spree_cm_commissioner/exports/operator_guest_json_gzip.rb
|
|
1453
1455
|
- app/models/spree_cm_commissioner/feature_image.rb
|
|
1454
1456
|
- app/models/spree_cm_commissioner/front_image.rb
|
|
@@ -1487,6 +1489,7 @@ files:
|
|
|
1487
1489
|
- app/models/spree_cm_commissioner/inventory_item.rb
|
|
1488
1490
|
- app/models/spree_cm_commissioner/invite.rb
|
|
1489
1491
|
- app/models/spree_cm_commissioner/invite_guest.rb
|
|
1492
|
+
- app/models/spree_cm_commissioner/invite_guest_group.rb
|
|
1490
1493
|
- app/models/spree_cm_commissioner/invite_team.rb
|
|
1491
1494
|
- app/models/spree_cm_commissioner/invite_user_event.rb
|
|
1492
1495
|
- app/models/spree_cm_commissioner/invite_user_taxon.rb
|
|
@@ -1835,7 +1838,6 @@ files:
|
|
|
1835
1838
|
- app/serializers/spree/v2/organizer/base_serializer.rb
|
|
1836
1839
|
- app/serializers/spree/v2/organizer/image_serializer.rb
|
|
1837
1840
|
- app/serializers/spree/v2/organizer/invite_crews_serializer.rb
|
|
1838
|
-
- app/serializers/spree/v2/organizer/invite_guest_serializer.rb
|
|
1839
1841
|
- app/serializers/spree/v2/organizer/invite_serializer.rb
|
|
1840
1842
|
- app/serializers/spree/v2/organizer/s3_signed_url_serializer.rb
|
|
1841
1843
|
- app/serializers/spree/v2/organizer/taxon_serializer.rb
|
|
@@ -2065,6 +2067,9 @@ files:
|
|
|
2065
2067
|
- app/services/spree_cm_commissioner/intercity_taxi_order/calculate_distance.rb
|
|
2066
2068
|
- app/services/spree_cm_commissioner/intercity_taxi_order/create.rb
|
|
2067
2069
|
- app/services/spree_cm_commissioner/intercity_taxi_order/update.rb
|
|
2070
|
+
- app/services/spree_cm_commissioner/invite_guest_groups/create.rb
|
|
2071
|
+
- app/services/spree_cm_commissioner/invite_guests/bulk_create.rb
|
|
2072
|
+
- app/services/spree_cm_commissioner/invite_guests/create.rb
|
|
2068
2073
|
- app/services/spree_cm_commissioner/line_items/sync_event_date.rb
|
|
2069
2074
|
- app/services/spree_cm_commissioner/metafields/product_metadata_service.rb
|
|
2070
2075
|
- app/services/spree_cm_commissioner/operator_guest_json_gzips/create.rb
|
|
@@ -3036,6 +3041,8 @@ files:
|
|
|
3036
3041
|
- db/migrate/20260106093359_add_contact_phone_to_cm_vendor_places.rb
|
|
3037
3042
|
- db/migrate/20260108101406_add_allow_booking_to_cm_trips.rb
|
|
3038
3043
|
- db/migrate/20260110073000_create_cm_pricing_model_routes.rb
|
|
3044
|
+
- db/migrate/20260115032932_add_mobile_claim_only_to_cm_invite_guests.rb
|
|
3045
|
+
- db/migrate/20260117131017_create_cm_invite_guest_groups.rb
|
|
3039
3046
|
- db/migrate/20260121024645_add_nationality_group_to_cm_guests.rb
|
|
3040
3047
|
- db/migrate/20260126110528_seed_user_initial_usernames.rb
|
|
3041
3048
|
- db/migrate/20260128043540_add_counter_cache_to_spree_users.rb
|
|
@@ -3240,9 +3247,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
3240
3247
|
version: '2.7'
|
|
3241
3248
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
3242
3249
|
requirements:
|
|
3243
|
-
- - "
|
|
3250
|
+
- - ">"
|
|
3244
3251
|
- !ruby/object:Gem::Version
|
|
3245
|
-
version:
|
|
3252
|
+
version: 1.3.1
|
|
3246
3253
|
requirements:
|
|
3247
3254
|
- none
|
|
3248
3255
|
rubygems_version: 3.4.1
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module V2
|
|
3
|
-
module Organizer
|
|
4
|
-
class InviteGuestSerializer < BaseSerializer
|
|
5
|
-
attributes :email, :quantity, :token, :invite_type, :claimed_status, :issued_to, :expiration_date,
|
|
6
|
-
:email_send_at, :created_at, :updated_at, :remark
|
|
7
|
-
belongs_to :variant, serializer: SpreeCmCommissioner::V2::Storefront::EventVariantSerializer
|
|
8
|
-
belongs_to :order, serializer: Spree::V2::Storefront::OrderSerializer
|
|
9
|
-
belongs_to :event, serializer: Spree::V2::Storefront::TaxonSerializer
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|