spree_cm_commissioner 2.0.0 → 2.0.1.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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +16 -2
  3. data/.gitignore +2 -1
  4. data/Gemfile.lock +32 -1
  5. data/Rakefile +33 -4
  6. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +8 -11
  7. data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
  8. data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
  9. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  11. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  12. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +13 -13
  13. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  14. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +81 -23
  15. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  16. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  17. data/app/interactors/spree_cm_commissioner/create_ticket.rb +5 -6
  18. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  19. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  20. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +1 -0
  21. data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
  22. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  23. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  24. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  25. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  26. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  27. data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +3 -7
  28. data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +3 -11
  29. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +6 -12
  30. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +1 -7
  31. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  32. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  33. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  34. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  35. data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
  36. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  37. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  38. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  39. data/app/mailers/spree/order_mailer_decorator.rb +3 -18
  40. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +9 -15
  41. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -12
  42. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  43. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  44. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  45. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  46. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  47. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -1
  48. data/app/models/spree_cm_commissioner/block.rb +23 -0
  49. data/app/models/spree_cm_commissioner/dynamic_field.rb +0 -20
  50. data/app/models/spree_cm_commissioner/guest.rb +18 -56
  51. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +1 -41
  52. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  53. data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
  54. data/app/models/spree_cm_commissioner/line_item_decorator.rb +46 -78
  55. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  56. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  57. data/app/models/spree_cm_commissioner/order_decorator.rb +30 -1
  58. data/app/models/spree_cm_commissioner/place.rb +1 -4
  59. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  60. data/app/models/spree_cm_commissioner/product_decorator.rb +10 -28
  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 -1
  83. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  84. data/app/models/spree_cm_commissioner/trip.rb +8 -10
  85. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  86. data/app/models/spree_cm_commissioner/trip_stop.rb +6 -25
  87. data/app/models/spree_cm_commissioner/user_identity_provider.rb +4 -26
  88. data/app/models/spree_cm_commissioner/variant_block.rb +9 -0
  89. data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -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 +11 -17
  93. data/app/models/spree_cm_commissioner/vendor_place.rb +9 -3
  94. data/app/queries/spree_cm_commissioner/trip_query.rb +70 -44
  95. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  96. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  97. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  98. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  99. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +1 -0
  100. data/app/serializers/spree/v2/tenant/user_serializer.rb +0 -1
  101. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
  102. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
  103. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  104. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  105. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  106. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  107. data/app/views/spree/admin/tenant_vendors/index.html.erb +2 -9
  108. data/app/views/spree/admin/tenants/_form.html.erb +0 -9
  109. data/app/views/spree/admin/tenants/edit.html.erb +1 -2
  110. data/app/views/spree/admin/tenants/index.html.erb +1 -7
  111. data/app/views/spree/admin/vendors/_form.html.erb +0 -14
  112. data/app/views/spree/order_mailer/confirm_email.html.erb +16 -27
  113. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +1 -5
  114. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +4 -41
  115. data/config/initializers/paper_trail.rb +1 -0
  116. data/config/initializers/spree_permitted_attributes.rb +5 -0
  117. data/config/locales/en.yml +1 -5
  118. data/config/routes.rb +21 -2
  119. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  120. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  121. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  122. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  123. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  124. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  125. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  126. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  127. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  128. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  129. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  130. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  131. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  132. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  133. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  134. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  135. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  136. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  137. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  138. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  139. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  140. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  141. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  142. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  143. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  144. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  145. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  146. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  147. data/docker-compose.yml +1 -1
  148. data/lib/cm_app_logger.rb +11 -4
  149. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  150. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  151. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  152. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  153. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +15 -0
  154. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  155. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  156. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  157. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  158. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  159. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  160. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  161. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  162. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
  163. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
  164. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  165. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  166. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
  167. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +10 -0
  168. data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
  169. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  170. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  171. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  172. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
  173. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  174. data/lib/spree_cm_commissioner/trip_query_result.rb +8 -0
  175. data/lib/spree_cm_commissioner/trip_result.rb +5 -3
  176. data/lib/spree_cm_commissioner/version.rb +1 -1
  177. data/lib/spree_cm_commissioner.rb +35 -1
  178. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  179. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  180. data/lib/tasks/generate_inventory_items.rake +7 -0
  181. data/spree_cm_commissioner.gemspec +7 -0
  182. metadata +141 -38
  183. data/app/assets/images/mailer/mail.png +0 -0
  184. data/app/assets/images/mailer/tenant_phone.png +0 -0
  185. data/app/assets/images/mailer/tenant_user.png +0 -0
  186. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  187. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  188. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  189. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  190. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  191. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  192. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  193. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  194. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
  195. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  196. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  197. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  198. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  199. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  200. data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +0 -42
  201. data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +0 -25
  202. data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +0 -19
  203. data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +0 -33
  204. data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +0 -6
  205. data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +0 -13
  206. data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +0 -5
  207. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  208. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  209. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  210. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  211. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  212. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  213. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  214. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  215. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -0,0 +1,72 @@
