spree_cm_commissioner 2.3.0.pre.pre4 → 2.3.0.pre.pre6
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/seat_layouts_controller.rb +48 -0
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +4 -0
- data/app/jobs/spree_cm_commissioner/seats/bulk_release_on_hold_blocks_job.rb +26 -0
- data/app/jobs/spree_cm_commissioner/seats/release_expired_blocks_job.rb +23 -0
- data/app/models/concerns/spree_cm_commissioner/event_metadata.rb +12 -4
- data/app/models/spree_cm_commissioner/block.rb +10 -1
- data/app/models/spree_cm_commissioner/guest.rb +14 -0
- data/app/models/spree_cm_commissioner/seat_layout.rb +10 -6
- data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +2 -0
- data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +2 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -1
- data/app/request_schemas/spree_cm_commissioner/seat_layout_schema.rb +7 -0
- data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/block_serializer.rb +1 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/seat_layout_serializer.rb +5 -2
- data/app/services/spree_cm_commissioner/seats/bulk_release_on_hold_blocks.rb +42 -0
- data/app/services/spree_cm_commissioner/seats/release_expired_blocks.rb +34 -0
- data/config/routes.rb +1 -1
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d30ecd3195208c3763b429a17013f18a5582fd162581838135ae0736e8e7be60
|
|
4
|
+
data.tar.gz: d11dea0d955b0f7d6d2b62ed907d1b3996d34a89789b705192068b5941e8b9ac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c1a81f26c31ca303b364d34f8976ecb53d5b924d1515ba633085975c4297772f63ef780ccd93e300cd01f310bb59708cf7386993bd081897a69c8baee84d7828
|
|
7
|
+
data.tar.gz: 3a5fcd628e1698a57a7a3e43da83ff2dfe43831feccd5b41a385ec1405b22c3da4867a89eaed3fdc4ceefd57f7c893ae42e28dc6075746dad78512159d09eb5f
|
data/Gemfile.lock
CHANGED
|
@@ -8,6 +8,32 @@ module Spree
|
|
|
8
8
|
module V2
|
|
9
9
|
module Storefront
|
|
10
10
|
class SeatLayoutsController < Spree::Api::V2::ResourceController
|
|
11
|
+
# GET /api/v2/storefront/seat_layouts/:id
|
|
12
|
+
# - include_details=true|false (optional, default: true)
|
|
13
|
+
def show
|
|
14
|
+
render_serialized_payload { serialize_resource(resource) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# This method is used by index:
|
|
18
|
+
# GET /api/v2/storefront/seat_layouts?
|
|
19
|
+
# - variant_ids[]=[1,2]
|
|
20
|
+
# - include_details=true|false (optional, default: true)
|
|
21
|
+
#
|
|
22
|
+
# override
|
|
23
|
+
def collection
|
|
24
|
+
return @collection if defined?(@collection)
|
|
25
|
+
|
|
26
|
+
scope = if include_details?
|
|
27
|
+
SpreeCmCommissioner::SeatLayout.active.includes(:top_level_blocks, seat_sections: :blocks)
|
|
28
|
+
else
|
|
29
|
+
SpreeCmCommissioner::SeatLayout.active
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
@collection = scope.joins(:blocks)
|
|
33
|
+
.where(blocks: { variant_id: params[:variant_ids] })
|
|
34
|
+
.distinct
|
|
35
|
+
end
|
|
36
|
+
|
|
11
37
|
# override
|
|
12
38
|
def resource
|
|
13
39
|
SpreeCmCommissioner::SeatLayout.includes(
|
|
@@ -25,10 +51,32 @@ module Spree
|
|
|
25
51
|
]
|
|
26
52
|
end
|
|
27
53
|
|
|
54
|
+
# override
|
|
55
|
+
def required_schema
|
|
56
|
+
return nil unless action_name == 'index'
|
|
57
|
+
|
|
58
|
+
SpreeCmCommissioner::SeatLayoutSchema
|
|
59
|
+
end
|
|
60
|
+
|
|
28
61
|
# override
|
|
29
62
|
def resource_serializer
|
|
30
63
|
SpreeCmCommissioner::V2::Storefront::SeatLayoutSerializer
|
|
31
64
|
end
|
|
65
|
+
|
|
66
|
+
# override
|
|
67
|
+
def collection_serializer
|
|
68
|
+
SpreeCmCommissioner::V2::Storefront::SeatLayoutSerializer
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# override
|
|
72
|
+
def serializer_params
|
|
73
|
+
super.merge(include_details: include_details?)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# default return true
|
|
77
|
+
def include_details?
|
|
78
|
+
params.fetch(:include_details, 'true') == 'true'
|
|
79
|
+
end
|
|
32
80
|
end
|
|
33
81
|
end
|
|
34
82
|
end
|
|
@@ -25,6 +25,10 @@ module SpreeCmCommissioner
|
|
|
25
25
|
# Why? Clamping masks bugs in Redis deduction. If Redis deducted 5 but this
|
|
26
26
|
# job tries to deduct 10, clamping silently loses the 5-unit discrepancy.
|
|
27
27
|
# Validation errors are better than silent data loss.
|
|
28
|
+
#
|
|
29
|
+
# ❌ DO NOT use increment! because it skips model validations.
|
|
30
|
+
# We need validations to run so negative quantities are caught and surfaced
|
|
31
|
+
# as errors, not silently allowed by the database.
|
|
28
32
|
inventory_item.update!(quantity_available: inventory_item.quantity_available + quantity)
|
|
29
33
|
end
|
|
30
34
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module Seats
|
|
3
|
+
class BulkReleaseOnHoldBlocksJob < ApplicationJob
|
|
4
|
+
queue_as :default
|
|
5
|
+
|
|
6
|
+
# Thin wrapper that calls BulkReleaseOnHoldBlocks service.
|
|
7
|
+
# Handles error logging and re-raising for Sidekiq retries.
|
|
8
|
+
#
|
|
9
|
+
# Args:
|
|
10
|
+
# cutoff_days: Number of days before considering a block "stale" (default: 7)
|
|
11
|
+
def perform(cutoff_days = 7)
|
|
12
|
+
SpreeCmCommissioner::Seats::BulkReleaseOnHoldBlocks.new(cutoff_days: cutoff_days).call
|
|
13
|
+
rescue StandardError => e
|
|
14
|
+
CmAppLogger.error(
|
|
15
|
+
label: 'SpreeCmCommissioner::Seats::BulkReleaseOnHoldBlocksJob#perform',
|
|
16
|
+
data: {
|
|
17
|
+
error_class: e.class.name,
|
|
18
|
+
error_message: e.message,
|
|
19
|
+
backtrace: e.backtrace&.first(10)&.join("\n")
|
|
20
|
+
}
|
|
21
|
+
)
|
|
22
|
+
raise
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module Seats
|
|
3
|
+
class ReleaseExpiredBlocksJob < ApplicationJob
|
|
4
|
+
queue_as :default
|
|
5
|
+
|
|
6
|
+
# Thin wrapper that calls ReleaseExpiredBlocks service.
|
|
7
|
+
# Handles error logging and re-raising for Sidekiq retries.
|
|
8
|
+
def perform
|
|
9
|
+
SpreeCmCommissioner::Seats::ReleaseExpiredBlocks.new.call
|
|
10
|
+
rescue StandardError => e
|
|
11
|
+
CmAppLogger.error(
|
|
12
|
+
label: 'SpreeCmCommissioner::Seats::ReleaseExpiredBlocksJob#perform',
|
|
13
|
+
data: {
|
|
14
|
+
error_class: e.class.name,
|
|
15
|
+
error_message: e.message,
|
|
16
|
+
backtrace: e.backtrace&.first(10)&.join("\n")
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
raise
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -13,10 +13,18 @@ module SpreeCmCommissioner
|
|
|
13
13
|
# For certain large events, admin can disable this manually.
|
|
14
14
|
store_public_metadata :allow_manual_search_for_operator, :boolean, default: true
|
|
15
15
|
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
|
|
16
|
+
# ⚠️ CRITICAL: Cached seat layout IDs kept in sync by SeatLayout callback.
|
|
17
|
+
# If callback is removed/modified without updating this, availability checks will fail.
|
|
18
|
+
#
|
|
19
|
+
# Sync callback (see seat_layout.rb:L26-35):
|
|
20
|
+
# after_commit :sync_seat_layout_id_to_layoutable!, if: -> { layoutable.present? }
|
|
21
|
+
# def sync_seat_layout_id_to_layoutable!
|
|
22
|
+
# layoutable.update!(preload_seat_layout_ids: layoutable.seat_layouts.pluck(:id))
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# TODO: Not scalable for many seat layouts. Consider storing boolean flag
|
|
26
|
+
# (has_active_seat_layout) instead when seat layouts become frequent.
|
|
27
|
+
store_public_metadata :preload_seat_layout_ids, :array, default: []
|
|
20
28
|
|
|
21
29
|
before_validation :validate_at_least_one_check_in_flow_presence
|
|
22
30
|
end
|
|
@@ -6,6 +6,7 @@ module SpreeCmCommissioner
|
|
|
6
6
|
driver: 3,
|
|
7
7
|
bathroom: 4,
|
|
8
8
|
text: 5,
|
|
9
|
+
standing: 6,
|
|
9
10
|
other: 0
|
|
10
11
|
}
|
|
11
12
|
|
|
@@ -27,17 +28,25 @@ module SpreeCmCommissioner
|
|
|
27
28
|
before_validation :assign_layout_from_section, if: -> { seat_layout.nil? && seat_section.present? }
|
|
28
29
|
|
|
29
30
|
def label_required?
|
|
30
|
-
|
|
31
|
+
sellable? || %w[other text].include?(block_type.to_s)
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
def self.seatable?(block_type)
|
|
34
35
|
block_type.to_s.in?(%w[sleeping_seat seat])
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
def self.sellable?(block_type)
|
|
39
|
+
seatable?(block_type) || block_type.to_s == 'standing'
|
|
40
|
+
end
|
|
41
|
+
|
|
37
42
|
def seatable?
|
|
38
43
|
self.class.seatable?(block_type)
|
|
39
44
|
end
|
|
40
45
|
|
|
46
|
+
def sellable?
|
|
47
|
+
self.class.sellable?(block_type)
|
|
48
|
+
end
|
|
49
|
+
|
|
41
50
|
def assign_layout_from_section
|
|
42
51
|
self.seat_layout = seat_section.seat_layout
|
|
43
52
|
end
|
|
@@ -80,6 +80,20 @@ module SpreeCmCommissioner
|
|
|
80
80
|
]
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
+
# Only allow holding a block if it represents a seat.
|
|
84
|
+
# Other block types, like standing, don’t need a hold.
|
|
85
|
+
# Use the variant's inventory item to track availability instead.
|
|
86
|
+
def can_hold_block?
|
|
87
|
+
block.present? && block.seatable?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Only allow holding a block if it represents a seat.
|
|
91
|
+
# Other block types, like standing, don’t need a hold.
|
|
92
|
+
# Use the variant's inventory item to track availability instead.
|
|
93
|
+
def can_reserve_block?
|
|
94
|
+
block.present? && block.seatable?
|
|
95
|
+
end
|
|
96
|
+
|
|
83
97
|
# no validation for each field as we allow user to save data to model partially.
|
|
84
98
|
def allowed_checkout?
|
|
85
99
|
kyc_fields.all? { |field| allowed_checkout_for?(field) }
|
|
@@ -23,17 +23,21 @@ module SpreeCmCommissioner
|
|
|
23
23
|
|
|
24
24
|
accepts_nested_attributes_for :seat_sections, :top_level_blocks, allow_destroy: true
|
|
25
25
|
|
|
26
|
+
# ⚠️ CRITICAL: Syncs preload_seat_layout_ids metadata to layoutable.
|
|
27
|
+
# DO NOT REMOVE without implementing alternative sync (see event_metadata.rb:L16-24).
|
|
26
28
|
after_commit :sync_seat_layout_id_to_layoutable!, if: -> { layoutable.present? }
|
|
27
29
|
|
|
28
30
|
private
|
|
29
31
|
|
|
30
|
-
# layoutable (taxon, vehicle) must have preload_seat_layout_id attribute,
|
|
31
|
-
# either as a column or as a key in a JSONB column (e.g., metadata)
|
|
32
32
|
def sync_seat_layout_id_to_layoutable!
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
# Update layoutable's seat layout metadata after any change (create/update/destroy).
|
|
34
|
+
# This keeps the cache in sync with the actual seat_layouts association.
|
|
35
|
+
if layoutable.respond_to?(:seat_layouts)
|
|
36
|
+
# Event has many seat layouts: cache all IDs for quick availability checks.
|
|
37
|
+
layoutable.update!(preload_seat_layout_ids: layoutable.seat_layouts.pluck(:id))
|
|
38
|
+
elsif layoutable.respond_to?(:seat_layout)
|
|
39
|
+
# Taxon/Vehicle has single seat layout: cache the ID (or nil if destroyed).
|
|
40
|
+
layoutable.update!(preload_seat_layout_id: destroyed? ? nil : id)
|
|
37
41
|
end
|
|
38
42
|
end
|
|
39
43
|
end
|
|
@@ -24,6 +24,8 @@ module SpreeCmCommissioner
|
|
|
24
24
|
|
|
25
25
|
ActiveRecord::Base.transaction do
|
|
26
26
|
guests_with_blocks.each do |guest|
|
|
27
|
+
next unless guest.can_hold_block?
|
|
28
|
+
|
|
27
29
|
inventory_items.each do |inventory_item|
|
|
28
30
|
reserved_blocks << hold_specific_block!(inventory_item, guest)
|
|
29
31
|
end
|
|
@@ -21,7 +21,7 @@ module SpreeCmCommissioner
|
|
|
21
21
|
base.has_many :check_ins, as: :checkinable, class_name: 'SpreeCmCommissioner::CheckIn', dependent: :nullify
|
|
22
22
|
base.has_many :customer_taxons, class_name: 'SpreeCmCommissioner::CustomerTaxon'
|
|
23
23
|
|
|
24
|
-
base.
|
|
24
|
+
base.has_many :seat_layouts, as: :layoutable, class_name: 'SpreeCmCommissioner::SeatLayout', dependent: :destroy
|
|
25
25
|
base.has_one :category_icon, as: :viewable, dependent: :destroy, class_name: 'SpreeCmCommissioner::TaxonCategoryIcon'
|
|
26
26
|
|
|
27
27
|
base.has_one :web_banner, as: :viewable, dependent: :destroy, class_name: 'SpreeCmCommissioner::TaxonWebBanner'
|
|
@@ -18,7 +18,7 @@ module Spree
|
|
|
18
18
|
:purchasable_on, :vendor_id, :available_on, :hide_video_banner
|
|
19
19
|
|
|
20
20
|
# To get full seat layout details, call the seat_layouts API with this ID.
|
|
21
|
-
base.attribute :
|
|
21
|
+
base.attribute :seat_layout_ids, &:preload_seat_layout_ids
|
|
22
22
|
|
|
23
23
|
base.attribute :purchasable_on_app do |taxon|
|
|
24
24
|
taxon.purchasable_on == 'app' || taxon.purchasable_on == 'both'
|
|
@@ -4,8 +4,11 @@ module SpreeCmCommissioner
|
|
|
4
4
|
class SeatLayoutSerializer < BaseSerializer
|
|
5
5
|
attributes :name, :status, :width, :height
|
|
6
6
|
|
|
7
|
-
has_many :seat_sections, serializer: SpreeCmCommissioner::V2::Storefront::SeatSectionSerializer
|
|
8
|
-
|
|
7
|
+
has_many :seat_sections, serializer: SpreeCmCommissioner::V2::Storefront::SeatSectionSerializer,
|
|
8
|
+
if: proc { |_, params| params && params[:include_details] == true }
|
|
9
|
+
|
|
10
|
+
has_many :top_level_blocks, serializer: SpreeCmCommissioner::V2::Storefront::BlockSerializer,
|
|
11
|
+
if: proc { |_, params| params && params[:include_details] == true }
|
|
9
12
|
end
|
|
10
13
|
end
|
|
11
14
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module Seats
|
|
3
|
+
class BulkReleaseOnHoldBlocks
|
|
4
|
+
def initialize(cutoff_days: 7)
|
|
5
|
+
@cutoff_days = cutoff_days
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Bulk releases stale on_hold blocks as a housekeeping job.
|
|
9
|
+
# Runs weekly to catch any blocks that didn't expire properly.
|
|
10
|
+
#
|
|
11
|
+
# This is a FULL release - releases ALL on_hold blocks older than cutoff_days.
|
|
12
|
+
# Complements ReleaseExpiredBlocks which runs every 5 minutes.
|
|
13
|
+
def call
|
|
14
|
+
cutoff_time = @cutoff_days.days.ago
|
|
15
|
+
|
|
16
|
+
stale_blocks = SpreeCmCommissioner::ReservedBlock
|
|
17
|
+
.on_hold
|
|
18
|
+
.where('created_at < ?', cutoff_time)
|
|
19
|
+
|
|
20
|
+
count = stale_blocks.count
|
|
21
|
+
|
|
22
|
+
# Transition all stale blocks to canceled status
|
|
23
|
+
stale_blocks.update_all( # rubocop:disable Rails/SkipsModelValidations
|
|
24
|
+
status: :canceled,
|
|
25
|
+
expired_at: nil,
|
|
26
|
+
updated_by_id: nil,
|
|
27
|
+
updated_at: Time.current
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
CmAppLogger.log(
|
|
31
|
+
label: 'SpreeCmCommissioner::Seats::BulkReleaseOnHoldBlocks#call',
|
|
32
|
+
data: {
|
|
33
|
+
released_count: count,
|
|
34
|
+
cutoff_days: @cutoff_days,
|
|
35
|
+
cutoff_time: cutoff_time,
|
|
36
|
+
job_type: 'bulk_release'
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module Seats
|
|
3
|
+
class ReleaseExpiredBlocks
|
|
4
|
+
# Releases blocks that have expired (hold time exceeded).
|
|
5
|
+
# Runs every 5 minutes to keep expired holds from accumulating.
|
|
6
|
+
#
|
|
7
|
+
# This is a PARTIAL release - only releases blocks where expired_at has passed.
|
|
8
|
+
# Complements BulkReleaseOnHoldBlocks which does weekly housekeeping.
|
|
9
|
+
def call
|
|
10
|
+
expired_blocks = SpreeCmCommissioner::ReservedBlock
|
|
11
|
+
.on_hold
|
|
12
|
+
.where('expired_at <= ?', Time.current)
|
|
13
|
+
|
|
14
|
+
count = expired_blocks.count
|
|
15
|
+
|
|
16
|
+
# Transition all expired blocks to canceled status
|
|
17
|
+
expired_blocks.update_all( # rubocop:disable Rails/SkipsModelValidations
|
|
18
|
+
status: :canceled,
|
|
19
|
+
expired_at: nil,
|
|
20
|
+
updated_by: nil,
|
|
21
|
+
updated_at: Time.current
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
CmAppLogger.log(
|
|
25
|
+
label: 'SpreeCmCommissioner::Seats::ReleaseExpiredBlocks#call',
|
|
26
|
+
data: {
|
|
27
|
+
released_count: count,
|
|
28
|
+
job_type: 'partial_release'
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/config/routes.rb
CHANGED
|
@@ -674,7 +674,7 @@ Spree::Core::Engine.add_routes do
|
|
|
674
674
|
post :user_order_transfer, to: 'user_order_transfer#create'
|
|
675
675
|
resources :anonymous_orders, path: 'o', only: %i[show]
|
|
676
676
|
|
|
677
|
-
resources :seat_layouts, only: %i[show]
|
|
677
|
+
resources :seat_layouts, only: %i[show index]
|
|
678
678
|
resources :inventory_items, only: %i[index]
|
|
679
679
|
namespace :transit do
|
|
680
680
|
resources :draft_orders, only: %i[create]
|
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.3.0.pre.
|
|
4
|
+
version: 2.3.0.pre.pre6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- You
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-10-
|
|
11
|
+
date: 2025-10-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: spree
|
|
@@ -1309,6 +1309,8 @@ files:
|
|
|
1309
1309
|
- app/jobs/spree_cm_commissioner/product_event_id_to_children_syncer_job.rb
|
|
1310
1310
|
- app/jobs/spree_cm_commissioner/queue_order_webhooks_requests_job.rb
|
|
1311
1311
|
- app/jobs/spree_cm_commissioner/reports_assigner_job.rb
|
|
1312
|
+
- app/jobs/spree_cm_commissioner/seats/bulk_release_on_hold_blocks_job.rb
|
|
1313
|
+
- app/jobs/spree_cm_commissioner/seats/release_expired_blocks_job.rb
|
|
1312
1314
|
- app/jobs/spree_cm_commissioner/sms_job.rb
|
|
1313
1315
|
- app/jobs/spree_cm_commissioner/sms_pin_code_job.rb
|
|
1314
1316
|
- app/jobs/spree_cm_commissioner/state_job.rb
|
|
@@ -1738,6 +1740,7 @@ files:
|
|
|
1738
1740
|
- app/request_schemas/spree_cm_commissioner/application_request_schema.rb
|
|
1739
1741
|
- app/request_schemas/spree_cm_commissioner/inventory_item_schema.rb
|
|
1740
1742
|
- app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
|
|
1743
|
+
- app/request_schemas/spree_cm_commissioner/seat_layout_schema.rb
|
|
1741
1744
|
- app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb
|
|
1742
1745
|
- app/request_schemas/spree_cm_commissioner/user_account_linkage_request_schema.rb
|
|
1743
1746
|
- app/request_schemas/spree_cm_commissioner/user_profile_request_schema.rb
|
|
@@ -1946,6 +1949,8 @@ files:
|
|
|
1946
1949
|
- app/services/spree_cm_commissioner/role_permissions_constructor.rb
|
|
1947
1950
|
- app/services/spree_cm_commissioner/role_permissions_loader.rb
|
|
1948
1951
|
- app/services/spree_cm_commissioner/rsa_service.rb
|
|
1952
|
+
- app/services/spree_cm_commissioner/seats/bulk_release_on_hold_blocks.rb
|
|
1953
|
+
- app/services/spree_cm_commissioner/seats/release_expired_blocks.rb
|
|
1949
1954
|
- app/services/spree_cm_commissioner/seeds/roles_decorator.rb
|
|
1950
1955
|
- app/services/spree_cm_commissioner/transit/base_route_order_metrics_updater.rb
|
|
1951
1956
|
- app/services/spree_cm_commissioner/transit/legs_builder_service.rb
|