spree_cm_commissioner 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d84958e990097b26c5a1550acf0683bb9901bfbb7dc3cc2e5e0057eb9f292a3
4
- data.tar.gz: 9e5112083a317fb9ae6e7bf07802d9e02cd86ae1fe0589e2214fc19c7dd476e4
3
+ metadata.gz: 3da0bd043e4ceca1f57afecc1bab6fbc58c960ba296f7fffa42b449a2475f8f8
4
+ data.tar.gz: 974c8e19e026fa90254594447a9735be039371ae6d0bc11a24c9cdf3b86dfd8c
5
5
  SHA512:
6
- metadata.gz: 8cbed043afc749ce07bf954a558fe4a1f692c6ae0d06b06d1c8f54bdd0f1069e1ea8d956ce2bb90240ba781a14afc55400d7167f1d4604b0127b3bb79142cb23
7
- data.tar.gz: f4dec3ddd14ac3654c0434cc2c9c81fcb7b6a16d10a87cdd89c353bc0c0f7571867e73494564149b5fb7fc983619f4dcb839bd52af5cc9bfb1da8f181de55757
6
+ metadata.gz: 4b1d418758d9880e50dd1481b095f4cad76cc106ca0a950b694d2a87c053bf7f48655029c52939f33bf099db0a7d84048f0482d488a20ac720f1b6f8015a687e
7
+ data.tar.gz: 93b3ffb94424ba4a4ed46e5cde3303dc33c54a58417dd1a0750a5cb56d3638778d1fa5ceb75cf812617c33e12ae3c38c6402b7719ddfa53b2ce9567a8bb860e4
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (1.12.0)
37
+ spree_cm_commissioner (1.13.0)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -49,6 +49,8 @@ module Spree
49
49
  place_json = Base64.strict_decode64(place_base_64_content)
50
50
  place_hash = JSON.parse(place_json)
51
51
 
52
+ place_hash = place_hash.except('lft', 'rgt', 'parent_id', 'depth')
53
+
52
54
  @place = SpreeCmCommissioner::Place.where(reference: place_hash['reference']).first_or_initialize do |place|
53
55
  place.assign_attributes(place_hash)
54
56
  end
