spree_cm_commissioner 2.5.1.pre.pre1 → 2.5.1.pre.pre2

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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/spree/admin/guests_controller.rb +5 -5
  4. data/app/controllers/spree/api/chatrace/check_ins_controller.rb +6 -4
  5. data/app/controllers/spree/api/chatrace/guests_controller.rb +5 -18
  6. data/app/controllers/spree/api/v2/operator/check_in_bulks_controller.rb +6 -5
  7. data/app/controllers/spree/api/v2/operator/check_in_sessions_controller.rb +32 -0
  8. data/app/controllers/spree/api/v2/operator/check_ins_controller.rb +5 -5
  9. data/app/controllers/spree/api/v2/operator/event_qrs_controller.rb +2 -0
  10. data/app/controllers/spree/api/v2/storefront/popular_route_places_controller.rb +1 -1
  11. data/app/controllers/spree/api/v2/storefront/self_check_in_controller.rb +7 -7
  12. data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +4 -4
  13. data/app/controllers/spree/api/v2/tenant/popular_route_places_controller.rb +60 -0
  14. data/app/controllers/spree/api/v2/tenant/routes_controller.rb +50 -0
  15. data/app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb +46 -0
  16. data/app/controllers/spree/events/guests_controller.rb +9 -10
  17. data/app/controllers/spree/transit/trips_controller.rb +3 -3
  18. data/app/finders/spree_cm_commissioner/places/find_with_route.rb +12 -12
  19. data/app/finders/spree_cm_commissioner/route_metrics/find_popular.rb +44 -0
  20. data/app/finders/spree_cm_commissioner/routes/find.rb +94 -0
  21. data/app/finders/spree_cm_commissioner/routes/find_popular.rb +20 -35
  22. data/app/interactors/spree_cm_commissioner/event_qr_generator.rb +2 -1
  23. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +11 -4
  24. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +10 -1
  25. data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +4 -3
  26. data/app/interactors/spree_cm_commissioner/trip_stops_creator.rb +2 -2
  27. data/app/jobs/spree_cm_commissioner/guests/preload_check_in_session_ids_job.rb +10 -0
  28. data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +10 -0
  29. data/app/jobs/spree_cm_commissioner/route_metrics/increase_fulfilled_order_count_job.rb +10 -0
  30. data/app/jobs/spree_cm_commissioner/route_metrics/increase_order_count_job.rb +10 -0
  31. data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +10 -0
  32. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +2 -2
  33. data/app/models/concerns/spree_cm_commissioner/route_order_countable.rb +2 -2
  34. data/app/models/spree_cm_commissioner/check_in.rb +34 -7
  35. data/app/models/spree_cm_commissioner/check_in_session.rb +8 -3
  36. data/app/models/spree_cm_commissioner/guest.rb +60 -28
  37. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +2 -2
  38. data/app/models/spree_cm_commissioner/place.rb +5 -8
  39. data/app/models/spree_cm_commissioner/pricing_actions/create_guest_adjustments.rb +52 -0
  40. data/app/models/spree_cm_commissioner/pricing_actions/create_line_item_adjustments.rb +6 -0
  41. data/app/models/spree_cm_commissioner/pricing_rule.rb +4 -0
  42. data/app/models/spree_cm_commissioner/pricing_rules/age_group.rb +45 -0
  43. data/app/models/spree_cm_commissioner/pricing_rules/nationality.rb +21 -2
  44. data/app/models/spree_cm_commissioner/pricing_rules/nationality_group.rb +41 -0
  45. data/app/models/spree_cm_commissioner/product_decorator.rb +1 -0
  46. data/app/models/spree_cm_commissioner/route.rb +46 -5
  47. data/app/models/spree_cm_commissioner/route_metric.rb +21 -0
  48. data/app/models/spree_cm_commissioner/route_photo.rb +12 -0
  49. data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
  50. data/app/models/spree_cm_commissioner/trip.rb +8 -33
  51. data/app/models/spree_cm_commissioner/trip_stop.rb +16 -2
  52. data/app/models/spree_cm_commissioner/vendor_decorator.rb +3 -1
  53. data/app/queries/spree_cm_commissioner/trip_query.rb +2 -2
  54. data/app/serializers/spree/v2/tenant/transit_cart_serializer.rb +11 -0
  55. data/app/serializers/spree_cm_commissioner/v2/operator/check_in_serializer.rb +1 -2
  56. data/app/serializers/spree_cm_commissioner/v2/operator/check_in_session_serializer.rb +9 -0
  57. data/app/serializers/spree_cm_commissioner/v2/operator/guest_serializer.rb +1 -1
  58. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +2 -1
  59. data/app/serializers/spree_cm_commissioner/v2/storefront/route_serializer.rb +3 -1
  60. data/app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb +17 -0
  61. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +1 -1
  62. data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +65 -0
  63. data/app/services/spree_cm_commissioner/check_ins/destroy_bulk.rb +54 -0
  64. data/app/services/spree_cm_commissioner/guests/preload_check_in_session_ids.rb +22 -0
  65. data/app/services/spree_cm_commissioner/pricing_models/create_with_rule_groups.rb +56 -0
  66. data/app/services/spree_cm_commissioner/pricing_models/update_with_rule_groups.rb +69 -0
  67. data/app/services/spree_cm_commissioner/pricing_rules/build_params.rb +16 -7
  68. data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +31 -0
  69. data/app/services/spree_cm_commissioner/{routes/increment_fulfilled_order_count.rb → route_metrics/increase_fulfilled_order_count.rb} +3 -3
  70. data/app/services/spree_cm_commissioner/{routes/increment_order_count.rb → route_metrics/increase_order_count.rb} +3 -3
  71. data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +31 -0
  72. data/app/services/spree_cm_commissioner/{routes/base_update_order_metrics.rb → route_metrics/update_route_metrics.rb} +11 -16
  73. data/app/services/spree_cm_commissioner/routes/create.rb +51 -0
  74. data/app/services/spree_cm_commissioner/routes/update.rb +25 -0
  75. data/app/{interactors/spree_cm_commissioner/transit/draft_order_creator.rb → services/spree_cm_commissioner/transit_order/create.rb} +13 -16
  76. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +123 -0
  77. data/app/services/spree_cm_commissioner/trips/service_calendars/create_or_update.rb +54 -0
  78. data/app/services/spree_cm_commissioner/trips/update_single_leg.rb +88 -0
  79. data/app/services/spree_cm_commissioner/trips/variants/create.rb +103 -0
  80. data/app/views/spree/transit/trip_stops/index.html.erb +4 -2
  81. data/app/views/spree_cm_commissioner/guest_mailer/send_ticket_to_guest.html.erb +0 -1
  82. data/config/initializers/spree_permitted_attributes.rb +11 -0
  83. data/config/locales/en.yml +2 -0
  84. data/config/locales/km.yml +2 -0
  85. data/config/routes.rb +8 -0
  86. data/db/migrate/20251224033103_migrate_cm_routes_to_cm_route_metrics.rb +17 -0
  87. data/db/migrate/20251224033910_migrate_cm_vendor_routes_to_cm_routes.rb +30 -0
  88. data/db/migrate/20251225100000_add_age_group_to_cm_guests.rb +6 -0
  89. data/db/migrate/20260105024742_add_type_to_cm_pricing_actions.rb +11 -0
  90. data/db/migrate/20260105072450_migrate_cm_trip_stops_to_support_trip_connection.rb +12 -0
  91. data/db/migrate/20260108101406_add_allow_booking_to_cm_trips.rb +5 -0
  92. data/db/migrate/20260121024645_add_nationality_group_to_cm_guests.rb +5 -0
  93. data/docs/pricing_model/age_group.md +40 -0
  94. data/docs/pricing_model/nationality_group.md +35 -0
  95. data/lib/spree_cm_commissioner/test_helper/factories/check_in_factory.rb +3 -1
  96. data/lib/spree_cm_commissioner/test_helper/factories/check_in_session_factory.rb +26 -0
  97. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +4 -0
  98. data/lib/spree_cm_commissioner/test_helper/factories/pricing_action_factory.rb +4 -0
  99. data/lib/spree_cm_commissioner/test_helper/factories/pricing_rule_factory.rb +45 -1
  100. data/lib/spree_cm_commissioner/test_helper/factories/route_factory.rb +7 -6
  101. data/lib/spree_cm_commissioner/test_helper/factories/route_metric_factory.rb +12 -0
  102. data/lib/spree_cm_commissioner/test_helper/factories/route_photo_factory.rb +5 -0
  103. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +4 -1
  104. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +3 -1
  105. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +2 -0
  106. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +22 -0
  107. data/lib/spree_cm_commissioner/transit/route_stop.rb +61 -0
  108. data/lib/spree_cm_commissioner/transit/route_stop_collection.rb +175 -0
  109. data/lib/spree_cm_commissioner/transit/trip_form.rb +81 -0
  110. data/lib/spree_cm_commissioner/transit/trip_stop_form.rb +61 -0
  111. data/lib/spree_cm_commissioner/version.rb +1 -1
  112. data/lib/spree_cm_commissioner.rb +4 -0
  113. metadata +54 -20
  114. data/app/interactors/spree_cm_commissioner/check_in_bulk_creator.rb +0 -71
  115. data/app/interactors/spree_cm_commissioner/check_in_destroyer.rb +0 -43
  116. data/app/jobs/spree_cm_commissioner/transit/route_fulfilled_order_count_incrementer_job.rb +0 -10
  117. data/app/jobs/spree_cm_commissioner/transit/route_order_count_incrementer_job.rb +0 -10
  118. data/app/jobs/spree_cm_commissioner/transit/route_previous_trip_count_decrementer_job.rb +0 -13
  119. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_decrementer_job.rb +0 -10
  120. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_incrementer_job.rb +0 -10
  121. data/app/models/concerns/spree_cm_commissioner/route_trip_count_callbacks.rb +0 -48
  122. data/app/models/spree_cm_commissioner/trip_connection.rb +0 -36
  123. data/app/models/spree_cm_commissioner/vendor_route.rb +0 -9
  124. data/app/services/spree_cm_commissioner/routes/decrement_previous_trip_count.rb +0 -30
  125. data/app/services/spree_cm_commissioner/routes/decrement_trip_count.rb +0 -33
  126. data/app/services/spree_cm_commissioner/routes/increment_trip_count.rb +0 -33
  127. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1.pre.pre1