1
+ <%= turbo_frame_tag "inventory_item" do %>
2
+ <div>
3
+ <h5 class="modal-title">Inventory</h5>
4
+ <p>
5
+ <% if @inventory_item.inventory_date.present? %>
6
+ <span><%= @inventory_item.inventory_date %></span><br>
7
+ <% end %>
8
+ <%= @inventory_item.variant.options_text %>
9
+ </p>
10
+
11
+ <ul class="list-group mb-1">
12
+ <li class="list-group-item d-flex justify-content-between align-items-center">
13
+ Max capacity
14
+ <span class="badge badge-primary badge-pill"><%= @inventory_item.max_capacity %></span>
15
+ </li>
16
+ <li class="list-group-item d-flex justify-content-between align-items-center">
17
+ Quantity available
18
+ <span class="badge badge-primary badge-pill"><%= @inventory_item.quantity_available %></span>
19
+ </li>
20
+ </ul>
21
+
22
+ <small class="text-muted">
23
+ <%= inventory_item_message(@inventory_item, @cached_inventory_item) %>
24
+ </small>
25
+
26
+ <%= link_to_with_icon('arrow-counterclockwise.svg', "Reset Inventory Item", reset_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id),
27
+ method: :patch,
28
+ remote: false,
29
+ class: 'icon_link btn btn-sm outline text-dark',
30
+ data: { confirm: "Only reset if stock is incorrect. Are you sure?" }, no_text: true
31
+ ) %>
32
+ </div>
33
+
34
+ <hr />
35
+
36
+ <div class="mt-2">
37
+ <h6 class="modal-title mb-1 d-flex flex-row justify-content-between">
38
+ Custom Prices
39
+ <%= link_to_with_icon('delete.svg', Spree.t(:remove),
40
+ delete_prices_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id),
41
+ method: :delete, remote: false, class: 'icon_link btn btn-sm text-danger', data: { action: :remove, confirm: "Are you sure to remove these prices & use base price?" }, no_text: true
42
+ ) if @prices.any?(&:persisted?) %>
43
+ </h6>
44
+
45
+ <%= form_with url: update_prices_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id), method: :patch, local: true, html: { class: 'inventory-item-prices-form' } do |form| %>
46
+ <table class="table">
47
+ <tbody>
48
+ <% @prices.each do |price| %>
49
+ <% currency = price.currency %>
50
+ <% default_price = @default_prices[currency] || Spree::Price.new %>
51
+ <tr id="inventory-item_prices_row_<%= currency %>" data-hook="inventory-item_prices_row">
52
+ <td><%= form.label "price_#{currency}", currency, class: 'form-label' %></td>
53
+ <td>
54
+ <%= form.hidden_field "prices[#{currency}][currency]", value: currency %>
55
+ <%= form.text_field "prices[#{currency}][price]", value: price.amount, placeholder: "Default: #{default_price.amount || 'N/A'}", class: 'form-control' %>
56
+ </td>
57
+ <td>
58
+ <%= form.text_field "prices[#{currency}][compare_at_price]", value: price.compare_at_price, placeholder: "Default: #{default_price.compare_at_price || 'N/A'}", class: 'form-control' %>
59
+ </td>
60
+ </tr>
61
+ <% end %>
62
+ </tbody>
63
+ </table>
64
+
65
+ <div class="d-flex flex-row justify-content-end mt-2">
66
+ <div class="form-actions" data-hook="buttons">
67
+ <%= button Spree.t('actions.save'), 'save.svg', 'submit', { class: 'btn-outline-success', data: { disable_with: "#{ Spree.t(:saving) }...", turbo_frame: "_top" } } %>
68
+ </div>
69
+ </div>
70
+ <% end %>
71
+ </div>
72
+ <% end %>
@@ -17,9 +17,11 @@
17
17
  </td>