@@ -0,0 +1,70 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Organizer
5
+ class InviteGuestsController < ::Spree::Api::V2::Organizer::BaseController
6
+ before_action :load_invite_guest_by_token, only: :show
7
+ before_action :load_invite_guest, :assign_line_item_data, only: :update
8
+
9
+ def show
10
+ render_serialized_payload { serialize_resource(@invite_guest) }
11
+ end
12
+
13
+ def update
14
+ return render_error(:revoked) if @invite_guest.revoked?
15
+ return render_error(:closed) if @invite_guest.expired?
16
+ return render_error(:fully_claimed) if @invite_guest.fully_claimed?
17
+
18
+ guest = @line_item.guests.new(guest_params)
19
+
20
+ if guest.save
21
+ @invite_guest.update(claimed_status: :claimed) if @line_item.guests.count == @invite_guest.quantity
22
+ render json: SpreeCmCommissioner::V2::Storefront::GuestSerializer.new(guest.reload).serializable_hash
23
+ else
24
+ render_error_payload(guest.errors.full_messages.to_sentence)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def load_invite_guest_by_token
31
+ @invite_guest = SpreeCmCommissioner::InviteGuest.find_by(token: params[:id])
32
+ rescue ActiveRecord::RecordNotFound
33
+ render_error_payload(I18n.t('invite.url_not_found'))
34
+ end
35
+
36
+ def load_invite_guest
37
+ @invite_guest = SpreeCmCommissioner::InviteGuest.find(params[:id])
38
+ end
39
+
40
+ def assign_line_item_data
41
+ @line_item = @invite_guest.order.line_items.first
42
+ @guests = @line_item.guests
43
+ end
44
+
45
+ def render_error(message)
46
+ render json: { errors: message }
47
+ end
48
+
49
+ def guest_params
50
+ params.require(:invite_guest).permit(
51
+ :first_name,
52
+ :last_name,
53
+ :dob,
54
+ :gender,
55
+ :age,
56
+ :emergency_contact,
57
+ :phone_number,
58
+ :address,
59
+ :other_organization
60
+ )
61
+ end
62
+
63
+ def resource_serializer
64
+ ::Spree::V2::Organizer::InviteGuestSerializer
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeCmCommissioner
2
+ module OrderImporter
3
+ class MultiGuest < BaseInteractor
4
+ delegate :params, :quantity, to: :context
5
+
6
+ def call
7
+ return context.fail!(message: 'variant_id_is_required') if params[:variant_id].blank?
8
+ return context.fail!(message: 'email_or_phone_is_required') if params[:order_email].blank? && params[:order_phone_number].blank?
9
+
10
+ context.order = construct_order
11
+ context.fail!(message: context.order.errors.full_messages.to_sentence) unless context.order.save
12
+ end
13
+
14
+ def construct_order
15
+ Spree::Order.new(
16
+ email: params[:order_email],
17
+ phone_number: params[:order_phone_number],
18
+ completed_at: Date.current,
19
+ state: 'complete',
20
+ payment_state: 'paid',
21
+ line_items_attributes: [
22
+ {
23
+ quantity: quantity.to_i,
24
+ variant_id: params[:variant_id]
25
+ }
26
+ ]
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
@@ -98,13 +98,12 @@ module SpreeCmCommissioner
98
98
  line_items.each do |line_item|
99
99
  next if line_item.event.nil?
100
100
 
101
- event_id = line_item.event.parent_id
102
- SpreeCmCommissioner::EventTransactionalMailer.send_to_participant(event_id, user.id).deliver_later
101
+ SpreeCmCommissioner::EventTransactionalMailer.send_to_participant(line_item.event_id, user.id).deliver_later
103
102
  end
104
103
  end
105
104
 
106
105
  def user_has_email?
107
- user.email.present?
106
+ user.present? && user.email.present?
108
107
  end
109
108
 
110
109
  # allow authorized user to accept all requested line items
@@ -0,0 +1,23 @@
1
+ module SpreeCmCommissioner
2
+ class InviteGuest < SpreeCmCommissioner::Base
3
+ enum invite_type: { invite: 0, open: 1, sponsor: 2 }
4
+ enum claimed_status: { active: 0, claimed: 1, revoked: 2 }
5
+
6
+ belongs_to :variant, class_name: 'Spree::Variant'
7
+ belongs_to :order, class_name: 'Spree::Order'
8
+ belongs_to :event, class_name: 'Spree::Taxon'
9
+
10
+ self.whitelisted_ransackable_attributes = %w[claimed_status]
11
+
12
+ def expired?
13
+ expiration_date.present? && expiration_date < Time.current
14
+ end
15
+
16
+ def fully_claimed?
17
+ return false unless order.present? && order.line_items.any?
18
+
19
+ line_item = order.line_items.first
20
+ line_item.guests.count >= order.line_items.first.number_of_guests
21
+ end
22
+ end
23
+ end
@@ -17,7 +17,7 @@ module SpreeCmCommissioner
17
17
  has_many :products, through: :product_places
18
18
 
19
19
  has_many :children, -> { order(:lft) }, class_name: 'SpreeCmCommissioner::Place', foreign_key: :parent_id, dependent: :destroy
20
- has_many :vendor_stops, class_name: 'SpreeCmCommissioner::VendorStop', dependent: :destroy
20
+ has_many :vendor_stops, class_name: 'SpreeCmCommissioner::VendorStop', dependent: :destroy, foreign_key: :stop_id
21
21
 
22
22
  def self.ransackable_attributes(auth_object = nil)
23
23
  super & %w[name code]
@@ -1,6 +1,7 @@
1
1
  module SpreeCmCommissioner
2
2
  class ProductPlace < Base
3
3
  self.inheritance_column = '_type_disabled'
4
+ acts_as_list column: :position
4
5
 
5
6
  belongs_to :product, class_name: 'Spree::Product', optional: false
6
7
  belongs_to :place, class_name: 'SpreeCmCommissioner::Place', optional: false
@@ -55,6 +55,8 @@ module SpreeCmCommissioner
55
55
  base.has_many :crew_invites, class_name: 'SpreeCmCommissioner::CrewInvite', dependent: :destroy
56
56
  base.has_many :invite_user_events, through: :user_events, class_name: 'SpreeCmCommissioner::InviteUserEvent'
57
57
 
58
+ base.has_many :invite_guests, class_name: 'SpreeCmCommissioner::InviteGuest', foreign_key: :event_id
59
+
58
60
  base.has_many :line_items, through: :products
59
61
  base.has_many :event_line_items, class_name: 'Spree::LineItem', foreign_key: :event_id
60
62
 
@@ -0,0 +1,13 @@
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
+ :claimed_at, :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
@@ -6,7 +6,8 @@ module SpreeCmCommissioner
6
6
 
7
7
  attributes :first_name, :last_name, :dob, :gender, :kyc_fields, :other_occupation, :created_at, :updated_at,
8
8
  :qr_data, :social_contact_platform, :social_contact, :available_social_contact_platforms,
9
- :age, :emergency_contact, :other_organization, :expectation, :upload_later, :address, :formatted_bib_number, :phone_number
9
+ :age, :emergency_contact, :other_organization, :expectation, :upload_later, :address, :formatted_bib_number, :phone_number,
10
+ :token
10
11
 
11
12
  # temporary, once app release after cm-app v1.9.1, we no longer need this.
12
13
  attribute :seat_number do |object|
@@ -131,6 +131,8 @@
131
131
  text-decoration: none;
132
132
  font-weight: 500;
133
133
  font-size: 14px;
134
+ width: 10rem;
135
+ max-width: 90%;
134
136
  }
