spree_cm_commissioner 2.0.0.pre.pre ā 2.0.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 +4 -4
- data/.env.example +3 -0
- data/.github/workflows/test_and_build_gem.yml +2 -16
- data/.gitignore +1 -2
- data/Gemfile.lock +1 -32
- data/Rakefile +4 -33
- data/app/assets/images/cm-hangmeas-checkout_image.svg +63 -0
- data/app/assets/images/cm-hangmeas-failed.svg +56 -0
- data/app/assets/images/cm-hangmeas-loader.svg +50 -0
- data/app/assets/images/cm-hangmeas-success.svg +51 -0
- data/app/assets/images/mailer/mail.png +0 -0
- data/app/assets/images/mailer/tenant_phone.png +0 -0
- data/app/assets/images/mailer/tenant_user.png +0 -0
- data/app/assets/javascripts/spree_cm_commissioner/backend.js +1 -0
- data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +65 -0
- data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +11 -8
- data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +1 -0
- data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +60 -0
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +2 -1
- data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +44 -0
- data/app/controllers/spree/admin/event_blazer_queries_controller.rb +11 -4
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -63
- data/app/controllers/spree/admin/tenants_controller.rb +8 -0
- data/app/controllers/spree/admin/trip_blazer_queries_controller.rb +35 -0
- data/app/controllers/spree/api/v2/organizer/invite_crews_controller.rb +33 -0
- data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
- data/app/controllers/spree/api/v2/storefront/dynamic_field_options_controller.rb +5 -1
- data/app/controllers/spree/api/v2/storefront/guests_controller.rb +30 -4
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +2 -0
- data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb +11 -0
- data/app/controllers/spree_cm_commissioner/well_known_controller.rb +31 -17
- data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +23 -81
- data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +20 -0
- data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +27 -0
- data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +27 -0
- data/app/interactors/spree_cm_commissioner/create_ticket.rb +6 -5
- data/app/interactors/spree_cm_commissioner/crew_invite_link_handler.rb +48 -0
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +0 -1
- data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
- data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +144 -0
- data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +7 -3
- data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +11 -3
- data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +12 -6
- data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +7 -1
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
- data/app/jobs/spree_cm_commissioner/application_job.rb +0 -20
- data/app/jobs/spree_cm_commissioner/application_unique_job.rb +0 -20
- data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
- data/app/mailers/spree/order_mailer_decorator.rb +18 -3
- data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
- data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +15 -9
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +13 -1
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -39
- data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +3 -1
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +5 -0
- data/app/models/spree_cm_commissioner/blazer_queryable.rb +8 -0
- data/app/models/spree_cm_commissioner/branch.rb +12 -0
- data/app/models/spree_cm_commissioner/crew_invite_link.rb +4 -0
- data/app/models/spree_cm_commissioner/dynamic_field.rb +37 -3
- data/app/models/spree_cm_commissioner/dynamic_field_option.rb +7 -1
- data/app/models/spree_cm_commissioner/guest.rb +57 -19
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +61 -3
- data/app/models/spree_cm_commissioner/invite.rb +4 -6
- data/app/models/spree_cm_commissioner/invite_team.rb +3 -1
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +78 -46
- data/app/models/spree_cm_commissioner/line_item_seat.rb +10 -0
- data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
- data/app/models/spree_cm_commissioner/option_type_decorator.rb +11 -1
- data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +8 -0
- data/app/models/spree_cm_commissioner/order_decorator.rb +1 -30
- data/app/models/spree_cm_commissioner/pin_code.rb +3 -2
- data/app/models/spree_cm_commissioner/pin_code_telegram.rb +28 -0
- data/app/models/spree_cm_commissioner/place.rb +3 -1
- data/app/models/spree_cm_commissioner/product_decorator.rb +26 -10
- data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +11 -0
- data/app/models/spree_cm_commissioner/service_calendar.rb +2 -0
- data/app/models/spree_cm_commissioner/state_decorator.rb +1 -0
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -26
- 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/stock_item_decorator.rb +0 -17
- data/app/models/spree_cm_commissioner/stop.rb +23 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +6 -2
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +6 -0
- data/app/models/spree_cm_commissioner/telegram_chat.rb +6 -0
- data/app/models/spree_cm_commissioner/trip.rb +10 -12
- data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
- data/app/models/spree_cm_commissioner/trip_stop.rb +3 -2
- data/app/models/spree_cm_commissioner/user_identity_provider.rb +26 -4
- data/app/models/spree_cm_commissioner/user_taxon.rb +1 -0
- data/app/models/spree_cm_commissioner/variant_decorator.rb +47 -36
- data/app/models/spree_cm_commissioner/variant_options.rb +23 -0
- data/app/models/spree_cm_commissioner/vehicle.rb +14 -9
- data/app/models/spree_cm_commissioner/vehicle_seat.rb +11 -0
- data/app/models/spree_cm_commissioner/vehicle_type.rb +76 -0
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +13 -7
- data/app/models/spree_cm_commissioner/vendor_place.rb +5 -6
- data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
- data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
- data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
- data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
- data/app/queries/spree_cm_commissioner/trip_query.rb +26 -23
- data/app/queries/spree_cm_commissioner/trip_search_query.rb +76 -0
- 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/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/organizer/invite_crews_serializer.rb +11 -0
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
- data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +0 -1
- data/app/serializers/spree/v2/tenant/user_serializer.rb +1 -0
- data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +23 -15
- data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
- data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +11 -0
- data/app/views/blazer/queries/_content.html.erb +8 -0
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +2 -7
- data/app/views/spree/admin/stock_managements/index.html.erb +6 -55
- data/app/views/spree/admin/tenant_vendors/index.html.erb +9 -2
- data/app/views/spree/admin/tenants/_form.html.erb +118 -42
- data/app/views/spree/admin/tenants/edit.html.erb +2 -1
- data/app/views/spree/admin/tenants/index.html.erb +7 -1
- data/app/views/spree/admin/vendors/_form.html.erb +14 -0
- data/app/views/spree/order_mailer/confirm_email.html.erb +27 -16
- data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +5 -1
- data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +41 -4
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +42 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +25 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +19 -0
- data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +33 -0
- data/config/initializers/spree_permitted_attributes.rb +2 -5
- data/config/locales/en.yml +10 -1
- data/config/routes.rb +6 -22
- data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +1 -3
- data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
- data/db/migrate/20250630103536_create_cm_telegram_chats.rb +13 -0
- data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
- data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
- data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
- data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +7 -0
- data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +6 -0
- data/db/migrate/20250711092937_add_position_to_cm_dynamic_fields.rb +11 -0
- data/db/migrate/20250711093045_add_position_to_cm_dynamic_field_options.rb +11 -0
- data/db/migrate/20250714121508_rename_cm_taxon_blazer_query_to_blazer_queryables.rb +7 -0
- data/db/migrate/20250714124323_make_cm_blazer_queryables_polymorphic.rb +19 -0
- data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +13 -0
- data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +5 -0
- data/docker-compose.yml +1 -1
- data/lib/cm_app_logger.rb +4 -11
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -14
- 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/branch_factory.rb +12 -0
- data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +0 -10
- data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +7 -0
- data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +30 -6
- data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +36 -0
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +34 -18
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +14 -0
- data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -10
- data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +19 -41
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +96 -0
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
- data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +11 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -35
- data/spree_cm_commissioner.gemspec +0 -7
- metadata +66 -135
- data/app/controllers/spree/admin/inventory_items_controller.rb +0 -83
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -37
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -32
- data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
- data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +0 -44
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -32
- data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
- data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +0 -44
- data/app/models/spree_cm_commissioner/block.rb +0 -23
- data/app/models/spree_cm_commissioner/inventory.rb +0 -11
- data/app/models/spree_cm_commissioner/inventory_item.rb +0 -69
- data/app/models/spree_cm_commissioner/price_decorator.rb +0 -9
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -41
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -25
- data/app/models/spree_cm_commissioner/reserved_block.rb +0 -30
- data/app/models/spree_cm_commissioner/seat_layout.rb +0 -20
- data/app/models/spree_cm_commissioner/seat_section.rb +0 -16
- data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +0 -30
- data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +0 -53
- data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +0 -49
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +0 -4
- data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +0 -4
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
- data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +0 -8
- data/app/models/spree_cm_commissioner/variant_block.rb +0 -9
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
- data/app/views/spree/admin/inventory_items/show.html.erb +0 -72
- data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -56
- data/config/initializers/paper_trail.rb +0 -1
- 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/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
- data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
- data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
- data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +0 -7
- data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +0 -5
- data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +0 -5
- data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +0 -9
- data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +0 -5
- data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +0 -9
- data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +0 -5
- data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +0 -5
- data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +0 -5
- data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +0 -6
- data/db/migrate/20250620090001_create_cm_seat_layouts.rb +0 -17
- data/db/migrate/20250620090002_create_cm_seat_sections.rb +0 -18
- data/db/migrate/20250620090003_create_cm_blocks.rb +0 -18
- data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +0 -29
- data/db/migrate/20250626083642_create_cm_variant_blocks.rb +0 -24
- data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +0 -13
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +0 -9
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
- data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +0 -27
- data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
- data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +0 -7
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
- data/lib/tasks/ensure_correct_product_type.rake +0 -7
- data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -0,0 +1,44 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module Transit
|
3
|
+
module TaxonBitwise
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
BIT_STOP = 0b001
|
7
|
+
BIT_STATION = 0b010
|
8
|
+
BIT_BRANCH = 0b100
|
9
|
+
BIT_LOCATION = 0b1000
|
10
|
+
|
11
|
+
included do
|
12
|
+
attr_accessor :stop, :station, :branch, :location
|
13
|
+
|
14
|
+
before_validation :at_least_one_checkbox_selected
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop?
|
18
|
+
data_type & BIT_STOP != 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def station?
|
22
|
+
data_type & BIT_STATION != 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def branch?
|
26
|
+
data_type & BIT_BRANCH != 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def location?
|
30
|
+
data_type & BIT_LOCATION != 0
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def at_least_one_checkbox_selected
|
36
|
+
if stop.nil? && station.nil? && branch.nil? && location.nil?
|
37
|
+
nil
|
38
|
+
elsif stop.to_i.zero? && station.to_i.zero? && branch.to_i.zero? && location.to_i.zero?
|
39
|
+
errors.add(:base, 'At least one checkbox (stop, branch, or location) must be selected')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -2,21 +2,28 @@ module Spree
|
|
2
2
|
module Admin
|
3
3
|
class EventBlazerQueriesController < Spree::Admin::ResourceController
|
4
4
|
def model_class
|
5
|
-
SpreeCmCommissioner::
|
5
|
+
SpreeCmCommissioner::BlazerQueryable
|
6
6
|
end
|
7
7
|
|
8
8
|
def object_name
|
9
|
-
'
|
9
|
+
'spree_cm_commissioner_blazer_queryable'
|
10
10
|
end
|
11
11
|
|
12
12
|
def create
|
13
|
-
|
13
|
+
queryable = Spree::Taxon.find(params[:event_id])
|
14
|
+
|
15
|
+
event_blazer = SpreeCmCommissioner::BlazerQueryable.new(
|
16
|
+
queryable: queryable,
|
17
|
+
blazer_query_id: params[:blazer_query_id]
|
18
|
+
)
|
19
|
+
|
14
20
|
if event_blazer.save
|
15
21
|
flash[:success] = I18n.t('event_blazer_queries.success')
|
16
22
|
else
|
17
23
|
flash[:alert] = event_blazer.errors.full_messages.join(', ')
|
18
24
|
end
|
19
|
-
|
25
|
+
|
26
|
+
redirect_to blazer.query_path(id: event_blazer.blazer_query_id, event_id: queryable.id)
|
20
27
|
end
|
21
28
|
end
|
22
29
|
end
|
@@ -5,8 +5,6 @@ module Spree
|
|
5
5
|
|
6
6
|
before_action :load_parent
|
7
7
|
|
8
|
-
helper_method :inventory_item_message
|
9
|
-
|
10
8
|
def load_parent
|
11
9
|
@product = Spree::Product.find_by(slug: params[:product_id])
|
12
10
|
end
|
@@ -14,59 +12,9 @@ module Spree
|
|
14
12
|
def index
|
15
13
|
@variants = @product.variants.includes(:images, stock_items: :stock_location, option_values: :option_type)
|
16
14
|
@variants = [@product.master] if @variants.empty?
|
17
|
-
@stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
|
18
|
-
|
19
|
-
load_inventories unless @product.permanent_stock?
|
20
|
-
end
|
21
|
-
|
22
|
-
def create
|
23
|
-
result = SpreeCmCommissioner::Stock::StockMovementCreator.call(
|
24
|
-
variant_id: params[:variant_id],
|
25
|
-
stock_location_id: params[:stock_location_id],
|
26
|
-
current_store: current_store,
|
27
|
-
stock_movement_params: stock_movement_params
|
28
|
-
)
|
29
|
-
|
30
|
-
if result.success?
|
31
|
-
flash[:success] = flash_message_for(result.stock_movement, :successfully_created)
|
32
|
-
else
|
33
|
-
flash[:error] = result.message
|
34
|
-
end
|
35
|
-
|
36
|
-
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
37
|
-
end
|
38
|
-
|
39
|
-
# GET /products/:slug/stock_managements/calendar?year=
|
40
|
-
def calendar
|
41
|
-
@year = params[:year].present? ? params[:year].to_i : Time.zone.today.year
|
42
15
|
|
43
|
-
|
44
|
-
to_date = Date.new(@year, 1, 1).end_of_year
|
45
|
-
|
46
|
-
@inventory_items = @product.inventory_items.includes(:variant, :prices).where(inventory_date: from_date..to_date).to_a
|
47
|
-
@cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@inventory_items)
|
48
|
-
.call
|
49
|
-
.index_by(&:inventory_item_id)
|
50
|
-
@events = SpreeCmCommissioner::CalendarEvent.from_inventory_items(@inventory_items)
|
51
|
-
end
|
52
|
-
|
53
|
-
def inventory_item_message(inventory_item, cached_inventory_item)
|
54
|
-
synced = inventory_item.quantity_available == cached_inventory_item.quantity_available
|
55
|
-
|
56
|
-
if synced
|
57
|
-
"Synced: Quantity available matches in both DB and Redis (#{cached_inventory_item.quantity_available})."
|
58
|
-
else
|
59
|
-
"Out of sync: Redis shows #{cached_inventory_item.quantity_available} available, which doesn't match the database."
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
16
|
+
@stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
|
64
17
|
|
65
|
-
def load_inventories
|
66
|
-
@inventory_items = @product.inventory_items.group_by { |item| item.variant.id }
|
67
|
-
@cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@product.inventory_items)
|
68
|
-
.call
|
69
|
-
.index_by(&:inventory_item_id)
|
70
18
|
@reserved_stocks = Spree::LineItem
|
71
19
|
.complete
|
72
20
|
.where(variant_id: @variants.pluck(:id))
|
@@ -77,16 +25,6 @@ module Spree
|
|
77
25
|
def model_class
|
78
26
|
Spree::StockItem
|
79
27
|
end
|
80
|
-
|
81
|
-
# This method processes the parameters for stock movement creation.
|
82
|
-
# Expected attributes for `stock_movement` include:
|
83
|
-
# - :quantity (Integer): The quantity of stock to move.
|
84
|
-
# - :action (String): The type of stock movement (e.g., "add" or "remove").
|
85
|
-
# - :originator_id, :originator_ty (String, optional): The ID and type of the entity creating the stock movement.
|
86
|
-
# Ensure that `permitted_stock_movement_attributes` is updated to reflect any changes.
|
87
|
-
def stock_movement_params
|
88
|
-
params.require(:stock_movement).permit(permitted_stock_movement_attributes)
|
89
|
-
end
|
90
28
|
end
|
91
29
|
end
|
92
30
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Spree
|
2
2
|
module Admin
|
3
3
|
class TenantsController < Spree::Admin::ResourceController
|
4
|
+
before_action :load_vector_icons, only: %i[new edit]
|
5
|
+
|
4
6
|
# override
|
5
7
|
def collection
|
6
8
|
params[:q] = {} if params[:q].blank?
|
@@ -31,6 +33,12 @@ module Spree
|
|
31
33
|
def collection_url(options = {})
|
32
34
|
admin_tenants_url(options)
|
33
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def load_vector_icons
|
40
|
+
@vector_icons = SpreeCmCommissioner::VectorIcon.all
|
41
|
+
end
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class TripBlazerQueriesController < Spree::Admin::ResourceController
|
4
|
+
def model_class
|
5
|
+
SpreeCmCommissioner::BlazerQueryable
|
6
|
+
end
|
7
|
+
|
8
|
+
def object_name
|
9
|
+
'spree_cm_commissioner_blazer_queryable'
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
queryable = SpreeCmCommissioner::Trip.find_by(id: params[:trip_id])
|
14
|
+
|
15
|
+
if queryable.nil?
|
16
|
+
flash[:alert] = I18n.t('trip_blazer_queries.not_found')
|
17
|
+
redirect_to request.referer || spree.admin_trips_path and return
|
18
|
+
end
|
19
|
+
|
20
|
+
trip_blazer = SpreeCmCommissioner::BlazerQueryable.new(
|
21
|
+
queryable: queryable,
|
22
|
+
blazer_query_id: params[:blazer_query_id]
|
23
|
+
)
|
24
|
+
|
25
|
+
if trip_blazer.save
|
26
|
+
flash[:success] = I18n.t('trip_blazer_queries.success')
|
27
|
+
else
|
28
|
+
flash[:alert] = trip_blazer.errors.full_messages.join(', ')
|
29
|
+
end
|
30
|
+
|
31
|
+
redirect_to blazer.query_path(id: trip_blazer.blazer_query_id, trip_id: queryable.id)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V2
|
4
|
+
module Organizer
|
5
|
+
class InviteCrewsController < ::Spree::Api::V2::Organizer::BaseController
|
6
|
+
def show
|
7
|
+
render_serialized_payload { serialize_resource(invite) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
context = SpreeCmCommissioner::CrewInviteLinkHandler.call(
|
12
|
+
params: params
|
13
|
+
)
|
14
|
+
|
15
|
+
if context.success?
|
16
|
+
render_serialized_payload { serialize_resource(context.invite) }
|
17
|
+
else
|
18
|
+
render_error_payload(context.message || I18n.t('invite.accept_fail'))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def invite
|
23
|
+
@invite ||= SpreeCmCommissioner::Invite.find_by!(token: params[:id])
|
24
|
+
end
|
25
|
+
|
26
|
+
def resource_serializer
|
27
|
+
::Spree::V2::Organizer::InviteCrewsSerializer
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
|
21
21
|
if guest.save
|
22
22
|
@invite_guest.update(claimed_status: :claimed) if @line_item.guests.count == @invite_guest.quantity
|
23
|
-
send_guest_claimed_invitation_telegram_alert_to_vendor(guest)
|
23
|
+
send_guest_claimed_invitation_telegram_alert_to_vendor(guest) if guest.event.vendor.preferred_telegram_chat_id.present?
|
24
24
|
|
25
25
|
render json: SpreeCmCommissioner::V2::Storefront::GuestSerializer.new(guest.reload).serializable_hash
|
26
26
|
else
|
@@ -5,38 +5,55 @@ module Spree
|
|
5
5
|
class AccommodationsController < ::Spree::Api::V2::ResourceController
|
6
6
|
private
|
7
7
|
|
8
|
-
# override
|
9
8
|
def collection
|
10
|
-
@collection ||=
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
@collection ||= collection_finder.call(params: params).value
|
10
|
+
end
|
11
|
+
|
12
|
+
def paginated_collection
|
13
|
+
return @paginated_collection if defined?(@paginated_collection)
|
14
|
+
|
15
|
+
@paginated_collection = super
|
16
|
+
@paginated_collection = apply_service_availability(@paginated_collection)
|
17
17
|
end
|
18
18
|
|
19
|
-
# override
|
20
19
|
def resource
|
21
|
-
|
20
|
+
resource = resource_finder.call(params: params).value
|
21
|
+
raise ActiveRecord::RecordNotFound if resource.nil?
|
22
|
+
|
23
|
+
apply_service_availability(resource)
|
24
|
+
end
|
25
|
+
|
26
|
+
def apply_service_availability(resource)
|
27
|
+
SpreeCmCommissioner::ApplyServiceAvailability.call(calendarable: resource,
|
28
|
+
from_date: params[:from_date].to_date,
|
29
|
+
to_date: params[:to_date].to_date
|
30
|
+
).value
|
22
31
|
end
|
23
32
|
|
24
|
-
# override
|
25
33
|
def allowed_sort_attributes
|
26
34
|
super << :min_price << :max_price
|
27
35
|
end
|
28
36
|
|
29
|
-
|
37
|
+
def model_class
|
38
|
+
Spree::Vendor
|
39
|
+
end
|
40
|
+
|
30
41
|
def resource_serializer
|
31
42
|
Spree::V2::Storefront::AccommodationSerializer
|
32
43
|
end
|
33
44
|
|
34
|
-
# override
|
35
45
|
def collection_serializer
|
36
46
|
Spree::V2::Storefront::AccommodationSerializer
|
37
47
|
end
|
38
48
|
|
39
|
-
|
49
|
+
def collection_finder
|
50
|
+
SpreeCmCommissioner::AccommodationSearchDetail
|
51
|
+
end
|
52
|
+
|
53
|
+
def resource_finder
|
54
|
+
SpreeCmCommissioner::AccommodationSearchDetail
|
55
|
+
end
|
56
|
+
|
40
57
|
def required_schema
|
41
58
|
SpreeCmCommissioner::AccommodationRequestSchema
|
42
59
|
end
|
@@ -8,7 +8,11 @@ module Spree
|
|
8
8
|
return @collection if defined?(@collection)
|
9
9
|
return SpreeCmCommissioner::DynamicFieldOption.none if params[:dynamic_field_id].blank?
|
10
10
|
|
11
|
-
@collection = SpreeCmCommissioner::DynamicFieldOption
|
11
|
+
@collection = SpreeCmCommissioner::DynamicFieldOption
|
12
|
+
.where(dynamic_field_id: params[:dynamic_field_id])
|
13
|
+
.active
|
14
|
+
.order(position: :asc)
|
15
|
+
|
12
16
|
@collection = @collection.where('value LIKE ?', "%#{params[:query]}%") if params[:query].present?
|
13
17
|
@collection
|
14
18
|
end
|
@@ -38,10 +38,25 @@ module Spree
|
|
38
38
|
def update
|
39
39
|
spree_authorize! :update, spree_current_order, order_token
|
40
40
|
|
41
|
-
|
41
|
+
begin
|
42
|
+
ActiveRecord::Base.transaction do
|
43
|
+
if guest_params[:guest_dynamic_fields_attributes]
|
44
|
+
dynamic_field_ids = guest_params[:guest_dynamic_fields_attributes].pluck(:dynamic_field_id)
|
45
|
+
resource.guest_dynamic_fields.where(dynamic_field_id: dynamic_field_ids).destroy_all
|
46
|
+
|
47
|
+
guest_params[:guest_dynamic_fields_attributes].each do |attr|
|
48
|
+
field = build_dynamic_field(attr)
|
49
|
+
field.save!
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
54
|
+
resource.save!
|
55
|
+
end
|
56
|
+
|
42
57
|
render_serialized_payload { serialize_resource(resource) }
|
43
|
-
|
44
|
-
render_error_payload(
|
58
|
+
rescue ActiveRecord::RecordInvalid => e
|
59
|
+
render_error_payload(e.record.errors, 400)
|
45
60
|
end
|
46
61
|
end
|
47
62
|
|
@@ -76,9 +91,20 @@ module Spree
|
|
76
91
|
:upload_later,
|
77
92
|
:country_code,
|
78
93
|
:contact,
|
79
|
-
guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
|
94
|
+
guest_dynamic_fields_attributes: %i[id dynamic_field_id dynamic_field_option_id value _destroy]
|
80
95
|
)
|
81
96
|
end
|
97
|
+
|
98
|
+
def build_dynamic_field(attr)
|
99
|
+
field = resource.guest_dynamic_fields.build(attr.except(:id))
|
100
|
+
|
101
|
+
if field.dynamic_field.requires_dynamic_field_options?
|
102
|
+
option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
|
103
|
+
field.dynamic_field_option = option if option
|
104
|
+
end
|
105
|
+
|
106
|
+
field
|
107
|
+
end
|
82
108
|
end
|
83
109
|
end
|
84
110
|
end
|
@@ -12,9 +12,9 @@ module Spree
|
|
12
12
|
spree_authorize! :update, spree_current_order, order_token
|
13
13
|
spree_authorize! :show, @variant
|
14
14
|
|
15
|
-
availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant
|
15
|
+
availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant)
|
16
16
|
|
17
|
-
unless availability_checker.can_supply?(add_item_params[:quantity].to_i)
|
17
|
+
unless availability_checker.can_supply?(add_item_params[:quantity].to_i, add_item_params[:options])
|
18
18
|
return render_error_payload(availability_checker.error_message || I18n.t('variant_availability.items_out_of_stock'))
|
19
19
|
end
|
20
20
|
|
@@ -27,6 +27,8 @@ module Spree
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def complete
|
30
|
+
return render_serialized_payload { serialized_current_order } if spree_current_order.confirm? || spree_current_order.complete?
|
31
|
+
|
30
32
|
spree_authorize! :update, spree_current_order, order_token
|
31
33
|
|
32
34
|
result = complete_service.call(order: spree_current_order)
|
@@ -37,7 +37,7 @@ module SpreeCmCommissioner
|
|
37
37
|
bit_fields = SpreeCmCommissioner::KycBitwise::BIT_FIELDS.keys
|
38
38
|
|
39
39
|
if permitted_resource_params[:use_product_kyc] == '1'
|
40
|
-
permitted_resource_params[:kyc] =
|
40
|
+
permitted_resource_params[:kyc] = nil
|
41
41
|
else
|
42
42
|
@kyc_result = calculate_kyc_value(params[:variant])
|
43
43
|
permitted_resource_params[:kyc] = @kyc_result
|
data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb
CHANGED
@@ -6,6 +6,17 @@ module SpreeCmCommissioner
|
|
6
6
|
def self.prepended(base)
|
7
7
|
base.include SpreeCmCommissioner::OrderConcern
|
8
8
|
end
|
9
|
+
|
10
|
+
# Override Spree's default behavior:
|
11
|
+
# By default, Spree raises an error if `complete` is called on a completed or confirmed order.
|
12
|
+
# We want to allow this call to succeed, so the API can be used both to:
|
13
|
+
# - complete the order (if it's not yet complete), or
|
14
|
+
# - return the latest state of a confirmed or completed order without raising a forbidden error.
|
15
|
+
def complete
|
16
|
+
return render_serialized_payload { serialized_current_order } if spree_current_order.confirm? || spree_current_order.complete?
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
9
20
|
end
|
10
21
|
end
|
11
22
|
end
|
@@ -3,18 +3,42 @@ module SpreeCmCommissioner
|
|
3
3
|
before_action :identify_request_source
|
4
4
|
rescue_from StandardError, with: :handle_error
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def assetlinks_json
|
7
|
+
render_platform_link(:android)
|
8
|
+
end
|
9
|
+
|
10
|
+
def apple_app_site_association
|
11
|
+
render_platform_link(:ios)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def render_platform_link(platform)
|
17
|
+
fetcher_class = platform_link_finder(platform)
|
18
|
+
|
19
|
+
result = fetcher_class.call(
|
20
|
+
store: @store,
|
21
|
+
tenant: @tenant,
|
22
|
+
refreshed: params[:_refreshed].present?
|
23
|
+
)
|
24
|
+
|
25
|
+
if result.success? && result.contents.present?
|
26
|
+
render json: result.contents
|
12
27
|
else
|
13
28
|
render_not_found
|
14
29
|
end
|
15
30
|
end
|
16
31
|
|
17
|
-
|
32
|
+
def platform_link_finder(platform)
|
33
|
+
case platform
|
34
|
+
when :android
|
35
|
+
SpreeCmCommissioner::AssetLinksFetcher
|
36
|
+
when :ios
|
37
|
+
SpreeCmCommissioner::AppleAppSiteAssociationFetcher
|
38
|
+
else
|
39
|
+
render_not_found
|
40
|
+
end
|
41
|
+
end
|
18
42
|
|
19
43
|
def identify_request_source
|
20
44
|
host = params[:original_host].presence || request.host.downcase
|
@@ -25,16 +49,6 @@ module SpreeCmCommissioner
|
|
25
49
|
@tenant = result.tenant
|
26
50
|
end
|
27
51
|
|
28
|
-
def render_preference(preference_key)
|
29
|
-
if @store&.send(preference_key).present?
|
30
|
-
render json: @store.send(preference_key)
|
31
|
-
elsif @tenant&.send(preference_key).present?
|
32
|
-
render json: @tenant.send(preference_key)
|
33
|
-
else
|
34
|
-
render_not_found
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
52
|
def render_not_found
|
39
53
|
render json: { error: 'Not found' }, status: :not_found
|
40
54
|
end
|
@@ -1,26 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# š« --- [NEW INVITATION CLAIMED] ---
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# ā
<b>Ticket Successfully Claimed!</b>
|
7
|
-
#
|
8
|
-
# [ x1 ]
|
9
|
-
# <b>5km Running Ticket</b>
|
10
|
-
# <i>š Distance: 5km, T-shirt: M</i>
|
11
|
-
# <i>šļø Nov 15, 2023</i>
|
12
|
-
# <i>šŖ Temple Run with Sai</i>
|
3
|
+
# <b>š Claimed By</b>
|
4
|
+
# Name: Orng SreyMoch
|
5
|
+
# Tel: <code>+85570760548</code>
|
13
6
|
#
|
14
|
-
# [ x2 ]
|
15
7
|
# <b>5km Running Ticket</b>
|
8
|
+
# Quantity: 1
|
16
9
|
# <i>š Distance: 5km, T-shirt: S</i>
|
17
10
|
# <i>šļø Nov 15, 2023 -> Nov 17, 2023</i>
|
18
|
-
# <i>šŖ Temple Run with Sai</i>
|
19
11
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# Tel: <code>+85570760548</code>
|
23
|
-
# Email: <code>admin_dev@cm.com</code>
|
12
|
+
# Order Number:
|
13
|
+
# <code>R621016753</code>
|
24
14
|
|
25
15
|
module SpreeCmCommissioner
|
26
16
|
class InviteGuestClaimedTelegramMessageFactory < TelegramMessageFactory
|
@@ -36,85 +26,37 @@ module SpreeCmCommissioner
|
|
36
26
|
end
|
37
27
|
|
38
28
|
def selected_line_items
|
39
|
-
|
40
|
-
|
41
|
-
order.line_items
|
29
|
+
vendor.present? ? order.line_items.for_vendor(vendor) : order.line_items
|
42
30
|
end
|
43
31
|
|
44
32
|
# override
|
45
33
|
def body
|
46
34
|
text = []
|
47
|
-
text << "Order Number:\n<code>#{order.number}</code>\n"
|
48
|
-
text << "\nā
<b>Ticket Successfully Claimed!</b>\n"
|
49
|
-
text << selected_line_items.map { |item| line_item_content(item) }.compact.join("\n\n")
|
50
|
-
text.compact.join("\n")
|
51
|
-
end
|
52
35
|
|
53
|
-
|
54
|
-
text
|
36
|
+
text << bold('š Claimed By')
|
37
|
+
text << "Name: #{guest.first_name} #{guest.last_name}"
|
38
|
+
text << "Tel: #{inline_code(guest.phone_number)}"
|
39
|
+
text << ''
|
40
|
+
|
41
|
+
selected_line_items.each do |item|
|
42
|
+
text << bold(item.product.name.to_s)
|
43
|
+
text << "šļø Quantity: #{item.quantity}"
|
44
|
+
text << italic("š #{item.options_text}") if item.options_text.present?
|
45
|
+
text << italic(pretty_date_for(item)) if item.date_present?
|
46
|
+
text << ''
|
47
|
+
end
|
55
48
|
|
56
|
-
text << bold(
|
57
|
-
text <<
|
58
|
-
text << italic("š #{line_item.options_text}") if line_item.options_text.present?
|
59
|
-
text << italic(pretty_date_for(line_item)) if pretty_date_for(line_item).present?
|
60
|
-
text << italic("šŖ #{line_item.vendor.name}") if line_item.vendor&.name.present? && vendor.blank?
|
49
|
+
text << bold('Order Number:')
|
50
|
+
text << inline_code(order.number)
|
61
51
|
|
62
52
|
text.compact.join("\n")
|
63
53
|
end
|
64
54
|
|
65
55
|
def pretty_date_for(line_item)
|
66
|
-
return nil unless line_item.date_present?
|
67
|
-
|
68
56
|
from_date = pretty_date(line_item.from_date)
|
69
57
|
to_date = pretty_date(line_item.to_date)
|
70
58
|
|
71
|
-
|
72
|
-
"šļø #{from_date}"
|
73
|
-
else
|
74
|
-
"šļø #{from_date} -> #{to_date}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# override
|
79
|
-
def footer
|
80
|
-
text = []
|
81
|
-
|
82
|
-
text << bold('š Claimed By')
|
83
|
-
text << "Name: #{guest.first_name} #{guest.last_name}" if guest.first_name.present? || guest.last_name.present?
|
84
|
-
text << "Tel: #{inline_code(guest.intel_phone_number)}" if guest.intel_phone_number.present?
|
85
|
-
|
86
|
-
if show_details_link && order.guests.any?
|
87
|
-
text << ''
|
88
|
-
text << 'View Tickets:'
|
89
|
-
text += generate_guests_links(order.guests)
|
90
|
-
end
|
91
|
-
|
92
|
-
text.compact.join("\n")
|
93
|
-
end
|
94
|
-
|
95
|
-
# Result:
|
96
|
-
# | No. A24 | No. A24 |
|
97
|
-
# | No. A24 | No. A24 |
|
98
|
-
# | No. A24 | No. A24 |
|
99
|
-
# | No. A24 | No. A24 |
|
100
|
-
# | No. A24 | No. A24 |
|
101
|
-
# | No. A24 |
|
102
|
-
def generate_guests_links(guests, guests_per_row = 2)
|
103
|
-
rows = (guests.size.to_f / guests_per_row).ceil
|
104
|
-
formatted_rows = []
|
105
|
-
|
106
|
-
rows.times do |i|
|
107
|
-
row_guests = guests.slice(i * guests_per_row, guests_per_row)
|
108
|
-
formatted_row = row_guests.map do |guest|
|
109
|
-
button_label = guest.seat_number.present? ? "No. #{guest.seat_number}" : "No. #{guest.formatted_bib_number || 'N/A'}"
|
110
|
-
link = Rails.application.routes.url_helpers.guest_cards_url(guest.token)
|
111
|
-
"| <a href='#{link}'>#{button_label}</a>"
|
112
|
-
end.join(' ')
|
113
|
-
|
114
|
-
formatted_rows << ("#{formatted_row} |")
|
115
|
-
end
|
116
|
-
|
117
|
-
formatted_rows
|
59
|
+
from_date == to_date ? "šļø #{from_date}" : "šļø #{from_date} -> #{to_date}"
|
118
60
|
end
|
119
61
|
end
|
120
62
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module LineItems
|
3
|
+
module FindByVariantDecorator
|
4
|
+
# ovveride
|
5
|
+
def execute(order:, variant:, options: {})
|
6
|
+
return super unless variant.product.product_type == 'transit'
|
7
|
+
|
8
|
+
order.line_items.detect do |line_item|
|
9
|
+
next if options[:date].present? && !(line_item.variant_id == variant.id && line_item.date == options[:date])
|
10
|
+
|
11
|
+
Spree::Dependencies.cart_compare_line_items_service.constantize.call(order: order, line_item: line_item, options: options).value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
unless Spree::LineItems::FindByVariant.included_modules.include?(SpreeCmCommissioner::LineItems::FindByVariantDecorator)
|
19
|
+
Spree::LineItems::FindByVariant.prepend(SpreeCmCommissioner::LineItems::FindByVariantDecorator)
|
20
|
+
end
|