4
+ version: 2.5.1.pre.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-22 00:00:00.000000000 Z
11
+ date: 2026-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -905,6 +905,7 @@ files:
905
905
  - app/controllers/spree/api/chatrace/orders_controller.rb
906
906
  - app/controllers/spree/api/json_ld/vendors_controller.rb
907
907
  - app/controllers/spree/api/v2/operator/check_in_bulks_controller.rb
908
+ - app/controllers/spree/api/v2/operator/check_in_sessions_controller.rb
908
909
  - app/controllers/spree/api/v2/operator/check_ins_controller.rb
909
910
  - app/controllers/spree/api/v2/operator/dashboard_crew_events_controller.rb
910
911
  - app/controllers/spree/api/v2/operator/event_charts_controller.rb
@@ -1031,13 +1032,16 @@ files:
1031
1032
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
1032
1033
  - app/controllers/spree/api/v2/tenant/pin_code_checkers_controller.rb
1033
1034
  - app/controllers/spree/api/v2/tenant/pin_code_generators_controller.rb
1035
+ - app/controllers/spree/api/v2/tenant/popular_route_places_controller.rb
1034
1036
  - app/controllers/spree/api/v2/tenant/product_dynamic_fields_controller.rb
1035
1037
  - app/controllers/spree/api/v2/tenant/products_controller.rb