18
18
  <td class="text-center d-flex flex-column align-items-center justify-content-center">
19
19
  <div style="width: 90px;">
20
- <%= form_tag admin_stock_items_path(variant_id: variant.id, stock_location_id: stock_location.id), method: :post do %>
20
+ <%= form_tag admin_product_stock_managements_path(product_id: params[:product_id], variant_id: variant.id, stock_location_id: stock_location.id), method: :post do %>
21
21
  <div class="input-group input-group-sm">
22
22
  <%= number_field_tag 'stock_movement[quantity]', 0, class: 'form-control text-center p-0' %>
23
+ <%= hidden_field_tag 'stock_movement[originator_id]', spree_current_user.id %>
24
+ <%= hidden_field_tag 'stock_movement[originator_type]', spree_current_user.class.name %>
23
25
  <div class="input-group-append">
24
26
  <%= button_tag(class: 'btn btn-outline-success pl-2 pr-1') do %>
25
27
  <%= svg_icon(name: 'arrow-left-right.svg', classes: "icon", width: 14, height: 14) %>
@@ -32,7 +34,10 @@
32
34
  <td class="text-center">
33
35
  <% if item.persisted? && can?(:update, item) %>
34
36
  <%= form_tag admin_stock_item_path(item), method: :put, class: 'toggle_stock_item_backorderable' do %>
35
- <%= check_box_tag 'stock_item[backorderable]', true, item.backorderable?, class: 'stock_item_backorderable', id: "stock_item_backorderable_#{stock_location.id}" %>
37
+ <%= check_box_tag 'stock_item[backorderable]', true, item.backorderable?,
38
+ class: 'stock_item_backorderable',
39
+ id: "stock_item_backorderable_#{stock_location.id}",
40
+ onclick: "if (!confirm('Are you sure to change backorderable status?')) { this.checked = !this.checked; }" %>
36
41
  <% end %>
37
42
  <% else %>
38
43
  <%= 'N/A' %>
@@ -0,0 +1,56 @@
1
+ <%= turbo_frame_tag "calendar" do %>
2
+ <%= form_with url: admin_product_stock_managements_path, method: :get, class: "mt-4" do %>
3
+ <%= select_year(params[:year]&.to_i || @year, { start_year: 2025, end_year: @year + 3 }, { name: "year", onchange: "this.form.submit()" }) %>
4
+ <% end %>
5
+
6
+ <div class="c-annual-calendar-container mt-2">
7
+ <div class="c-annual-calendar">
8
+ <% (1..12).each do |month| %>
9
+ <%= month_calendar(start_date: Date.new(@year, month, 1), attribute: :from_date, end_attribute: :to_date, events: @events) do |date, events| %>
10
+ <div class="c-annual-day" data-date="<%= date.strftime '%Y-%m-%d' %>">
11
+ <%= date.day %>
12
+ <ul class="p-0 m-0 list-unstyled">
13
+ <% events = events.sort_by { |e| e.options[:inventory_item]&.variant_id.to_i } %>
14
+ <% events.each do |event| %>
15
+ <% inventory_item = event.options[:inventory_item] %>
16
+ <% synced = inventory_item.quantity_available == @cached_inventory_items[inventory_item.id].quantity_available %>
17
+
18
+ <% classes = 'badge ' %>
19
+ <% classes += synced ? 'badge-primary ' : 'badge-danger ' %>
20
+ <% classes += 'badge-success ' if inventory_item.prices.any? %>
21
+
22
+ <li class="<%= classes %>"
23
+ data-toggle="modal"
24
+ data-target="#inventoryItemModal"
25
+ role="button"
26
+ onclick="updateModalTurboFrameSrc('<%= admin_product_variant_inventory_item_path(@product, inventory_item.variant_id, inventory_item.id) %>')">
27
+ <%= inventory_item.quantity_available %>
28
+ <%= inventory_item.prices.first.display_amount if inventory_item.prices.any? %>
29
+ </li>
30
+ <% end %>
31
+ </ul>
32
+ </div>
33
+ <% end %>
34
+ <% end %>
35
+ </div>
36
+ </div>
37
+
38
+ <div class="modal fade" id="inventoryItemModal" tabindex="-1" role="dialog">
39
+ <div class="modal-dialog" role="document">
40
+ <div class="modal-content">
41
+ <div class="modal-body">
42
+ <%= turbo_frame_tag "inventory_item" %>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+ <script>
49
+ function updateModalTurboFrameSrc(url) {
50
+ let frame = document.getElementById('inventory_item');
51
+ frame.src = null;
52
+ frame.innerHTML = `<div class="spinner-border mt-2" role="status"></div>`;
53
+ frame.src = url
54
+ }
55
+ </script>
56
+ <% end %>
@@ -19,30 +19,73 @@
19
19
  <% @variants.each do |variant| %>
