spree_cm_commissioner 1.18.2.pre.pre1 → 2.0.0.pre.pre

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +0 -3
  3. data/.github/workflows/test_and_build_gem.yml +16 -2
  4. data/.gitignore +2 -1
  5. data/Gemfile.lock +28 -1
  6. data/Rakefile +33 -4
  7. data/app/assets/javascripts/spree_cm_commissioner/backend.js +0 -1
  8. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +8 -11
  9. data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +0 -1
  10. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +1 -2
  11. data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
  12. data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
  13. data/app/controllers/spree/admin/tenants_controller.rb +0 -8
  14. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  15. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  16. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +5 -31
  17. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  18. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  19. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +17 -31
  20. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  21. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  22. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  23. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  24. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  25. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  26. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  27. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  28. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  29. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +1 -5
  30. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  31. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  32. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  33. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  34. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  35. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  36. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  37. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +9 -15
  38. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -13
  39. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  40. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  41. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  42. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  43. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  44. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -4
  45. data/app/models/spree_cm_commissioner/block.rb +23 -0
  46. data/app/models/spree_cm_commissioner/dynamic_field.rb +3 -15
  47. data/app/models/spree_cm_commissioner/dynamic_field_option.rb +1 -5
  48. data/app/models/spree_cm_commissioner/guest.rb +19 -1
  49. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +3 -21
  50. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  51. data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
  52. data/app/models/spree_cm_commissioner/invite_team.rb +1 -3
  53. data/app/models/spree_cm_commissioner/line_item_decorator.rb +46 -78
  54. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  55. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  56. data/app/models/spree_cm_commissioner/order_decorator.rb +30 -1
  57. data/app/models/spree_cm_commissioner/pin_code.rb +2 -3
  58. data/app/models/spree_cm_commissioner/place.rb +1 -3
  59. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  60. data/app/models/spree_cm_commissioner/product_decorator.rb +10 -4
  61. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  62. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  63. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  64. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  65. data/app/models/spree_cm_commissioner/reserved_block.rb +30 -0
  66. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  67. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  68. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  69. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  70. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  71. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  72. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  73. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  74. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  75. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  76. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  77. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  78. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  79. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  80. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  81. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  82. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -2
  83. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  84. data/app/models/spree_cm_commissioner/trip.rb +20 -6
  85. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  86. data/app/models/spree_cm_commissioner/trip_stop.rb +2 -3
  87. data/app/models/spree_cm_commissioner/user_taxon.rb +0 -1
  88. data/app/models/spree_cm_commissioner/variant_block.rb +9 -0
  89. data/app/models/spree_cm_commissioner/variant_decorator.rb +36 -47
  90. data/app/models/spree_cm_commissioner/variant_options.rb +0 -23
  91. data/app/models/spree_cm_commissioner/vehicle.rb +9 -14
  92. data/app/models/spree_cm_commissioner/vendor_decorator.rb +7 -10
  93. data/app/models/spree_cm_commissioner/vendor_place.rb +6 -5
  94. data/app/models/spree_cm_commissioner/vendor_stop.rb +1 -2
  95. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
  96. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +3 -45
  97. data/app/queries/spree_cm_commissioner/trip_query.rb +23 -26
  98. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  99. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  100. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  101. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  102. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +1 -0
  103. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +1 -4
  104. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +3 -1
  105. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +3 -1
  106. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +1 -2
  107. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +15 -23
  108. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  109. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  110. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  111. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  112. data/app/views/spree/admin/tenants/_form.html.erb +42 -109
  113. data/config/initializers/paper_trail.rb +1 -0
  114. data/config/initializers/spree_permitted_attributes.rb +5 -2
  115. data/config/locales/en.yml +0 -5
  116. data/config/routes.rb +22 -4
  117. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  118. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  119. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  120. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  121. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  122. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  123. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  124. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  125. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  126. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  127. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  128. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  129. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  130. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  131. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  132. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  133. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  134. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  135. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  136. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  137. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  138. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  139. data/docker-compose.yml +1 -1
  140. data/lib/cm_app_logger.rb +11 -4
  141. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  142. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  143. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  144. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  145. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +9 -0
  146. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  147. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  148. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  149. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  150. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  151. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  152. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  153. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  154. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +8 -0
  155. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +8 -0
  156. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  157. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  158. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +10 -3
  159. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  160. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  161. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  162. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  163. data/lib/spree_cm_commissioner/version.rb +1 -1
  164. data/lib/spree_cm_commissioner.rb +35 -1
  165. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  166. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  167. data/lib/tasks/generate_inventory_items.rake +7 -0
  168. data/spree_cm_commissioner.gemspec +7 -0
  169. metadata +131 -43
  170. data/app/assets/images/cm-hangmeas-checkout_image.svg +0 -63
  171. data/app/assets/images/cm-hangmeas-failed.svg +0 -56
  172. data/app/assets/images/cm-hangmeas-loader.svg +0 -50
  173. data/app/assets/images/cm-hangmeas-success.svg +0 -51
  174. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +0 -65
  175. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +0 -60
  176. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  177. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  178. data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +0 -27
  179. data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +0 -27
  180. data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +0 -144
  181. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +0 -30
  182. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  183. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  184. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  185. data/app/models/spree_cm_commissioner/pin_code_telegram.rb +0 -28
  186. data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +0 -11
  187. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  188. data/app/models/spree_cm_commissioner/telegram_chat.rb +0 -6
  189. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  190. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  191. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +0 -18
  192. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  193. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  194. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  195. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  196. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +0 -5
  197. data/db/migrate/20250630103536_create_cm_telegram_chats.rb +0 -13
  198. data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +0 -6
  199. data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +0 -5
  200. data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +0 -5
  201. data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +0 -7
  202. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  203. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  204. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  205. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  206. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  207. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  208. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  209. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  210. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a65e24463b1ee3637a58c514292c89d69654bb50e80cc26654d334b235a1418f