135
137
 
136
138
  .cta-button:hover {
data/config/routes.rb CHANGED
@@ -450,6 +450,7 @@ Spree::Core::Engine.add_routes do
450
450
  resources :images
451
451
  resource :s3_signed_urls
452
452
  resources :invites
453
+ resources :invite_guests, only: %i[show update]
453
454
  end
454
455
 
455
456
  namespace :tenant do
@@ -0,0 +1,21 @@
1
+ class CreateSpreeCmCommissionerInviteGuest < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_invite_guests, if_not_exists: true do |t|
4
+ t.references :variant, foreign_key: { to_table: :spree_variants }, null: true, index: true
5
+ t.references :order, foreign_key: { to_table: :spree_orders }, null: true, index: true
6
+ t.references :event, foreign_key: { to_table: :spree_taxons }, null: true, index: true
7
+ t.string :email, index: true
8
+ t.integer :quantity, default: 1
9
+ t.string :token, null: false, unique: true, index: true
10
+ t.integer :invite_type, default: 0
11
+ t.integer :claimed_status, default: 0
12
+ t.string :issued_to
13
+ t.datetime :expiration_date
14
+ t.text :remark
15
+ t.datetime :expires_at
16
+ t.datetime :claimed_at
17
+ t.datetime :email_send_at
18
+ t.timestamps
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.12.0'.freeze
2
+ VERSION = '1.13.0'.freeze
3
3
 
4
4
  module_function
5
5
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.0
4
+ version: 1.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-26 00:00:00.000000000 Z
11
+ date: 2025-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -779,6 +779,7 @@ files:
779
779
  - app/controllers/spree/api/v2/operator/taxons_controller.rb
780
780
  - app/controllers/spree/api/v2/organizer/base_controller.rb
781
781
  - app/controllers/spree/api/v2/organizer/images_controller.rb
782
+ - app/controllers/spree/api/v2/organizer/invite_guests_controller.rb
782
783
  - app/controllers/spree/api/v2/organizer/invites_controller.rb
783
784
  - app/controllers/spree/api/v2/organizer/s3_signed_urls_controller.rb
784
785
  - app/controllers/spree/api/v2/organizer/ticket_images_controller.rb
@@ -1034,6 +1035,7 @@ files:
1034
1035
  - app/interactors/spree_cm_commissioner/order_accepted_state_updater.rb
1035
1036
  - app/interactors/spree_cm_commissioner/order_complete_notification_sender.rb
1036
1037
  - app/interactors/spree_cm_commissioner/order_complete_telegram_sender.rb
1038
+ - app/interactors/spree_cm_commissioner/order_importer/multi_guest.rb
1037
1039
  - app/interactors/spree_cm_commissioner/order_importer/single_guest.rb
1038
1040
  - app/interactors/spree_cm_commissioner/order_rejected_notification_sender.rb
1039
1041
  - app/interactors/spree_cm_commissioner/order_rejected_state_updater.rb
@@ -1211,6 +1213,7 @@ files:
1211
1213
  - app/models/spree_cm_commissioner/import.rb
1212
1214
  - app/models/spree_cm_commissioner/imports/import_order.rb
1213
1215
  - app/models/spree_cm_commissioner/invite.rb
1216
+ - app/models/spree_cm_commissioner/invite_guest.rb
1214
1217
  - app/models/spree_cm_commissioner/invite_user_event.rb
1215
1218
  - app/models/spree_cm_commissioner/invite_user_taxon.rb
1216
1219
  - app/models/spree_cm_commissioner/invoice.rb
@@ -1498,6 +1501,7 @@ files:
1498
1501
  - app/serializers/spree/v2/organizer/asset_serializer.rb
1499
1502
  - app/serializers/spree/v2/organizer/base_serializer.rb
1500
1503
  - app/serializers/spree/v2/organizer/image_serializer.rb
1504
+ - app/serializers/spree/v2/organizer/invite_guest_serializer.rb
1501
1505
  - app/serializers/spree/v2/organizer/invite_serializer.rb
1502
1506
  - app/serializers/spree/v2/organizer/s3_signed_url_serializer.rb
1503
1507
  - app/serializers/spree/v2/organizer/taxon_serializer.rb
@@ -2405,6 +2409,7 @@ files:
2405
2409
  - db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
2406
2410
  - db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
2407
2411
  - db/migrate/20250418072528_add_nested_set_columns_to_places.rb
2412
+ - db/migrate/20250422014417_create_spree_cm_commissioner_invite_guest.rb
2408
2413
  - db/migrate/20250425084929_add_description_to_spree_prototypes.rb
2409
2414
  - db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
2410
2415
  - db/migrate/20250428025645_add_slug_to_spree_prototypes.rb