spree_cm_commissioner 2.5.0.pre.pre13 → 2.5.0.pre.pre14

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +4 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/spree/admin/base_controller_decorator.rb +7 -33
  5. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +7 -51
  6. data/app/controllers/spree/api/v2/storefront/intercity_taxi/distance_calculator_controller.rb +47 -0
  7. data/app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb +7 -5
  8. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +2 -2
  9. data/app/controllers/spree/api/v2/tenant/intercity_taxi/distance_calculator_controller.rb +47 -0
  10. data/app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb +7 -5
  11. data/app/controllers/spree/api/v2/tenant/trip_search_controller.rb +2 -2
  12. data/app/interactors/spree_cm_commissioner/google_routes_distance_calculator.rb +0 -13
  13. data/app/interactors/spree_cm_commissioner/invalidate_cache_request.rb +3 -3
  14. data/app/interactors/spree_cm_commissioner/vehicle_type_updater.rb +41 -0
  15. data/app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb +1 -1
  16. data/app/mailers/spree/order_mailer_decorator.rb +22 -1
  17. data/app/models/concerns/spree_cm_commissioner/line_item_seat_selection.rb +40 -0
  18. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +1 -1
  19. data/app/models/concerns/spree_cm_commissioner/vehicle_kind.rb +21 -0
  20. data/app/models/spree_cm_commissioner/adjustable/adjuster/pricing_action.rb +25 -0
  21. data/app/models/spree_cm_commissioner/guest.rb +1 -1
  22. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +3 -0
  23. data/app/models/spree_cm_commissioner/homepage_background_app_image.rb +1 -1
  24. data/app/models/spree_cm_commissioner/invite_guest.rb +2 -5
  25. data/app/models/spree_cm_commissioner/line_item_decorator.rb +2 -2
  26. data/app/models/spree_cm_commissioner/option_type_decorator.rb +4 -1
  27. data/app/models/spree_cm_commissioner/option_value_decorator.rb +4 -1
  28. data/app/models/spree_cm_commissioner/{option_value_vehicle.rb → option_value_vehicle_type.rb} +2 -2
  29. data/app/models/spree_cm_commissioner/trip.rb +7 -6
  30. data/app/models/spree_cm_commissioner/vehicle.rb +8 -20
  31. data/app/models/spree_cm_commissioner/vehicle_type.rb +28 -0
  32. data/app/models/spree_cm_commissioner/vehicle_type_option_type.rb +6 -0
  33. data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -0
  34. data/app/overrides/spree/admin/products/edit/clear_cache_button.html.erb.deface +1 -1
  35. data/app/overrides/spree/admin/taxons/edit/clear_cache_button.html.erb.deface +3 -2
  36. data/app/queries/spree_cm_commissioner/trip_query.rb +5 -5
  37. data/app/request_schemas/spree_cm_commissioner/intercity_taxi_draft_order_update_schema.rb +2 -0
  38. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +12 -0
  39. data/app/serializers/spree/v2/tenant/line_item_serializer.rb +14 -1
  40. data/app/serializers/spree_cm_commissioner/v2/storefront/distance_serializer.rb +26 -0
  41. data/app/serializers/spree_cm_commissioner/v2/storefront/intercity_taxi_line_item_serializer.rb +3 -3
  42. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +2 -2
  43. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb +1 -1
  44. data/app/serializers/spree_cm_commissioner/v2/storefront/{trip_vehicle_serializer.rb → trip_vehicle_type_serializer.rb} +2 -4
  45. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +98 -0
  46. data/app/services/spree_cm_commissioner/calculate_distance.rb +279 -0
  47. data/app/services/spree_cm_commissioner/cart/recalculate_decorator.rb +28 -1
  48. data/app/services/spree_cm_commissioner/guests/claim_invite_guest_service.rb +65 -0
  49. data/app/services/spree_cm_commissioner/intercity_taxi_order/calculate_distance.rb +224 -0
  50. data/app/services/spree_cm_commissioner/intercity_taxi_order/update.rb +30 -3
  51. data/app/services/spree_cm_commissioner/line_items/apply_pricing_models.rb +27 -0
  52. data/app/services/spree_cm_commissioner/pricing_models/apply.rb +4 -12
  53. data/app/services/spree_cm_commissioner/signing/sign_data.rb +42 -0
  54. data/app/services/spree_cm_commissioner/signing/verify_signature.rb +52 -0
  55. data/app/services/spree_cm_commissioner/transit/export_order.rb +146 -0
  56. data/app/services/spree_cm_commissioner/update_guest_service.rb +129 -0
  57. data/app/views/spree/admin/homepage_section/edit.html.erb +7 -2
  58. data/app/views/spree/order_mailer/cancel_email.html.erb +19 -0
  59. data/app/views/spree_cm_commissioner/cancel_order_mailer/_cancel_email.html.erb +12 -0
  60. data/app/views/spree_cm_commissioner/cancel_order_mailer/_footer.html.erb +8 -0
  61. data/app/views/spree_cm_commissioner/cancel_order_mailer/_header.html.erb +3 -0
  62. data/app/views/spree_cm_commissioner/cancel_order_mailer/_mailer_stylesheets.html.erb +139 -0
  63. data/app/views/spree_cm_commissioner/cancel_order_mailer/_your_booking.html.erb +8 -0
  64. data/app/views/spree_cm_commissioner/cancel_order_mailer/purchased_items/_items.html.erb +53 -0
  65. data/app/views/spree_cm_commissioner/cancel_order_mailer/purchased_items/_summary.html.erb +108 -0
  66. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_cancel_email.html.erb +12 -0
  67. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_footer.html.erb +8 -0
  68. data/app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_header.html.erb +15 -0
  69. data/app/views/spree_cm_commissioner/layouts/cancel_order_mailer.html.erb +16 -0
  70. data/config/locales/en.yml +15 -0
  71. data/config/locales/km.yml +27 -2
  72. data/config/routes.rb +2 -0
  73. data/db/migrate/20251127074809_change_guest_dynamic_fields_value_from_jsonb_to_text.rb +40 -0
  74. data/db/migrate/20251219035243_add_migrations_to_support_vehicle_types.rb +36 -0
  75. data/lib/spree_cm_commissioner/distance.rb +88 -0
  76. data/lib/spree_cm_commissioner/engine.rb +3 -0
  77. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +2 -2
  78. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +3 -3
  79. data/lib/spree_cm_commissioner/test_helper/factories/pricing_model_variant_factory.rb +6 -0
  80. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +1 -1
  81. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +1 -0
  82. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +4 -1
  83. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +7 -0
  84. data/lib/spree_cm_commissioner/trip_query_result.rb +1 -1
  85. data/lib/spree_cm_commissioner/trip_result.rb +7 -1
  86. data/lib/spree_cm_commissioner/version.rb +1 -1
  87. data/lib/spree_cm_commissioner.rb +1 -1
  88. metadata +39 -10
  89. data/app/interactors/spree_cm_commissioner/trip_distance_calculator.rb +0 -165
  90. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +0 -41
  91. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +0 -11
  92. data/app/models/spree_cm_commissioner/vehicle_option_type.rb +0 -6
  93. data/lib/spree_cm_commissioner/intercity_taxi/distance.rb +0 -38
  94. data/lib/spree_cm_commissioner/test_helper/factories/vendor_route_factory.rb +0 -7
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.0.pre.pre13
4
+ version: 2.5.0.pre.pre14
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-18 00:00:00.000000000 Z
11
+ date: 2026-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -957,6 +957,7 @@ files:
957
957
  - app/controllers/spree/api/v2/storefront/homepage_data_controller.rb