20
20
  <tr id="<%= spree_dom_id variant %>" data-hook="admin_product_stock_management_index_rows">
21
21
  <td class="image text-center">
22
- <%= small_image(variant) %>
23
- <div class="mt-4">
24
- Reserved Stock: <%= @reserved_stocks[variant.id] || 0 %></strong>
25
- </div>
22
+ <%= small_image(variant) %>
26
23
  </td>
27
24
  <td>
28
25
  <%= variant.sku_and_options_text %>
29
26
  <%= form_tag admin_product_variants_including_master_path(@product, variant, format: :js), method: :put, class: 'toggle_variant_track_inventory mt-2' do %>
30
27
  <div class="checkbox">
31
28
  <%= label_tag "track_inventory_#{ variant.id }", class: 'm-0' do %>
32
- <%= check_box_tag 'track_inventory', 1, variant.track_inventory?, class: 'track_inventory_checkbox', id: "track_inventory_#{ variant.id }" %>
29
+ <%= check_box_tag 'track_inventory', 1, variant.track_inventory?,
30
+ class: 'track_inventory_checkbox',
31
+ id: "track_inventory_#{ variant.id }",
32
+ onclick: "if (!confirm('Are you sure to change track inventory status?')) { this.checked = !this.checked; }" %>
33
33
  <%= Spree.t(:track_inventory) %>
34
34
  <%= hidden_field_tag 'variant[track_inventory]', variant.track_inventory?, class: 'variant_track_inventory', id: "variant_track_inventory_#{variant.id}" %>
35
35
  <% end %>
36
36
  </div>
37
37
  <% end if can?(:update, @product) && can?(:update, variant) %>
38
+
39
+ <% if defined?(@reserved_stocks) %>
40
+ <div>
41
+ <%= svg_icon name: "cart-check.svg", width: '14', height: '14' %>
42
+ <%= label_tag "reserved_stock#{variant.id}", "Reserved Stock: #{@reserved_stocks[variant.id] || 0}", class: "m-0" %>
43
+ <%= link_to_with_icon('capture.svg', "Create Inventory Item", admin_product_stock_management_variant_inventory_items(@product, variant.id),
44
+ method: :post,
45
+ remote: false,
46
+ class: 'icon_link btn btn-sm btn-outline-primary ml-2',
47
+ no_text: true
48
+ ) unless @inventory_items[variant.id].present? %>
49
+ </div>
50
+ <% end %>
51
+
38
52
  <% if variant.permanent_stock? %>
39
53
  <div>
40
54
  <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
41
55
  <%= svg_icon name: "info-circle-fill.svg", width: '14', height: '14' %>
42
56
  </span>
43
- <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock) %>
57
+ <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock), class: "m-0" %>
44
58
  </div>
45
59
  <% end %>