4
- data.tar.gz: 8082b3770111363b6e7100c01cfb1a2b31a78c6e5e211cb96af4278495a224dd
3
+ metadata.gz: 0c84700dfc0c91553426b4c3957ab2e2906f4327f9b968efe1d88ce590d69a63
4
+ data.tar.gz: c98479e1dd2ff5f4def2b7799ff2ffc894812dd737e52a6e2488839318ca514b
5
5
  SHA512:
6
- metadata.gz: 9bbf56e0af387769a6030cc47eb6cc5c214b198d288262b6f997bfb0a93df3d6f45912a411693c89155faca7bc268d67bdf3000c4ead3f2fb7f881ee198790ef
7
- data.tar.gz: d3bab592404b7495e5685c7da6f741c7f6aa3743e8aa46b68b6077d8e45f5e5bb35b66a22205977ecc57ae2438e251297806008c526d61e39babe7ab3ad17c6c
6
+ metadata.gz: ddc75d3e7e17ad18de9c620336c8233191f268bd2c18911455b6169f4a6a379b2d8d537e1a7cc6c2d8f280842772b787d19d3215263cf3a6856309f263712512
7
+ data.tar.gz: 551e01c90befa48ad8fa44adc40e9be2af4bda32319f05e562d66d099a0d729477f9ade32aee9c9256728481756e35ccec863782d033962756daba9720e868e8
data/.env.example CHANGED
@@ -24,6 +24,3 @@ WAITING_ROOM_DISABLED=no
24
24
  # Vattanac Bank
25
25
  VATTANAC_AES_SECRET_KEY= ""
26
26
  VATTANAC_PUBLIC_KEY=""
27
-
28
- # Organizer URL
29
- ORGANIZER_URL=http://127.0.0.1:4000/organizer
@@ -10,6 +10,7 @@ on:
10
10
  - reopened
11
11
  branches:
12
12
  - develop
13
+ - milestone-77-scalable-design
13
14
  push:
14
15
  tags:
