spree_cm_commissioner 1.10.0.pre.pre1 → 1.10.0.pre.hotfix.pre.sms
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/.github/workflows/test_and_build_gem.yml +48 -26
- data/.gitignore +1 -2
- data/.vscode/settings.json +1 -1
- data/Gemfile.lock +1 -22
- data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -17
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
- data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
- data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
- data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
- data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
- data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
- data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
- data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
- data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
- data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
- data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +2 -2
- data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -26
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
- data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
- data/app/models/spree_cm_commissioner/place.rb +11 -2
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
- data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
- data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
- data/app/models/spree_cm_commissioner/trip.rb +0 -11
- data/app/models/spree_cm_commissioner/trip_connection.rb +1 -0
- data/app/models/spree_cm_commissioner/trip_stop.rb +12 -5
- data/app/models/spree_cm_commissioner/variant_decorator.rb +28 -25
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -14
- data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +2 -1
- data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
- data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +7 -0
- data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
- data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
- data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
- data/app/queries/spree_cm_commissioner/trip_query.rb +11 -11
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
- data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
- data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
- data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
- data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
- data/app/views/spree/admin/stock_managements/index.html.erb +5 -31
- data/config/routes.rb +4 -11
- data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
- data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +9 -0
- data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +9 -0
- data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
- data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
- data/docker-compose.yml +1 -1
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +2 -2
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
- data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
- data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -28
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +0 -34
- data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
- data/lib/tasks/update_orphan_root_places.rake +7 -0
- data/spree_cm_commissioner.gemspec +0 -5
- metadata +22 -69
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -71
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
- data/app/models/spree_cm_commissioner/inventory.rb +0 -11
- data/app/models/spree_cm_commissioner/inventory_item.rb +0 -37
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -114
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -42
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
- data/app/models/spree_cm_commissioner/stock_movement_decorator.rb +0 -34
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
- data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -17
- data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -32
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
- data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -34,11 +34,11 @@ module SpreeCmCommissioner
|
|
34
34
|
trips.vehicle_id AS vehicle_id'
|
35
35
|
)
|
36
36
|
.joins('INNER JOIN cm_trips AS trips ON trips.variant_id = spree_variants.id')
|
37
|
-
.joins('INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id =
|
38
|
-
.joins('INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id =
|
37
|
+
.joins('INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = spree_variants.id AND boarding.stop_type = 0')
|
38
|
+
.joins('INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = spree_variants.id AND drop_off.stop_type = 1')
|
39
39
|
.joins('INNER JOIN spree_vendors AS vendors ON vendors.id = spree_variants.vendor_id')
|
40
40
|
.joins('INNER JOIN spree_products AS routes ON routes.id = spree_variants.product_id')
|
41
|
-
.where('
|
41
|
+
.where('boarding.stop_id = ? AND drop_off.stop_id = ?', origin_id, destination_id)
|
42
42
|
|
43
43
|
result.map do |trip|
|
44
44
|
trip_result_options = {
|
@@ -69,9 +69,9 @@ module SpreeCmCommissioner
|
|
69
69
|
INNER JOIN spree_products AS routes2 ON routes2.id = variant2.product_id
|
70
70
|
INNER JOIN cm_trips AS trip1 ON trip1.variant_id = cm_trip_connections.from_trip_id
|
71
71
|
INNER JOIN cm_trips AS trip2 ON trip2.variant_id = cm_trip_connections.to_trip_id
|
72
|
-
INNER JOIN
|
73
|
-
INNER JOIN
|
74
|
-
INNER JOIN
|
72
|
+
INNER JOIN cm_trip_stops trip1_origin ON trip1_origin.trip_id = variant1.id AND trip1_origin.stop_type = 0
|
73
|
+
INNER JOIN cm_trip_stops trip2_origin ON trip2_origin.trip_id = variant2.id AND trip2_origin.stop_type = 0
|
74
|
+
INNER JOIN cm_trip_stops trip2_destination ON trip2_destination.trip_id = variant2.id AND trip2_destination.stop_type = 1
|
75
75
|
INNER JOIN spree_vendors AS vendor1 ON vendor1.id = variant1.vendor_id
|
76
76
|
INNER JOIN spree_vendors AS vendor2 ON vendor2.id = variant2.vendor_id'
|
77
77
|
)
|
@@ -93,12 +93,12 @@ module SpreeCmCommissioner
|
|
93
93
|
trip2.vehicle_id AS trip2_vehicle,
|
94
94
|
routes2.short_name AS route2_short_name,
|
95
95
|
routes2.name AS route2_name,
|
96
|
-
trip1_origin.
|
97
|
-
trip2_origin.
|
98
|
-
trip2_destination.
|
96
|
+
trip1_origin.stop_name AS trip1_origin,
|
97
|
+
trip2_origin.stop_name AS trip2_origin,
|
98
|
+
trip2_destination.stop_name AS trip2_destination,
|
99
99
|
vendor2.name AS trip2_vendor_name'
|
100
|
-
)
|
101
|
-
|
100
|
+
).where('trip1_origin.stop_id = ? AND trip2_destination.stop_id = ?', origin_id, destination_id
|
101
|
+
).uniq
|
102
102
|
|
103
103
|
return [] if result.blank?
|
104
104
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module VariantAvailability
|
3
|
+
class NonPermanentStockQuery
|
4
|
+
attr_reader :variant, :except_line_item_id, :error_message
|
5
|
+
|
6
|
+
def initialize(variant:, except_line_item_id: nil)
|
7
|
+
@variant = variant
|
8
|
+
@except_line_item_id = except_line_item_id
|
9
|
+
@error_message = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def available?(quantity)
|
13
|
+
reserve_variants =
|
14
|
+
Spree::LineItem
|
15
|
+
.complete
|
16
|
+
.select('(SUM(DISTINCT spree_stock_items.count_on_hand) - SUM(spree_line_items.quantity)) AS available_quantity')
|
17
|
+
.joins(variant: :stock_items)
|
18
|
+
.where(variant_id: variant.id)
|
19
|
+
.where.not(id: except_line_item_id)
|
20
|
+
.group(:variant_id)
|
21
|
+
|
22
|
+
# there is a case when variant does not have any purchaces yet, it will return empty & always available true.
|
23
|
+
# in this case, we check with stock items directly.
|
24
|
+
|
25
|
+
available_quantity = if reserve_variants.any?
|
26
|
+
reserve_variants.sum(&:available_quantity)
|
27
|
+
else
|
28
|
+
variant.stock_items.sum(:count_on_hand)
|
29
|
+
end
|
30
|
+
if available_quantity >= quantity
|
31
|
+
true
|
32
|
+
elsif available_quantity == 1
|
33
|
+
@error_message = I18n.t('variant_availability.item_available_instock')
|
34
|
+
false
|
35
|
+
elsif available_quantity <= 0
|
36
|
+
@error_message = I18n.t('variant_availability.items_out_of_stock')
|
37
|
+
false
|
38
|
+
else
|
39
|
+
@error_message = I18n.t('variant_availability.items_available_instock', available_quantity: available_quantity)
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module VariantAvailability
|
3
|
+
class PermanentStockQuery
|
4
|
+
attr_reader :variant, :from_date, :to_date, :except_line_item_id
|
5
|
+
|
6
|
+
def initialize(variant:, from_date:, to_date:, except_line_item_id: nil)
|
7
|
+
@variant = variant
|
8
|
+
@from_date = from_date
|
9
|
+
@to_date = to_date
|
10
|
+
@except_line_item_id = except_line_item_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def available?(quantity)
|
14
|
+
(from_date..from_date).all? do |booking_date|
|
15
|
+
booked_date_quantity[booking_date].nil? ||
|
16
|
+
(booked_date_quantity[booking_date] - quantity) >= 0
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def booked_date_quantity
|
21
|
+
dates_sql = ApplicationRecord.sanitize_sql_array(
|
22
|
+
[
|
23
|
+
'SELECT date FROM generate_series(?::date, ?::date, ?) AS date',
|
24
|
+
from_date,
|
25
|
+
to_date,
|
26
|
+
date_interval
|
27
|
+
]
|
28
|
+
)
|
29
|
+
|
30
|
+
@booked_variants ||=
|
31
|
+
Spree::LineItem
|
32
|
+
.complete
|
33
|
+
.select(
|
34
|
+
'(SUM(DISTINCT spree_stock_items.count_on_hand) - SUM(spree_line_items.quantity)) AS available_quantity',
|
35
|
+
'dates.date AS reservation_date'
|
36
|
+
)
|
37
|
+
.joins(variant: :stock_items)
|
38
|
+
.where(variant_id: variant.id)
|
39
|
+
.where.not(id: except_line_item_id)
|
40
|
+
.joins("INNER JOIN (#{dates_sql}) dates ON dates.date >= spree_line_items.from_date AND dates.date < spree_line_items.to_date")
|
41
|
+
.group(:variant_id, :reservation_date)
|
42
|
+
.order(:reservation_date)
|
43
|
+
.each_with_object({}) do |record, hash|
|
44
|
+
hash[record.reservation_date.to_date] = record.available_quantity
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# override this for product that have
|
49
|
+
# different date time interval than 1 day.
|
50
|
+
def date_interval
|
51
|
+
'1 day'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
class VendorStopPlaceQuery
|
3
|
+
attr_reader :query, :vendor_id, :stop_type, :reference_stop_id
|
4
|
+
|
5
|
+
def initialize(query:, vendor_id:, stop_type: :boarding, reference_stop_id: nil)
|
6
|
+
@query = query.to_s.strip
|
7
|
+
@vendor_id = vendor_id
|
8
|
+
@stop_type = stop_type
|
9
|
+
@reference_stop_id = reference_stop_id
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
results = vendor_stops
|
14
|
+
return [] if results.empty?
|
15
|
+
|
16
|
+
places = results.includes(:stop).map(&:stop).compact.uniq
|
17
|
+
|
18
|
+
format_places(places)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def vendor_stops
|
24
|
+
scope = base_scope
|
25
|
+
return scope if query.blank?
|
26
|
+
|
27
|
+
scope = scope.where.not(stop_id: reference_stop_id) if reference_stop_id.present?
|
28
|
+
scope.where('cm_places.name ILIKE ?', "%#{query}%")
|
29
|
+
end
|
30
|
+
|
31
|
+
def base_scope
|
32
|
+
SpreeCmCommissioner::VendorStop
|
33
|
+
.joins(:stop)
|
34
|
+
.where(vendor_id: vendor_id)
|
35
|
+
.where(stop_type: stop_type)
|
36
|
+
.order(trip_count: :desc)
|
37
|
+
.where.not(trip_count: 0)
|
38
|
+
end
|
39
|
+
|
40
|
+
def format_places(places)
|
41
|
+
places
|
42
|
+
.sort_by { |p| [-p.depth, -p.lft] }
|
43
|
+
.filter_map do |place|
|
44
|
+
next if place.depth.zero?
|
45
|
+
|
46
|
+
{
|
47
|
+
id: place.id,
|
48
|
+
parent_id: place.parent_id,
|
49
|
+
name: place.self_and_ancestors.map(&:name).reverse.join(', ')
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -3,9 +3,6 @@ module SpreeCmCommissioner
|
|
3
3
|
params do
|
4
4
|
required(:from_date).value(:date)
|
5
5
|
required(:to_date).value(:date)
|
6
|
-
required(:state_id).value(:integer)
|
7
|
-
required(:number_of_adults).value(:integer)
|
8
|
-
required(:number_of_kids).value(:integer)
|
9
6
|
end
|
10
7
|
|
11
8
|
rule(:from_date, :to_date) do
|
@@ -9,12 +9,10 @@ module Spree
|
|
9
9
|
|
10
10
|
attributes :total_inventory, :service_availabilities
|
11
11
|
|
12
|
-
# Deprecated
|
13
12
|
attribute :total_booking do |vendor|
|
14
13
|
vendor.respond_to?(:total_booking) ? vendor.total_booking : 0
|
15
14
|
end
|
16
15
|
|
17
|
-
# Deprecated
|
18
16
|
attribute :remaining do |vendor|
|
19
17
|
vendor.respond_to?(:remaining) ? vendor.remaining : vendor.total_inventory
|
20
18
|
end
|
@@ -13,6 +13,7 @@ module Spree
|
|
13
13
|
|
14
14
|
belongs_to :occupation, serializer: Spree::V2::Tenant::TaxonSerializer
|
15
15
|
belongs_to :nationality, serializer: Spree::V2::Tenant::TaxonSerializer
|
16
|
+
has_one :id_card, serializer: Spree::V2::Tenant::IdCardSerializer
|
16
17
|
|
17
18
|
# allowed_checkout updates frequently
|
18
19
|
cache_options store: nil
|
@@ -48,6 +48,8 @@ module SpreeCmCommissioner
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def fetch_option_value(guest, option_type_name)
|
51
|
+
return guest.formatted_bib_number if option_type_name == 'bib-prefix'
|
52
|
+
|
51
53
|
guest.line_item&.variant&.find_option_value_name_for(option_type_name: option_type_name)
|
52
54
|
end
|
53
55
|
|
@@ -25,9 +25,11 @@ module SpreeCmCommissioner
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.auth_context(params)
|
28
|
+
tenant_id = find_oauth_application(params)&.tenant_id
|
29
|
+
|
28
30
|
case flow_type(params)
|
29
31
|
when 'login_auth'
|
30
|
-
options = { login: params[:username], password: params[:password] }
|
32
|
+
options = { login: params[:username], password: params[:password], tenant_id: tenant_id }
|
31
33
|
SpreeCmCommissioner::UserPasswordAuthenticator.call(options)
|
32
34
|
when 'social_auth'
|
33
35
|
options = { id_token: params[:id_token] }
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<% content_for(:page_tabs) do %>
|
2
|
+
<% if can?(:admin, Spree::CmsPage) %>
|
3
|
+
<%= content_tag :li, class: 'nav-item' do %>
|
4
|
+
<%= link_to_with_icon 'building.svg',
|
5
|
+
Spree::Store.default&.name || Spree.t(:store),
|
6
|
+
admin_cms_pages_url(tab: :default),
|
7
|
+
class: "nav-link #{'active' if params[:tab].blank? || params[:tab] == 'default'}" %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<!-- Tenant Tabs -->
|
11
|
+
<% SpreeCmCommissioner::Tenant.all.each do |tenant| %>
|
12
|
+
<%= content_tag :li, class: 'nav-item' do %>
|
13
|
+
<%= link_to_with_icon 'building.svg',
|
14
|
+
tenant.name,
|
15
|
+
admin_cms_pages_url(tab: :tenants, tenant_id: tenant.id),
|
16
|
+
class: "nav-link #{'active' if params[:tenant_id].to_s == tenant.id.to_s}" %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
@@ -19,7 +19,10 @@
|
|
19
19
|
<% @variants.each do |variant| %>
|
20
20
|
<tr id="<%= spree_dom_id variant %>" data-hook="admin_product_stock_management_index_rows">
|
21
21
|
<td class="image text-center">
|
22
|
-
|
22
|
+
<%= small_image(variant) %>
|
23
|
+
<div class="mt-4">
|
24
|
+
Reserved Stock: <%= @reserved_stocks[variant.id] || 0 %></strong>
|
25
|
+
</div>
|
23
26
|
</td>
|
24
27
|
<td>
|
25
28
|
<%= variant.sku_and_options_text %>
|
@@ -32,37 +35,14 @@
|
|
32
35
|
<% end %>
|
33
36
|
</div>
|
34
37
|
<% end if can?(:update, @product) && can?(:update, variant) %>
|
35
|
-
|
36
|
-
<% if defined?(@reserved_stocks) %>
|
37
|
-
<div>
|
38
|
-
<span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
|
39
|
-
<%= svg_icon name: "cart-check.svg", width: '14', height: '14' %>
|
40
|
-
</span>
|
41
|
-
<%= label_tag "reserved_stock#{variant.id}", "Reserved Stock: #{@reserved_stocks[variant.id] || 0}", class: "m-0" %>
|
42
|
-
</div>
|
43
|
-
<% end %>
|
44
|
-
|
45
38
|
<% if variant.permanent_stock? %>
|
46
39
|
<div>
|
47
40
|
<span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
|
48
41
|
<%= svg_icon name: "info-circle-fill.svg", width: '14', height: '14' %>
|
49
42
|
</span>
|
50
|
-
<%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock)
|
43
|
+
<%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock) %>
|
51
44
|
</div>
|
52
45
|
<% end %>
|
53
|
-
|
54
|
-
<% if defined?(@inventory_items) %>
|
55
|
-
<% @inventory_items[variant.id]&.each do |inventory_item| %>
|
56
|
-
<div>
|
57
|
-
<%= svg_icon name: "handbag.svg", width: '14', height: '14' %>
|
58
|
-
<%= label_tag "max_capacity_#{ inventory_item.id }", "Max capacity: #{inventory_item.max_capacity}", class: "m-0" %>
|
59
|
-
</div>
|
60
|
-
<div>
|
61
|
-
<%= svg_icon name: "approve.svg", width: '14', height: '14' %>
|
62
|
-
<%= label_tag "quantity_available_#{ inventory_item.id }", "Quantity available: #{inventory_item.quantity_available}", class: "m-0" %>
|
63
|
-
</div>
|
64
|
-
<% end %>
|
65
|
-
<% end %>
|
66
46
|
</td>
|
67
47
|
|
68
48
|
<td colspan="3" class="stock_location_info">
|
@@ -73,9 +53,3 @@
|
|
73
53
|
</tbody>
|
74
54
|
</table>
|
75
55
|
</div>
|
76
|
-
|
77
|
-
<%= turbo_frame_tag "calendar", src: calendar_admin_product_stock_managements_path(year: params[:year]) do %>
|
78
|
-
<div class="spinner-border mt-2" role="status">
|
79
|
-
<span class="sr-only">Loading...</span>
|
80
|
-
</div>
|
81
|
-
<% end if @product.permanent_stock? %>
|
data/config/routes.rb
CHANGED
@@ -138,11 +138,7 @@ Spree::Core::Engine.add_routes do
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
resources :stock_managements
|
142
|
-
collection do
|
143
|
-
get :calendar
|
144
|
-
end
|
145
|
-
end
|
141
|
+
resources :stock_managements
|
146
142
|
|
147
143
|
resources :product_completion_steps do
|
148
144
|
collection do
|
@@ -520,11 +516,11 @@ Spree::Core::Engine.add_routes do
|
|
520
516
|
resource :reset_passwords, only: [:update]
|
521
517
|
resource :change_passwords, only: [:update]
|
522
518
|
resource :user_contacts, only: [:update]
|
519
|
+
|
520
|
+
resources :cms_pages, only: %i[index show]
|
523
521
|
end
|
524
522
|
|
525
523
|
namespace :storefront do
|
526
|
-
resources :inventory_item
|
527
|
-
|
528
524
|
resources :waiting_room_sessions, only: :create
|
529
525
|
resources :vattanac_banks, only: %i[create]
|
530
526
|
resource :cart, controller: :cart, only: %i[show create destroy] do
|
@@ -550,10 +546,7 @@ Spree::Core::Engine.add_routes do
|
|
550
546
|
resource :cart_guests, only: %i[create destroy]
|
551
547
|
resources :cart_payment_method_groups, only: %i[index]
|
552
548
|
|
553
|
-
resources :accommodations, only: %i[index show]
|
554
|
-
resources :variants, only: %i[index show], module: :accommodations
|
555
|
-
end
|
556
|
-
|
549
|
+
resources :accommodations, only: %i[index show]
|
557
550
|
resources :line_items, only: %i[index show]
|
558
551
|
resources :account_checker
|
559
552
|
resource :account_recovers, only: [:update]
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class AddNestedSetColumnsToPlaces < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
add_column :cm_places, :parent_id, :integer if !column_exists?(:cm_places, :parent_id)
|
4
|
+
add_column :cm_places, :lft, :integer if !column_exists?(:cm_places, :lft)
|
5
|
+
add_column :cm_places, :rgt, :integer if !column_exists?(:cm_places, :rgt)
|
6
|
+
|
7
|
+
add_column :cm_places, :depth, :integer if !column_exists?(:cm_places, :depth)
|
8
|
+
add_column :cm_places, :children_count, :integer if !column_exists?(:cm_places, :children_count)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateCmTaxonOptionTypes < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :cm_taxon_option_types do |t|
|
4
|
+
t.references :taxon, null: false, if_not_exists: true
|
5
|
+
t.references :option_type, null: false, if_not_exists: true
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class CreateCmTaxonOptionValues < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :cm_taxon_option_values do |t|
|
4
|
+
t.references :taxon, null: false, if_not_exists: true
|
5
|
+
t.references :option_value, null: false, if_not_exists: true
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
data/docker-compose.yml
CHANGED
@@ -40,8 +40,8 @@ module SpreeCmCommissioner
|
|
40
40
|
after: %r{//= require spree/backend}, verbose: true
|
41
41
|
|
42
42
|
# For NPM support
|
43
|
-
template 'app/javascript/
|
44
|
-
inject_into_file 'app/javascript/
|
43
|
+
template 'app/javascript/spree_cm_commissioner/utilities.js'
|
44
|
+
inject_into_file 'app/javascript/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
|
45
45
|
after: %r{import "@spree/dashboard"}, verbose: true
|
46
46
|
end
|
47
47
|
|
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
class CalendarEvent
|
3
3
|
attr_reader :from_date, :to_date, :title, :options
|
4
4
|
|
5
|
-
def initialize(from_date:, to_date:, title
|
5
|
+
def initialize(from_date:, to_date:, title:, options:)
|
6
6
|
@from_date = from_date
|
7
7
|
@to_date = to_date
|
8
8
|
@title = title
|
@@ -23,15 +23,5 @@ module SpreeCmCommissioner
|
|
23
23
|
)
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
27
|
-
def self.from_inventory_items(inventory_items)
|
28
|
-
inventory_items.map do |item|
|
29
|
-
CalendarEvent.new(
|
30
|
-
from_date: item.inventory_date,
|
31
|
-
to_date: item.inventory_date,
|
32
|
-
options: { inventory_item: item }
|
33
|
-
)
|
34
|
-
end
|
35
|
-
end
|
36
26
|
end
|
37
27
|
end
|
@@ -10,5 +10,15 @@ FactoryBot.define do
|
|
10
10
|
address_components { FFaker::Address.street_address }
|
11
11
|
lat { FFaker::Geolocation.lat }
|
12
12
|
lon { FFaker::Geolocation.lng }
|
13
|
+
trait :with_parent do
|
14
|
+
association :parent, factory: :cm_place
|
15
|
+
end
|
16
|
+
transient do
|
17
|
+
children_count { 0 }
|
18
|
+
end
|
19
|
+
|
20
|
+
after(:create) do |place, evaluator|
|
21
|
+
create_list(:cm_place, evaluator.children_count, parent: place)
|
22
|
+
end
|
13
23
|
end
|
14
|
-
end
|
24
|
+
end
|
@@ -1,40 +1,19 @@
|
|
1
1
|
FactoryBot.define do
|
2
2
|
factory :cm_base_variant, parent: :base_variant do
|
3
|
-
is_master { false }
|
4
|
-
|
5
3
|
transient do
|
6
4
|
total_inventory { 10 }
|
7
|
-
backorderable { false }
|
8
5
|
end
|
9
6
|
|
10
7
|
after :create do |variant, evaluator|
|
11
8
|
variant.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
|
12
|
-
variant.stock_items.update_all(backorderable: evaluator.backorderable)
|
13
9
|
end
|
14
10
|
end
|
15
11
|
|
16
|
-
factory :cm_variant, parent: :
|
17
|
-
product
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
number_of_kids { nil }
|
22
|
-
end
|
23
|
-
|
24
|
-
after(:create) do |variant, evaluator|
|
25
|
-
if evaluator.number_of_adults.present?
|
26
|
-
number_of_adults = create(:cm_option_type, :number_of_adults)
|
27
|
-
variant.product.option_types << number_of_adults
|
28
|
-
variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_adults, name: evaluator.number_of_adults, option_type: number_of_adults)
|
29
|
-
end
|
30
|
-
|
31
|
-
if evaluator.number_of_kids.present?
|
32
|
-
number_of_kids = create(:cm_option_type, :number_of_kids)
|
33
|
-
variant.product.option_types << number_of_kids
|
34
|
-
variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_kids, name: evaluator.number_of_kids, option_type: number_of_kids)
|
35
|
-
end
|
36
|
-
|
37
|
-
variant.save!
|
12
|
+
factory :cm_variant, parent: :variant do
|
13
|
+
product do
|
14
|
+
stock_locations = [create(:stock_location)]
|
15
|
+
product = create(:product, vendor: create(:active_vendor, stock_locations: stock_locations))
|
16
|
+
product
|
38
17
|
end
|
39
18
|
end
|
40
19
|
|
@@ -45,13 +24,12 @@ FactoryBot.define do
|
|
45
24
|
duration { "1" }
|
46
25
|
route { }
|
47
26
|
end
|
48
|
-
|
49
27
|
before(:create) do |trip, evaluator|
|
50
28
|
trip.product = evaluator.route
|
51
29
|
|
52
30
|
trip.option_values = [evaluator.departure_time, evaluator.duration]
|
53
|
-
end
|
54
31
|
|
32
|
+
end
|
55
33
|
after(:create) do |trip, evaluator|
|
56
34
|
trip.stock_items = [create(:stock_item, variant: trip, stock_location: evaluator.product.vendor.stock_locations.first)]
|
57
35
|
trip.stock_items.first.adjust_count_on_hand(10)
|
@@ -19,7 +19,6 @@ require 'spree_cm_commissioner/user_session_jwt_token'
|
|
19
19
|
require 'spree_cm_commissioner/trip_result'
|
20
20
|
require 'spree_cm_commissioner/trip_query_result'
|
21
21
|
require 'spree_cm_commissioner/trip_seat_layout_result'
|
22
|
-
require 'spree_cm_commissioner/cached_inventory_item'
|
23
22
|
|
24
23
|
require 'activerecord_multi_tenant'
|
25
24
|
require 'google/cloud/recaptcha_enterprise'
|
@@ -45,36 +44,3 @@ require 'cm_app_logger'
|
|
45
44
|
require 'counter_culture'
|
46
45
|
|
47
46
|
require 'byebug' if Rails.env.development? || Rails.env.test?
|
48
|
-
|
49
|
-
module SpreeCmCommissioner
|
50
|
-
class << self
|
51
|
-
# Allows overriding the default Redis connection pool with a custom one
|
52
|
-
attr_writer :redis_pool
|
53
|
-
|
54
|
-
def redis_pool
|
55
|
-
@redis_pool ||= default_redis_pool
|
56
|
-
end
|
57
|
-
|
58
|
-
# Resets the Redis pool, useful for testing or reinitialization
|
59
|
-
def reset_redis_pool
|
60
|
-
@redis_pool = nil
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def default_redis_pool
|
66
|
-
pool_size = ENV.fetch('REDIS_POOL_SIZE', '5').to_i
|
67
|
-
timeout = ENV.fetch('REDIS_TIMEOUT', '5').to_i
|
68
|
-
redis_url = ENV.fetch('REDIS_URL', 'redis://localhost:6379/12')
|
69
|
-
|
70
|
-
ConnectionPool.new(size: pool_size, timeout: timeout) do
|
71
|
-
Redis.new(url: redis_url, timeout: timeout)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# Provides a configuration block for customizing SpreeCmCommissioner settings
|
77
|
-
def self.configure
|
78
|
-
yield self
|
79
|
-
end
|
80
|
-
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
namespace :spree_cm_commissioner do
|
2
|
+
desc 'Migrate and Rebuild place hierarchy..'
|
3
|
+
task migrate_and_rebuild_place_hierarchy: :environment do
|
4
|
+
puts 'Resetting column information :lft and :rgt columns...'
|
5
|
+
SpreeCmCommissioner::Place.reset_column_information
|
6
|
+
SpreeCmCommissioner::Place.rebuild!
|
7
|
+
puts 'Place hierarchy rebuild completed successfully!'
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
namespace :spree_cm_commissioner do
|
2
|
+
desc 'Update orphan root places...'
|
3
|
+
task update_orphan_root_places: :environment do
|
4
|
+
count = SpreeCmCommissioner::Place.where(parent_id: 0).update_all(parent_id: nil) # rubocop:disable Rails/SkipsModelValidations
|
5
|
+
puts "#{count} orphan root places updated."
|
6
|
+
end
|
7
|
+
end
|
@@ -54,11 +54,6 @@ Gem::Specification.new do |s|
|
|
54
54
|
s.add_dependency "rqrcode", "~> 2.0"
|
55
55
|
s.add_dependency "premailer-rails"
|
56
56
|
s.add_dependency 'counter_culture', '~> 3.2'
|
57
|
-
# Redis
|
58
|
-
s.add_dependency 'redis'
|
59
|
-
s.add_dependency 'redis-rails'
|
60
|
-
s.add_dependency 'connection_pool'
|
61
|
-
|
62
57
|
s.add_development_dependency 'pg'
|
63
58
|
s.add_development_dependency 'spree_dev_tools'
|
64
59
|
s.add_dependency 'blazer', '~> 3.0.4'
|