60
+
61
+ <% if defined?(@inventory_items) %>
62
+ <% @inventory_items[variant.id]&.each do |inventory_item| %>
63
+ <div>
64
+ <%= svg_icon name: "handbag.svg", width: '14', height: '14' %>
65
+ <%= label_tag "max_capacity_#{ inventory_item.id }", "Max capacity: #{inventory_item.max_capacity}", class: "m-0" %>
66
+ </div>
67
+ <div>
68
+ <%= svg_icon name: "approve.svg", width: '14', height: '14' %>
69
+ <%= label_tag "quantity_available_#{ inventory_item.id }", "Quantity available: #{inventory_item.quantity_available}", class: "m-0" %>
70
+
71
+ <% synced = inventory_item.quantity_available == @cached_inventory_items[inventory_item.id].quantity_available %>
72
+ <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="<%= inventory_item_message(inventory_item, @cached_inventory_items[inventory_item.id]) %>">
73
+ <% if synced %>
74
+ <%= svg_icon name: "cloud-check.svg", width: '14', height: '14', classes: 'text-success' %>
75
+ <% else %>
76
+ <%= svg_icon name: "cloud-slash.svg", width: '14', height: '14', classes: 'text-danger' %>
77
+ <% end %>
78
+ </span>
79
+
80
+ <%= link_to_with_icon('arrow-counterclockwise.svg', "Reset Inventory Item", reset_admin_product_variant_inventory_item_path(@product, inventory_item.variant_id, inventory_item.id),
81
+ method: :patch,
82
+ remote: false,
83
+ class: 'icon_link btn btn-sm outline text-dark',
84
+ data: { confirm: "Only reset if stock is incorrect. Are you sure?" }, no_text: true
85
+ ) %>
86
+ </div>
87
+ <% end %>
88
+ <% end %>
46
89
  </td>
47
90
 
48
91
  <td colspan="3" class="stock_location_info">
@@ -53,3 +96,9 @@
53
96
  </tbody>
54
97
  </table>
55
98
  </div>
99
+
100
+ <%= turbo_frame_tag "calendar", src: calendar_admin_product_stock_managements_path(year: params[:year]) do %>
101
+ <div class="spinner-border mt-2" role="status">
102
+ <span class="sr-only">Loading...</span>
103
+ </div>
104
+ <% end if @product.permanent_stock? %>
@@ -1,6 +1,6 @@
1
1
  <% content_for :page_title do %>
2
2
  <%= page_header_back_button spree.admin_tenants_url %>
3
- <%= link_to Spree.t('tenants'), spree.admin_tenants_url %> / <%= link_to @tenant.name, spree.admin_tenants_url%> / <%= Spree.t('vendors') %>
3
+ <%= link_to @tenant.name, spree.admin_tenants_url %> / <%= Spree.t('vendors') %>
4
4
  <% end %>
5
5
 
6
6
  <% content_for :page_actions do %>
@@ -24,20 +24,13 @@
24
24
  <tbody>
25
25
  <% @vendors.each do |vendor| %>
26
26
  <tr id="<%= spree_dom_id vendor %>" data-hook="admin_vendors_index_rows">
27
- <td>
28
- <% if can?(:edit, vendor) %>
29
- <%= link_to vendor.name, edit_admin_vendor_path(vendor.slug) %>
30
- <% else %>
31
- <td><%= vendor.name %></td>
32
- <% end %>
33
- </td>
27
+ <td><%= vendor.name %></td>
34
28
  <td><%= vendor.slug %></td>
35
29
  <td><%= vendor.created_at %></td>
36
30
  <td><%= vendor.updated_at %></td>
37
31
  <td><%= vendor.tenant.name %></td>
38
32
  <td data-hook="admin_tenants_index_row_actions" class="actions">
39
33
  <span class="d-flex justify-content-end">
40
- <%= link_to_edit vendor, url: edit_admin_vendor_path(vendor.slug), no_text: true if can?(:edit, vendor) %>
41
34
  <%= link_to_delete vendor, url: admin_tenant_vendor_path(@tenant, vendor.id), no_text: true if can?(:delete, vendor) %>
42
35
  </span>
43
36
  </td>
@@ -101,15 +101,6 @@
101
101
  <% end %>
102
102
  </div>
103
103
 
104
- <!-- Brand Primary Color Field -->
105
- <div class="col-md-6">
106
- <%= f.label :preferred_brand_primary_color, Spree.t(:brand_primary_color), class: 'form-label' %>
107
- <%= f.text_field :preferred_brand_primary_color, class: 'form-control color-picker', placeholder: '#FF5733', value: @object.preferred_brand_primary_color %>
108
- <div class="color-preview" style="margin-top: 10px;">
109
- <%= content_tag :div, nil, style: "background-color: #{@object.preferred_brand_primary_color}; width: 60px; height: 60px; border: 1px solid #ccc; box-sizing: border-box; display: block;" %>
110
- </div>
111
- </div>
112
-
113
104
  <!-- State Field -->
114
105
  <div class="col-6">
115
106
  <%= f.field_container :state do %>
@@ -1,7 +1,6 @@
1
1
  <% content_for :page_title do %>