15
16
  - "*"
@@ -37,7 +38,8 @@ jobs:
37
38
  console.log("PR title format is correct.");
38
39
  }
39
40
  - name: Check commit messages format
40
- if: github.event_name == 'pull_request'
41
+ # skip validation if the PR is from the milestone-77-scalable-design branch for temporary
42
+ if: github.event_name == 'pull_request' && github.head_ref != 'milestone-77-scalable-design'
41
43
  uses: actions/github-script@v7
42
44
  with:
43
45
  script: |
@@ -136,6 +138,17 @@ jobs:
136
138
  --health-timeout 5s
137
139
  --health-retries 5
138
140
 
141
+ redis:
142
+ image: redis
143
+ # Set health checks to wait until redis has started
144
+ options: >-
145
+ --health-cmd "redis-cli ping"
146
+ --health-interval 10s
147
+ --health-timeout 5s
148
+ --health-retries 5
149
+ ports:
150
+ - 6379:6379 # Maps port 6379 on service container to the host
151
+
139
152
  steps:
140
153
  - uses: actions/checkout@v3
141
154
 
@@ -171,8 +184,9 @@ jobs:
171
184
  - name: Run test
172
185
  env:
173
186
  DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
187
+ REDIS_URL: redis://localhost:6379/0
174
188
 
175
- if: github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'develop'
189
+ if: github.event_name == 'pull_request'
176
190
  run: |
177
191
  bundle exec rake
178
192
 
data/.gitignore CHANGED
@@ -28,4 +28,5 @@ node_modules
28
28
  # VScode
29
29
  .vscode
30
30
  !.vscode/.settings.json
31
- .env
31
+ .env
32
+ vendor/bundle/
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (1.18.2.pre.pre1)
37
+ spree_cm_commissioner (2.0.0.pre.pre)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -42,6 +42,7 @@ PATH
42
42
  aws-sdk-s3
43
43
  blazer (~> 3.0.4)
44
44
  byebug
45
+ connection_pool
45
46
  counter_culture (~> 3.2)
46
47
  dry-validation (~> 1.10)
47
48
  elasticsearch (~> 8.5)
@@ -54,9 +55,12 @@ PATH
54
55
  interactor (~> 3.1)
55
56
  jwt (>= 2.5.0)
56
57
  noticed (~> 1.6)
58
+ paper_trail (~> 16.0)
57
59
  phonelib
58
60
  premailer-rails
59
61
  rails (~> 7.0.4)
62
+ redis
63
+ redis-rails
60
64
  rqrcode (~> 2.0)
61
65
  searchkick (~> 5.1)
62
66
  simple_calendar (~> 2.4)
@@ -584,6 +588,9 @@ GEM
584
588
  sawyer (~> 0.9)
585
589
  orm_adapter (0.5.0)
586
590
  os (1.1.4)
591
+ paper_trail (16.0.0)
592
+ activerecord (>= 6.1)
593
+ request_store (~> 1.4)
587
594
  parallel (1.23.0)
588
595
  paranoia (2.6.3)
589
596
  activerecord (>= 5.1, < 7.2)
@@ -619,6 +626,8 @@ GEM
619
626
  activesupport (>= 2.3.14)
620
627
  racc (1.7.1)
621
628
  rack (2.2.8)
629
+ rack-session (1.0.2)
630
+ rack (< 3)
622
631
  rack-test (2.1.0)
623
632
  rack (>= 1.3)
624
633
  rails (7.0.8)
@@ -662,13 +671,31 @@ GEM
662
671
  rbtree (0.4.6)
663
672
  redis (5.0.7)
664
673
  redis-client (>= 0.9.0)
674
+ redis-actionpack (5.5.0)
675
+ actionpack (>= 5)
676
+ redis-rack (>= 2.1.0, < 4)
677
+ redis-store (>= 1.1.0, < 2)
678
+ redis-activesupport (5.3.0)
679
+ activesupport (>= 3, < 8)
680
+ redis-store (>= 1.3, < 2)
665
681
  redis-client (0.17.0)