958
958
  - app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb
959
959
  - app/controllers/spree/api/v2/storefront/id_cards_controller.rb
960
+ - app/controllers/spree/api/v2/storefront/intercity_taxi/distance_calculator_controller.rb
960
961
  - app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb
961
962
  - app/controllers/spree/api/v2/storefront/inventory_items_controller.rb
962
963
  - app/controllers/spree/api/v2/storefront/line_item_qrs_controller.rb
@@ -1020,6 +1021,7 @@ files:
1020
1021
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
1021
1022
  - app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
1022
1023
  - app/controllers/spree/api/v2/tenant/id_cards_controller.rb
1024
+ - app/controllers/spree/api/v2/tenant/intercity_taxi/distance_calculator_controller.rb
1023
1025
  - app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb
1024
1026
  - app/controllers/spree/api/v2/tenant/line_items_controller.rb
1025
1027
  - app/controllers/spree/api/v2/tenant/notifications_controller.rb
@@ -1270,7 +1272,6 @@ files:
1270
1272
  - app/interactors/spree_cm_commissioner/transactional_email_sender.rb
1271
1273
  - app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb
1272
1274
  - app/interactors/spree_cm_commissioner/trip_clone_creator.rb
1273
- - app/interactors/spree_cm_commissioner/trip_distance_calculator.rb
1274
1275
  - app/interactors/spree_cm_commissioner/trip_stops_creator.rb