1036
1038
  - app/controllers/spree/api/v2/tenant/profile_images_controller.rb
1037
1039
  - app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb
1040
+ - app/controllers/spree/api/v2/tenant/routes_controller.rb
1038
1041
  - app/controllers/spree/api/v2/tenant/s3_signed_urls_controller.rb
1039
1042
  - app/controllers/spree/api/v2/tenant/taxons_controller.rb
1040
1043
  - app/controllers/spree/api/v2/tenant/tickets_controller.rb
1044
+ - app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb
1041
1045
  - app/controllers/spree/api/v2/tenant/trip_places_controller.rb
1042
1046
  - app/controllers/spree/api/v2/tenant/trip_search_controller.rb
1043
1047
  - app/controllers/spree/api/v2/tenant/trips_controller.rb
@@ -1145,6 +1149,8 @@ files:
1145
1149
  - app/finders/spree_cm_commissioner/payment_methods/group_by_bank.rb
1146
1150
  - app/finders/spree_cm_commissioner/places/find_with_route.rb
1147
1151
  - app/finders/spree_cm_commissioner/products/find_decorator.rb
1152
+ - app/finders/spree_cm_commissioner/route_metrics/find_popular.rb
1153
+ - app/finders/spree_cm_commissioner/routes/find.rb
1148
1154
  - app/finders/spree_cm_commissioner/routes/find_popular.rb
1149
1155
  - app/helpers/spree/admin/base_helper_decorator.rb
1150
1156
  - app/helpers/spree/admin/google_wallets_helper.rb
@@ -1180,8 +1186,6 @@ files:
1180
1186
  - app/interactors/spree_cm_commissioner/bib_number_swapper.rb
1181
1187
  - app/interactors/spree_cm_commissioner/billing_address_creator.rb
1182
1188
  - app/interactors/spree_cm_commissioner/chatrace_order_creator.rb
1183
- - app/interactors/spree_cm_commissioner/check_in_bulk_creator.rb
1184
- - app/interactors/spree_cm_commissioner/check_in_destroyer.rb
1185
1189
  - app/interactors/spree_cm_commissioner/confirm_pin_code_checker.rb
1186
1190
  - app/interactors/spree_cm_commissioner/conversion_pre_calculator.rb
1187
1191
  - app/interactors/spree_cm_commissioner/create_event.rb
@@ -1273,7 +1277,6 @@ files:
1273
1277
  - app/interactors/spree_cm_commissioner/telegram_web_app_vendor_user_authorizer.rb
1274
1278
  - app/interactors/spree_cm_commissioner/telegram_web_app_vendor_user_checker.rb
1275
1279
  - app/interactors/spree_cm_commissioner/transactional_email_sender.rb
1276
- - app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb
1277
1280
  - app/interactors/spree_cm_commissioner/trip_clone_creator.rb
1278
1281
  - app/interactors/spree_cm_commissioner/trip_stops_creator.rb
1279
1282
  - app/interactors/spree_cm_commissioner/unique_device_token_cron_executor.rb
@@ -1327,6 +1330,7 @@ files:
1327
1330
  - app/jobs/spree_cm_commissioner/event_line_items_date_syncer_job.rb
1328
1331
  - app/jobs/spree_cm_commissioner/export_csv_job.rb
1329
1332
  - app/jobs/spree_cm_commissioner/firebase_email_fetcher_job.rb
1333
+ - app/jobs/spree_cm_commissioner/guests/preload_check_in_session_ids_job.rb
1330
1334
  - app/jobs/spree_cm_commissioner/import_order_job.rb
1331
1335
  - app/jobs/spree_cm_commissioner/integrations/base_job.rb
1332
1336
  - app/jobs/spree_cm_commissioner/integrations/polling_job.rb
@@ -1341,6 +1345,10 @@ files:
1341
1345
  - app/jobs/spree_cm_commissioner/product_event_id_to_children_syncer_job.rb
1342
1346
  - app/jobs/spree_cm_commissioner/queue_order_webhooks_requests_job.rb
1343
1347
  - app/jobs/spree_cm_commissioner/reports_assigner_job.rb
1348
+ - app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb
1349
+ - app/jobs/spree_cm_commissioner/route_metrics/increase_fulfilled_order_count_job.rb
1350
+ - app/jobs/spree_cm_commissioner/route_metrics/increase_order_count_job.rb
1351
+ - app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb
1344
1352
  - app/jobs/spree_cm_commissioner/seats/bulk_release_on_hold_blocks_job.rb
1345
1353
  - app/jobs/spree_cm_commissioner/seats/release_expired_blocks_job.rb
1346
1354
  - app/jobs/spree_cm_commissioner/sms_job.rb
@@ -1354,11 +1362,6 @@ files:
1354
1362
  - app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb
1355
1363
  - app/jobs/spree_cm_commissioner/telegram_notification_sender_job.rb
1356
1364
  - app/jobs/spree_cm_commissioner/telegram_start_message_sender_job.rb
1357
- - app/jobs/spree_cm_commissioner/transit/route_fulfilled_order_count_incrementer_job.rb
1358
- - app/jobs/spree_cm_commissioner/transit/route_order_count_incrementer_job.rb
1359
- - app/jobs/spree_cm_commissioner/transit/route_previous_trip_count_decrementer_job.rb
1360
- - app/jobs/spree_cm_commissioner/transit/route_trip_count_decrementer_job.rb
1361
- - app/jobs/spree_cm_commissioner/transit/route_trip_count_incrementer_job.rb
1362
1365
  - app/jobs/spree_cm_commissioner/unique_device_token_cron_job.rb