666
682
  connection_pool
683
+ redis-rack (3.0.0)
684
+ rack-session (>= 0.2.0)
685
+ redis-store (>= 1.2, < 2)
686
+ redis-rails (5.0.2)
687
+ redis-actionpack (>= 5.0, < 6)
688
+ redis-activesupport (>= 5.0, < 6)
689
+ redis-store (>= 1.2, < 2)
690
+ redis-store (1.11.0)
691
+ redis (>= 4, < 6)
667
692
  regexp_parser (2.8.2)
668
693
  representable (3.2.0)
669
694
  declarative (< 0.1.0)
670
695
  trailblazer-option (>= 0.1.1, < 0.2.0)
671
696
  uber (< 0.2.0)
697
+ request_store (1.7.0)
698
+ rack (>= 1.4)
672
699
  responders (3.1.1)
673
700
  actionpack (>= 5.2)
674
701
  railties (>= 5.2)
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
4
  require 'rspec/core/rake_task'
5
- require 'spree/testing_support/extension_rake'
5
+ require 'spree/testing_support/common_rake'
6
6
 
7
7
  RSpec::Core::RakeTask.new
8
8
 
@@ -14,8 +14,37 @@ task :default do
14
14
  Rake::Task[:spec].invoke
15
15
  end
16
16
 
17
+ # Copied from:
18
+ # spree_core:lib/spree/testing_support/common_rake.rb
19
+ # But refactored to skip frontend & backend setup.
17
20
  desc 'Generates a dummy app for testing'
18
- task :test_app do
19
- ENV['LIB_NAME'] = 'spree_cm_commissioner'
20
- Rake::Task['extension:test_app'].invoke
21
+ task :test_app do |_t, args|
22
+ require 'spree_cm_commissioner'
23
+ require "generators/spree_cm_commissioner/install/install_generator"
24
+
25
+ Rails.env = ENV['RAILS_ENV'] = 'test'
26
+
27
+ Spree::DummyGeneratorHelper.inject_extension_requirements = true
28
+ Spree::DummyGenerator.start ["--lib_name=spree_cm_commissioner", '--quiet']
29
+ Spree::InstallGenerator.start [
30
+ "--lib_name=spree_cm_commissioner",
31
+ '--auto-accept',
32
+ '--migrate=false',
33
+ '--seed=false',
34
+ '--sample=false',
35
+ '--quiet',
36
+ '--copy_storefront=false',
37
+ "--install_storefront=false",
38
+ "--install_admin=false",
39
+ "--user_class=Spree::User"
40
+ ]
41
+
42
+ puts 'Setting up dummy database...'
43
+ system('bin/rails db:environment:set RAILS_ENV=test')
44
+ system('bundle exec rake db:drop db:create')
45
+ Spree::DummyModelGenerator.start
46
+ system('bundle exec rake db:migrate')
47
+
48
+ puts 'Running extension installation generator...'
49
+ SpreeCmCommissioner::Generators::InstallGenerator.start(['--auto-run-migrations'])
21
50
  end
@@ -11,4 +11,3 @@
11
11
  //= require spree_cm_commissioner/selected_field_filter_origin_destination
12
12
  //= require spree_cm_commissioner/location_checkbox_manager
13
13
  //= require spree_cm_commissioner/trip_stop_selection
14
- //= require spree_cm_commissioner/tenant_payment_icon_fields
@@ -55,8 +55,9 @@ $day-background: theme-color("light");
55
55
  }
56
56
  }
57
57
 
58
- // .wday-0 {
59
- // }
58
+ .wday-0 {
59
+ background-color: darken($day-background, 5%);
60
+ }
60
61
 
61
62
  // .wday-1 {
62
63
  // }
@@ -73,8 +74,9 @@ $day-background: theme-color("light");
73
74
  // .wday-5 {
74
75
  // }
75
76
 