1275
1276
  - app/interactors/spree_cm_commissioner/unique_device_token_cron_executor.rb
1276
1277
  - app/interactors/spree_cm_commissioner/update_payment_gateway_status.rb
@@ -1293,7 +1294,7 @@ files:
1293
1294
  - app/interactors/spree_cm_commissioner/user_vendor_assigner.rb
1294
1295
  - app/interactors/spree_cm_commissioner/variant_block_updater.rb
1295
1296
  - app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb
1296
- - app/interactors/spree_cm_commissioner/vehicle_updater.rb
1297
+ - app/interactors/spree_cm_commissioner/vehicle_type_updater.rb
1297
1298
  - app/interactors/spree_cm_commissioner/vendor_creation_telegram_alert_sender.rb
1298
1299
  - app/interactors/spree_cm_commissioner/vendor_nearby_place_builder.rb
1299
1300
  - app/interactors/spree_cm_commissioner/vendor_updater.rb
@@ -1379,6 +1380,7 @@ files:
1379
1380
  - app/models/concerns/spree_cm_commissioner/line_item_durationable.rb
1380
1381
  - app/models/concerns/spree_cm_commissioner/line_item_guests_concern.rb
1381
1382
  - app/models/concerns/spree_cm_commissioner/line_item_integration.rb
1383
+ - app/models/concerns/spree_cm_commissioner/line_item_seat_selection.rb
1382
1384
  - app/models/concerns/spree_cm_commissioner/line_item_transitable.rb
1383
1385
  - app/models/concerns/spree_cm_commissioner/line_items_filter_scope.rb
1384
1386
  - app/models/concerns/spree_cm_commissioner/metafield.rb
@@ -1408,7 +1410,7 @@ files:
1408
1410
  - app/models/concerns/spree_cm_commissioner/user_notification.rb
1409
1411
  - app/models/concerns/spree_cm_commissioner/user_preference.rb
1410
1412
  - app/models/concerns/spree_cm_commissioner/variant_options_concern.rb
1411
- - app/models/concerns/spree_cm_commissioner/vehicle_type.rb
1413
+ - app/models/concerns/spree_cm_commissioner/vehicle_kind.rb
1412
1414
  - app/models/concerns/spree_cm_commissioner/vendor_preference.rb
1413
1415
  - app/models/concerns/spree_cm_commissioner/vendor_promotable.rb
1414
1416
  - app/models/concerns/spree_cm_commissioner/video_on_demand_bitwise.rb
@@ -1416,6 +1418,7 @@ files:
1416
1418
  - app/models/spree_cm_commissioner.rb
1417
1419
  - app/models/spree_cm_commissioner/ability_decorator.rb
1418
1420
  - app/models/spree_cm_commissioner/address_decorator.rb
1421
+ - app/models/spree_cm_commissioner/adjustable/adjuster/pricing_action.rb
1419
1422
  - app/models/spree_cm_commissioner/adjustment_decorator.rb
1420
1423
  - app/models/spree_cm_commissioner/asset.rb
1421
1424
  - app/models/spree_cm_commissioner/back_image.rb
@@ -1493,7 +1496,7 @@ files:
1493
1496
  - app/models/spree_cm_commissioner/oauth_application_decorator.rb
1494
1497
  - app/models/spree_cm_commissioner/option_type_decorator.rb
1495
1498
  - app/models/spree_cm_commissioner/option_value_decorator.rb
1496
- - app/models/spree_cm_commissioner/option_value_vehicle.rb
1499
+ - app/models/spree_cm_commissioner/option_value_vehicle_type.rb
1497
1500
  - app/models/spree_cm_commissioner/option_value_vendor.rb
1498
1501
  - app/models/spree_cm_commissioner/order/address_book_decorator.rb
1499
1502
  - app/models/spree_cm_commissioner/order_decorator.rb
@@ -1605,8 +1608,9 @@ files:
1605
1608
  - app/models/spree_cm_commissioner/variant_options.rb
1606
1609
  - app/models/spree_cm_commissioner/vector_icon.rb
1607
1610
  - app/models/spree_cm_commissioner/vehicle.rb
1608
- - app/models/spree_cm_commissioner/vehicle_option_type.rb
1609
1611
  - app/models/spree_cm_commissioner/vehicle_photo.rb
1612
+ - app/models/spree_cm_commissioner/vehicle_type.rb
1613
+ - app/models/spree_cm_commissioner/vehicle_type_option_type.rb
1610
1614
  - app/models/spree_cm_commissioner/vendor_app_promotion_banner.rb
1611
1615
  - app/models/spree_cm_commissioner/vendor_decorator.rb