2
2
  <%= page_header_back_button spree.admin_tenants_url %>
3
- <%= link_to Spree.t('tenants'), spree.admin_tenants_url %> /
4
- <%= @object.name %>
3
+ <%= link_to @object.name, spree.admin_tenants_url %>
5
4
  <% end %>
6
5
 
7
6
  <%= render partial: 'tabs', locals: { current: :edit } %>
@@ -40,13 +40,7 @@
40
40
  <tbody>
41
41
  <% @collection.each do |tenant| %>
42
42
  <tr id="<%= spree_dom_id tenant %>" data-hook="admin_tenants_index_rows">
43
- <td>
44
- <% if can?(:edit, tenant) %>
45
- <%= link_to tenant.name, edit_admin_tenant_path(tenant.slug) %>
46
- <% else %>
47
- <%= tenant.name %>
48
- <% end %>
49
- </td>
43
+ <td><%= tenant.name %></td>
50
44
  <td><%= tenant.slug %></td>
51
45
  <td><%= tenant.description %></td>
52
46
  <td><%= tenant.created_at %></td>
@@ -60,18 +60,4 @@
60
60
  <%= f.label :notification_email %>
61
61
  <%= f.email_field :notification_email, class: 'form-control' %>
62
62
  <% end %>
63
- <%= f.field_container :from_email do %>
64
- <%= f.label :from_email, Spree.t(:from_email)%>
65
- <%= f.email_field :from_email, class: 'form-control' %>
66
- <small class="form-text text-muted">
67
- This is the email which will be the sender of all your Store emails (Order Confirmation, Shipment notification etc)
68
- </small>
69
- <% end %>
70
- <%= f.field_container :support_email do %>
71
- <%= f.label :support_email, Spree.t(:support_email) %>
72
- <%= f.email_field :support_email, class: 'form-control' %>
73
- <small class="form-text text-muted">
74
- This email is visible to your Store visitors in the Footer section
75
- </small>
76
- <% end %>
77
63
  </div>
@@ -1,33 +1,22 @@
1
1
  <tr>
2
- <td class="email-body" width="570" cellpadding="0" cellspacing="0">
3
- <table class="email-body_inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
2
+ <td class="email-body" width="570" cellpadding="0" cellspacing="0">
3
+ <table class="email-body_inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
4
+ <!-- Body content -->
4
5
  <tbody>
5
- <tr>
6
- <td>
7
- <% if @order.tenant.nil? %>
8
- <div class="f-fallback">
9
- <%= render 'spree_cm_commissioner/order_mailer/greeting', order: @order %>
10
- <div class="content">
6
+ <tr>
7
+ <td>
8
+ <div class="f-fallback">
9
+ <%= render 'spree_cm_commissioner/order_mailer/greeting', order: @order %>
10
+ <div class="content">
11
11
  <%= render 'spree_cm_commissioner/order_mailer/order_total', order: @order %>
12
12
  <%= render 'spree_cm_commissioner/order_mailer/your_booking', order: @order, show_booking_header: true %>
13
13
  <%= render 'spree_cm_commissioner/order_mailer/customer_info', order: @order %>
14
- <%= render 'spree_cm_commissioner/order_mailer/support_contact' %>
15
- </div>
16
- </div>
17
- <% else %>
18
- <div class="f-fallback">
19
- <%= render 'spree_cm_commissioner/order_mailer/tenant/greeting', order: @order %>
20
- <div class="content">
21
- <%= render 'spree_cm_commissioner/order_mailer/order_total', order: @order %>
22
- <%= render 'spree_cm_commissioner/order_mailer/your_booking', order: @order, show_booking_header: true %>
23
- <%= render 'spree_cm_commissioner/order_mailer/tenant/customer_info', order: @order %>
24
- <%= render 'spree_cm_commissioner/order_mailer/tenant/support_contact' %>
25
- </div>
26
- </div>
27
- <% end %>
28
- </td>
29
- </tr>
14
+ <%= render 'spree_cm_commissioner/order_mailer/support_contact'%>
15
+ </div>
16
+ </div>
17
+ </td>
18
+ </tr>
30
19
  </tbody>
31
- </table>
32
- </td>
33
- </tr>
20
+ </table>
21
+ </td>
22
+ </tr>
@@ -23,11 +23,7 @@
23
23
  <table class="email-footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
24
24
  <tr>