76
- // .wday-6 {
77
- // }
77
+ .wday-6 {
78
+ background-color: darken($day-background, 5%);
79
+ }
78
80
 
79
81
  // .today {
80
82
  // }
@@ -86,9 +88,7 @@ $day-background: theme-color("light");
86
88
  // }
87
89
 
88
90
  // known as active-date
89
- .start-date {
90
- background-color: darken($day-background, 5%);
91
- }
91
+ // .start-date {}
92
92
 
93
93
  // .prev-month {
94
94
  // }
@@ -159,11 +159,8 @@ $day-background: theme-color("light");
159
159
 
160
160
  // .current-month {}
161
161
  .has-events {
162
- background-color: lighten(theme-color("warning"), 30%);
163
- color: darken(theme-color("warning"), 50%);
164
-
165
162
  @include hover {
166
- background-color: theme-color("warning");
163
+ background-color: rgba($dark, 0.1);
167
164
  }
168
165
  }
169
166
 
@@ -3,4 +3,3 @@
3
3
  @import "spree_cm_commissioner/backend/service_calendar";
4
4
  @import "spree_cm_commissioner/backend/guest_qr_code";
5
5
  @import "spree_cm_commissioner/backend/vehicle_seat";
6
- @import "spree_cm_commissioner/backend/tenant_payment_icon_fields";
@@ -6,9 +6,8 @@ module SpreeCmCommissioner
6
6
  after_action :set_cache_control_for_cdn
7
7
  end
8
8
 
9
- # Override This Method based on your UseCase
10
9
  def max_age
11
- ENV.fetch('CONTENT_CACHE_MAX_AGE', 1.day.to_i).to_i
10
+ ENV.fetch('CONTENT_CACHE_MAX_AGE', '180')
12
11
  end
13
12
 
14
13
  def set_cache_control_for_cdn
@@ -0,0 +1,83 @@
1
+ module Spree
2
+ module Admin
3
+ class InventoryItemsController < StockManagementsController
4
+ before_action :load_parent
5
+
6
+ # GET /products/:slug/variants/:variant_id/inventory_items/:id
7
+ def show
8
+ @inventory_item = @product.inventory_items.find(params[:id])
9
+ @default_prices = @inventory_item.variant.prices.to_a.index_by(&:currency)
10
+
11
+ @prices = @inventory_item.prices.to_a
12
+ supported_currencies_for_all_stores.each do |currency|
13
+ @prices << @inventory_item.prices.new(currency: currency) if @prices.none? { |price| price.currency == currency }
14
+ end
15
+
16
+ @cached_inventory_item = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new([@inventory_item])
17
+ .call
18
+ .index_by(&:inventory_item_id)[@inventory_item.id]
19
+ end
20
+
21
+ # POST /products/:slug/variants/:variant_id/inventory_items
22
+ def create
23
+ variant = @product.variants.find(params[:variant_id])
24
+ inventory_item = variant.create_default_non_permanent_inventory_item!
25
+
26
+ if inventory_item.present?
27
+ result = SpreeCmCommissioner::Stock::InventoryItemResetter.call(inventory_item: inventory_item)
28
+
29
+ if result.success?
30
+ flash[:success] = flash_message_for(result.inventory_item, :successfully_created)
31
+ else
32
+ flash[:error] = result.message
33
+ end
34
+ end
35
+
36
+ redirect_back fallback_location: admin_product_stock_managements_path(@product)
37
+ end
38
+
39
+ # PATCH /products/:slug/variants/:variant_id/inventory_items/:id/reset
40
+ def reset
41
+ inventory_item = @product.inventory_items.find(params[:id])
42
+ result = SpreeCmCommissioner::Stock::InventoryItemResetter.call(inventory_item: inventory_item)
43
+
44
+ if result.success?
45
+ flash[:success] = flash_message_for(result.inventory_item, :successfully_updated)
46
+ else
47
+ flash[:error] = result.message
48
+ end
49
+
50
+ redirect_back fallback_location: admin_product_stock_managements_path(@product)
51
+ end
52
+
53
+ # PATCH /products/:slug/variants/:variant_id/inventory_items/:id/update_prices
54
+ def update_prices
55
+ inventory_item = @product.inventory_items.find(params[:id])
56
+
57
+ params[:prices]&.values&.each do |price_params|
58
+ price = inventory_item.prices.find_or_initialize_by(currency: price_params[:currency])
59
+ price.price = price_params[:price].empty? ? nil : price_params[:price]
60
+ price.compare_at_price = price_params[:compare_at_price].empty? ? nil : price_params[:compare_at_price]
61
+ price.variant_id = inventory_item.variant_id
62
+ price.save! if (price.new_record? && price.price) || (!price.new_record? && price.changed?)
63
+ end
64
+
65
+ flash[:success] = flash_message_for(inventory_item, :successfully_updated)
66
+ redirect_back fallback_location: admin_product_stock_managements_path(@product)
67
+ end
68
+
69
+ # PATCH /products/:slug/variants/:variant_id/inventory_items/:id/delete_prices
70
+ def delete_prices
71
+ inventory_item = @product.inventory_items.find(params[:id])
72
+
73
+ if inventory_item.prices.destroy_all
74
+ flash[:success] = flash_message_for(inventory_item, :successfully_removed)
75
+ else
76
+ flash[:error] = inventory_item.errors.full_messages.join(', ')
77
+ end
78
+
79
+ redirect_back fallback_location: admin_product_stock_managements_path(@product)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -5,6 +5,8 @@ module Spree
5
5
 
