spree_cm_commissioner 2.8.1.pre.3 → 2.8.2
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 +1 -0
- data/.gitignore +0 -4
- data/Gemfile.lock +1 -1
- data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
- 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/trip_search_controller.rb +0 -1
- 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_cm_commissioner/admin/products_controller_decorator.rb +0 -19
- data/app/factory/spree_cm_commissioner/event_telegram_message_factory.rb +68 -0
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +2 -2
- data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
- data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
- data/app/jobs/spree_cm_commissioner/event_creation_telegram_alert_sender_job.rb +10 -0
- data/app/jobs/spree_cm_commissioner/oauth_access_tokens/cleanup_expired_job.rb +11 -0
- data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -0
- 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/service_origin.rb +22 -0
- data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/vehicle_kind.rb +1 -1
- data/app/models/spree_cm_commissioner/integration.rb +0 -31
- data/app/models/spree_cm_commissioner/integrations/stadium_x_v1.rb +10 -4
- data/app/models/spree_cm_commissioner/inventory_item.rb +17 -8
- data/app/models/spree_cm_commissioner/maintenance_tasks/cache_invalidation.rb +2 -0
- data/app/models/spree_cm_commissioner/order_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/place.rb +0 -2
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -39
- data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
- data/app/models/spree_cm_commissioner/route.rb +6 -2
- data/app/models/spree_cm_commissioner/seat_layout.rb +0 -2
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -7
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -15
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -10
- data/app/models/spree_cm_commissioner/tenant.rb +0 -9
- data/app/models/spree_cm_commissioner/trip.rb +6 -2
- data/app/models/spree_cm_commissioner/trip_stop.rb +0 -2
- data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
- data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
- data/app/models/spree_cm_commissioner/vehicle.rb +0 -3
- data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -1
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -21
- data/app/models/spree_cm_commissioner/vendor_place.rb +0 -2
- data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +9 -0
- data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +26 -44
- data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +36 -31
- data/app/queries/spree_cm_commissioner/trip_query.rb +2 -4
- data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -1
- 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/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/trip_result_serializer.rb +7 -2
- data/app/services/spree_cm_commissioner/integrations/base/sync_manager.rb +2 -1
- data/app/services/spree_cm_commissioner/integrations/base/sync_result.rb +0 -11
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/external_client/client.rb +15 -14
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_matches.rb +4 -7
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_zones.rb +3 -6
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_manager.rb +3 -0
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/full_sync_strategy.rb +3 -1
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/incremental_sync_strategy.rb +3 -1
- data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/webhook_sync_strategy.rb +2 -1
- data/app/services/spree_cm_commissioner/oauth_access_tokens/cleanup_expired.rb +53 -0
- data/app/services/spree_cm_commissioner/order_holds/hold.rb +0 -17
- data/app/services/spree_cm_commissioner/order_holds/release.rb +0 -17
- data/app/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
- data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
- data/app/services/spree_cm_commissioner/telegram_alerts/event_creation.rb +35 -0
- data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +5 -16
- data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -1
- data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
- data/app/views/spree/admin/integrations/_form.html.erb +0 -12
- data/app/views/spree/admin/integrations/index.html.erb +1 -1
- data/config/initializers/spree_permitted_attributes.rb +1 -8
- data/config/locales/en.yml +0 -13
- data/config/locales/km.yml +0 -7
- data/config/routes.rb +0 -26
- data/lib/spree_cm_commissioner/test_helper/factories/integration_factory.rb +0 -11
- data/lib/spree_cm_commissioner/trip_result.rb +48 -21
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -7
- metadata +10 -220
- 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/transit/item_availabilities_controller.rb +0 -66
- data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
- 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 -51
- 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 -34
- data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
- data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
- 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/jobs/spree_cm_commissioner/audit_event_job.rb +0 -29
- data/app/jobs/spree_cm_commissioner/cleanup_expired_access_tokens_job.rb +0 -9
- 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/models/concerns/spree_cm_commissioner/audit_wrapper.rb +0 -139
- data/app/models/concerns/spree_cm_commissioner/integrations/inventory_sync_cachable.rb +0 -9
- data/app/models/concerns/spree_cm_commissioner/variant_metadata.rb +0 -24
- data/app/models/spree_cm_commissioner/audit_event.rb +0 -11
- data/app/models/spree_cm_commissioner/currency_rate.rb +0 -15
- data/app/models/spree_cm_commissioner/integrations/book_me_bus_v1.rb +0 -56
- data/app/models/spree_cm_commissioner/integrations/larryta.rb +0 -81
- data/app/models/spree_cm_commissioner/integrations/vireak_buntham.rb +0 -82
- data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -34
- 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 -157
- data/app/models/spree_cm_commissioner/show_contestant.rb +0 -34
- 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 -135
- data/app/models/spree_cm_commissioner/show_person.rb +0 -15
- data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
- data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
- data/app/models/spree_cm_commissioner/vote.rb +0 -16
- data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -19
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -34
- 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 -194
- data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
- data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
- data/app/serializables/spree_cm_commissioner/item_availability_sync.rb +0 -10
- data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
- 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 -26
- data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -18
- 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 -15
- data/app/serializers/spree_cm_commissioner/v2/storefront/item_availability_sync_serializer.rb +0 -10
- data/app/services/spree_cm_commissioner/audit_logger.rb +0 -59
- data/app/services/spree_cm_commissioner/cleanup_expired_access_tokens.rb +0 -52
- data/app/services/spree_cm_commissioner/currency_converter/create.rb +0 -27
- data/app/services/spree_cm_commissioner/currency_rates/manage.rb +0 -99
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -279
- data/app/services/spree_cm_commissioner/google_maps_geocoder.rb +0 -41
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/client.rb +0 -261
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/connection.rb +0 -147
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_item_status.rb +0 -52
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_items.rb +0 -91
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/unstock_inventory.rb +0 -140
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_inventory.rb +0 -52
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_item_availability.rb +0 -249
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_locations.rb +0 -103
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_product.rb +0 -66
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_route_stops.rb +0 -113
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_routes.rb +0 -128
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_seat_layout.rb +0 -342
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_service_calendars.rb +0 -59
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trip_stop.rb +0 -179
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trips.rb +0 -597
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_variant.rb +0 -58
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_vehicle_types.rb +0 -87
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/time_parser.rb +0 -19
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/base.rb +0 -40
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/branch.rb +0 -65
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/direction.rb +0 -51
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/inventory_item_status.rb +0 -148
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/location.rb +0 -55
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/operator.rb +0 -17
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/reservation_cart.rb +0 -85
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat.rb +0 -128
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat_layout.rb +0 -363
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/stop.rb +0 -84
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/trip.rb +0 -199
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/wallet_payment.rb +0 -40
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_manager.rb +0 -22
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/full_sync_strategy.rb +0 -117
- data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/incremental_sync_strategy.rb +0 -64
- data/app/services/spree_cm_commissioner/integrations/larryta/external_client/client.rb +0 -344
- data/app/services/spree_cm_commissioner/integrations/larryta/external_client/connection.rb +0 -74
- data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_item_status.rb +0 -53
- data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_items.rb +0 -106
- data/app/services/spree_cm_commissioner/integrations/larryta/inventory/hold_seats.rb +0 -143
- data/app/services/spree_cm_commissioner/integrations/larryta/inventory/release_seats.rb +0 -90
- data/app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb +0 -113
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_item_availability.rb +0 -261
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_product.rb +0 -72
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_routes.rb +0 -142
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_seat_layout.rb +0 -255
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_stock_item.rb +0 -55
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trip_stop.rb +0 -167
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trips.rb +0 -320
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_variant.rb +0 -63
- data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_vehicle_type.rb +0 -79
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/base.rb +0 -39
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking.rb +0 -113
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_session.rb +0 -43
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_transaction.rb +0 -236
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/direction.rb +0 -71
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/passenger.rb +0 -48
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/schedule.rb +0 -150
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat.rb +0 -31
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_availability.rb +0 -49
- data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_layout.rb +0 -211
- data/app/services/spree_cm_commissioner/integrations/larryta/sync_manager.rb +0 -17
- data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/full_sync_strategy.rb +0 -79
- data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/incremental_sync_strategy.rb +0 -58
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/client.rb +0 -206
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/connection.rb +0 -59
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_item_status.rb +0 -48
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_items.rb +0 -97
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/unstock_inventory.rb +0 -208
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_item_availability.rb +0 -270
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_locations.rb +0 -96
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_nationality_pricing.rb +0 -76
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_product.rb +0 -69
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_routes.rb +0 -110
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_seat_layout.rb +0 -207
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_stock_item.rb +0 -43
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trip_stop.rb +0 -185
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trips.rb +0 -300
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_variant.rb +0 -56
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_vehicle_type.rb +0 -51
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/base.rb +0 -32
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking.rb +0 -48
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking_transaction.rb +0 -46
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/cell.rb +0 -53
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/confirm_booking_request.rb +0 -43
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/location.rb +0 -37
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/schedule.rb +0 -138
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat.rb +0 -48
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat_layout.rb +0 -79
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_manager.rb +0 -17
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/full_sync_strategy.rb +0 -87
- data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/incremental_sync_strategy.rb +0 -53
- data/app/services/spree_cm_commissioner/inventory_items/generate_permanent_item.rb +0 -48
- data/app/services/spree_cm_commissioner/place_resolver.rb +0 -95
- data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -56
- data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -49
- 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 -66
- data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
- 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 -334
- data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
- data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -104
- 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 -119
- 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/views/spree/admin/integrations/_book_me_bus_v1_fields.html.erb +0 -47
- data/app/views/spree/admin/integrations/_larryta_fields.html.erb +0 -58
- data/app/views/spree/admin/integrations/_vireak_buntham_fields.html.erb +0 -75
- 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/20260327143200_create_cm_audit_events.rb +0 -21
- 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/20260410045815_create_cm_currency_rates.rb +0 -23
- data/db/migrate/20260411102139_add_metadata_to_cm_inventory_items.rb +0 -6
- 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/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
- data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
- data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
- 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 -96
- 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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cc101fbc1fb46a184c311e3cdf1827cd6515ae3b0399d77ca67c48560b3417bc
|
|
4
|
+
data.tar.gz: 5437f4e82b8c48ce55753432d2ce529935b0c63d472946f03153e817ba3c3038
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74c7a8c0fbb21ae704c905b4f14b8d878b701adf82fc569a0db9d3bb780cae702eb93303c29db6bd08f602e9270fb89caed7bf5ebdb3a21d474057cef17d2157
|
|
7
|
+
data.tar.gz: 981dc574b4b68c1fec6ed7a665ec47ef52bfb60ef89476ab119e72da1311c9e2ae01e78a69436a8663ba185b460df46c6fd5836ccc52531c5e4a13eeaa5c3209
|
data/.env.example
CHANGED
|
@@ -34,6 +34,7 @@ DISTANCE_SIGNING_KEY=hei********************VY
|
|
|
34
34
|
|
|
35
35
|
# Cache durations (in seconds) for different content types
|
|
36
36
|
# See: app/controllers/concerns/spree_cm_commissioner/content_cachable.rb
|
|
37
|
+
CACHE_AUTO_INVALIDATION_DISABLED="" # Set to yes to disable CDN cache invalidation entirely (kill switch)
|
|
37
38
|
CACHE_CDN_MAX_AGE=86400 # CDN/server-side cache duration for all responses
|
|
38
39
|
CACHE_STATIC_MAX_AGE=86400 # Static content (countries, provinces, seat layouts, CMS pages) - 1 day
|
|
39
40
|
CACHE_SEMI_STATIC_MAX_AGE=3600 # Semi-static content (menus, homepage backgrounds, routes) - 1 hour
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 🎉 ---[Event]---
|
|
2
|
+
#
|
|
3
|
+
# 📋 Event: {{event.name}}
|
|
4
|
+
#
|
|
5
|
+
# 👤 Organizer: {{vendor.name}}
|
|
6
|
+
#
|
|
7
|
+
# 🗓️ Start Date: {{from_date}}
|
|
8
|
+
# 🗓️ End Date: {{to_date}}
|
|
9
|
+
# 🔗 URL: ......
|
|
10
|
+
#
|
|
11
|
+
module SpreeCmCommissioner
|
|
12
|
+
class EventTelegramMessageFactory < TelegramMessageFactory
|
|
13
|
+
attr_reader :event
|
|
14
|
+
|
|
15
|
+
def initialize(event:)
|
|
16
|
+
@event = event
|
|
17
|
+
|
|
18
|
+
title = "✨ #{event.name} ✨"
|
|
19
|
+
|
|
20
|
+
super(title: title)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def body
|
|
24
|
+
[
|
|
25
|
+
event_name_line,
|
|
26
|
+
organizer_line,
|
|
27
|
+
[start_date_line, end_date_line].compact.join("\n"),
|
|
28
|
+
event_url_line
|
|
29
|
+
].compact_blank.join("\n\n")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def event_name_line
|
|
35
|
+
"📋 Event: #{event.name}" if event.name.present?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def organizer_line
|
|
39
|
+
return if event.vendor&.name.blank?
|
|
40
|
+
|
|
41
|
+
"👤 Organizer: #{bold(event.vendor.name)}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def start_date_line
|
|
45
|
+
return if event.from_date.blank?
|
|
46
|
+
|
|
47
|
+
"🗓️ Start Date: #{pretty_datetime(event.from_date)}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def end_date_line
|
|
51
|
+
return if event.to_date.blank?
|
|
52
|
+
|
|
53
|
+
"🗓️ End Date: #{pretty_datetime(event.to_date)}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def pretty_datetime(date)
|
|
57
|
+
return '' if date.blank?
|
|
58
|
+
|
|
59
|
+
date.strftime('%b %d, %Y · %H:%M')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def event_url_line
|
|
63
|
+
return if event.event_url.blank?
|
|
64
|
+
|
|
65
|
+
"🔗 URL: #{event.event_url}"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -15,8 +15,8 @@ module SpreeCmCommissioner
|
|
|
15
15
|
.joins(:inventory_items)
|
|
16
16
|
.where(vendor_id: vendor_id)
|
|
17
17
|
.where(inventory_items: { inventory_date: stay_dates })
|
|
18
|
-
.where('CAST(
|
|
19
|
-
CAST(
|
|
18
|
+
.where('CAST(public_metadata->\'cm_options\'->>\'number-of-adults\' AS INTEGER) +
|
|
19
|
+
CAST(public_metadata->\'cm_options\'->>\'number-of-kids\' AS INTEGER) >= ?', number_of_guests
|
|
20
20
|
)
|
|
21
21
|
.where('inventory_items.quantity_available > 0')
|
|
22
22
|
.distinct
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
class EventCreationTelegramAlertSenderJob < ApplicationUniqueJob
|
|
3
|
+
queue_as :telegram_bot
|
|
4
|
+
|
|
5
|
+
def perform(options = {})
|
|
6
|
+
event = Spree::Taxon.find(options[:event_id])
|
|
7
|
+
SpreeCmCommissioner::TelegramAlerts::EventCreation.call(event: event)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -23,6 +23,8 @@ module SpreeCmCommissioner
|
|
|
23
23
|
TripKey = Struct.new(:trip_id, :direction, :boarding_trip_stop_id, :drop_off_trip_stop_id)
|
|
24
24
|
|
|
25
25
|
included do
|
|
26
|
+
include SpreeCmCommissioner::ServiceOrigin
|
|
27
|
+
|
|
26
28
|
validates :direction, inclusion: { in: DIRECTION }, allow_nil: true
|
|
27
29
|
validates :trip_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
28
30
|
validates :service_origin_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
@@ -125,6 +127,12 @@ module SpreeCmCommissioner
|
|
|
125
127
|
|
|
126
128
|
private
|
|
127
129
|
|
|
130
|
+
def resolve_service_origin_id
|
|
131
|
+
return nil if trip_id.blank?
|
|
132
|
+
|
|
133
|
+
SpreeCmCommissioner::Trip.find_by(id: trip_id)&.service_origin_id
|
|
134
|
+
end
|
|
135
|
+
|
|
128
136
|
def validate_trip_stops_for_scheduled_trips
|
|
129
137
|
return if trip_id.blank? || trip_id.zero?
|
|
130
138
|
|
|
@@ -26,10 +26,8 @@ module SpreeCmCommissioner
|
|
|
26
26
|
|
|
27
27
|
state_machine.after_transition to: :canceled, do: :precalculate_conversion
|
|
28
28
|
state_machine.after_transition to: :canceled, do: :restock_inventory!
|
|
29
|
-
state_machine.after_transition to: :canceled, do: :de_allocate_resources
|
|
30
29
|
|
|
31
30
|
state_machine.after_transition to: :complete, do: :increment_route_fulfilled_order_count
|
|
32
|
-
state_machine.after_transition to: :complete, do: :allocate_resources
|
|
33
31
|
|
|
34
32
|
scope :accepted, -> { where(request_state: 'accepted') }
|
|
35
33
|
|
|
@@ -330,13 +328,5 @@ module SpreeCmCommissioner
|
|
|
330
328
|
factory = OrderTelegramMessageFactory.new(title: title, order: self)
|
|
331
329
|
TelegramNotificationSenderJob.perform_later(chat_id: chat_id, message: factory.message, parse_mode: factory.parse_mode)
|
|
332
330
|
end
|
|
333
|
-
|
|
334
|
-
def allocate_resources
|
|
335
|
-
SpreeCmCommissioner::VotingCreditAllocationJob.perform_later(order_id: id)
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
def de_allocate_resources
|
|
339
|
-
SpreeCmCommissioner::VotingCreditDeAllocationJob.perform_later(order_id: id)
|
|
340
|
-
end
|
|
341
331
|
end
|
|
342
332
|
end
|
|
@@ -5,7 +5,7 @@ module SpreeCmCommissioner
|
|
|
5
5
|
module ProductType
|
|
6
6
|
extend ActiveSupport::Concern
|
|
7
7
|
|
|
8
|
-
PRODUCT_TYPES = %i[accommodation service ecommerce transit
|
|
8
|
+
PRODUCT_TYPES = %i[accommodation service ecommerce transit].freeze
|
|
9
9
|
PERMANENT_STOCK_PRODUCT_TYPES = %w[accommodation service transit].freeze
|
|
10
10
|
PRE_INVENTORY_DAYS = { 'transit' => 90, 'accommodation' => 365, 'service' => 30 }.freeze
|
|
11
11
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
# Defaults service_origin (nationality) from parent associations during validation (on create).
|
|
3
|
+
# Vendor → Route → Trip → LineItem.
|
|
4
|
+
# Pricing rules use this to determine local vs foreigner rates.
|
|
5
|
+
module ServiceOrigin
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
before_validation :assign_service_origin_id, on: :create
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def assign_service_origin_id
|
|
15
|
+
self.service_origin_id ||= resolve_service_origin_id
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def resolve_service_origin_id
|
|
19
|
+
nil
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -7,6 +7,7 @@ module SpreeCmCommissioner
|
|
|
7
7
|
preference :telegram_order_alert_chat_id, :string
|
|
8
8
|
preference :telegram_order_request_alert_chat_id, :string
|
|
9
9
|
preference :telegram_new_vendor_alert_chat_id, :string
|
|
10
|
+
preference :telegram_new_event_alert_chat_id, :string
|
|
10
11
|
preference :assetlinks, :string, default: ''
|
|
11
12
|
preference :apple_app_site_association, :string, default: ''
|
|
12
13
|
end
|
|
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
|
|
|
2
2
|
module VehicleKind
|
|
3
3
|
extend ActiveSupport::Concern
|
|
4
4
|
|
|
5
|
-
VEHICLE_KINDS = %i[suv sedan minivan van sleeping_bus luxury_van air_bus bus ferry
|
|
5
|
+
VEHICLE_KINDS = %i[suv sedan minivan van sleeping_bus luxury_van air_bus bus ferry].freeze
|
|
6
6
|
|
|
7
7
|
included do
|
|
8
8
|
enum kind: VEHICLE_KINDS if table_exists? && column_names.include?('kind')
|
|
@@ -25,36 +25,5 @@ module SpreeCmCommissioner
|
|
|
25
25
|
def unstock_external_inventory!(_order, _line_items)
|
|
26
26
|
raise NotImplementedError, 'Subclasses must implement the unstock_external_inventory! method'
|
|
27
27
|
end
|
|
28
|
-
|
|
29
|
-
def sync_item_availability!(_options = {})
|
|
30
|
-
raise NotImplementedError, 'Subclasses must implement the sync_item_availability! method'
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def hold_inventory!(_order, _line_items)
|
|
34
|
-
raise NotImplementedError, 'Subclasses must implement the hold_inventory! method'
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Integrations that manage external inventory reservations should override this to return true
|
|
38
|
-
def supports_external_inventory_holding?
|
|
39
|
-
false
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Integrations that support automatically releasing external inventory
|
|
43
|
-
# after reservation expiration or order cancellation should override this to return true
|
|
44
|
-
def supports_auto_release_inventory?
|
|
45
|
-
false
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def release_inventory!(_order, _line_items)
|
|
49
|
-
raise NotImplementedError, 'Subclasses must implement the release_inventory! method'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def external_inventory_items(_order)
|
|
53
|
-
raise NotImplementedError, 'Subclasses must implement the external_inventory_items method'
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def external_inventory_item_status(_order, _options)
|
|
57
|
-
raise NotImplementedError, 'Subclasses must implement the external_inventory_item_status method'
|
|
58
|
-
end
|
|
59
28
|
end
|
|
60
29
|
end
|
|
@@ -5,7 +5,10 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
|
|
|
5
5
|
|
|
6
6
|
# override
|
|
7
7
|
def sync_manager
|
|
8
|
-
SpreeCmCommissioner::Integrations::StadiumXV1::SyncManager.new(
|
|
8
|
+
SpreeCmCommissioner::Integrations::StadiumXV1::SyncManager.new(
|
|
9
|
+
integration: self,
|
|
10
|
+
client: client
|
|
11
|
+
)
|
|
9
12
|
end
|
|
10
13
|
|
|
11
14
|
# override
|
|
@@ -15,6 +18,7 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
|
|
|
15
18
|
order: order,
|
|
16
19
|
line_items: line_items
|
|
17
20
|
)
|
|
21
|
+
|
|
18
22
|
raise SpreeCmCommissioner::Integrations::SyncError, result.error unless result.success?
|
|
19
23
|
end
|
|
20
24
|
|
|
@@ -23,9 +27,11 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
|
|
|
23
27
|
raise SpreeCmCommissioner::Integrations::SyncError, 'Ticket cannot be cancelled'
|
|
24
28
|
end
|
|
25
29
|
|
|
26
|
-
def sync_item_availability!(_options = {}); end
|
|
27
|
-
|
|
28
30
|
def client
|
|
29
|
-
|
|
31
|
+
SpreeCmCommissioner::Integrations::StadiumXV1::ExternalClient::Client.new(
|
|
32
|
+
public_key: public_key,
|
|
33
|
+
private_key: private_key,
|
|
34
|
+
base_url: base_url
|
|
35
|
+
)
|
|
30
36
|
end
|
|
31
37
|
end
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
class InventoryItem < Base
|
|
3
3
|
include SpreeCmCommissioner::ProductType
|
|
4
|
-
include SpreeCmCommissioner::StoreMetadata
|
|
5
|
-
include SpreeCmCommissioner::Integrations::IntegrationMappable
|
|
6
4
|
|
|
7
5
|
MAX_DISPLAY_STOCK = 20
|
|
8
6
|
|
|
9
|
-
store_public_metadata :last_synced_at, :datetime
|
|
10
|
-
store_public_metadata :original_price, :integer
|
|
11
|
-
store_public_metadata :currency, :string
|
|
12
|
-
|
|
13
7
|
# Association
|
|
14
8
|
belongs_to :variant, class_name: 'Spree::Variant', optional: false
|
|
15
9
|
|
|
@@ -29,8 +23,23 @@ module SpreeCmCommissioner
|
|
|
29
23
|
|
|
30
24
|
before_save -> { self.product_type = variant.product_type }, if: -> { product_type.nil? }
|
|
31
25
|
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
after_commit :schedule_product_cache_invalidation
|
|
27
|
+
|
|
28
|
+
# Only for ecommerce: the app uses product.in_stock? (derived from quantity_available) for product cards.
|
|
29
|
+
# Other types (e.g. accommodation, bus) have many inventory items (including daily-generated ones),
|
|
30
|
+
# so invalidating per item would flood the task queue.
|
|
31
|
+
#
|
|
32
|
+
# This is temporary until we have a more robust cache invalidation strategy in place.
|
|
33
|
+
def schedule_product_cache_invalidation
|
|
34
|
+
return unless ecommerce?
|
|
35
|
+
return unless saved_change_to_quantity_available?
|
|
36
|
+
|
|
37
|
+
# Only fires on in_stock status transition (0 ↔ N); non-zero to non-zero changes are skipped.
|
|
38
|
+
old_val, new_val = saved_change_to_quantity_available
|
|
39
|
+
return if old_val.to_i.positive? && new_val.to_i.positive?
|
|
40
|
+
|
|
41
|
+
SpreeCmCommissioner::MaintenanceTasks::CacheInvalidation.pending.create_or_find_by(maintainable: variant.product)
|
|
42
|
+
end
|
|
34
43
|
|
|
35
44
|
def public_quantity_available
|
|
36
45
|
[quantity_available, MAX_DISPLAY_STOCK].min
|
|
@@ -3,6 +3,8 @@ module SpreeCmCommissioner
|
|
|
3
3
|
module MaintenanceTasks
|
|
4
4
|
class CacheInvalidation < MaintenanceTask
|
|
5
5
|
def maintain
|
|
6
|
+
return if ENV['CACHE_AUTO_INVALIDATION_DISABLED'] == 'yes'
|
|
7
|
+
|
|
6
8
|
if maintainable.is_a?(SpreeCmCommissioner::HomepageBackground) || maintainable.is_a?(Spree::Menu)
|
|
7
9
|
SpreeCmCommissioner::HomepageDataLoader.clear_cache
|
|
8
10
|
end
|
|
@@ -42,7 +42,6 @@ module SpreeCmCommissioner
|
|
|
42
42
|
base.has_many :reserved_blocks, through: :guests, class_name: 'SpreeCmCommissioner::ReservedBlock'
|
|
43
43
|
base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variants
|
|
44
44
|
base.has_many :product_completion_steps, class_name: 'SpreeCmCommissioner::ProductCompletionStep', through: :line_items
|
|
45
|
-
base.has_many :audit_events, class_name: 'SpreeCmCommissioner::AuditEvent', as: :auditable
|
|
46
45
|
|
|
47
46
|
base.delegate :customer, to: :user, allow_nil: true
|
|
48
47
|
|
|
@@ -14,8 +14,6 @@ module SpreeCmCommissioner
|
|
|
14
14
|
|
|
15
15
|
base.delegate :is_open_dated, :is_open_dated?, to: :trip, allow_nil: true
|
|
16
16
|
|
|
17
|
-
base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', foreign_key: :episode_id, dependent: :destroy
|
|
18
|
-
|
|
19
17
|
base.has_many :variant_kind_option_types, -> { where(kind: :variant).order(:position) },
|
|
20
18
|
through: :product_option_types, source: :option_type
|
|
21
19
|
|
|
@@ -57,45 +55,8 @@ module SpreeCmCommissioner
|
|
|
57
55
|
|
|
58
56
|
base.belongs_to :event, class_name: 'Spree::Taxon', optional: true
|
|
59
57
|
|
|
60
|
-
base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
|
|
61
58
|
base.has_many :industry_classifications, -> { joins(:taxon).where(spree_taxons: { kind: :industry }) }, class_name: 'Spree::Classification'
|
|
62
59
|
base.has_many :industry_taxons, through: :industry_classifications, source: :taxon
|
|
63
|
-
base.scope :visible_to, lambda { |user|
|
|
64
|
-
publicly_available = where(status: :active, preview: false)
|
|
65
|
-
|
|
66
|
-
if user
|
|
67
|
-
# Resolved through associations — avoids hardcoding class names.
|
|
68
|
-
taxon_type = reflect_on_association(:taxons).klass.polymorphic_name
|
|
69
|
-
|
|
70
|
-
# IDs of products that have been explicitly assigned their own PreviewRole.
|
|
71
|
-
products_with_own_roles = SpreeCmCommissioner::PreviewRole
|
|
72
|
-
.where(previewable_type: polymorphic_name)
|
|
73
|
-
.select(:previewable_id)
|
|
74
|
-
|
|
75
|
-
# Path A: product has its own PreviewRole → user must hold that role directly.
|
|
76
|
-
# Taxon membership is irrelevant for these products.
|
|
77
|
-
via_product_role = where(status: :active, preview: true)
|
|
78
|
-
.where(id: products_with_own_roles)
|
|
79
|
-
.where(id: user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id))
|
|
80
|
-
|
|
81
|
-
# Path B: product has no own PreviewRole → inherit access from its event or taxons.
|
|
82
|
-
# Accessible if the user holds a preview role for the product's event_id or any
|
|
83
|
-
# taxon the product belongs to via the classifications join table.
|
|
84
|
-
allowed_taxon_ids = user.preview_roles.where(previewable_type: taxon_type).select(:previewable_id)
|
|
85
|
-
preview_no_own = where(status: :active, preview: true).where.not(id: products_with_own_roles)
|
|
86
|
-
|
|
87
|
-
via_event_id = preview_no_own.where(event_id: allowed_taxon_ids)
|
|
88
|
-
via_taxon_join = preview_no_own.joins(:taxons).where(spree_taxons: { id: allowed_taxon_ids })
|
|
89
|
-
|
|
90
|
-
publicly_available
|
|
91
|
-
.or(via_product_role)
|
|
92
|
-
.or(where(id: via_event_id.select(:id)))
|
|
93
|
-
.or(where(id: via_taxon_join.select(:id)))
|
|
94
|
-
else
|
|
95
|
-
publicly_available
|
|
96
|
-
end
|
|
97
|
-
}
|
|
98
|
-
|
|
99
60
|
base.scope :min_price, lambda { |vendor|
|
|
100
61
|
joins(:prices_including_master)
|
|
101
62
|
.where(vendor_id: vendor.id, product_type: vendor.primary_product_type)
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module RoleDecorator
|
|
3
3
|
def self.prepended(base)
|
|
4
|
-
base.enum role_type: { internal: 0, external: 1
|
|
4
|
+
base.enum role_type: { internal: 0, external: 1 }
|
|
5
5
|
|
|
6
6
|
base.has_many :role_permissions, class_name: 'SpreeCmCommissioner::RolePermission'
|
|
7
7
|
base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
|
|
8
|
-
base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole'
|
|
9
8
|
|
|
10
9
|
base.belongs_to :vendor, optional: true
|
|
11
10
|
|
|
@@ -14,8 +13,6 @@ module SpreeCmCommissioner
|
|
|
14
13
|
where(vendor_id: vendor)
|
|
15
14
|
}
|
|
16
15
|
base.scope :filter_external, -> { where(role_type: :external) }
|
|
17
|
-
base.scope :filter_internal, -> { where(role_type: :internal) }
|
|
18
|
-
base.scope :filter_preview, -> { where(role_type: :preview) }
|
|
19
16
|
|
|
20
17
|
base.accepts_nested_attributes_for :role_permissions, allow_destroy: true
|
|
21
18
|
|