1612
1616
  - app/models/spree_cm_commissioner/vendor_logo.rb
@@ -1922,6 +1926,7 @@ files:
1922
1926
  - app/serializers/spree_cm_commissioner/v2/storefront/calculator_serializer.rb
1923
1927
  - app/serializers/spree_cm_commissioner/v2/storefront/category_taxon_serializer.rb
1924
1928
  - app/serializers/spree_cm_commissioner/v2/storefront/check_in_serializer.rb
1929
+ - app/serializers/spree_cm_commissioner/v2/storefront/distance_serializer.rb
1925
1930
  - app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb
1926
1931
  - app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb
1927
1932
  - app/serializers/spree_cm_commissioner/v2/storefront/event_option_value_serializer.rb
@@ -1961,7 +1966,7 @@ files:
1961
1966
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb
1962
1967
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb
1963
1968
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_variant_serializer.rb
1964
- - app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_serializer.rb
1969
+ - app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_type_serializer.rb
1965
1970
  - app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb
1966
1971
  - app/serializers/spree_cm_commissioner/v2/storefront/user_contact_serializer.rb
1967
1972
  - app/serializers/spree_cm_commissioner/v2/storefront/user_identity_provider_serializer.rb
@@ -1973,6 +1978,8 @@ files:
1973
1978
  - app/services/sms_adapter/plasgate.rb
1974
1979
  - app/services/sms_adapter/twillio.rb
1975
1980
  - app/services/spree_cm_commissioner/aes_encryption_service.rb
1981
+ - app/services/spree_cm_commissioner/api_caches/invalidate.rb
1982
+ - app/services/spree_cm_commissioner/calculate_distance.rb
1976
1983
  - app/services/spree_cm_commissioner/cart/add_guest.rb
1977
1984
  - app/services/spree_cm_commissioner/cart/destroy_decorator.rb
1978
1985
  - app/services/spree_cm_commissioner/cart/recalculate_decorator.rb
@@ -1999,6 +2006,7 @@ files:
1999
2006
  - app/services/spree_cm_commissioner/google_wallets/hotel_class_creator.rb
2000
2007
  - app/services/spree_cm_commissioner/google_wallets/hotel_class_updater.rb
2001
2008
  - app/services/spree_cm_commissioner/google_wallets/hotel_object_builder.rb
2009
+ - app/services/spree_cm_commissioner/guests/claim_invite_guest_service.rb
2002
2010
  - app/services/spree_cm_commissioner/homepage_data_loader.rb
2003
2011
  - app/services/spree_cm_commissioner/imports/base_import_order_service.rb
2004
2012
  - app/services/spree_cm_commissioner/imports/create_order_service.rb
@@ -2021,8 +2029,10 @@ files:
2021
2029
  - app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/full_sync_strategy.rb
2022
2030
  - app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/incremental_sync_strategy.rb
2023
2031
  - app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/webhook_sync_strategy.rb
2032
+ - app/services/spree_cm_commissioner/intercity_taxi_order/calculate_distance.rb
2024
2033
  - app/services/spree_cm_commissioner/intercity_taxi_order/create.rb
2025
2034
  - app/services/spree_cm_commissioner/intercity_taxi_order/update.rb
2035
+ - app/services/spree_cm_commissioner/line_items/apply_pricing_models.rb
2026
2036
  - app/services/spree_cm_commissioner/metafields/product_metadata_service.rb
2027
2037
  - app/services/spree_cm_commissioner/order_params_checker.rb
2028
2038
  - app/services/spree_cm_commissioner/orders/bulk_archive_inactive_orders.rb
@@ -2049,9 +2059,13 @@ files:
2049
2059
  - app/services/spree_cm_commissioner/seats/bulk_release_on_hold_blocks.rb
2050
2060
  - app/services/spree_cm_commissioner/seats/release_expired_blocks.rb
2051
2061
  - app/services/spree_cm_commissioner/seeds/roles_decorator.rb
2062
+ - app/services/spree_cm_commissioner/signing/sign_data.rb
2063
+ - app/services/spree_cm_commissioner/signing/verify_signature.rb
2052
2064
  - app/services/spree_cm_commissioner/telegram_alerts/integration_sync_failure.rb
2065
+ - app/services/spree_cm_commissioner/transit/export_order.rb
2053
2066
  - app/services/spree_cm_commissioner/transit/legs_builder_service.rb
2054
2067
  - app/services/spree_cm_commissioner/trips/search.rb
2068
+ - app/services/spree_cm_commissioner/update_guest_service.rb
2055
2069
  - app/services/spree_cm_commissioner/user_authenticator.rb