6
6
  before_action :load_parent
7
7
 
8
+ helper_method :inventory_item_message
9
+
8
10
  def load_parent
9
11
  @product = Spree::Product.find_by(slug: params[:product_id])
10
12
  end
@@ -12,9 +14,59 @@ module Spree
12
14
  def index
13
15
  @variants = @product.variants.includes(:images, stock_items: :stock_location, option_values: :option_type)
14
16
  @variants = [@product.master] if @variants.empty?
15
-
16
17
  @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
17
18
 
19
+ load_inventories unless @product.permanent_stock?
20
+ end
21
+
22
+ def create
23
+ result = SpreeCmCommissioner::Stock::StockMovementCreator.call(
24
+ variant_id: params[:variant_id],
25
+ stock_location_id: params[:stock_location_id],
26
+ current_store: current_store,
27
+ stock_movement_params: stock_movement_params
28
+ )
29
+
30
+ if result.success?
31
+ flash[:success] = flash_message_for(result.stock_movement, :successfully_created)
32
+ else
33
+ flash[:error] = result.message
34
+ end
35
+
36
+ redirect_back fallback_location: admin_product_stock_managements_path(@product)
37
+ end
38
+
39
+ # GET /products/:slug/stock_managements/calendar?year=
40
+ def calendar
41
+ @year = params[:year].present? ? params[:year].to_i : Time.zone.today.year
42
+
43
+ from_date = Date.new(@year, 1, 1).beginning_of_year
44
+ to_date = Date.new(@year, 1, 1).end_of_year
45
+
46
+ @inventory_items = @product.inventory_items.includes(:variant, :prices).where(inventory_date: from_date..to_date).to_a
47
+ @cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@inventory_items)
48
+ .call
49
+ .index_by(&:inventory_item_id)
50
+ @events = SpreeCmCommissioner::CalendarEvent.from_inventory_items(@inventory_items)
51
+ end
52
+
53
+ def inventory_item_message(inventory_item, cached_inventory_item)
54
+ synced = inventory_item.quantity_available == cached_inventory_item.quantity_available
55
+
56
+ if synced
57
+ "Synced: Quantity available matches in both DB and Redis (#{cached_inventory_item.quantity_available})."
58
+ else
59
+ "Out of sync: Redis shows #{cached_inventory_item.quantity_available} available, which doesn't match the database."
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def load_inventories
66
+ @inventory_items = @product.inventory_items.group_by { |item| item.variant.id }
67
+ @cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@product.inventory_items)
68
+ .call
69
+ .index_by(&:inventory_item_id)
18
70
  @reserved_stocks = Spree::LineItem