25
25
  <td>
26
- <% if @order.tenant.nil? %>
27
- <%= render 'spree_cm_commissioner/order_mailer/footer', store: @order.store %>
28
- <% else %>
29
- <%= render 'spree_cm_commissioner/order_mailer/tenant/footer', store: @order.store %>
30
- <% end %>
26
+ <%= render 'spree_cm_commissioner/order_mailer/footer', store: @order.store%>
31
27
  </td>
32
28
  </tr>
33
29
  </table>
@@ -55,10 +55,10 @@
55
55
  border-radius: 1.5625rem 1.5625rem 0 0;
56
56
  background: #653ed7;
57
57
  background: url(<%= image_path("mailer/event-mailer-bg.png") %>) center center / cover,
58
- linear-gradient(45deg, #653ed7, rgba(0, 0, 255, 0) 70.71%),
59
- linear-gradient(225deg, #653ed7, rgba(0, 0, 255, 0) 70.71%),
60
- linear-gradient(330deg, #35ace0, rgba(0, 0, 255, 0) 70.71%),
61
- linear-gradient(150deg, #35ace0, rgba(0, 0, 255, 0) 70.71%);
58
+ linear-gradient(45deg, #653ed7, rgba(0, 0, 255, 0) 70.71%),
59
+ linear-gradient(225deg, #653ed7, rgba(0, 0, 255, 0) 70.71%),
60
+ linear-gradient(330deg, #35ace0, rgba(0, 0, 255, 0) 70.71%),
61
+ linear-gradient(150deg, #35ace0, rgba(0, 0, 255, 0) 70.71%);
62
62
  }
63
63
  #confirm-email #greeting-card p,
64
64
  #confirm-email #greeting-card .booking-confirmm,
@@ -66,24 +66,6 @@
66
66
  #confirm-email #greeting-card .description {
67
67
  color: #fff;
68
68
  }
69
-
70
- #confirm-email #greeting-card-1 {
71
- color: #fff;
72
- padding: 1.5rem;
73
- background-size: cover;
74
- background-position: center;
75
- background-repeat: no-repeat;
76
- border-radius: 1.5625rem 1.5625rem 0 0;
77
- background: #<%= @brand_color %>;
78
- }
79
- #confirm-email #greeting-card-1 p,
80
- #confirm-email #greeting-card-1 .header,
81
- #confirm-email #greeting-card-1 .booking-confirm,
82
- #confirm-email #greeting-card-1 .hello,
83
- #confirm-email #greeting-card-1 .description {
84
- color: #fff;
85
- }
86
-
87
69
  #confirm-email .align-right {
88
70
  vertical-align: top;
89
71
  }
@@ -92,15 +74,6 @@
92
74
  margin-top: 1.25rem;
93
75
  margin-bottom: 0.625rem;
94
76
  }
95
- #confirm-email .icon-hang-meas {
96
- width: 6.25rem;
97
- }
98
- #confirm-email .header {
99
- display: flex;
100
- align-items: center;
101
- justify-content: space-between;
102
- width: 100%;
103
- }
104
77
  #confirm-email #greeting-card .hello,
105
78
  .booking-confirm {
106
79
  font-size: 1.375rem;
@@ -110,15 +83,6 @@
110
83
  margin-bottom: 0.25rem;
111
84
  margin-top: 1.25rem;
112
85
  }
113
- #confirm-email #greeting-card-1 .booking-confirm {
114
- font-size: 1.375rem;
115
- font-style: normal;
116
- font-weight: 700;
117
- line-height: 1.75rem;
118
- margin-bottom: 0.25rem;
119
- margin-top: 1.25rem;
120
- color: #fff;
121
- }
122
86
  #confirm-email #greeting-card .booking-confirm {
123
87
  font-size: 1.5rem;
124
88
  padding: 0.625rem 0;
@@ -269,7 +233,6 @@
269
233
  }
270
234
  #confirm-email .notice-info .description {
271
235
  padding-left: 0.75rem;
272
- color: #939393;
273
236
  }
274
237
  #confirm-email .notice-info a {
275
238
  color: #6444D8;
@@ -0,0 +1 @@
1
+ PaperTrail.enabled = true
@@ -60,5 +60,10 @@ module Spree
60
60
  age
61
61
  gender
62
62
  ]
