spree_cm_commissioner 2.0.0.pre.pre → 2.0.0.pre.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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/operator/pie_chart_events_controller.rb +46 -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 +24 -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/create_vendor.rb +44 -0
- 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 +33 -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/concerns/spree_cm_commissioner/variant_options_concern.rb +4 -2
- 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/chart_type.rb +10 -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_decorator.rb +6 -0
- 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/pie_chart_event_queries.rb +179 -0
- 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/serializables/spree_cm_commissioner/pie_chart_event.rb +11 -0
- 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/chart_type_serializer.rb +10 -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 +7 -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 +70 -133
- 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
@@ -1,6 +1,5 @@
|
|
1
1
|
module Spree
|
2
2
|
module OrderMailerDecorator
|
3
|
-
# overrided
|
4
3
|
def cancel_email(order, resend: false)
|
5
4
|
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
|
6
5
|
return false if @order.email.blank?
|
@@ -12,18 +11,34 @@ module Spree
|
|
12
11
|
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
|
13
12
|
return false if @order.email.blank?
|
14
13
|
|
14
|
+
@tenant = @order.tenant
|
15
|
+
if @tenant.present?
|
16
|
+
@brand_color = @tenant.preferences[:brand_primary_color]
|
17
|
+
@vendor_logo_url = @tenant.active_vendor&.logo&.original_url
|
18
|
+
end
|
19
|
+
|
15
20
|
@current_store = @order.store
|
16
21
|
@product_type = @order.products.first&.product_type || 'accommodation'
|
17
22
|
|
18
|
-
subject =
|
23
|
+
subject = resend ? "[#{Spree.t(:resend).upcase}] " : ''
|
19
24
|
subject += "#{@current_store&.name} Booking Confirmation ##{@order.number}"
|
20
25
|
|
21
|
-
mail(to: @order.email, from:
|
26
|
+
mail(to: @order.email, from: from_email_address, subject: subject, store_url: @current_store.url) do |format|
|
22
27
|
format.html { render layout: 'spree_cm_commissioner/layouts/order_mailer' }
|
23
28
|
format.text
|
24
29
|
end
|
25
30
|
end
|
26
31
|
|
32
|
+
private
|
33
|
+
|
34
|
+
def from_email_address
|
35
|
+
if @order.tenant.nil?
|
36
|
+
from_address
|
37
|
+
else
|
38
|
+
@order.tenant.active_vendor&.from_email
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
27
42
|
def ticket_email(guest, email)
|
28
43
|
@guest = guest
|
29
44
|
@event = @guest.event
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module EventCheckInFlowable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
preference :group_check_in_enabled, :boolean, default: true
|
7
|
+
preference :individual_check_in_enabled, :boolean, default: true
|
8
|
+
|
9
|
+
before_validation :validate_at_least_one_check_in_flow_presence
|
10
|
+
end
|
11
|
+
|
12
|
+
def check_in_flows
|
13
|
+
flows = []
|
14
|
+
flows << 'group' if group_check_in_enabled?
|
15
|
+
flows << 'individual' if individual_check_in_enabled?
|
16
|
+
flows
|
17
|
+
end
|
18
|
+
|
19
|
+
def group_check_in_enabled? = preferred_group_check_in_enabled
|
20
|
+
def individual_check_in_enabled? = preferred_individual_check_in_enabled
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def validate_at_least_one_check_in_flow_presence
|
25
|
+
return if check_in_flows.any?
|
26
|
+
|
27
|
+
errors.add(:check_in_flows, 'must have at least one flow selected')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -18,23 +18,29 @@ module SpreeCmCommissioner
|
|
18
18
|
def date_unit
|
19
19
|
return nil unless permanent_stock?
|
20
20
|
|
21
|
-
|
21
|
+
date_range_excluding_checkout.size if accommodation?
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def date_range_excluding_checkout
|
25
25
|
return [] unless date_present?
|
26
26
|
|
27
|
-
(from_date.to_date..to_date.to_date).to_a
|
27
|
+
date_range = (from_date.to_date..to_date.to_date).to_a
|
28
|
+
date_range.pop if date_range.size > 1
|
29
|
+
date_range
|
28
30
|
end
|
29
31
|
|
30
|
-
def
|
31
|
-
|
32
|
-
end
|
32
|
+
def date_range_including_checkout
|
33
|
+
return [] unless date_present?
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
(from_date.to_date..to_date.to_date).to_a
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
+
def date_range
|
39
|
+
if accommodation?
|
40
|
+
date_range_excluding_checkout
|
41
|
+
else
|
42
|
+
date_range_including_checkout
|
43
|
+
end
|
38
44
|
end
|
39
45
|
|
40
46
|
private
|
@@ -49,6 +55,24 @@ module SpreeCmCommissioner
|
|
49
55
|
def set_duration
|
50
56
|
self.from_date ||= variant.start_date_time || event&.from_date
|
51
57
|
self.to_date ||= variant.end_date_time || event&.to_date
|
58
|
+
|
59
|
+
return if persisted?
|
60
|
+
|
61
|
+
apply_variant_time(:from_date, variant.start_date_time)
|
62
|
+
apply_variant_time(:to_date, variant.end_date_time)
|
63
|
+
end
|
64
|
+
|
65
|
+
def apply_variant_time(field, variant_time)
|
66
|
+
field_value = send(field)
|
67
|
+
|
68
|
+
return unless field_value.present? && field_value.hour.zero? && variant_time.present?
|
69
|
+
|
70
|
+
send("#{field}=", field_value.change(
|
71
|
+
hour: variant_time.hour,
|
72
|
+
min: variant_time.min,
|
73
|
+
sec: variant_time.sec
|
74
|
+
)
|
75
|
+
)
|
52
76
|
end
|
53
77
|
end
|
54
78
|
end
|
@@ -14,6 +14,13 @@ module SpreeCmCommissioner
|
|
14
14
|
state_selection
|
15
15
|
payment_option
|
16
16
|
delivery_option
|
17
|
+
amenity
|
18
|
+
departure_time
|
19
|
+
duration
|
20
|
+
vehicle_id
|
21
|
+
origin
|
22
|
+
destination
|
23
|
+
place_id
|
17
24
|
].freeze
|
18
25
|
|
19
26
|
RESERVED_OPTIONS = {
|
@@ -40,7 +47,12 @@ module SpreeCmCommissioner
|
|
40
47
|
'bib-zerofill' => 'integer',
|
41
48
|
'bib-display-prefix' => 'boolean',
|
42
49
|
'bib-pre-generation-on-create' => 'boolean',
|
43
|
-
'seat-number-positions' => 'array'
|
50
|
+
'seat-number-positions' => 'array',
|
51
|
+
'origin' => 'place_id',
|
52
|
+
'destination' => 'place_id',
|
53
|
+
'departure-time' => 'time',
|
54
|
+
'vehicle' => 'vehicle_id',
|
55
|
+
'allow-seat-selection' => 'boolean'
|
44
56
|
}.freeze
|
45
57
|
|
46
58
|
included do
|
@@ -5,8 +5,6 @@ module SpreeCmCommissioner
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
-
state_machine.before_transition to: :payment, do: :hold_blocks!
|
9
|
-
|
10
8
|
state_machine.before_transition to: :complete, do: :request, if: :need_confirmation?
|
11
9
|
state_machine.before_transition to: :complete, do: :generate_bib_number
|
12
10
|
|
@@ -16,14 +14,10 @@ module SpreeCmCommissioner
|
|
16
14
|
state_machine.after_transition to: :complete, do: :send_order_complete_telegram_alert_to_vendors, unless: :need_confirmation?
|
17
15
|
state_machine.after_transition to: :complete, do: :send_order_complete_telegram_alert_to_store, unless: :need_confirmation?
|
18
16
|
|
19
|
-
state_machine.around_transition to: :complete, do: :unstock_inventory!
|
20
|
-
|
21
17
|
state_machine.after_transition to: :complete, do: :send_transaction_email_to_user, if: :user_has_email?
|
22
18
|
state_machine.after_transition to: :resumed, do: :precalculate_conversion
|
23
|
-
state_machine.around_transition to: :resumed, do: :unstock_inventory!
|
24
19
|
|
25
20
|
state_machine.after_transition to: :canceled, do: :precalculate_conversion
|
26
|
-
state_machine.after_transition to: :canceled, do: :restock_inventory!
|
27
21
|
|
28
22
|
scope :accepted, -> { where(request_state: 'accepted') }
|
29
23
|
|
@@ -73,39 +67,6 @@ module SpreeCmCommissioner
|
|
73
67
|
end
|
74
68
|
end
|
75
69
|
|
76
|
-
def unstock_inventory!
|
77
|
-
ActiveRecord::Base.transaction do
|
78
|
-
yield # Equal to block.call
|
79
|
-
|
80
|
-
# After the transition is complete, the following code will execute first before proceeding to other `after_transition` callbacks.
|
81
|
-
# This ensures that if `reserve_blocks!` or `unstock_inventory_in_redis!` fails, the state will be rolled back,
|
82
|
-
# and neither the `finalize!` method nor any notifications will be triggered.
|
83
|
-
# The payment will be reversed in vPago gem, and `Spree::Checkout::Complete` will be called, which checks `order.reload.complete?`.
|
84
|
-
# This is critical because if the order state is complete, the payment will be marked as paid.
|
85
|
-
|
86
|
-
reserve_blocks!
|
87
|
-
unstock_inventory_in_redis!
|
88
|
-
|
89
|
-
# We rollback only order state, and we keep payment state as it is.
|
90
|
-
# We implement payment in vPago gem, and it will be reversed in the gem.
|
91
|
-
# Some bank has api for refund, but some don't have the api to refund yet. So we keep the payment state as it is and refund manually.
|
92
|
-
end
|
93
|
-
rescue StandardError => e
|
94
|
-
CmAppLogger.log(
|
95
|
-
label: 'SpreeCmCommissioner::OrderStateMachine#reserve_inventory failed',
|
96
|
-
data: { order_id: id, error: e.message, type: e.class.name, backtrace: e.backtrace&.first(5)&.join("\n") }
|
97
|
-
)
|
98
|
-
|
99
|
-
raise e
|
100
|
-
end
|
101
|
-
|
102
|
-
def restock_inventory!
|
103
|
-
ActiveRecord::Base.transaction do
|
104
|
-
cancel_blocks!
|
105
|
-
restock_inventory_in_redis!
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
70
|
def generate_bib_number
|
110
71
|
line_items.find_each(&:generate_remaining_guests)
|
111
72
|
|
@@ -3,10 +3,12 @@ module SpreeCmCommissioner
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
delegate :
|
6
|
+
delegate :product_type,
|
7
|
+
:subscribable?,
|
7
8
|
:allowed_upload_later?,
|
8
9
|
:need_confirmation?, :need_confirmation,
|
9
10
|
:allow_anonymous_booking,
|
11
|
+
:accommodation?, :service?, :ecommerce?,
|
10
12
|
:allow_self_check_in,
|
11
13
|
:allow_self_check_in?,
|
12
14
|
:required_self_check_in_location,
|
@@ -6,20 +6,10 @@ module SpreeCmCommissioner
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
PRODUCT_TYPES = %i[accommodation service ecommerce transit].freeze
|
9
|
-
PERMANENT_STOCK_PRODUCT_TYPES = %w[accommodation service transit].freeze
|
10
|
-
PRE_INVENTORY_DAYS = { 'transit' => 90, 'accommodation' => 365, 'service' => 30 }.freeze
|
11
9
|
|
12
10
|
included do
|
13
11
|
enum product_type: PRODUCT_TYPES if table_exists? && column_names.include?('product_type')
|
14
12
|
enum primary_product_type: PRODUCT_TYPES if table_exists? && column_names.include?('primary_product_type')
|
15
13
|
end
|
16
|
-
|
17
|
-
def permanent_stock?
|
18
|
-
PERMANENT_STOCK_PRODUCT_TYPES.include?(product_type)
|
19
|
-
end
|
20
|
-
|
21
|
-
def pre_inventory_days
|
22
|
-
PRE_INVENTORY_DAYS[product_type]
|
23
|
-
end
|
24
14
|
end
|
25
15
|
end
|
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5 }
|
6
|
+
enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5, transit: 6 }
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -5,6 +5,11 @@ module SpreeCmCommissioner
|
|
5
5
|
included do
|
6
6
|
preference :assetlinks, :string, default: ''
|
7
7
|
preference :apple_app_site_association, :string, default: ''
|
8
|
+
preference :payment_checkout_image, :string, default: ''
|
9
|
+
preference :payment_failed_image, :string, default: ''
|
10
|
+
preference :payment_success_image, :string, default: ''
|
11
|
+
preference :payment_loader, :string, default: ''
|
12
|
+
preference :brand_primary_color, :string, default: ''
|
8
13
|
end
|
9
14
|
end
|
10
15
|
end
|
@@ -53,8 +53,9 @@ module SpreeCmCommissioner
|
|
53
53
|
# No need to fallback to event start date to avoid n+1.
|
54
54
|
# To get end_time duration of event, include event when needed instead.
|
55
55
|
def start_date_time
|
56
|
-
return nil if start_date.blank?
|
56
|
+
return nil if start_date.blank? && start_time.blank?
|
57
57
|
return start_date if start_time.blank?
|
58
|
+
return start_time if start_date.blank?
|
58
59
|
|
59
60
|
start_date.change(hour: start_time.hour, min: start_time.min, sec: start_time.sec)
|
60
61
|
end
|
@@ -62,8 +63,9 @@ module SpreeCmCommissioner
|
|
62
63
|
# No need to fallback to event end date to avoid n+1.
|
63
64
|
# To get end_time duration of event, include event when needed instead.
|
64
65
|
def end_date_time
|
65
|
-
return nil if end_date.blank?
|
66
|
+
return nil if end_date.blank? && end_time.blank?
|
66
67
|
return end_date if end_time.blank?
|
68
|
+
return end_time if end_date.blank?
|
67
69
|
|
68
70
|
end_date.change(hour: end_time.hour, min: end_time.min, sec: end_time.sec)
|
69
71
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
class BlazerQueryable < SpreeCmCommissioner::Base
|
3
|
+
belongs_to :queryable, polymorphic: true
|
4
|
+
belongs_to :blazer_query, class_name: 'Blazer::Query'
|
5
|
+
|
6
|
+
validates :queryable_id, uniqueness: { scope: %i[queryable_type blazer_query_id], message: I18n.t('event_blazer_queries.fail') }
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require_dependency 'spree_cm_commissioner'
|
2
|
+
|
3
|
+
module SpreeCmCommissioner
|
4
|
+
class Branch < SpreeCmCommissioner::Place
|
5
|
+
belongs_to :state, class_name: 'Spree::State', optional: true
|
6
|
+
belongs_to :vendor, class_name: 'Spree::Vendor'
|
7
|
+
|
8
|
+
def validate_reference?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,20 +1,54 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class DynamicField < SpreeCmCommissioner::Base
|
3
|
+
acts_as_list column: :position, scope: :vendor_id
|
4
|
+
|
3
5
|
belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
|
4
6
|
|
5
7
|
has_many :dynamic_field_options, class_name: 'SpreeCmCommissioner::DynamicFieldOption', dependent: :destroy
|
6
8
|
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :destroy
|
7
9
|
has_many :product_dynamic_fields, class_name: 'SpreeCmCommissioner::ProductDynamicField', dependent: :destroy
|
8
10
|
|
9
|
-
enum data_type: {
|
11
|
+
enum data_type: { text: 0, number: 1, boolean: 2, checkbox: 3, radio: 4, selection: 5, textarea: 6 }
|
12
|
+
enum data_fill_stage: { pre_registration: 0, post_registration: 1, during_check_in: 2 }
|
10
13
|
|
11
14
|
accepts_nested_attributes_for :dynamic_field_options, allow_destroy: true, reject_if: :all_blank
|
12
15
|
|
13
16
|
validates :label, presence: true
|
14
17
|
validates :data_type, presence: true
|
18
|
+
validates :configurations, presence: true, allow_blank: false
|
19
|
+
validate :validate_data_fill_stage_phase
|
20
|
+
|
21
|
+
def requires_dynamic_field_options?
|
22
|
+
checkbox? || radio? || selection?
|
23
|
+
end
|
24
|
+
|
25
|
+
def multiple_select
|
26
|
+
return nil unless selection?
|
27
|
+
|
28
|
+
configurations['multiple_select'] == true
|
29
|
+
end
|
30
|
+
|
31
|
+
def multiple_select=(value)
|
32
|
+
self.configurations ||= {}
|
33
|
+
self.configurations['multiple_select'] = ActiveModel::Type::Boolean.new.cast(value)
|
34
|
+
end
|
35
|
+
|
36
|
+
def required_at_stage?(stage)
|
37
|
+
data_fill_stage == stage.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def display_label
|
41
|
+
label + " (#{data_fill_stage.humanize})"
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def validate_data_fill_stage_phase
|
47
|
+
return if data_fill_stage.blank?
|
48
|
+
|
49
|
+
return if data_fill_stage.in?(self.class.data_fill_stages.keys)
|
15
50
|
|
16
|
-
|
17
|
-
checkbox? || radio?
|
51
|
+
errors.add(:data_fill_stage, "must be one of: #{self.class.data_fill_stages.keys.join(', ')}")
|
18
52
|
end
|
19
53
|
end
|
20
54
|
end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class DynamicFieldOption < SpreeCmCommissioner::Base
|
3
|
+
acts_as_list column: :position, scope: :dynamic_field_id
|
4
|
+
|
3
5
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
6
|
+
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :restrict_with_error
|
7
|
+
|
8
|
+
enum status: { active: 0, draft: 1, archived: 2 }
|
4
9
|
|
5
10
|
validates :value, presence: true, uniqueness: { scope: :dynamic_field_id }
|
11
|
+
validates :status, presence: true
|
6
12
|
validate :parent_field_must_be_selection_type
|
7
13
|
|
8
14
|
private
|
@@ -10,7 +16,7 @@ module SpreeCmCommissioner
|
|
10
16
|
def parent_field_must_be_selection_type
|
11
17
|
return unless dynamic_field
|
12
18
|
|
13
|
-
return if dynamic_field.
|
19
|
+
return if dynamic_field.requires_dynamic_field_options?
|
14
20
|
|
15
21
|
errors.add(:dynamic_field, 'must be a selection type field')
|
16
22
|
end
|
@@ -24,16 +24,10 @@ module SpreeCmCommissioner
|
|
24
24
|
scope :none_bib, -> { where(bib_prefix: [nil, '']) }
|
25
25
|
|
26
26
|
belongs_to :line_item, class_name: 'Spree::LineItem'
|
27
|
-
|
28
27
|
has_one :variant, class_name: 'Spree::Variant', through: :line_item
|
29
|
-
|
30
28
|
belongs_to :user, class_name: 'Spree::User'
|
31
29
|
belongs_to :occupation, class_name: 'Spree::Taxon'
|
32
30
|
belongs_to :nationality, class_name: 'Spree::Taxon'
|
33
|
-
belongs_to :block, class_name: 'SpreeCmCommissioner::Block', optional: true
|
34
|
-
|
35
|
-
has_one :reserved_block, class_name: 'SpreeCmCommissioner::ReservedBlock'
|
36
|
-
|
37
31
|
scope :checked_ins, -> { joins(:check_in) }
|
38
32
|
scope :no_show, -> { left_outer_joins(:check_in).where(cm_check_ins: { id: nil }) }
|
39
33
|
|
@@ -54,14 +48,10 @@ module SpreeCmCommissioner
|
|
54
48
|
|
55
49
|
before_create :generate_bib, if: -> { line_item.reload && variant.bib_pre_generation_on_create? }
|
56
50
|
|
57
|
-
after_create :preload_order_block_ids, if: -> { block_id.present? }
|
58
|
-
after_update :preload_order_block_ids, if: :saved_change_to_block_id?
|
59
|
-
after_destroy :preload_order_block_ids
|
60
|
-
|
61
51
|
validates :seat_number, uniqueness: { scope: :event_id }, allow_nil: true, if: -> { event_id.present? }
|
62
52
|
validates :bib_index, uniqueness: true, allow_nil: true
|
63
53
|
|
64
|
-
self.whitelisted_ransackable_associations = %w[id_card event]
|
54
|
+
self.whitelisted_ransackable_associations = %w[id_card event line_item]
|
65
55
|
self.whitelisted_ransackable_attributes = %w[first_name last_name phone_number gender contact occupation_id card_type created_at check_in_status]
|
66
56
|
|
67
57
|
def self.csv_importable_columns
|
@@ -223,6 +213,62 @@ module SpreeCmCommissioner
|
|
223
213
|
save!
|
224
214
|
end
|
225
215
|
|
216
|
+
def missing_dynamic_fields_for_stage(stage)
|
217
|
+
required_fields = line_item.product.dynamic_fields.where(data_fill_stage: stage)
|
218
|
+
filled_ids = guest_dynamic_fields.map(&:dynamic_field_id)
|
219
|
+
|
220
|
+
required_fields.reject { |field| filled_ids.include?(field.id) }
|
221
|
+
end
|
222
|
+
|
223
|
+
def all_required_dynamic_fields_completed?(stage)
|
224
|
+
missing_dynamic_fields_for_stage(stage).blank?
|
225
|
+
end
|
226
|
+
|
227
|
+
def validate_dynamic_fields_for_phase(phase)
|
228
|
+
required_fields = line_item.product.dynamic_fields.where(data_fill_stage: phase)
|
229
|
+
filled_ids = guest_dynamic_fields.map(&:dynamic_field_id)
|
230
|
+
|
231
|
+
required_fields.each do |field|
|
232
|
+
errors.add(:base, "#{field.label} is required for #{phase} phase") unless filled_ids.include?(field.id)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def pre_registration_completed?
|
237
|
+
return true unless line_item.product.dynamic_fields.pre_registration.any?
|
238
|
+
|
239
|
+
pre_registration_fields_completed?
|
240
|
+
end
|
241
|
+
|
242
|
+
def post_registration_completed?
|
243
|
+
return true unless line_item.product.dynamic_fields.post_registration.any?
|
244
|
+
|
245
|
+
post_registration_fields_completed?
|
246
|
+
end
|
247
|
+
|
248
|
+
def check_in_completed?
|
249
|
+
return true unless line_item.product.dynamic_fields.during_check_in.any?
|
250
|
+
|
251
|
+
check_in_fields_completed?
|
252
|
+
end
|
253
|
+
|
254
|
+
def current_collection_phase
|
255
|
+
if check_in.present?
|
256
|
+
:during_check_in
|
257
|
+
elsif line_item.order.completed?
|
258
|
+
:post_registration
|
259
|
+
else
|
260
|
+
:pre_registration
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def phase_completion_status
|
265
|
+
{
|
266
|
+
pre_registration: pre_registration_completed?,
|
267
|
+
post_registration: post_registration_completed?,
|
268
|
+
during_check_in: check_in_completed?
|
269
|
+
}
|
270
|
+
end
|
271
|
+
|
226
272
|
# bib_number: 345, bib_prefix: 5KM, bib_zerofill: 5 => return 5KM00345
|
227
273
|
# bib_number: 345, bib_prefix: 5KM, bib_zerofill: 2 => return 5KM345
|
228
274
|
def formatted_bib_number
|
@@ -237,14 +283,6 @@ module SpreeCmCommissioner
|
|
237
283
|
filled_bib_number
|
238
284
|
end
|
239
285
|
end
|
240
|
-
|
241
|
-
def preload_order_block_ids
|
242
|
-
return if line_item.blank?
|
243
|
-
return if line_item.order.blank?
|
244
|
-
|
245
|
-
block_ids = line_item.order.blocks.pluck(:id)
|
246
|
-
line_item.order.update(preload_block_ids: block_ids)
|
247
|
-
end
|
248
286
|
end
|
249
287
|
end
|
250
288
|
# rubocop:enable Metrics/ClassLength
|
@@ -2,9 +2,12 @@ module SpreeCmCommissioner
|
|
2
2
|
class GuestDynamicField < SpreeCmCommissioner::Base
|
3
3
|
belongs_to :guest, class_name: 'SpreeCmCommissioner::Guest', optional: false
|
4
4
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
5
|
+
belongs_to :dynamic_field_option, class_name: 'SpreeCmCommissioner::DynamicFieldOption', optional: true
|
5
6
|
|
6
7
|
validates :value, presence: true
|
7
8
|
validate :validate_value_format, if: -> { value.present? && dynamic_field.present? }
|
9
|
+
validate :validate_option_reference, if: -> { dynamic_field_option.present? }
|
10
|
+
validate :check_required_fields_based_on_phase
|
8
11
|
|
9
12
|
private
|
10
13
|
|
@@ -12,14 +15,69 @@ module SpreeCmCommissioner
|
|
12
15
|
return if dynamic_field.blank?
|
13
16
|
|
14
17
|
case dynamic_field.data_type.to_s
|
15
|
-
when '
|
18
|
+
when 'number'
|
16
19
|
errors.add(:value, 'must be a number') unless value.to_s.match?(/\A\d+\z/)
|
17
20
|
when 'boolean'
|
18
|
-
errors.add(:value, 'must be true or false') unless %w[true false
|
19
|
-
when 'checkbox', 'radio'
|
21
|
+
errors.add(:value, 'must be true or false') unless %w[true false].include?(value.to_s.downcase)
|
22
|
+
when 'checkbox', 'radio', 'selection'
|
23
|
+
validate_option_value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_option_value
|
28
|
+
if dynamic_field_option.present?
|
29
|
+
self.value ||= dynamic_field_option.value
|
30
|
+
else
|
20
31
|
valid_options = dynamic_field.dynamic_field_options.pluck(:id).map(&:to_s)
|
21
32
|
errors.add(:value, 'is not a valid option') unless valid_options.include?(value)
|
22
33
|
end
|
23
34
|
end
|
35
|
+
|
36
|
+
def validate_option_reference
|
37
|
+
return if dynamic_field.blank? || dynamic_field_option.blank?
|
38
|
+
return if dynamic_field_option.dynamic_field_id == dynamic_field_id
|
39
|
+
|
40
|
+
errors.add(:dynamic_field_option, 'must belong to the same dynamic field')
|
41
|
+
end
|
42
|
+
|
43
|
+
def before_checkin_phase?
|
44
|
+
guest.present? && guest.line_item.present? && guest.check_in.nil?
|
45
|
+
end
|
46
|
+
|
47
|
+
def after_purchase_phase?
|
48
|
+
guest.present? && guest.line_item.present? && guest.line_item.completed? && guest.check_in.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
def during_checkin_phase?
|
52
|
+
guest.present? && guest.check_in.present?
|
53
|
+
end
|
54
|
+
|
55
|
+
def pre_registration_required?
|
56
|
+
dynamic_field.data_fill_stage.to_sym == :pre_registration &&
|
57
|
+
guest.line_item.order.completed? && guest.check_in.blank?
|
58
|
+
end
|
59
|
+
|
60
|
+
def post_registration_required?
|
61
|
+
dynamic_field.data_fill_stage.to_sym == :post_registration &&
|
62
|
+
guest.line_item.order.completed? && guest.check_in.blank?
|
63
|
+
end
|
64
|
+
|
65
|
+
def during_check_in_required?
|
66
|
+
dynamic_field.data_fill_stage.to_sym == :during_check_in &&
|
67
|
+
guest.check_in.present?
|
68
|
+
end
|
69
|
+
|
70
|
+
def check_required_fields_based_on_phase
|
71
|
+
return if dynamic_field.blank? || value.present?
|
72
|
+
|
73
|
+
case dynamic_field.data_fill_stage.to_sym
|
74
|
+
when :pre_registration
|
75
|
+
errors.add(:value, I18n.t('guest_dynamic_field.errors.pre_registration_required')) if pre_registration_required?
|
76
|
+
when :post_registration
|
77
|
+
errors.add(:value, I18n.t('guest_dynamic_field.errors.post_registration_required')) if post_registration_required?
|
78
|
+
when :during_check_in
|
79
|
+
errors.add(:value, I18n.t('guest_dynamic_field.errors.during_check_in_required')) if during_check_in_required?
|
80
|
+
end
|
81
|
+
end
|
24
82
|
end
|
25
83
|
end
|
@@ -5,16 +5,14 @@ module SpreeCmCommissioner
|
|
5
5
|
has_many :invite_user_events, class_name: 'SpreeCmCommissioner::InviteUserEvent', dependent: :destroy
|
6
6
|
scope :active, -> { where('expires_at > ?', Time.current) }
|
7
7
|
|
8
|
-
after_create :set_expiration
|
9
|
-
|
10
|
-
def set_expiration
|
11
|
-
update(expires_at: 3.days.from_now)
|
12
|
-
end
|
13
|
-
|
14
8
|
def invite_url
|
15
9
|
"#{Spree::Store.default.formatted_url}/invite/#{token}?utm_source=email"
|
16
10
|
end
|
17
11
|
|
12
|
+
def invite_crew_link
|
13
|
+
"#{Spree::Store.default.formatted_url}/invite_crews/#{token}"
|
14
|
+
end
|
15
|
+
|
18
16
|
def url_valid?
|
19
17
|
expires_at.present? && expires_at > Time.current
|
20
18
|
end
|