19
71
  .complete
20
72
  .where(variant_id: @variants.pluck(:id))
@@ -25,6 +77,16 @@ module Spree
25
77
  def model_class
26
78
  Spree::StockItem
27
79
  end
80
+
81
+ # This method processes the parameters for stock movement creation.
82
+ # Expected attributes for `stock_movement` include:
83
+ # - :quantity (Integer): The quantity of stock to move.
84
+ # - :action (String): The type of stock movement (e.g., "add" or "remove").
85
+ # - :originator_id, :originator_ty (String, optional): The ID and type of the entity creating the stock movement.
86
+ # Ensure that `permitted_stock_movement_attributes` is updated to reflect any changes.
87
+ def stock_movement_params
88
+ params.require(:stock_movement).permit(permitted_stock_movement_attributes)
89
+ end
28
90
  end
29
91
  end
30
92
  end
@@ -1,8 +1,6 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TenantsController < Spree::Admin::ResourceController
4
- before_action :load_vector_icons, only: %i[new edit]
5
-
6
4
  # override
7
5
  def collection
8
6
  params[:q] = {} if params[:q].blank?
@@ -33,12 +31,6 @@ module Spree
33
31
  def collection_url(options = {})
34
32
  admin_tenants_url(options)
35
33
  end
36
-
37
- private
38
-
39
- def load_vector_icons
40
- @vector_icons = SpreeCmCommissioner::VectorIcon.all
41
- end
42
34
  end
43
35
  end
44
36
  end
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class Accommodations::VariantsController < ::Spree::Api::V2::ResourceController
6
+ private
7
+
8
+ # override
9
+ def collection
10
+ @collection ||= SpreeCmCommissioner::Accommodations::FindVariant.new(
11
+ from_date: params[:from_date]&.to_date,
12
+ to_date: params[:to_date]&.to_date,
13
+ vendor_id: params[:accommodation_id],
14
+ number_of_adults: params[:adult].to_i,
15
+ number_of_kids: params[:children].to_i
16
+ ).execute
17
+ end
18
+
19
+ # override
20
+ def resource
21
+ @resource ||= collection.find(params[:id])
22
+ end
23
+
24
+ # override
25
+ def resource_serializer
26
+ Spree::V2::Storefront::VariantSerializer
27
+ end
28
+
29
+ # override
30
+ def collection_serializer
31
+ Spree::V2::Storefront::VariantSerializer
32
+ end
33
+
34
+ # override
35
+ def required_schema
36
+ SpreeCmCommissioner::VariantRequestSchema
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -5,55 +5,38 @@ module Spree
5
5
  class AccommodationsController < ::Spree::Api::V2::ResourceController
6
6
  private
7
7
 
8
+ # override
8
9
  def collection
9
- @collection ||= collection_finder.call(params: params).value
10
- end
11
-
12
- def paginated_collection
13
- return @paginated_collection if defined?(@paginated_collection)
14
-
15
- @paginated_collection = super
16
- @paginated_collection = apply_service_availability(@paginated_collection)
10
+ @collection ||= SpreeCmCommissioner::Accommodations::Find.new(
11
+ from_date: params[:from_date]&.to_date,
12
+ to_date: params[:to_date]&.to_date,
13
+ state_id: params[:province_id],
14
+ number_of_adults: params[:adult].to_i,
15
+ number_of_kids: params[:children].to_i
16
+ ).execute
17
17
  end
18
18
 
19
+ # override
19
20
  def resource
20
- resource = resource_finder.call(params: params).value
21
- raise ActiveRecord::RecordNotFound if resource.nil?
22
-
23
- apply_service_availability(resource)
24
- end
25
-
26
- def apply_service_availability(resource)
27
- SpreeCmCommissioner::ApplyServiceAvailability.call(calendarable: resource,
28
- from_date: params[:from_date].to_date,
29
- to_date: params[:to_date].to_date
30
- ).value
21
+ @resource ||= collection.find_by!(slug: params[:id])
31
22
  end
