spree_cm_commissioner 2.8.3.pre.pre14 → 2.8.3
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 +1 -2
- data/.gitignore +0 -6
- data/Gemfile.lock +1 -1
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
- data/app/controllers/spree/admin/guests_controller.rb +1 -1
- data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -1
- data/app/controllers/spree/admin/system/waiting_room_controller.rb +0 -15
- data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
- data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +1 -3
- data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
- data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb +1 -3
- data/app/controllers/spree/api/v2/tenant/trips_controller.rb +0 -11
- data/app/controllers/spree_cm_commissioner/admin/orders_controller_decorator.rb +3 -7
- data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
- data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
- data/app/helpers/spree_cm_commissioner/admin/guest_helper.rb +0 -10
- data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +5 -62
- data/app/interactors/spree_cm_commissioner/waiting_guests_caller.rb +7 -49
- data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/line_item_open_dated_trippable.rb +7 -50
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/line_items_filter_scope.rb +0 -5
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
- data/app/models/spree_cm_commissioner/guest.rb +0 -20
- data/app/models/spree_cm_commissioner/import.rb +1 -1
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -7
- data/app/models/spree_cm_commissioner/notification.rb +1 -10
- data/app/models/spree_cm_commissioner/order_decorator.rb +3 -13
- data/app/models/spree_cm_commissioner/payment_decorator.rb +0 -19
- data/app/models/spree_cm_commissioner/payment_method_decorator.rb +0 -8
- data/app/models/spree_cm_commissioner/pin_code.rb +9 -62
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -56
- data/app/models/spree_cm_commissioner/reserved_block.rb +0 -2
- data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +0 -4
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -3
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -23
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
- data/app/models/spree_cm_commissioner/tenant.rb +0 -9
- data/app/models/spree_cm_commissioner/trip.rb +12 -33
- data/app/models/spree_cm_commissioner/user_decorator.rb +0 -18
- data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -4
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -5
- data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +8 -31
- data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +5 -57
- data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +2 -4
- data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +2 -5
- data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
- data/app/serializers/spree/v2/tenant/dynamic_field_serializer.rb +1 -1
- data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/pin_code_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +1 -4
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +1 -2
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +0 -1
- data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
- data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +5 -11
- data/app/services/spree_cm_commissioner/inventory_items/reset.rb +1 -1
- data/app/services/spree_cm_commissioner/open_dated_trips/redeem.rb +36 -80
- data/app/services/spree_cm_commissioner/reserved_blocks/reserve.rb +1 -2
- data/app/services/spree_cm_commissioner/transit_order/create.rb +14 -48
- data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +2 -1
- data/app/services/spree_cm_commissioner/trips/create_open_dated_trip.rb +98 -0
- data/app/services/spree_cm_commissioner/trips/update_open_dated_trip.rb +67 -0
- data/app/services/spree_cm_commissioner/trips/variants/create.rb +2 -1
- data/app/views/spree/admin/guests/_table.html.erb +87 -82
- data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
- data/app/views/spree/admin/system/waiting_room/show.html.erb +0 -53
- data/config/initializers/spree_permitted_attributes.rb +0 -8
- data/config/locales/en.yml +7 -110
- data/config/locales/km.yml +4 -104
- data/config/routes.rb +0 -50
- data/lib/spree_cm_commissioner/transit/trip_form.rb +13 -0
- data/lib/spree_cm_commissioner/trip_query_result.rb +6 -46
- data/lib/spree_cm_commissioner/trip_result.rb +7 -9
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -7
- data/spree_cm_commissioner.gemspec +1 -1
- metadata +6 -214
- data/app/controllers/spree/admin/order_ticket_transfers_controller.rb +0 -25
- data/app/controllers/spree/admin/ticket_transfer_rules_controller.rb +0 -47
- data/app/controllers/spree/admin/ticket_transfers_controller.rb +0 -61
- data/app/controllers/spree/api/v2/storefront/account/recipients_controller.rb +0 -32
- data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
- data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
- data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
- data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/storefront/ticket_transfer_acceptances_controller.rb +0 -32
- data/app/controllers/spree/api/v2/storefront/ticket_transfers_controller.rb +0 -117
- data/app/controllers/spree/api/v2/tenant/ad_campaigns_controller.rb +0 -25
- data/app/controllers/spree/api/v2/tenant/episodes_controller.rb +0 -38
- data/app/controllers/spree/api/v2/tenant/free_vote_claim_controller.rb +0 -58
- data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
- data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
- data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
- data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
- data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
- data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
- data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -36
- data/app/controllers/spree/api/v2/tenant/vote_packages_controller.rb +0 -33
- data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
- data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -43
- data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
- data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
- data/app/helpers/spree_cm_commissioner/admin/ticket_transfers_helper.rb +0 -32
- data/app/jobs/spree_cm_commissioner/expire_ticket_transfer_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/telegram_gateway/pin_code_sender_job.rb +0 -18
- data/app/jobs/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count_job.rb +0 -17
- data/app/jobs/spree_cm_commissioner/vendor_route_metrics/increase_trip_count_job.rb +0 -14
- data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/waiting_room/publish_lobby_path_job.rb +0 -17
- data/app/models/concerns/spree_cm_commissioner/ticket_transferable.rb +0 -15
- data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
- data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
- data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
- data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
- data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
- data/app/models/spree_cm_commissioner/show.rb +0 -169
- data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
- data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
- data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
- data/app/models/spree_cm_commissioner/show_episode.rb +0 -108
- data/app/models/spree_cm_commissioner/show_person.rb +0 -15
- data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -21
- data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
- data/app/models/spree_cm_commissioner/ticket_transfer.rb +0 -191
- data/app/models/spree_cm_commissioner/ticket_transfer_rule.rb +0 -88
- data/app/models/spree_cm_commissioner/vendor_route_metric.rb +0 -25
- data/app/models/spree_cm_commissioner/vote.rb +0 -16
- data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -100
- data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
- data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
- data/app/models/spree_cm_commissioner/voting_session.rb +0 -216
- data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
- data/app/notifications/spree_cm_commissioner/ticket_transfer_accepted_notification.rb +0 -48
- data/app/notifications/spree_cm_commissioner/ticket_transfer_completed_notification.rb +0 -48
- data/app/notifications/spree_cm_commissioner/ticket_transfer_expired_notification.rb +0 -46
- data/app/notifications/spree_cm_commissioner/ticket_transfer_received_notification.rb +0 -48
- data/app/notifications/spree_cm_commissioner/ticket_transfer_rejected_notification.rb +0 -48
- data/app/overrides/spree/admin/products/_form/allow_gift_transfer.html.erb.deface +0 -9
- data/app/overrides/spree/admin/products/_form/allow_transfer.html.erb.deface +0 -9
- data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
- data/app/overrides/spree/admin/shared/_order_tabs/ticket_transfers.html.erb.deface +0 -10
- data/app/overrides/spree/admin/shared/sub_menu/_product/ticket_transfers_tab.html.erb.deface +0 -3
- data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
- data/app/queries/spree_cm_commissioner/recipient_searcher_query.rb +0 -14
- data/app/serializers/spree/v2/tenant/ad_campaign_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
- data/app/serializers/spree/v2/tenant/free_vote_claim_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -20
- data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
- data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/vote_package_serializer.rb +0 -12
- data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -23
- data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
- data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -21
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_minimal_serializer.rb +0 -30
- data/app/serializers/spree_cm_commissioner/v2/storefront/line_item_minimal_serializer.rb +0 -57
- data/app/serializers/spree_cm_commissioner/v2/storefront/recipient_serializer.rb +0 -13
- data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_minimal_serializer.rb +0 -17
- data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_serializer.rb +0 -20
- data/app/services/spree_cm_commissioner/checkout/complete_decorator.rb +0 -22
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
- data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
- data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
- data/app/services/spree_cm_commissioner/show_persons/contestant_assigner.rb +0 -51
- data/app/services/spree_cm_commissioner/telegram_gateway/pin_code_sender.rb +0 -99
- data/app/services/spree_cm_commissioner/ticket_transfers/accept.rb +0 -132
- data/app/services/spree_cm_commissioner/ticket_transfers/cancel.rb +0 -54
- data/app/services/spree_cm_commissioner/ticket_transfers/complete.rb +0 -68
- data/app/services/spree_cm_commissioner/ticket_transfers/eligibility_checker.rb +0 -99
- data/app/services/spree_cm_commissioner/ticket_transfers/expire.rb +0 -47
- data/app/services/spree_cm_commissioner/ticket_transfers/fee_calculator.rb +0 -57
- data/app/services/spree_cm_commissioner/ticket_transfers/initiate.rb +0 -98
- data/app/services/spree_cm_commissioner/ticket_transfers/preview_rule.rb +0 -38
- data/app/services/spree_cm_commissioner/ticket_transfers/reject.rb +0 -55
- data/app/services/spree_cm_commissioner/ticket_transfers/transfer_guest.rb +0 -29
- data/app/services/spree_cm_commissioner/trips/add_ons/create.rb +0 -124
- data/app/services/spree_cm_commissioner/trips/add_ons/update_price.rb +0 -36
- data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
- data/app/services/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count.rb +0 -19
- data/app/services/spree_cm_commissioner/vendor_route_metrics/increase_trip_count.rb +0 -24
- data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
- data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
- data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
- data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
- data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
- data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
- data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
- data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
- data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -335
- data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -40
- data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
- data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
- data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -116
- data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
- data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
- data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
- data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -190
- data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -105
- data/app/services/spree_cm_commissioner/waiting_room/publish_lobby_path.rb +0 -48
- data/app/services/spree_cm_commissioner/waiting_room_lobby_metadata_fetcher.rb +0 -47
- data/app/services/telegram_gateway_adapter/client.rb +0 -124
- data/app/views/spree/admin/order_ticket_transfers/show.html.erb +0 -7
- data/app/views/spree/admin/shared/_ticket_transfer_details.html.erb +0 -226
- data/app/views/spree/admin/shared/_ticket_transfer_tabs.html.erb +0 -14
- data/app/views/spree/admin/ticket_transfer_rules/_form.html.erb +0 -193
- data/app/views/spree/admin/ticket_transfer_rules/edit.html.erb +0 -11
- data/app/views/spree/admin/ticket_transfer_rules/index.html.erb +0 -79
- data/app/views/spree/admin/ticket_transfer_rules/new.html.erb +0 -11
- data/app/views/spree/admin/ticket_transfers/_search_form.html.erb +0 -70
- data/app/views/spree/admin/ticket_transfers/_tabs.html.erb +0 -14
- data/app/views/spree/admin/ticket_transfers/index.html.erb +0 -74
- data/app/views/spree/admin/ticket_transfers/show.html.erb +0 -13
- data/app/views/spree/admin/ticket_transfers/state_changes.html.erb +0 -47
- data/db/migrate/20260303101440_add_allow_transfer_to_spree_products.rb +0 -5
- data/db/migrate/20260303101907_create_cm_ticket_transfers.rb +0 -32
- data/db/migrate/20260303102316_add_state_to_cm_guests.rb +0 -7
- data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
- data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
- data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
- data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
- data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
- data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
- data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
- data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
- data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
- data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
- data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
- data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
- data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
- data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
- data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
- data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
- data/db/migrate/20260408100000_create_cm_ticket_transfer_rules.rb +0 -28
- data/db/migrate/20260410120000_add_transfer_type_to_cm_ticket_transfers.rb +0 -5
- data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
- data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
- data/db/migrate/20260422120000_add_settlement_status_to_cm_ticket_transfers.rb +0 -6
- data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
- data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
- data/db/migrate/20260507000000_add_index_to_cm_ticket_transfers_completed_at.rb +0 -5
- data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
- data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
- data/db/migrate/20260520000000_add_number_to_cm_ticket_transfers.rb +0 -6
- data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
- data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
- data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
- data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
- data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
- data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
- data/db/migrate/20260605120908_add_description_to_cm_dynamic_fields.rb +0 -5
- data/db/migrate/20260608000000_add_allow_gift_transfer_to_spree_products.rb +0 -5
- data/db/migrate/20260608000000_add_display_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260608000000_create_cm_vendor_route_metrics.rb +0 -25
- data/db/migrate/20260608152251_add_gender_to_cm_reserved_blocks.rb +0 -5
- data/db/migrate/20260610000001_add_delivery_channel_to_cm_pin_codes.rb +0 -6
- data/db/migrate/20260610000001_drop_is_open_dated_from_cm_trips.rb +0 -6
- data/db/migrate/20260614000001_change_code_limit_in_cm_pin_codes.rb +0 -5
- data/db/migrate/20260615000002_add_index_to_code_on_cm_pin_codes.rb +0 -5
- data/docs/sql/jsonb_query_guide.md +0 -57
- data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
- data/lib/spree_cm_commissioner/test_helper/factories/ticket_transfer_factory.rb +0 -18
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_route_metric_factory.rb +0 -10
- data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
- data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
- data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
- data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.rb +0 -11
- data/lib/tasks/backfill_route_metrics.rake +0 -21
- data/lib/tasks/backfill_vendor_route_metrics.rake +0 -23
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0774f6d0c4fad7ae396f14326fd6d0965164b74d89f355c3966bc8d1fd9563f9
|
|
4
|
+
data.tar.gz: 002d84c9f1273b54f01d5a25bdecc5f3b475a12e07b32d8e1846c19107fe776f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 260d54db1f9dd63dbfef02edf2944d02e2c582972b8903815462e438be9cbfb6f5561a7b4a4b64c2cda4af18908c8c7a91958213c06764d1f7ee4d8e2c16dec3
|
|
7
|
+
data.tar.gz: 003d6ecd547b0215851266f06e823f2f7c5e7a8da35f5b4a8051784855a4d095d088b79f700dcadca8820d561d7a9989a3ee0d9eb7940943c3c5777cc7a4742c
|
|
@@ -164,8 +164,7 @@ jobs:
|
|
|
164
164
|
env:
|
|
165
165
|
DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
|
|
166
166
|
run: |
|
|
167
|
-
|
|
168
|
-
bundle exec brakeman --no-threads --no-exit-on-warn
|
|
167
|
+
bundle exec brakeman --no-exit-on-warn
|
|
169
168
|
|
|
170
169
|
test:
|
|
171
170
|
needs: [setup]
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -16,7 +16,6 @@ module SpreeCmCommissioner
|
|
|
16
16
|
GuestCardClassesController
|
|
17
17
|
SeatLayoutController
|
|
18
18
|
CmsPagesController
|
|
19
|
-
AdvertisementsController
|
|
20
19
|
].freeze
|
|
21
20
|
|
|
22
21
|
# Priority 2: Semi-Static (1 hour)
|
|
@@ -26,7 +25,6 @@ module SpreeCmCommissioner
|
|
|
26
25
|
HomepageDataController
|
|
27
26
|
PopularRoutesController
|
|
28
27
|
RoutePlacesController
|
|
29
|
-
ShowsController
|
|
30
28
|
].freeze
|
|
31
29
|
|
|
32
30
|
# Priority 3: Moderate Freshness (30 minutes)
|
|
@@ -51,10 +51,7 @@ module Spree
|
|
|
51
51
|
def permitted_resource_params
|
|
52
52
|
segment_value = helpers.calculate_segment_value(params[:spree_cm_commissioner_homepage_section])
|
|
53
53
|
|
|
54
|
-
params
|
|
55
|
-
.require(:spree_cm_commissioner_homepage_section)
|
|
56
|
-
.permit(:title, :description, :active, :tenant_id, :preview)
|
|
57
|
-
.merge(segment: segment_value)
|
|
54
|
+
params.require(:spree_cm_commissioner_homepage_section).permit(:title, :description, :active, :tenant_id).merge(segment: segment_value)
|
|
58
55
|
end
|
|
59
56
|
|
|
60
57
|
def load_tenants
|
|
@@ -4,10 +4,7 @@ module Spree
|
|
|
4
4
|
class WaitingRoomController < Spree::Admin::BaseController
|
|
5
5
|
def show
|
|
6
6
|
@fetcher = SpreeCmCommissioner::WaitingRoomSystemMetadataFetcher.new
|
|
7
|
-
@lobby_fetcher = SpreeCmCommissioner::WaitingRoomLobbyMetadataFetcher.new
|
|
8
|
-
|
|
9
7
|
@fetcher.load_document_data
|
|
10
|
-
@lobby_fetcher.load_document_data
|
|
11
8
|
|
|
12
9
|
@active_sesions_count = SpreeCmCommissioner::WaitingRoomSession.active.count
|
|
13
10
|
end
|
|
@@ -32,18 +29,6 @@ module Spree
|
|
|
32
29
|
|
|
33
30
|
redirect_back fallback_location: admin_system_waiting_room_path
|
|
34
31
|
end
|
|
35
|
-
|
|
36
|
-
def publish_lobby_path
|
|
37
|
-
result = SpreeCmCommissioner::WaitingRoom::PublishLobbyPath.call
|
|
38
|
-
|
|
39
|
-
if result.success?
|
|
40
|
-
flash[:success] = "Published waiting guests records path: #{result.value[:records_path]}"
|
|
41
|
-
else
|
|
42
|
-
flash[:error] = result.error.to_s
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
redirect_back fallback_location: admin_system_waiting_room_path
|
|
46
|
-
end
|
|
47
32
|
end
|
|
48
33
|
end
|
|
49
34
|
end
|
|
@@ -3,7 +3,6 @@ module Spree
|
|
|
3
3
|
module TaxonsControllerDecorator
|
|
4
4
|
def self.prepended(base)
|
|
5
5
|
base.before_action :build_assets, only: %i[create update]
|
|
6
|
-
base.before_action :normalize_sti_taxon_params, only: %i[create update]
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
# override
|
|
@@ -51,24 +50,6 @@ module Spree
|
|
|
51
50
|
@taxon.build_home_banner(attachment: permitted_resource_params.delete(:home_banner)) if permitted_resource_params[:home_banner]
|
|
52
51
|
@taxon.build_video_banner(attachment: permitted_resource_params.delete(:video_banner)) if permitted_resource_params[:video_banner]
|
|
53
52
|
end
|
|
54
|
-
|
|
55
|
-
# Some admin forms submit STI records under their class key
|
|
56
|
-
# (e.g. :spree_cm_commissioner_show) while Spree update reads :taxon.
|
|
57
|
-
# Merge both into :taxon so all edited fields are persisted.
|
|
58
|
-
def normalize_sti_taxon_params
|
|
59
|
-
return unless @taxon
|
|
60
|
-
|
|
61
|
-
sti_key = @taxon.class.model_name.param_key.to_sym
|
|
62
|
-
sti_params = params[sti_key]
|
|
63
|
-
return unless sti_params.is_a?(::ActionController::Parameters)
|
|
64
|
-
|
|
65
|
-
base_params = params[:taxon]
|
|
66
|
-
base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
|
|
67
|
-
sti_hash = sti_params.to_unsafe_h
|
|
68
|
-
merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
|
|
69
|
-
|
|
70
|
-
params[:taxon] = merged_params
|
|
71
|
-
end
|
|
72
53
|
end
|
|
73
54
|
end
|
|
74
55
|
end
|
|
@@ -11,7 +11,6 @@ module Spree
|
|
|
11
11
|
# - inbound_date: Date of inbound transit (optional)
|
|
12
12
|
# - outbound_legs: Array of outbound leg details (required)
|
|
13
13
|
# - inbound_legs: Array of inbound leg details (optional)
|
|
14
|
-
# - include_return: Whether to add the trip's "return included" add-on as a line item (optional)
|
|
15
14
|
def create
|
|
16
15
|
@outbound_legs = params[:outbound_legs].is_a?(Array) && params[:outbound_legs].any? ? build_legs(:outbound, params[:outbound_legs]) : []
|
|
17
16
|
@inbound_legs = params[:inbound_legs].is_a?(Array) && params[:inbound_legs].any? ? build_legs(:inbound, params[:inbound_legs]) : []
|
|
@@ -21,8 +20,7 @@ module Spree
|
|
|
21
20
|
inbound_date: params[:inbound_date]&.to_date,
|
|
22
21
|
outbound_legs: @outbound_legs,
|
|
23
22
|
inbound_legs: @inbound_legs,
|
|
24
|
-
user: spree_current_user
|
|
25
|
-
include_return: ActiveModel::Type::Boolean.new.cast(params[:include_return])
|
|
23
|
+
user: spree_current_user
|
|
26
24
|
)
|
|
27
25
|
|
|
28
26
|
if result.success?
|
|
@@ -11,7 +11,6 @@ module Spree
|
|
|
11
11
|
# - inbound_date: Date of inbound transit (optional)
|
|
12
12
|
# - outbound_legs: Array of outbound leg details (required)
|
|
13
13
|
# - inbound_legs: Array of inbound leg details (optional)
|
|
14
|
-
# - include_return: Whether to add the trip's "return included" add-on as a line item (optional)
|
|
15
14
|
def create
|
|
16
15
|
@outbound_legs = params[:outbound_legs].is_a?(Array) && params[:outbound_legs].any? ? build_legs(:outbound, params[:outbound_legs]) : []
|
|
17
16
|
@inbound_legs = params[:inbound_legs].is_a?(Array) && params[:inbound_legs].any? ? build_legs(:inbound, params[:inbound_legs]) : []
|
|
@@ -21,8 +20,7 @@ module Spree
|
|
|
21
20
|
inbound_date: params[:inbound_date]&.to_date,
|
|
22
21
|
outbound_legs: @outbound_legs,
|
|
23
22
|
inbound_legs: @inbound_legs,
|
|
24
|
-
user: spree_current_user
|
|
25
|
-
include_return: ActiveModel::Type::Boolean.new.cast(params[:include_return])
|
|
23
|
+
user: spree_current_user
|
|
26
24
|
)
|
|
27
25
|
|
|
28
26
|
if result.success?
|
|
@@ -25,17 +25,6 @@ module Spree
|
|
|
25
25
|
def resource_serializer
|
|
26
26
|
Spree::V2::Tenant::TripSerializer
|
|
27
27
|
end
|
|
28
|
-
|
|
29
|
-
# override
|
|
30
|
-
def serializer_params
|
|
31
|
-
super.merge(
|
|
32
|
-
include_details: include_details?
|
|
33
|
-
)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def include_details?
|
|
37
|
-
params.fetch(:include_details, 'true') == 'true'
|
|
38
|
-
end
|
|
39
28
|
end
|
|
40
29
|
end
|
|
41
30
|
end
|
|
@@ -40,13 +40,9 @@ module SpreeCmCommissioner
|
|
|
40
40
|
|
|
41
41
|
# override
|
|
42
42
|
def cancel
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
internal_note = params.dig(:order, :internal_note)
|
|
47
|
-
@order.canceled_by(try_spree_current_user, cancellation_reason: internal_note)
|
|
48
|
-
flash[:success] = Spree.t(:order_canceled)
|
|
49
|
-
end
|
|
43
|
+
internal_note = params.dig(:order, :internal_note)
|
|
44
|
+
@order.canceled_by(try_spree_current_user, cancellation_reason: internal_note)
|
|
45
|
+
flash[:success] = Spree.t(:order_canceled)
|
|
50
46
|
redirect_back fallback_location: spree.edit_admin_order_url(@order)
|
|
51
47
|
end
|
|
52
48
|
|
|
@@ -6,7 +6,6 @@ module SpreeCmCommissioner
|
|
|
6
6
|
base.around_action :set_writing_role, only: %i[index]
|
|
7
7
|
base.after_action :set_tenant_after_update, only: %i[update]
|
|
8
8
|
base.before_action :merge_industry_taxons_into_taxons, only: [:update]
|
|
9
|
-
base.before_action :normalize_sti_product_params, only: %i[create update]
|
|
10
9
|
end
|
|
11
10
|
|
|
12
11
|
# Override
|
|
@@ -52,24 +51,6 @@ module SpreeCmCommissioner
|
|
|
52
51
|
|
|
53
52
|
protected
|
|
54
53
|
|
|
55
|
-
# Some admin forms submit STI records under their class key while
|
|
56
|
-
# Spree update reads :product. Merge both into :product so all edited
|
|
57
|
-
# fields are persisted for STI product subclasses.
|
|
58
|
-
def normalize_sti_product_params
|
|
59
|
-
return unless @product
|
|
60
|
-
|
|
61
|
-
sti_key = @product.class.model_name.param_key.to_sym
|
|
62
|
-
sti_params = params[sti_key]
|
|
63
|
-
return unless sti_params.is_a?(::ActionController::Parameters)
|
|
64
|
-
|
|
65
|
-
base_params = params[:product]
|
|
66
|
-
base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
|
|
67
|
-
sti_hash = sti_params.to_unsafe_h
|
|
68
|
-
merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
|
|
69
|
-
|
|
70
|
-
params[:product] = merged_params
|
|
71
|
-
end
|
|
72
|
-
|
|
73
54
|
def merge_industry_taxons_into_taxons
|
|
74
55
|
return if params[:product].blank?
|
|
75
56
|
|
|
@@ -61,16 +61,6 @@ module SpreeCmCommissioner
|
|
|
61
61
|
'badge-info'
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
|
-
|
|
65
|
-
def guest_state_badge(guest)
|
|
66
|
-
badge_class = case guest.state
|
|
67
|
-
when 'active' then 'badge-success'
|
|
68
|
-
when 'locked' then 'badge-warning'
|
|
69
|
-
when 'transferred' then 'badge-secondary'
|
|
70
|
-
else 'badge-info'
|
|
71
|
-
end
|
|
72
|
-
content_tag(:span, guest.state.humanize, class: "badge #{badge_class}")
|
|
73
|
-
end
|
|
74
64
|
end
|
|
75
65
|
end
|
|
76
66
|
end
|
|
@@ -6,7 +6,7 @@ module SpreeCmCommissioner
|
|
|
6
6
|
context.fail!(message: I18n.t('pincode_sender.pincode.blank')) if context.pin_code.nil?
|
|
7
7
|
|
|
8
8
|
if context.pin_code.phone_number?
|
|
9
|
-
|
|
9
|
+
send_sms
|
|
10
10
|
else
|
|
11
11
|
send_email
|
|
12
12
|
end
|
|
@@ -16,73 +16,18 @@ module SpreeCmCommissioner
|
|
|
16
16
|
|
|
17
17
|
private
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
# easy to find and reason about. Telegram Gateway is primary; SMS is the fallback.
|
|
21
|
-
def send_phone_otp
|
|
22
|
-
if telegram_gateway_available?
|
|
23
|
-
send_via_telegram_gateway
|
|
24
|
-
else
|
|
25
|
-
send_via_sms
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def telegram_gateway_available?
|
|
30
|
-
return false unless telegram_gateway_enabled?
|
|
31
|
-
return false if telegram_gateway_api_key.blank?
|
|
32
|
-
|
|
33
|
-
ability = telegram_gateway_adapter.check_send_ability(context.pin_code.contact)
|
|
34
|
-
context.telegram_gateway_request_id = ability.request_id if ability.ok?
|
|
35
|
-
ability.ok?
|
|
36
|
-
rescue TelegramGatewayAdapter::Error, Faraday::Error
|
|
37
|
-
false
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def send_via_telegram_gateway
|
|
19
|
+
def send_sms
|
|
41
20
|
from_number = sms_from_number
|
|
42
21
|
return if from_number.blank?
|
|
43
22
|
|
|
44
|
-
|
|
45
|
-
# (a) the API response already reflects the channel for the mobile UI,
|
|
46
|
-
# (b) verification can reach Telegram even if the user submits the OTP
|
|
47
|
-
# before the async send job has run. For Telegram-delivered codes
|
|
48
|
-
# the `code` column stores Telegram's request_id (Telegram generates
|
|
49
|
-
# and holds the actual OTP).
|
|
50
|
-
context.pin_code.update!(
|
|
51
|
-
delivery_channel: :telegram_gateway,
|
|
52
|
-
code: context.telegram_gateway_request_id
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
SpreeCmCommissioner::TelegramGateway::PinCodeSenderJob.perform_later(
|
|
56
|
-
pin_code_id: context.pin_code.id,
|
|
57
|
-
from: from_number,
|
|
58
|
-
request_id: context.telegram_gateway_request_id,
|
|
59
|
-
tenant_id: context.pin_code&.application&.tenant_id
|
|
60
|
-
)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def send_via_sms
|
|
64
|
-
from_number = sms_from_number
|
|
65
|
-
return if from_number.blank?
|
|
66
|
-
|
|
67
|
-
SpreeCmCommissioner::SmsPinCodeJob.perform_later(
|
|
68
|
-
pin_code_id: context.pin_code.id,
|
|
23
|
+
options = {
|
|
69
24
|
from: from_number,
|
|
70
25
|
to: context.pin_code.contact,
|
|
71
26
|
body: I18n.t('pincode_sender.sms.body', code: context.pin_code.code, readable_type: context.pin_code.readable_type),
|
|
72
27
|
tenant_id: context.pin_code&.application&.tenant_id
|
|
73
|
-
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def telegram_gateway_enabled?
|
|
77
|
-
ENV['TELEGRAM_GATEWAY_ENABLED'] == 'yes'
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def telegram_gateway_api_key
|
|
81
|
-
@telegram_gateway_api_key ||= ENV.fetch('TELEGRAM_GATEWAY_API_KEY', nil)
|
|
82
|
-
end
|
|
28
|
+
}
|
|
83
29
|
|
|
84
|
-
|
|
85
|
-
@telegram_gateway_adapter ||= TelegramGatewayAdapter::Client.new
|
|
30
|
+
SpreeCmCommissioner::SmsPinCodeJob.perform_later(options)
|
|
86
31
|
end
|
|
87
32
|
|
|
88
33
|
def sms_from_number
|
|
@@ -93,8 +38,6 @@ module SpreeCmCommissioner
|
|
|
93
38
|
end
|
|
94
39
|
|
|
95
40
|
def send_email
|
|
96
|
-
context.pin_code.update!(delivery_channel: :email)
|
|
97
|
-
|
|
98
41
|
SpreeCmCommissioner::PinCodeMailer.send_pin_code(
|
|
99
42
|
context.pin_code.id,
|
|
100
43
|
context.pin_code.readable_type,
|
|
@@ -19,47 +19,18 @@ module SpreeCmCommissioner
|
|
|
19
19
|
max_sessions - active_sessions
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
# This query
|
|
23
|
-
# Client must create waiting_guests
|
|
24
|
-
#
|
|
25
|
-
# Yesterday's guests are always older than today's, so fill from yesterday first, then use any
|
|
26
|
-
# leftover slots for today. This way no one queued before the midnight rollover gets skipped.
|
|
27
|
-
# e.g. 5 slots, 2 waiting in yesterday -> take both, then take 3 from today.
|
|
22
|
+
# This query required index. create them in Firebase beforehand.
|
|
23
|
+
# Client side must create waiting_guests document with :queued_at & :allow_to_enter_room_at to null to allow fillter & order.
|
|
28
24
|
def fetch_long_waiting_guests(available_slots)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# same partition — return now to avoid querying (and double-counting) it twice.
|
|
33
|
-
return previous_guests if records_path == previous_records_path
|
|
34
|
-
|
|
35
|
-
remaining_slots = available_slots - previous_guests.size
|
|
36
|
-
return previous_guests if remaining_slots <= 0
|
|
37
|
-
|
|
38
|
-
previous_guests + eligible_guests_in(records_path, remaining_slots)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def eligible_guests_in(records_path, limit)
|
|
42
|
-
firestore.col(records_path)
|
|
25
|
+
firestore.col('waiting_guests')
|
|
26
|
+
.doc(current_date)
|
|
27
|
+
.col('records')
|
|
43
28
|
.where('allow_to_enter_room_at', '==', nil)
|
|
44
29
|
.order('queued_at')
|
|
45
|
-
.limit(
|
|
30
|
+
.limit(available_slots)
|
|
46
31
|
.get.to_a
|
|
47
32
|
end
|
|
48
33
|
|
|
49
|
-
# Published path is authoritative; fall back to the server's own date if not yet published.
|
|
50
|
-
def records_path
|
|
51
|
-
lobby_data&.dig(:waiting_guests_records_path).presence || default_records_path(current_date)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Drain target is derived from the server date, never the (possibly stale) lobby pointer.
|
|
55
|
-
def previous_records_path
|
|
56
|
-
default_records_path(previous_date)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def default_records_path(date)
|
|
60
|
-
"waiting_guests/#{date}/records"
|
|
61
|
-
end
|
|
62
|
-
|
|
63
34
|
# For alert waiting guests to enter room, we just update :allow_to_enter_room_at.
|
|
64
35
|
# App will listen to firebase & start refresh session token to enter room.
|
|
65
36
|
def calling_all(waiting_guests)
|
|
@@ -74,22 +45,9 @@ module SpreeCmCommissioner
|
|
|
74
45
|
Time.zone.now.strftime('%Y-%m-%d')
|
|
75
46
|
end
|
|
76
47
|
|
|
77
|
-
def previous_date
|
|
78
|
-
1.day.ago.strftime('%Y-%m-%d')
|
|
79
|
-
end
|
|
80
|
-
|
|
81
48
|
# When open app, app request to check whether room is full or not via Firebase instead of server to minimize server requests.
|
|
82
|
-
# merge: true so we preserve the published `waiting_guests_records_path` on the lobby doc.
|
|
83
49
|
def mark_as(full:, available_slots:)
|
|
84
|
-
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def lobby_data
|
|
88
|
-
@lobby_data ||= lobby_document.get.data
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def lobby_document
|
|
92
|
-
@lobby_document ||= firestore.col('waiting_rooms').doc('lobby')
|
|
50
|
+
firestore.col('waiting_rooms').doc('lobby').set({ full: full, available_slots: available_slots })
|
|
93
51
|
end
|
|
94
52
|
|
|
95
53
|
def fetch_max_sessions
|
|
@@ -1,28 +1,13 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
|
-
# Makes an open-return entitlement line item redeemable.
|
|
3
|
-
#
|
|
4
|
-
# New design: the open return is no longer a fake open-dated *trip* line item. It is a plain
|
|
5
|
-
# ecommerce add-on (a Spree::Product linked to the outbound trip's product via an
|
|
6
|
-
# `open_dated_pair` ProductRelation) sold as a regular ecommerce line item at checkout.
|
|
7
|
-
#
|
|
8
|
-
# Redemption swaps that ecommerce line item in place into a concrete transit ticket on a chosen
|
|
9
|
-
# return trip (see SpreeCmCommissioner::OpenDatedTrips::Redeem). Once swapped, the line item is a
|
|
10
|
-
# `transit` item.
|
|
11
2
|
module LineItemOpenDatedTrippable
|
|
12
3
|
extend ActiveSupport::Concern
|
|
13
4
|
|
|
14
5
|
included do
|
|
15
6
|
include SpreeCmCommissioner::StoreMetadata
|
|
16
7
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# outbound journey at purchase time (return origin = outbound destination, and vice versa).
|
|
21
|
-
# Storing the return direction means every consumer reads it directly: redemption is a plain
|
|
22
|
-
# id match and the search needs no flip. Endpoints rather than a trip keep this
|
|
23
|
-
# leg-count-independent: a multi-leg outbound still has exactly one origin and one destination.
|
|
24
|
-
store_private_metadata :open_dated_return_origin_place_id, :integer
|
|
25
|
-
store_private_metadata :open_dated_return_destination_place_id, :integer
|
|
8
|
+
# Open dated trip metadata
|
|
9
|
+
store_public_metadata :is_open_dated, :boolean, default: false
|
|
10
|
+
store_public_metadata :original_trip_id, :integer # Original template trip ID BEFORE redemption
|
|
26
11
|
|
|
27
12
|
# Alias existing columns for better semantic meaning
|
|
28
13
|
alias_attribute :valid_until, :to_date # Expiration date
|
|
@@ -34,47 +19,19 @@ module SpreeCmCommissioner
|
|
|
34
19
|
accepter
|
|
35
20
|
end
|
|
36
21
|
|
|
37
|
-
|
|
38
|
-
open_dated_return_origin_place_id.present? && open_dated_return_destination_place_id.present?
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def open_dated_product
|
|
42
|
-
return nil if open_dated_product_id.blank?
|
|
43
|
-
|
|
44
|
-
@open_dated_product ||= Spree::Product.find_by(id: open_dated_product_id)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Origin place the return trip must depart from (= outbound destination).
|
|
48
|
-
def open_dated_return_origin_place
|
|
49
|
-
return nil if open_dated_return_origin_place_id.blank?
|
|
50
|
-
|
|
51
|
-
@open_dated_return_origin_place ||= SpreeCmCommissioner::Place.find_by(id: open_dated_return_origin_place_id)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Destination place the return trip must arrive at (= outbound origin).
|
|
55
|
-
def open_dated_return_destination_place
|
|
56
|
-
return nil if open_dated_return_destination_place_id.blank?
|
|
57
|
-
|
|
58
|
-
@open_dated_return_destination_place ||= SpreeCmCommissioner::Place.find_by(id: open_dated_return_destination_place_id)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Human-readable return journey, e.g. "Siem Reap → Phnom Penh". Nil when endpoints are missing.
|
|
62
|
-
def open_dated_route_label
|
|
63
|
-
return nil if open_dated_return_origin_place.blank? || open_dated_return_destination_place.blank?
|
|
64
|
-
|
|
65
|
-
"#{open_dated_return_origin_place.full_path_name} → #{open_dated_return_destination_place.full_path_name}"
|
|
66
|
-
end
|
|
67
|
-
|
|
22
|
+
# Check if ticket has been redeemed
|
|
68
23
|
def redeemed?
|
|
69
24
|
redeemed_at.present?
|
|
70
25
|
end
|
|
71
26
|
|
|
27
|
+
# Check if ticket is expired
|
|
72
28
|
def expired?
|
|
73
29
|
valid_until.present? && valid_until.to_date < Date.current
|
|
74
30
|
end
|
|
75
31
|
|
|
32
|
+
# Check if ticket can be redeemed
|
|
76
33
|
def can_redeem?
|
|
77
|
-
|
|
34
|
+
is_open_dated? && !redeemed? && !expired?
|
|
78
35
|
end
|
|
79
36
|
end
|
|
80
37
|
end
|
|
@@ -138,6 +138,7 @@ module SpreeCmCommissioner
|
|
|
138
138
|
|
|
139
139
|
trip = SpreeCmCommissioner::Trip.find_by(id: trip_id)
|
|
140
140
|
return unless trip # Skip if trip doesn't exist (will be caught by other validations)
|
|
141
|
+
return if trip.open_dated? # Skip validation for open-dated trips
|
|
141
142
|
|
|
142
143
|
# For scheduled trips, require valid trip stops
|
|
143
144
|
errors.add(:boarding_trip_stop_id, 'must be greater than 0') if boarding_trip_stop_id.present? && boarding_trip_stop_id <= 0
|
|
@@ -10,11 +10,6 @@ module SpreeCmCommissioner
|
|
|
10
10
|
scope :accepted, -> { joins(:order).merge(Spree::Order.accepted) }
|
|
11
11
|
scope :paid, -> { joins(:order).merge(Spree::Order.paid) }
|
|
12
12
|
scope :with_bib_prefix, -> { joins(:option_types).where(option_types: { name: 'bib-prefix' }) }
|
|
13
|
-
scope :exclude_ticket_transfer_orders, -> { joins(:order).merge(Spree::Order.not_ticket_transfer) }
|
|
14
|
-
|
|
15
|
-
# Centralizes the rule so that adjustments (e.g. excluding new order kinds in the
|
|
16
|
-
# future) only need to be made here. Use this anywhere inventory is computed.
|
|
17
|
-
scope :affecting_inventory, -> { complete.exclude_ticket_transfer_orders }
|
|
18
13
|
|
|
19
14
|
scope :filter_by_event, lambda { |event|
|
|
20
15
|
case event
|