1363
1366
  - app/jobs/spree_cm_commissioner/variants_public_metadata_updater_job.rb
1364
1367
  - app/jobs/spree_cm_commissioner/vendor_creation_telegram_alert_sender_job.rb
@@ -1399,7 +1402,6 @@ files:
1399
1402
  - app/models/concerns/spree_cm_commissioner/product_delegation.rb
1400
1403
  - app/models/concerns/spree_cm_commissioner/product_type.rb
1401
1404
  - app/models/concerns/spree_cm_commissioner/route_order_countable.rb
1402
- - app/models/concerns/spree_cm_commissioner/route_trip_count_callbacks.rb
1403
1405
  - app/models/concerns/spree_cm_commissioner/route_type.rb
1404
1406
  - app/models/concerns/spree_cm_commissioner/service_calendar_type.rb
1405
1407
  - app/models/concerns/spree_cm_commissioner/service_recommendations.rb
@@ -1520,13 +1522,17 @@ files:
1520
1522
  - app/models/spree_cm_commissioner/place.rb
1521
1523
  - app/models/spree_cm_commissioner/price_decorator.rb
1522
1524
  - app/models/spree_cm_commissioner/pricing_action.rb
1525
+ - app/models/spree_cm_commissioner/pricing_actions/create_guest_adjustments.rb
1526
+ - app/models/spree_cm_commissioner/pricing_actions/create_line_item_adjustments.rb
1523
1527
  - app/models/spree_cm_commissioner/pricing_model.rb
1524
1528
  - app/models/spree_cm_commissioner/pricing_model_variant.rb
1525
1529
  - app/models/spree_cm_commissioner/pricing_rule.rb
1526
1530
  - app/models/spree_cm_commissioner/pricing_rule_group.rb
1531
+ - app/models/spree_cm_commissioner/pricing_rules/age_group.rb
1527
1532
  - app/models/spree_cm_commissioner/pricing_rules/extra_drop_off_distance.rb
1528
1533
  - app/models/spree_cm_commissioner/pricing_rules/extra_pick_up_distance.rb
1529
1534
  - app/models/spree_cm_commissioner/pricing_rules/nationality.rb
1535
+ - app/models/spree_cm_commissioner/pricing_rules/nationality_group.rb
1530
1536
  - app/models/spree_cm_commissioner/product_completion_step.rb
1531
1537
  - app/models/spree_cm_commissioner/product_completion_step_banner.rb
1532
1538
  - app/models/spree_cm_commissioner/product_completion_steps/chatrace_telegram.rb
@@ -1558,6 +1564,8 @@ files:
1558
1564
  - app/models/spree_cm_commissioner/role_decorator.rb
1559
1565
  - app/models/spree_cm_commissioner/role_permission.rb
1560
1566
  - app/models/spree_cm_commissioner/route.rb
1567
+ - app/models/spree_cm_commissioner/route_metric.rb
1568
+ - app/models/spree_cm_commissioner/route_photo.rb
1561
1569
  - app/models/spree_cm_commissioner/s3_presigned_url.rb
1562
1570
  - app/models/spree_cm_commissioner/s3_presigned_url_builder.rb
1563
1571
  - app/models/spree_cm_commissioner/saved_guest.rb
@@ -1596,7 +1604,6 @@ files:
1596
1604
  - app/models/spree_cm_commissioner/tenant.rb
1597
1605
  - app/models/spree_cm_commissioner/transactional_email.rb
1598
1606
  - app/models/spree_cm_commissioner/trip.rb
1599
- - app/models/spree_cm_commissioner/trip_connection.rb
1600
1607
  - app/models/spree_cm_commissioner/trip_stop.rb
1601
1608
  - app/models/spree_cm_commissioner/user_decorator.rb
1602
1609
  - app/models/spree_cm_commissioner/user_deletion_survey.rb
@@ -1622,7 +1629,6 @@ files:
1622
1629
  - app/models/spree_cm_commissioner/vendor_photo.rb
1623
1630
  - app/models/spree_cm_commissioner/vendor_place.rb
1624
1631
  - app/models/spree_cm_commissioner/vendor_promotion_rule.rb
1625
- - app/models/spree_cm_commissioner/vendor_route.rb
1626
1632
  - app/models/spree_cm_commissioner/vendor_web_promotion_banner.rb
1627
1633
  - app/models/spree_cm_commissioner/video.rb
1628
1634
  - app/models/spree_cm_commissioner/video_on_demand.rb
@@ -1888,6 +1894,7 @@ files:
1888
1894
  - app/serializers/spree/v2/tenant/taxon_serializer.rb
1889
1895
  - app/serializers/spree/v2/tenant/taxonomy_serializer.rb
1890
1896
  - app/serializers/spree/v2/tenant/ticket_serializer.rb
1897
+ - app/serializers/spree/v2/tenant/transit_cart_serializer.rb
1891
1898
  - app/serializers/spree/v2/tenant/trip_place_serializer.rb
1892
1899
  - app/serializers/spree/v2/tenant/trip_query_result_serializer.rb
1893
1900
  - app/serializers/spree/v2/tenant/trip_serializer.rb
@@ -1909,6 +1916,7 @@ files:
1909
1916
  - app/serializers/spree_cm_commissioner/json_ld/vendor_serializer.rb
1910
1917
  - app/serializers/spree_cm_commissioner/v2/operator/base_serializer.rb
1911
1918
  - app/serializers/spree_cm_commissioner/v2/operator/check_in_serializer.rb