32
23
 
24
+ # override
33
25
  def allowed_sort_attributes
34
26
  super << :min_price << :max_price
35
27
  end
36
28
 
37
- def model_class
38
- Spree::Vendor
39
- end
40
-
29
+ # override
41
30
  def resource_serializer
42
31
  Spree::V2::Storefront::AccommodationSerializer
43
32
  end
44
33
 
34
+ # override
45
35
  def collection_serializer
46
36
  Spree::V2::Storefront::AccommodationSerializer
47
37
  end
48
38
 
49
- def collection_finder
50
- SpreeCmCommissioner::AccommodationSearchDetail
51
- end
52
-
53
- def resource_finder
54
- SpreeCmCommissioner::AccommodationSearchDetail
55
- end
56
-
39
+ # override
57
40
  def required_schema
58
41
  SpreeCmCommissioner::AccommodationRequestSchema
59
42
  end
@@ -38,25 +38,10 @@ module Spree
38
38
  def update
39
39
  spree_authorize! :update, spree_current_order, order_token
40
40
 
41
- begin
42
- if guest_params[:guest_dynamic_fields_attributes]
43
- resource.guest_dynamic_fields.destroy_all
44
-
45
- guest_params[:guest_dynamic_fields_attributes].each do |attr|
46
- field = build_dynamic_field(attr)
47
- field.save!
48
- end
49
- end
50
-
51
- resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
52
-
53
- if resource.save
54
- render_serialized_payload { serialize_resource(resource) }
55
- else
56
- render_error_payload(resource.errors, 400)
57
- end
58
- rescue ActiveRecord::RecordInvalid => e
59
- render_error_payload(e.record.errors, 400)
41
+ if resource.update(guest_params)
42
+ render_serialized_payload { serialize_resource(resource) }
43
+ else
44
+ render_error_payload(resource, 400)
60
45
  end
61
46
  end
62
47
 
@@ -91,20 +76,9 @@ module Spree
91
76
  :upload_later,
92
77
  :country_code,
93
78
  :contact,
94
- guest_dynamic_fields_attributes: %i[id dynamic_field_id dynamic_field_option_id value _destroy]
79
+ guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
95
80
  )
96
81
  end
97
-
98
- def build_dynamic_field(attr)
99
- field = resource.guest_dynamic_fields.build(attr.except(:id))
100
-
101
- if field.dynamic_field.requires_dynamic_field_options?
102
- option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
103
- field.dynamic_field_option = option if option
104
- end
105
-
106
- field
107
- end
108
82
  end
109
83
  end
110
84
  end
@@ -12,9 +12,9 @@ module Spree
12
12
  spree_authorize! :update, spree_current_order, order_token
13
13
  spree_authorize! :show, @variant
14
14
 
15
- availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant)
15
+ availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant, add_item_params[:options])
16
16
 
17
- unless availability_checker.can_supply?(add_item_params[:quantity].to_i, add_item_params[:options])
17
+ unless availability_checker.can_supply?(add_item_params[:quantity].to_i)
18
18
  return render_error_payload(availability_checker.error_message || I18n.t('variant_availability.items_out_of_stock'))
19
19
  end
20
20
 
@@ -37,7 +37,7 @@ module SpreeCmCommissioner
37
37
  bit_fields = SpreeCmCommissioner::KycBitwise::BIT_FIELDS.keys
38
38
 
39
39
  if permitted_resource_params[:use_product_kyc] == '1'
40
- permitted_resource_params[:kyc] = nil
40
+ permitted_resource_params[:kyc] = @product.kyc
41
41
  else
42
42
  @kyc_result = calculate_kyc_value(params[:variant])
43
43
  permitted_resource_params[:kyc] = @kyc_result