2056
2070
  - app/services/spree_cm_commissioner/user_roles_assigner.rb
2057
2071
  - app/services/spree_cm_commissioner/users/incomplete_guest_checker_service.rb
@@ -2410,6 +2424,7 @@ files:
2410
2424
  - app/views/spree/layouts/event.html.erb
2411
2425
  - app/views/spree/layouts/transit.html.erb
2412
2426
  - app/views/spree/order_mailer/_adjustment.html.erb
2427
+ - app/views/spree/order_mailer/cancel_email.html.erb
2413
2428
  - app/views/spree/order_mailer/confirm_email.html.erb
2414
2429
  - app/views/spree/order_mailer/ticket_email.html.erb
2415
2430
  - app/views/spree/order_mailer/ticket_email.text.erb
@@ -2488,6 +2503,16 @@ files:
2488
2503
  - app/views/spree/transit/vendors/_form.html.erb
2489
2504
  - app/views/spree/transit/vendors/_tabs.html.erb
2490
2505
  - app/views/spree/transit/vendors/edit.html.erb
2506
+ - app/views/spree_cm_commissioner/cancel_order_mailer/_cancel_email.html.erb
2507
+ - app/views/spree_cm_commissioner/cancel_order_mailer/_footer.html.erb
2508
+ - app/views/spree_cm_commissioner/cancel_order_mailer/_header.html.erb
2509
+ - app/views/spree_cm_commissioner/cancel_order_mailer/_mailer_stylesheets.html.erb
2510
+ - app/views/spree_cm_commissioner/cancel_order_mailer/_your_booking.html.erb
2511
+ - app/views/spree_cm_commissioner/cancel_order_mailer/purchased_items/_items.html.erb
2512
+ - app/views/spree_cm_commissioner/cancel_order_mailer/purchased_items/_summary.html.erb
2513
+ - app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_cancel_email.html.erb
2514
+ - app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_footer.html.erb
2515
+ - app/views/spree_cm_commissioner/cancel_order_mailer/tenant/_header.html.erb
2491
2516
  - app/views/spree_cm_commissioner/crew_invite_mailer/_mailer_stylesheets.html.erb
2492
2517
  - app/views/spree_cm_commissioner/crew_invite_mailer/send_crew_invite_email.html.erb
2493
2518
  - app/views/spree_cm_commissioner/event_transactional_mailer/_event_banner.html.erb
@@ -2501,6 +2526,7 @@ files:
2501
2526
  - app/views/spree_cm_commissioner/guest_mailer/_mailer_stylesheets.html.erb
2502
2527
  - app/views/spree_cm_commissioner/guest_mailer/_terms_and_conditions.html.erb
2503
2528
  - app/views/spree_cm_commissioner/guest_mailer/send_ticket_to_guest.html.erb
2529
+ - app/views/spree_cm_commissioner/layouts/cancel_order_mailer.html.erb
2504
2530
  - app/views/spree_cm_commissioner/layouts/crew_invite_mailer.html.erb
2505
2531
  - app/views/spree_cm_commissioner/layouts/event_transactional_mailer.html.erb
2506
2532
  - app/views/spree_cm_commissioner/layouts/guest_mailer.html.erb
@@ -2950,7 +2976,9 @@ files:
2950
2976
  - db/migrate/20251017101605_create_cm_integration_mappings.rb
2951
2977
  - db/migrate/20251113081853_add_index_to_spree_orders_updated_at.rb
2952
2978
  - db/migrate/20251119093000_add_tenant_id_to_cm_vendor_places.rb
2979
+ - db/migrate/20251127074809_change_guest_dynamic_fields_value_from_jsonb_to_text.rb
2953
2980
  - db/migrate/20251209022924_add_contact_fields_to_cm_tenants.rb
2981
+ - db/migrate/20251219035243_add_migrations_to_support_vehicle_types.rb
2954
2982
  - docker-compose.yml
2955
2983
  - docs/api/scoped-access-token-endpoints.md
2956
2984
  - docs/option_types/attr_types.md
@@ -2973,9 +3001,9 @@ files:
2973
3001
  - lib/spree_cm_commissioner.rb
2974
3002
  - lib/spree_cm_commissioner/cached_inventory_item.rb
2975
3003
  - lib/spree_cm_commissioner/calendar_event.rb
3004
+ - lib/spree_cm_commissioner/distance.rb
2976
3005
  - lib/spree_cm_commissioner/engine.rb
2977
3006
  - lib/spree_cm_commissioner/factories.rb