63
+
64
+ @@stock_movement_attributes += %i[
65
+ originator_type
66
+ originator_id
67
+ ]
63
68
  end
64
69
  end
@@ -54,11 +54,7 @@ en:
54
54
  guest_card_classes:
55
55
  empty_info: "No guest card classes information available."
56
56
  background_image: "Background Image"
57
- guest_dynamic_field:
58
- errors:
59
- pre_registration_required: "is required before ticket issuance"
60
- post_registration_required: "must be completed after purchase"
61
- during_check_in_required: "is required during check-in"
57
+
62
58
  google_wallet:
63
59
  note: "Click <b>Create</b> or <b> Update</b> to connect to Google Wallet after filled all information "
64
60
  google_wallet_class_created: "Google Wallet class created successfully."
data/config/routes.rb CHANGED
@@ -138,7 +138,21 @@ Spree::Core::Engine.add_routes do
138
138
  end
139
139
  end
140
140
 
141
- resources :stock_managements
141
+ resources :stock_managements do
142
+ collection do
143
+ get :calendar
144
+ end
145
+ end
146
+
147
+ resources :variants do
148
+ resources :inventory_items, only: %i[show create] do
149
+ member do
150
+ patch :reset
151
+ patch :update_prices
152
+ delete :delete_prices
153
+ end
154
+ end
155
+ end
142
156
 
143
157
  resources :product_completion_steps do
144
158
  collection do
@@ -531,6 +545,8 @@ Spree::Core::Engine.add_routes do
531
545
  end
532
546
 
533
547
  namespace :storefront do
548
+ resources :inventory_item
549
+
534
550
  resources :waiting_room_sessions, only: :create
535
551
  resources :vattanac_banks, only: %i[create]
536
552
  resource :cart, controller: :cart, only: %i[show create destroy] do
@@ -556,7 +572,10 @@ Spree::Core::Engine.add_routes do
556
572
  resource :cart_guests, only: %i[create destroy]
557
573
  resources :cart_payment_method_groups, only: %i[index]
558
574
 
559
- resources :accommodations, only: %i[index show]
575
+ resources :accommodations, only: %i[index show] do
576
+ resources :variants, only: %i[index show], module: :accommodations
577
+ end
578
+
560
579
  resources :line_items, only: %i[index show]
561
580
  resources :account_checker
562
581
  resource :account_recovers, only: [:update]
@@ -1,5 +1,7 @@
1
1
  class UpdateCounterCacheOfVehicleType < ActiveRecord::Migration[7.0]
2
- def up
2
+ def up
3
+ if defined?(SpreeCmCommissioner::VehicleSeat) && SpreeCmCommissioner::VehicleSeat.respond_to?(:counter_culture_fix_counts)
3
4
  SpreeCmCommissioner::VehicleSeat.counter_culture_fix_counts
4
5
  end
6
+ end
5
7
  end
@@ -0,0 +1,21 @@
1
+ class CreateCmInventoryItems < ActiveRecord::Migration[7.0]
2
+ def up
3
+ create_table :cm_inventory_items, if_not_exists: true do |t|
4
+ t.integer :variant_id
5
+ t.date :inventory_date
6
+ t.integer :max_capacity, default: 0, null: false
7
+ t.integer :quantity_available, default: 0, null: false
8
+ t.integer :product_type, default: 0, null: false
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :cm_inventory_items, :variant_id, if_not_exists: true
14
+ add_index :cm_inventory_items, :inventory_date, if_not_exists: true
15
+ add_index :cm_inventory_items, [:variant_id, :inventory_date], unique: true, if_not_exists: true
16
+ end
17
+
18
+ def down
19
+ drop_table :cm_inventory_items
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ class AddLockVersionToCmInventoryItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_inventory_items, :lock_version, :integer, default: 0, null: false, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIndexToSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_index :spree_products, :product_type unless index_exists?(:spree_products, :product_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddProductTypeToSpreeVariants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_variants, :product_type, :integer, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddProductTypeToSpreeLineItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_line_items, :product_type, :integer, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddInventoryItemToSpreePrices < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:spree_prices, :inventory_item_id)
4
+ add_reference :spree_prices, :inventory_item, foreign_key: { to_table: :cm_inventory_items }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmLineItemSeats < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_line_item_seats, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmVehicleSeats < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_vehicle_seats, if_exists: true
4
+ end
5
+ end