1919
+ - app/serializers/spree_cm_commissioner/v2/operator/check_in_session_serializer.rb
1912
1920
  - app/serializers/spree_cm_commissioner/v2/operator/classification_serializer.rb
1913
1921
  - app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb
1914
1922
  - app/serializers/spree_cm_commissioner/v2/operator/event_qr_serializer.rb
@@ -1963,6 +1971,7 @@ files:
1963
1971
  - app/serializers/spree_cm_commissioner/v2/storefront/self_check_in_serializer.rb
1964
1972
  - app/serializers/spree_cm_commissioner/v2/storefront/stock_item_serializer.rb
1965
1973
  - app/serializers/spree_cm_commissioner/v2/storefront/taxon_include_product_serializer.rb
1974
+ - app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb
1966
1975
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_place_serializer.rb
1967
1976
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb
1968
1977
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb
@@ -1987,6 +1996,8 @@ files:
1987
1996
  - app/services/spree_cm_commissioner/cart/destroy_decorator.rb
1988
1997
  - app/services/spree_cm_commissioner/cart/recalculate_decorator.rb
1989
1998
  - app/services/spree_cm_commissioner/cart/remove_guest.rb
1999
+ - app/services/spree_cm_commissioner/check_ins/create_bulk.rb
2000
+ - app/services/spree_cm_commissioner/check_ins/destroy_bulk.rb
1990
2001
  - app/services/spree_cm_commissioner/checkout/advance_decorator.rb
1991
2002
  - app/services/spree_cm_commissioner/checkout/update_decorator.rb
1992
2003
  - app/services/spree_cm_commissioner/completion_steps/mark_line_item_as_completed.rb
@@ -2010,6 +2021,7 @@ files:
2010
2021
  - app/services/spree_cm_commissioner/google_wallets/hotel_class_updater.rb
2011
2022
  - app/services/spree_cm_commissioner/google_wallets/hotel_object_builder.rb
2012
2023
  - app/services/spree_cm_commissioner/guests/claim_invite_guest_service.rb
2024
+ - app/services/spree_cm_commissioner/guests/preload_check_in_session_ids.rb
2013
2025
  - app/services/spree_cm_commissioner/homepage_data_loader.rb
2014
2026
  - app/services/spree_cm_commissioner/imports/base_import_order_service.rb
2015
2027
  - app/services/spree_cm_commissioner/imports/create_order_service.rb
@@ -2046,18 +2058,21 @@ files:
2046
2058
  - app/services/spree_cm_commissioner/payment_method_type_mapper.rb
2047
2059
  - app/services/spree_cm_commissioner/penalty_calculator.rb
2048
2060
  - app/services/spree_cm_commissioner/pricing_models/apply.rb
2061
+ - app/services/spree_cm_commissioner/pricing_models/create_with_rule_groups.rb
2062
+ - app/services/spree_cm_commissioner/pricing_models/update_with_rule_groups.rb
2049
2063
  - app/services/spree_cm_commissioner/pricing_rules/build_params.rb
2050
2064
  - app/services/spree_cm_commissioner/pricing_rules/build_template.rb
2051
2065
  - app/services/spree_cm_commissioner/pricing_rules/create.rb
2052
2066
  - app/services/spree_cm_commissioner/pricing_rules/update.rb
2053
2067
  - app/services/spree_cm_commissioner/role_permissions_constructor.rb
2054
2068
  - app/services/spree_cm_commissioner/role_permissions_loader.rb
2055
- - app/services/spree_cm_commissioner/routes/base_update_order_metrics.rb
2056
- - app/services/spree_cm_commissioner/routes/decrement_previous_trip_count.rb
2057
- - app/services/spree_cm_commissioner/routes/decrement_trip_count.rb
2058
- - app/services/spree_cm_commissioner/routes/increment_fulfilled_order_count.rb
2059
- - app/services/spree_cm_commissioner/routes/increment_order_count.rb
2060
- - app/services/spree_cm_commissioner/routes/increment_trip_count.rb
2069
+ - app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb
2070
+ - app/services/spree_cm_commissioner/route_metrics/increase_fulfilled_order_count.rb
2071
+ - app/services/spree_cm_commissioner/route_metrics/increase_order_count.rb
2072
+ - app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb
2073
+ - app/services/spree_cm_commissioner/route_metrics/update_route_metrics.rb
2074
+ - app/services/spree_cm_commissioner/routes/create.rb
2075
+ - app/services/spree_cm_commissioner/routes/update.rb
2061
2076
  - app/services/spree_cm_commissioner/rsa_service.rb
2062
2077
  - app/services/spree_cm_commissioner/seats/bulk_release_on_hold_blocks.rb
2063
2078
  - app/services/spree_cm_commissioner/seats/release_expired_blocks.rb
@@ -2067,7 +2082,12 @@ files:
2067
2082
  - app/services/spree_cm_commissioner/telegram_alerts/integration_sync_failure.rb
2068
2083
  - app/services/spree_cm_commissioner/transit/export_order.rb
2069
2084
  - app/services/spree_cm_commissioner/transit/legs_builder_service.rb
2085
+ - app/services/spree_cm_commissioner/transit_order/create.rb
2086
+ - app/services/spree_cm_commissioner/trips/create_single_leg.rb
2070
2087
  - app/services/spree_cm_commissioner/trips/search.rb
2088
+ - app/services/spree_cm_commissioner/trips/service_calendars/create_or_update.rb
2089
+ - app/services/spree_cm_commissioner/trips/update_single_leg.rb
2090
+ - app/services/spree_cm_commissioner/trips/variants/create.rb
2071
2091
  - app/services/spree_cm_commissioner/update_guest_service.rb
2072
2092
  - app/services/spree_cm_commissioner/user_authenticator.rb