2978
- - lib/spree_cm_commissioner/intercity_taxi/distance.rb
2979
3007
  - lib/spree_cm_commissioner/intercity_taxi/map_place.rb
2980
3008
  - lib/spree_cm_commissioner/jwt_token.rb
2981
3009
  - lib/spree_cm_commissioner/line_item_jwt_token.rb
@@ -3030,6 +3058,7 @@ files:
3030
3058
  - lib/spree_cm_commissioner/test_helper/factories/place_factory.rb
3031
3059
  - lib/spree_cm_commissioner/test_helper/factories/pricing_action_factory.rb
3032
3060
  - lib/spree_cm_commissioner/test_helper/factories/pricing_model_factory.rb
3061
+ - lib/spree_cm_commissioner/test_helper/factories/pricing_model_variant_factory.rb
3033
3062
  - lib/spree_cm_commissioner/test_helper/factories/pricing_rule_factory.rb
3034
3063
  - lib/spree_cm_commissioner/test_helper/factories/pricing_rule_group_factory.rb
3035
3064
  - lib/spree_cm_commissioner/test_helper/factories/product_completion_step_banner_factory.rb
@@ -3066,11 +3095,11 @@ files:
3066
3095
  - lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb
3067
3096
  - lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb
3068
3097
  - lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb
3098
+ - lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb
3069
3099
  - lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb
3070
3100
  - lib/spree_cm_commissioner/test_helper/factories/vendor_logo_factory.rb
3071
3101
  - lib/spree_cm_commissioner/test_helper/factories/vendor_photo_factory.rb
3072
3102
  - lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb
3073
- - lib/spree_cm_commissioner/test_helper/factories/vendor_route_factory.rb
3074
3103
  - lib/spree_cm_commissioner/test_helper/factories/video_on_demand_factory.rb
3075
3104
  - lib/spree_cm_commissioner/test_helper/factories/webhook_subscriber_factory.rb
3076
3105
  - lib/spree_cm_commissioner/test_helper/factories/webhook_subscriber_rule_factory.rb
@@ -1,165 +0,0 @@
1
- module SpreeCmCommissioner
2
- # Computes trip distance details and pricing payload.
3
- #
4
- # Inputs via context:
5
- # - origin: { lat:, lng: }
6
- # - configured_destination: { lat:, lng: }
7
- # - pickups: Array<{ lat:, lng: }> (optional)
8
- # - dropoffs: Array<{ lat:, lng: }> (optional)
9
- # - pickup_oob_confirmed: Boolean (optional)
10
- # - dropoff_oob_confirmed: Boolean (optional)
11
- # - base_price_usd: Numeric
12
- # - boundary_km: Numeric (optional, default 0)
13
- #
14
- # Outputs via context on success:
15
- # - payload: Hash (compatible with previous controller response)
16
- # - base_km, detour_pickup_km, detour_dropoff_km: Floats or nil
17
- # - distance_km, directions_url, ordered_points, estimated_time_minutes (when optimize true)
18
- class TripDistanceCalculator < BaseInteractor
19
- delegate :origin,
20
- :configured_destination,
21
- :pickups,
22
- :dropoffs,
23
- :pickup_oob_confirmed,
24
- :dropoff_oob_confirmed,
25
- :base_price_usd,
26
- :boundary_km,
27
- to: :context
28
-
29
- def call
30
- validate_inputs
31
-
32
- pickups_points, dropoffs_points, final_destination = prepare_points
33
- base_km, detour_pickup_km, detour_dropoff_km = compute_route_kms(pickups_points, dropoffs_points, final_destination)
34
- details_ctx = fetch_details(final_destination, pickups_points, dropoffs_points)
35
- extra_data = compute_extra_data(base_km, detour_pickup_km, detour_dropoff_km)
36
- payload = build_payload(details_ctx, base_km, detour_pickup_km, detour_dropoff_km, extra_data)
37
- assign_context(details_ctx, base_km, detour_pickup_km, detour_dropoff_km, payload)
38
- end
39
-
40
- private
41
-
42
- def validate_inputs
43
- context.fail!(message: 'origin is required') if origin.blank?
44
- context.fail!(message: 'configured_destination is required') if configured_destination.blank?
45
- end
46
-
47
- def compute_km(origin:, destination:, pickups: nil, dropoffs: nil, optimize: nil)
48
- ctx = SpreeCmCommissioner::GoogleRoutesDistanceCalculator.call(
49
- origin: origin,
50
- destination: destination,
51
- pickups: pickups,
52
- dropoffs: dropoffs,
53
- optimize: optimize
54
- )
55
- return nil unless ctx.success?
56
-
57
- ctx.distance_km
58
- end
59
-
60
- def prepare_points
61
- pickups_points = Array(pickups).compact
62
- dropoffs_points = Array(dropoffs).compact
63
- final_destination = dropoffs_points.last || configured_destination
64
- [pickups_points, dropoffs_points, final_destination]
65
- end
66
-
67
- def compute_route_kms(pickups_points, dropoffs_points, final_destination)
68
- base_km = compute_km(origin: origin, destination: configured_destination)
69
- detour_pickup_km =
70
- if pickups_points.any?
71
- compute_km(
72
- origin: origin,
73
- destination: configured_destination,
74
- pickups: pickups_points,
75
- optimize: false
76
- )
77
- end
78
- detour_dropoff_km =
79
- if dropoffs_points.any?
80
- compute_km(
81
- origin: origin,
82
- destination: final_destination,
83
- dropoffs: dropoffs_points,
84
- optimize: false
85
- )
86
- end
87
- [base_km, detour_pickup_km, detour_dropoff_km]
88
- end
89
-
90
- def fetch_details(final_destination, pickups_points, dropoffs_points)
91
- ctx = SpreeCmCommissioner::GoogleRoutesDistanceCalculator.call(
92
- origin: origin,
93
- destination: final_destination,
94
- pickups: pickups_points,
95
- dropoffs: dropoffs_points,
96
- optimize: true
97
- )
98
- context.fail!(message: ctx.message || 'Unable to calculate') unless ctx.success?
99
- ctx
100
- end
101
-
102
- def compute_extra_data(base_km, detour_pickup_km, detour_dropoff_km)
103
- extra_pickup_km = compute_extra_km(detour_pickup_km, base_km, pickup_oob_confirmed)
104
- extra_dropoff_km = compute_extra_km(detour_dropoff_km, base_km, dropoff_oob_confirmed)
105
- extra_pickup_charge_usd = charge_for_extra_km(extra_pickup_km)
106
- extra_dropoff_charge_usd = charge_for_extra_km(extra_dropoff_km)
107
- extra_charge_usd = (extra_pickup_charge_usd + extra_dropoff_charge_usd).round(2)
108
- total_price_usd = (base_price_usd.to_f + extra_charge_usd).round(2)
109
-
110
- {
111
- extra_pickup_km: extra_pickup_km,
112
- extra_dropoff_km: extra_dropoff_km,
113
- extra_pickup_charge_usd: extra_pickup_charge_usd,
114
- extra_dropoff_charge_usd: extra_dropoff_charge_usd,
115
- total_price_usd: total_price_usd
116
- }
117
- end
118
-
119
- def build_payload(details_ctx, base_km, detour_pickup_km, detour_dropoff_km, data)
120
- {
121
- distance_km: details_ctx.distance_km,
122
- directions_url: details_ctx.directions_url,
123
- ordered_points: details_ctx.ordered_points,
124
- estimated_time_minutes: details_ctx.estimated_time_minutes,
125
- base_price_usd: base_price_usd.to_f,
126
- total_price_usd: data[:total_price_usd],
127
- extra_pickup_km: data[:extra_pickup_km],
128
- extra_dropoff_km: data[:extra_dropoff_km],
129
- extra_pickup_charge_usd: data[:extra_pickup_charge_usd],
130
- extra_dropoff_charge_usd: data[:extra_dropoff_charge_usd],
131
- extra_charge_usd: data[:extra_charge_usd],
132
- base_km: base_km,
133
- detour_pickup_km: detour_pickup_km,
134
- detour_dropoff_km: detour_dropoff_km
135
- }
136
- end
137
-
138
- def assign_context(details_ctx, base_km, detour_pickup_km, detour_dropoff_km, payload)
139
- context.payload = payload
140
- context.distance_km = details_ctx.distance_km
141
- context.directions_url = details_ctx.directions_url
142
- context.ordered_points = details_ctx.ordered_points
143
- context.estimated_time_minutes = details_ctx.estimated_time_minutes
144
- context.base_km = base_km
145
- context.detour_pickup_km = detour_pickup_km
146
- context.detour_dropoff_km = detour_dropoff_km
147
- end
148
-
149
- def compute_extra_km(detour_km, base_km, confirmed)
150
- return 0.0 unless confirmed && detour_km && base_km
151
-
152
- [(detour_km - base_km - boundary_km), 0.0].max
153
- end
154
-
155
- def charge_for_extra_km(extra_km)
156
- x = extra_km.to_f
157
- return 0.0 if x <= 0
158
- return 2.0 if x <= 5.0
159
- return 5.0 if x <= 10.0
160
- return 10.0 if x <= 20.0
161
-
162
- (10.0 + ((x - 20.0) * 0.5)).round(2)
163
- end
164
- end
165
- end
@@ -1,41 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VehicleUpdater < BaseInteractor
3
- def call
4
- vehicle = context.vehicle
5
- data = context.data
6
-
7
- option_value_ids = data[:option_value_ids] || []
8
- option_type_ids = data[:option_type_ids] || []
9
-
10
- ActiveRecord::Base.transaction do
11
- update_vehicle!(vehicle, data[:vehicle_attributes])
12
- update_amenities!(vehicle, option_value_ids, option_type_ids)
13
- end
14
-
15
- context.message = I18n.t('views.transit.vehicles.update_success')
16
- rescue StandardError => e
17
- context.fail!(message: "Failed to update vehicle: #{e.message}")
18
- end
19
-
20
- private
21
-
22
- def update_vehicle!(vehicle, attributes)
23
- return if vehicle.update(attributes.slice(:code, :license_plate, :allow_seat_selection, :vehicle_type, :number_of_seats))
24
-
25
- raise vehicle.errors.full_messages.to_sentence
26
- end
27
-
28
- def update_amenities!(vehicle, option_value_ids, option_type_ids)
29
- vehicle.option_value_vehicles.where.not(option_value_id: option_value_ids).destroy_all
30
- vehicle.vehicle_option_types.where.not(option_type_id: option_type_ids).destroy_all
31
-
32
- option_value_ids.each do |option_value_id|
33
- vehicle.option_value_vehicles.find_or_create_by(option_value_id: option_value_id)
34
- end
35
-
36
- option_type_ids.each do |option_type_id|
37
- vehicle.vehicle_option_types.find_or_create_by(option_type_id: option_type_id)
38
- end
39
- end
40
- end
41
- end
@@ -1,11 +0,0 @@
1
- module SpreeCmCommissioner
2
- module VehicleType
3
- extend ActiveSupport::Concern
4
-
5
- VEHICLE_TYPES = %i[suv sedan minivan van sleeping_bus luxury_van air_bus bus ferry].freeze
6
-
7
- included do
8
- enum vehicle_type: VEHICLE_TYPES if table_exists? && column_names.include?('vehicle_type')
9
- end
10
- end
11
- end
@@ -1,6 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VehicleOptionType < ApplicationRecord
3
- belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle'
4
- belongs_to :option_type, class_name: 'Spree::OptionType'
5
- end
6
- end
@@ -1,38 +0,0 @@
1
- module SpreeCmCommissioner
2
- module IntercityTaxi
3
- class Distance
4
- attr_accessor :distance_km, :ordered_points, :estimated_time_minutes, :base_km,
5
- :detour_pickup_km, :detour_dropoff_km, :extra_pickup_km, :extra_dropoff_km
6
-
7
- def initialize(options = {})
8
- options = options.stringify_keys if options.is_a?(Hash)
9
-
10
- @distance_km = options['distance_km']&.to_f
11
- @ordered_points = options['ordered_points']
12
- @estimated_time_minutes = options['estimated_time_minutes']&.to_i
13
- @base_km = options['base_km']&.to_f
14
- @detour_pickup_km = options['detour_pickup_km']&.to_f
15
- @detour_dropoff_km = options['detour_dropoff_km']&.to_f
16
- @extra_pickup_km = options['extra_pickup_km']&.to_f
17
- @extra_dropoff_km = options['extra_dropoff_km']&.to_f
18
- end
19
-
20
- def self.from_hash(hash)
21
- new(hash || {})
22
- end
23
-
24
- def to_h
25
- {
26
- 'distance_km' => @distance_km,
27
- 'ordered_points' => @ordered_points,
28
- 'estimated_time_minutes' => @estimated_time_minutes,
29
- 'base_km' => @base_km,
30
- 'detour_pickup_km' => @detour_pickup_km,
31
- 'detour_dropoff_km' => @detour_dropoff_km,
32
- 'extra_pickup_km' => @extra_pickup_km,
33
- 'extra_dropoff_km' => @extra_dropoff_km
34
- }.compact
35
- end
36
- end
37
- end
38
- end
@@ -1,7 +0,0 @@
1
- FactoryBot.define do
2
- factory :cm_vendor_route, class: 'SpreeCmCommissioner::VendorRoute' do
3
- association :route, factory: :cm_route
4
- association :vendor
5
- trip_count { 0 }
6
- end
7
- end