2073
2093
  - app/services/spree_cm_commissioner/user_roles_assigner.rb
@@ -2979,11 +2999,20 @@ files:
2979
2999
  - db/migrate/20251127074809_change_guest_dynamic_fields_value_from_jsonb_to_text.rb
2980
3000
  - db/migrate/20251209022924_add_contact_fields_to_cm_tenants.rb
2981
3001
  - db/migrate/20251219035243_add_migrations_to_support_vehicle_types.rb
3002
+ - db/migrate/20251224033103_migrate_cm_routes_to_cm_route_metrics.rb
3003
+ - db/migrate/20251224033910_migrate_cm_vendor_routes_to_cm_routes.rb
3004
+ - db/migrate/20251225100000_add_age_group_to_cm_guests.rb
3005
+ - db/migrate/20260105024742_add_type_to_cm_pricing_actions.rb
2982
3006
  - db/migrate/20260105072146_add_nationality_group_and_age_group_to_cm_saved_guests.rb
3007
+ - db/migrate/20260105072450_migrate_cm_trip_stops_to_support_trip_connection.rb
2983
3008
  - db/migrate/20260106093359_add_contact_phone_to_cm_vendor_places.rb
3009
+ - db/migrate/20260108101406_add_allow_booking_to_cm_trips.rb
3010
+ - db/migrate/20260121024645_add_nationality_group_to_cm_guests.rb
2984
3011
  - docker-compose.yml
2985
3012
  - docs/api/scoped-access-token-endpoints.md
2986
3013
  - docs/option_types/attr_types.md
3014
+ - docs/pricing_model/age_group.md
3015
+ - docs/pricing_model/nationality_group.md
2987
3016
  - docs/private_key.pem
2988
3017
  - docs/public_key.pem
2989
3018
  - docs/spree_core/add_new_promotion.md
@@ -3072,6 +3101,8 @@ files:
3072
3101
  - lib/spree_cm_commissioner/test_helper/factories/role.rb
3073
3102
  - lib/spree_cm_commissioner/test_helper/factories/role_permission_factory.rb
3074
3103
  - lib/spree_cm_commissioner/test_helper/factories/route_factory.rb
3104
+ - lib/spree_cm_commissioner/test_helper/factories/route_metric_factory.rb
3105
+ - lib/spree_cm_commissioner/test_helper/factories/route_photo_factory.rb
3075
3106
  - lib/spree_cm_commissioner/test_helper/factories/saved_guest_factory.rb
3076
3107
  - lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb
3077
3108
  - lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb
@@ -3088,7 +3119,6 @@ files:
3088
3119
  - lib/spree_cm_commissioner/test_helper/factories/telegram_bot_factory.rb
3089
3120
  - lib/spree_cm_commissioner/test_helper/factories/tenant_factory.rb
3090
3121
  - lib/spree_cm_commissioner/test_helper/factories/transactional_email_factory.rb
3091
- - lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb
3092
3122
  - lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb
3093
3123
  - lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb
3094
3124
  - lib/spree_cm_commissioner/test_helper/factories/user_deletion_reasons_factory.rb
@@ -3106,7 +3136,11 @@ files:
3106
3136
  - lib/spree_cm_commissioner/test_helper/factories/webhook_subscriber_factory.rb
3107
3137
  - lib/spree_cm_commissioner/test_helper/factories/webhook_subscriber_rule_factory.rb
3108
3138
  - lib/spree_cm_commissioner/transit/leg.rb
3139
+ - lib/spree_cm_commissioner/transit/route_stop.rb
3140
+ - lib/spree_cm_commissioner/transit/route_stop_collection.rb
3109
3141
  - lib/spree_cm_commissioner/transit/seat_selection.rb
3142
+ - lib/spree_cm_commissioner/transit/trip_form.rb
3143
+ - lib/spree_cm_commissioner/transit/trip_stop_form.rb
3110
3144
  - lib/spree_cm_commissioner/trip_query_result.rb
3111
3145
  - lib/spree_cm_commissioner/trip_result.rb
3112
3146
  - lib/spree_cm_commissioner/user_session_jwt_token.rb
@@ -1,71 +0,0 @@
1
- module SpreeCmCommissioner
2
- class CheckInBulkCreator < BaseInteractor
3
- delegate :check_ins_attributes, :check_in_by, to: :context
4
-
5
- def call
6
- context.fail!(message: :guest_ids_must_not_blank) if check_ins_attributes.blank?
7
-
8
- ActiveRecord::Base.transaction do
9
- context.check_ins = check_ins_attributes.map do |check_in_attributes|
10
- create_check_in_for(check_in_attributes)
11
- end
12
- end
13
- end
14
-
15
- private
16
-
17
- def confirmed_at
18
- context.confirmed_at ||= DateTime.current
19
- end
20
-
21
- def guest_ids
22
- context.guest_ids ||= check_ins_attributes.pluck(:guest_id)
23
- end
24
-
25
- def guests
26
- @guests ||= SpreeCmCommissioner::Guest.where(id: guest_ids).index_by(&:id)
27
- end
28
-
29
- def create_check_in_for(check_in_attributes)
30
- context.fail!(message: :guest_id_must_not_blank) if check_in_attributes[:guest_id].blank?
31
-
32
- guest = guests[check_in_attributes[:guest_id]]
33
-
34
- return context.fail!(message: :guest_not_found) if guest.blank?
35
- return context.fail!(message: :already_check_in) if guest.check_in.present?
36
-
37
- update_guest_data(guest, check_in_attributes) if guest_data_present?(check_in_attributes)
38
-
39
- check_in = SpreeCmCommissioner::CheckIn.new(
40
- guest: guest,
41
- check_in_by: check_in_by,
42
- checkinable: guest.event,
43
- confirmed_at: check_in_attributes[:confirmed_at] || confirmed_at
44
- )
45
-
46
- if check_in.save
47
- guest.state_changes.create!(
48
- user: check_in_by,
49
- previous_state: 'unchecked_in',
50
- next_state: 'checked_in',
51
- name: 'guest'
52
- )
53
- return check_in
54
- end
55
-
56
- context.fail!(message: :invalid, errors: check_in.errors.full_messages)
57
- end
58
-
59
- def guest_data_present?(check_in_attributes)
60
- check_in_attributes[:guest_attributes].present?
61
- end
62
-
63
- def update_guest_data(guest, check_in_attributes)
64
- guest_data = check_in_attributes[:guest_attributes]
65
-
66
- return if guest.update(guest_data)
67
-
68
- context.fail!(message: :invalid_guest_data, errors: guest.errors.full_messages)
69
- end
70
- end
71
- end
@@ -1,43 +0,0 @@
1
- module SpreeCmCommissioner
2
- class CheckInDestroyer < BaseInteractor
3
- delegate :guest_ids, :destroyed_by, to: :context
4
-
5
- def call
6
- context.fail!(message: :guest_ids_must_not_blank) if guest_ids.blank?
7
-
8
- ActiveRecord::Base.transaction do
9
- context.check_ins = guest_ids.map do |guest_id|
10
- destroy_check_in_for(guest_id)
11
- end.compact
12
- end
13
- end
14
-
15
- private
16
-
17
- def guests
18
- @guests ||= SpreeCmCommissioner::Guest.where(id: guest_ids).index_by(&:id)
19
- end
20
-
21
- def destroy_check_in_for(guest_id)
22
- context.fail!(message: :guest_id_must_not_blank) if guest_id.blank?
23
-
24
- guest = guests[guest_id.to_i]
25
- context.fail!(message: :guest_not_found) if guest.blank?
26
-
27
- return nil if guest.check_in.blank?
28
-
29
- check_in = guest.check_in
30
- if check_in.destroy
31
- guest.state_changes.create!(
32
- user: destroyed_by,
33
- previous_state: 'checked_in',
34
- next_state: 'unchecked_in',
35
- name: 'guest'
36
- )
37
- check_in
38
- else
39
- context.fail!(message: :invalid, errors: check_in.errors.full_messages)
40
- end
41
- end
42
- end
43
- end
@@ -1,10 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Transit
3
- class RouteFulfilledOrderCountIncrementerJob < ApplicationUniqueJob
4
- def perform(options = {})
5
- order = Spree::Order.find(options[:order_id])
6
- SpreeCmCommissioner::Routes::IncrementFulfilledOrderCount.call(order: order)
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Transit
3
- class RouteOrderCountIncrementerJob < ApplicationUniqueJob
4
- def perform(options = {})
5
- order = Spree::Order.find(options[:order_id])
6
- SpreeCmCommissioner::Routes::IncrementOrderCount.call(order: order)
7
- end
8
- end
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- # Perform the previous-route decrement outside the Trip transaction.
2
-
3
- module SpreeCmCommissioner
4
- module Transit
5
- class RoutePreviousTripCountDecrementerJob < ApplicationUniqueJob
6
- queue_as :default
7
-
8
- def perform(options = {})
9
- SpreeCmCommissioner::Routes::DecrementPreviousTripCount.call(previous_route_id: options[:previous_route_id])
10
- end
11
- end
12
- end
13
- end
@@ -1,10 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Transit
3
- class RouteTripCountDecrementerJob < ApplicationUniqueJob
4
- def perform(options = {})
5
- trip = SpreeCmCommissioner::Trip.find(options[:trip_id])
6
- SpreeCmCommissioner::Routes::DecrementTripCount.call(trip: trip)
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Transit
3
- class RouteTripCountIncrementerJob < ApplicationUniqueJob
4
- def perform(options = {})
5
- trip = SpreeCmCommissioner::Trip.find(options[:trip_id])
6
- SpreeCmCommissioner::Routes::IncrementTripCount.call(trip: trip)
7
- end
8
- end
9
- end
10
- end
@@ -1,48 +0,0 @@
1
- module SpreeCmCommissioner
2
- module RouteTripCountCallbacks
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- after_create :increase_trip_count
7
- before_destroy :decrease_trip_count
8
-
9
- # When route context may change, enqueue an async job after commit that
10
- # reads the previous values from `previous_changes` to decrement counts
11
- # on the old route/vendor. This avoids keeping in-memory state and keeps
12
- # the Trip update fast.
13
- after_commit :enqueue_decrement_previous_route_trip_counts, on: :update
14
-
15
- after_commit :increment_new_route_trip_counts, on: :update, if: :changed_route_context?
16
- end
17
-
18
- private
19
-
20
- def decrease_trip_count
21
- SpreeCmCommissioner::Transit::RouteTripCountDecrementerJob.perform_now(trip_id: id)
22
- end
23
-
24
- def increase_trip_count
25
- SpreeCmCommissioner::Transit::RouteTripCountIncrementerJob.perform_later(trip_id: id)
26
- end
27
-
28
- # Read previous_changes to find prior route context and enqueue the job.
29
- def enqueue_decrement_previous_route_trip_counts
30
- prev_route_id = previous_changes['route_id']&.first
31
- prev_origin_id = previous_changes['origin_place_id']&.first
32
- prev_destination_id = previous_changes['destination_place_id']&.first
33
-
34
- return unless prev_route_id.present? && prev_origin_id.present? && prev_destination_id.present?
35
-
36
- SpreeCmCommissioner::Transit::RoutePreviousTripCountDecrementerJob.perform_later(
37
- previous_route_id: prev_route_id
38
- )
39
- end
40
-
41
- # Safely increment the trip_count for the trip's (new) route after update.
42
- def increment_new_route_trip_counts
43
- return if origin_place_id.blank? || destination_place_id.blank? || route_id.blank?
44
-
45
- SpreeCmCommissioner::Transit::RouteTripCountIncrementerJob.perform_later(trip_id: id)
46
- end
47
- end
48
- end
@@ -1,36 +0,0 @@
1
- module SpreeCmCommissioner
2
- class TripConnection < Base
3
- belongs_to :from_trip, class_name: 'SpreeCmCommissioner::Trip'
4
- belongs_to :to_trip, class_name: 'SpreeCmCommissioner::Trip'
5
-
6
- validate :both_trip_cannot_be_the_same
7
- before_validation :calculate_connection_time_minutes
8
- validates :from_trip_id, uniqueness: { scope: :to_trip_id }
9
-
10
- private
11
-
12
- def calculate_connection_time_minutes
13
- return if from_trip.nil? || to_trip.nil?
14
-
15
- arrival_seconds = from_trip.arrival_time.seconds_since_midnight
16
- departure_seconds = to_trip.departure_time.seconds_since_midnight
17
-
18
- layover_seconds = departure_seconds - arrival_seconds
19
- layover_seconds += 86_400 if layover_seconds.negative?
20
-
21
- connection_time_in_minutes = layover_seconds / 60
22
-
23
- if connection_time_in_minutes.between?(0, 180)
24
- self.connection_time_minutes = connection_time_in_minutes.to_i
25
- else
26
- errors.add(:base, 'Connection time must be less than 3 hours')
27
- end
28
- end
29
-
30
- def both_trip_cannot_be_the_same
31
- return unless from_trip.id == to_trip.id
32
-
33
- errors.add(:base, 'Both trip cannot be the same')
34
- end
35
- end
36
- end
@@ -1,9 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VendorRoute < Base
3
- belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
4
- belongs_to :route, class_name: 'SpreeCmCommissioner::Route', optional: false
5
-
6
- has_many :trips, -> (vr) { where(vendor_id: vr.vendor_id, route_id: vr.route_id) }, class_name: 'SpreeCmCommissioner::Trip'
7
- validates :vendor_id, uniqueness: { scope: :route_id }
8
- end
9
- end
@@ -1,30 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Routes
3
- class DecrementPreviousTripCount
4
- prepend ::Spree::ServiceModule::Base
5
-
6
- def call(previous_route_id:)
7
- previous_route = SpreeCmCommissioner::Route.find_by(id: previous_route_id)
8
- return failure(nil, 'Route not found') unless previous_route
9
-
10
- if previous_route.vendors.exists?
11
-
12
- # Build a trip-like object that responds to :route and :vendor so the delegated
13
- # service can locate vendor routes correctly.
14
- trip_like = Struct.new(:route, :vendor).new(previous_route, previous_route.vendors.first)
15
- result = SpreeCmCommissioner::Routes::DecrementTripCount.call(trip: trip_like)
16
- return result if result.failure?
17
- else
18
- previous_route.with_lock do
19
- new_count = [previous_route.trip_count.to_i - 1, 0].max
20
- previous_route.update!(trip_count: new_count)
21
- end
22
- end
23
-
24
- success(previous_route: previous_route)
25
- rescue StandardError => e
26
- failure(nil, e.message)
27
- end
28
- end
29
- end
30
- end
@@ -1,33 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Routes
3
- class DecrementTripCount
4
- prepend ::Spree::ServiceModule::Base
5
-
6
- def call(trip:)
7
- return failure(nil, 'Trip not found') unless trip
8
-
9
- vendor = trip.vendor
10
- return failure(nil, 'Vendor not found') unless vendor
11
-
12
- ActiveRecord::Base.transaction do
13
- route = trip.route
14
-
15
- route.update!(trip_count: [route.trip_count - 1, 0].max)
16
-
17
- vendor_route = locate_vendor_route(vendor: vendor, route: route)
18
- vendor_route&.update!(trip_count: [vendor_route.trip_count - 1, 0].max)
19
- end
20
-
21
- success(trip: trip)
22
- rescue StandardError => e
23
- failure(nil, e.message)
24
- end
25
-
26
- private
27
-
28
- def locate_vendor_route(vendor:, route:)
29
- vendor.vendor_routes.find_by(route_id: route.id)
30
- end
31
- end
32
- end
33
- end
@@ -1,33 +0,0 @@
1
- module SpreeCmCommissioner
2
- module Routes
3
- class IncrementTripCount
4
- prepend ::Spree::ServiceModule::Base
5
-
6
- def call(trip:)
7
- return failure(nil, 'Trip not found') unless trip
8
-
9
- vendor = trip.vendor
10
- return failure(nil, 'Vendor not found') unless vendor
11
-
12
- ActiveRecord::Base.transaction do
13
- route = trip.route
14
-
15
- route.update!(trip_count: route.trip_count + 1)
16
-
17
- vendor_route = find_or_create_vendor_route(vendor: vendor, route: route)
18
- vendor_route.update!(trip_count: vendor_route.trip_count + 1)
19
- end
20
-
21
- success(trip: trip)
22
- rescue StandardError => e
23
- failure(nil, e.message)
24
- end
25
-
26
- private
27
-
28
- def find_or_create_vendor_route(vendor:, route:)
29
- vendor.vendor_routes.find_or_create_by!(route_id: route.id)
30
- end
31
- end
32
- end
33
- end
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :cm_trip_connection, class: SpreeCmCommissioner::TripConnection do
3
- from_trip_id { create(:cm_trip) }
4
- to_trip_id { create(:cm_trip) }
5
- end
6
- end