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
@@ -3,21 +3,17 @@
3
3
  <div class="col-6">
4
4
  <%= f.field_container :name do %>
5
5
  <%= f.label :name, raw(Spree.t(:name) + required_span_tag) %>
6
- <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus' %>
7
- <% if f.object.errors[:name].any? %>
8
- <div class="error text-danger"><%= f.object.errors[:name].join(', ') %></div>
9
- <% end %>
6
+ <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus'%>
7
+ <%= f.error_message_on :name %>
10
8
  <% end %>
11
9
  </div>
12
10
 
13
- <!-- Slug Field -->
11
+ <!-- Slug Field (only show if editing) -->
14
12
  <div class="col-6">
15
13
  <%= f.field_container :slug do %>
16
14
  <%= f.label :slug, raw(Spree.t(:slug)) %>
17
15
  <%= f.text_field :slug, class: 'form-control', placeholder: 'slug' %>
18
- <% if f.object.errors[:slug].any? %>
19
- <div class="error text-danger"><%= f.object.errors[:slug].join(', ') %></div>
20
- <% end %>
16
+ <%= f.error_message_on :slug %>
21
17
  <% end %>
22
18
  </div>
23
19
 
@@ -26,20 +22,16 @@
26
22
  <%= f.field_container :description do %>
27
23
  <%= f.label :description, raw(Spree.t(:description)) %>
28
24
  <%= f.text_area :description, class: 'form-control', placeholder: 'description' %>
29
- <% if f.object.errors[:description].any? %>
30
- <div class="error text-danger"><%= f.object.errors[:description].join(', ') %></div>
31
- <% end %>
25
+ <%= f.error_message_on :description %>
32
26
  <% end %>
33
27
  </div>
34
28
 
35
- <!-- Host Field -->
29
+ <!-- Host Field -->
36
30
  <div class="col-12">
37
31
  <%= f.field_container :host do %>
38
32
  <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
39
33
  <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
40
- <% if f.object.errors[:host].any? %>
41
- <div class="error text-danger"><%= f.object.errors[:host].join(', ') %></div>
42
- <% end %>
34
+ <%= f.error_message_on :host %>
43
35
  <% end %>
44
36
  </div>
45
37
 
@@ -47,26 +39,21 @@
47
39
  <div class="col-12">
48
40
  <%= f.field_container :preferred_assetlinks do %>
49
41
  <%= f.label :preferred_assetlinks, raw(Spree.t(:assetlinks)) %>
50
- <%= f.text_area :preferred_assetlinks, class: 'form-control', rows: 5,
51
- placeholder: <<~JSON.strip
52
- example:
53
- [
54
- {
55
- "relation": ["delegate_permission/common.handle_all_urls"],
56
- "target": {
57
- "namespace": "android_app",
58
- "package_name": "com.yourapp.app",
59
- "sha256_cert_fingerprints": [
60
- "SHA256_CERTIFICATE_FINGERPRINT_HERE"
61
- ]
62
- }
63
- }
64
- ]
65
- JSON
66
- %>
67
- <% if f.object.errors[:preferred_assetlinks].any? %>
68
- <div class="error text-danger"><%= f.object.errors[:preferred_assetlinks].join(', ') %></div>
69
- <% end %>
42
+ <%= f.text_area :preferred_assetlinks, class: 'form-control',
43
+ placeholder: 'example:
44
+ [
45
+ {
46
+ "relation": ["delegate_permission/common.handle_all_urls"],
47
+ "target": {
48
+ "namespace": "android_app",
49
+ "package_name": "com.yourapp.app",
50
+ "sha256_cert_fingerprints": [
51
+ "SHA256_CERTIFICATE_FINGERPRINT_HERE"
52
+ ]
53
+ }
54
+ }
55
+ ]', rows: 5 %>
56
+ <%= f.error_message_on :preferred_assetlinks %>
70
57
  <% end %>
71
58
  </div>
72
59
 
@@ -74,30 +61,25 @@
74
61
  <div class="col-12">
75
62
  <%= f.field_container :preferred_apple_app_site_association do %>
76
63
  <%= f.label :preferred_apple_app_site_association, raw(Spree.t(:apple_app_site_association)) %>
77
- <%= f.text_area :preferred_apple_app_site_association, class: 'form-control', rows: 5,
78
- placeholder: <<~JSON.strip
79
- example:
80
- {
81
- "webcredentials": {
82
- "apps": [
83
- "TEAM_ID.com.yourapp.app"
84
- ]
85
- },
86
- "applinks": {
87
- "apps": [],
88
- "details": [
89
- {
90
- "appID": "TEAM_ID.com.yourapp.app",
91
- "paths": ["*"]
92
- }
93
- ]
64
+ <%= f.text_area :preferred_apple_app_site_association, class: 'form-control',
65
+ placeholder: 'example:
66
+ {
67
+ "webcredentials": {
68
+ "apps": [
69
+ "TEAM_ID.com.yourapp.app"
70
+ ]
71
+ },
72
+ "applinks": {
73
+ "apps": [],
74
+ "details": [
75
+ {
76
+ "appID": "TEAM_ID.com.yourapp.app",
77
+ "paths": ["*"]
94
78
  }
95
- }
96
- JSON
97
- %>
98
- <% if f.object.errors[:preferred_apple_app_site_association].any? %>
99
- <div class="error text-danger"><%= f.object.errors[:preferred_apple_app_site_association].join(', ') %></div>
100
- <% end %>
79
+ ]
80
+ }
81
+ }', rows: 5 %>
82
+ <%= f.error_message_on :preferred_apple_app_site_association %>
101
83
  <% end %>
102
84
  </div>
103
85
 
@@ -105,57 +87,8 @@
105
87
  <div class="col-6">
106
88
  <%= f.field_container :state do %>
107
89
  <%= f.label :state, raw(Spree.t(:state)) %>
108
- <%= f.select :state,
109
- options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], f.object&.state),
110
- { required: true },
111
- class: 'select2 form-control' %>
112
- <% if f.object.errors[:state].any? %>
113
- <div class="error text-danger"><%= f.object.errors[:state].join(', ') %></div>
114
- <% end %>
90
+ <%= f.select :state, options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], @object.state), { required: true }, class: 'select2 form-control' %>
91
+ <%= f.error_message_on :state %>
115
92
  <% end %>
116
93
  </div>
117
94
  </div>
118
-
119
- <div data-hook="admin_tenant_form_fields" class="row">
120
- <div class="col-12">
121
- <div class="row gy-4">
122
- <% payment_icon_fields = [
123
- { field: :preferred_payment_checkout_image, label: Spree.t(:payment_checkout_image), target: 'checkout' },
124
- { field: :preferred_payment_failed_image, label: Spree.t(:payment_failed_image), target: 'failed' },
125
- { field: :preferred_payment_success_image, label: Spree.t(:payment_success_image), target: 'success' },
126
- { field: :preferred_payment_loader, label: Spree.t(:payment_loader), target: 'loader' }
127
- ] %>
128
-
129
- <% payment_icon_fields.each do |icon| %>
130
- <div class="col-md-3">
131
- <%= f.field_container icon[:field] do %>
132
- <div class="d-flex flex-column align-items-center text-center">
133
- <label class="form-label fw-bold mb-2" for="tenant_<%= icon[:field] %>">
134
- <%= icon[:label] %>
135
- </label>
136
-
137
- <div class="icon-preview-container mb-2" id="icon-preview-container-<%= icon[:field] %>">
138
- <span class="payment-icon-preview" id="icon-preview-<%= icon[:field] %>">
139
- <% if f.object.send(icon[:field]).present? %>
140
- <%= render_vector_icon(f.object.send(icon[:field])) %>
141
- <% else %>
142
- <span class="no-icon-placeholder"></span>
143
- <% end %>
144
- </span>
145
- <span class="remove-icon-btn <%= 'hidden' unless f.object.send(icon[:field]).present? %>" data-target="<%= icon[:field] %>">&times;</span>
146
- </div>
147
- </div>
148
-
149
- <%= f.collection_select icon[:field],
150
- @vector_icons, :path, :path,
151
- { include_blank: 'None' },
152
- { class: 'select2 form-control tenant-payment-icon-select mt-2', data: { target: icon[:target] } } %>
153
- <% if f.object.errors[icon[:field]].any? %>
154
- <div class="text-danger small mt-1"><%= f.object.errors[icon[:field]].join(', ') %></div>
155
- <% end %>
156
- <% end %>
157
- </div>
158
- <% end %>
159
- </div>
160
- </div>
161
- </div>
@@ -0,0 +1 @@
1
+ PaperTrail.enabled = true
@@ -31,8 +31,6 @@ module Spree
31
31
  subtitle
32
32
  preferred_background_color
33
33
  preferred_foreground_color
34
- preferred_group_check_in_enabled
35
- preferred_individual_check_in_enabled
36
34
  show_badge_status
37
35
  purchasable_on
38
36
  available_on
@@ -60,5 +58,10 @@ module Spree
60
58
  age
61
59
  gender
62
60
  ]
61
+
62
+ @@stock_movement_attributes += %i[
63
+ originator_type
64
+ originator_id
65
+ ]
63
66
  end
64
67
  end
@@ -459,10 +459,6 @@ en:
459
459
  businesses_cant_be_blank: "Businesses can't be blank"
460
460
  phone_number_cant_be_blank: "Phone number can't be blank"
461
461
  quantity_cant_be_less_than_or_equal_to_zero: "Quantity can't be less or equal than 0"
462
- spree_cm_commissioner/vendor_place:
463
- attributes:
464
- place_id:
465
- taken: "has already existed with this place type"
466
462
 
467
463
  mail:
468
464
  order_mailer:
@@ -547,7 +543,6 @@ en:
547
543
  update_user_login: "update user code"
548
544
  contact_update: "update contact code"
549
545
  otp_code: "OTP code"
550
- telegram_verification: "telegram code"
551
546
 
552
547
  notifications:
553
548
  spree_cm_commissioner:
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
@@ -529,6 +543,8 @@ Spree::Core::Engine.add_routes do
529
543
  end
530
544
 
531
545
  namespace :storefront do
546
+ resources :inventory_item
547
+
532
548
  resources :waiting_room_sessions, only: :create
533
549
  resources :vattanac_banks, only: %i[create]
534
550
  resource :cart, controller: :cart, only: %i[show create destroy] do
@@ -554,7 +570,10 @@ Spree::Core::Engine.add_routes do
554
570
  resource :cart_guests, only: %i[create destroy]
555
571
  resources :cart_payment_method_groups, only: %i[index]
556
572
 
557
- resources :accommodations, only: %i[index show]
573
+ resources :accommodations, only: %i[index show] do
574
+ resources :variants, only: %i[index show], module: :accommodations
575
+ end
576
+
558
577
  resources :line_items, only: %i[index show]
559
578
  resources :account_checker
560
579
  resource :account_recovers, only: [:update]
@@ -669,6 +688,5 @@ Rails.application.routes.draw do
669
688
  get 'o/:id', to: 'spree_cm_commissioner/orders#show', as: 'order'
670
689
  get 'li/:id', to: 'spree_cm_commissioner/line_item_qr_images#show', as: 'line_item_qr_image'
671
690
  get 'g/:id', to: 'spree_cm_commissioner/guest_cards#show', as: 'guest_cards'
672
- get '.well-known/assetlinks.json', to: 'spree_cm_commissioner/well_known#assetlinks_json'
673
- get '.well-known/apple-app-site-association', to: 'spree_cm_commissioner/well_known#apple_app_site_association'
691
+ get '.well-known/:id', to: 'spree_cm_commissioner/well_known#show', constraints: { id: /(assetlinks\.json|apple-app-site-association)/ }
674
692
  end
@@ -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
@@ -0,0 +1,9 @@
1
+ class DropTableCmVehicleTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_vehicles, :vehicle_type_id)
4
+ remove_reference :cm_vehicles, :vehicle_type, foreign_key: { to_table: :cm_vehicle_types }
5
+ end
6
+
7
+ drop_table :cm_vehicle_types, if_exists: true
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmOptionValueVehicleTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_option_value_vehicle_types, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveUnnecessaryFieldsFromCmPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ # It is for single table inheritance (branch, stop)
4
+ # Remove it as we no longer need.
5
+ remove_column :cm_places, :type if column_exists?(:cm_places, :type)
6
+ remove_column :cm_places, :vendor_id if column_exists?(:cm_places, :vendor_id)
7
+ remove_column :cm_places, :branch_id if column_exists?(:cm_places, :branch_id)
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveRouteTypeFromSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :spree_products, :route_type if column_exists?(:spree_products, :route_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveUnnecessaryFieldsFromSpreeTaxons < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :spree_taxons, :data_type if column_exists?(:spree_taxons, :data_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveVariantIdFromCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :cm_trips, :variant_id if column_exists?(:cm_trips, :variant_id)
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class UpdateCmTripConnectionsToUseCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_foreign_key :cm_trip_connections, column: :from_trip_id if foreign_key_exists?(:cm_trip_connections, column: :from_trip_id)
4
+ remove_foreign_key :cm_trip_connections, column: :to_trip_id if foreign_key_exists?(:cm_trip_connections, column: :to_trip_id)
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ class CreateCmSeatLayouts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_seat_layouts, if_not_exists: true do |t|
4
+ t.string :name
5
+ t.integer :total_seats
6
+ t.integer :total_sections
7
+ t.integer :status, default: 0
8
+
9
+ t.float :width
10
+ t.float :height
11
+
12
+ t.references :layoutable, polymorphic: true, index: true
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class CreateCmSeatSections < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_seat_sections, if_not_exists: true do |t|
4
+ t.string :name
5
+ t.references :seat_layout, foreign_key: { to_table: :cm_seat_layouts }, null: false
6
+ t.integer :total_seats
7
+
8
+ t.float :width
9
+ t.float :height
10
+ t.float :x
11
+ t.float :y
12
+ t.float :rotation
13
+ t.string :shape_path
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ class CreateCmBlocks < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_blocks, if_not_exists: true do |t|
4
+ t.string :label
5
+
6
+ t.references :seat_layout, foreign_key: { to_table: :cm_seat_layouts }, null: false
7
+ t.references :seat_section, foreign_key: { to_table: :cm_seat_sections }, null: true
8
+
9
+ t.float :width
10
+ t.float :height
11
+ t.float :x
12
+ t.float :y
13
+ t.float :rotation
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ class CreateCmReservedBlocks < ActiveRecord::Migration[7.0]
2
+ def up
3
+ create_table :cm_reserved_blocks, if_not_exists: true do |t|
4
+ t.references :updated_by, foreign_key: { to_table: :spree_users }, null: true
5
+ t.references :guest, foreign_key: { to_table: :cm_guests }, null: true
6
+ t.references :inventory_item, foreign_key: { to_table: :cm_inventory_items }, null: false
7
+ t.references :block, null: false, foreign_key: { to_table: :cm_blocks }
8
+
9
+ t.integer :status, null: false
10
+
11
+ t.datetime :inventory_date
12
+ t.datetime :expired_at
13
+
14
+ t.timestamps
15
+ end
16
+
17
+ unless index_exists?(:cm_reserved_blocks, [:block_id, :inventory_item_id], unique: true)
18
+ add_index :cm_reserved_blocks, [:block_id, :inventory_item_id], unique: true, name: 'index_reserved_blocks_on_block_and_inventory_item'
19
+ end
20
+ end
21
+
22
+ def down
23
+ if index_exists?(:cm_reserved_blocks, [:block_id, :inventory_item_id], name: 'index_reserved_blocks_on_block_and_inventory_item')
24
+ remove_index :cm_reserved_blocks, name: 'index_reserved_blocks_on_block_and_inventory_item'
25
+ end
26
+
27
+ drop_table :cm_reserved_blocks, if_exists: true
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+
2
+ class CreateCmVariantBlocks < ActiveRecord::Migration[7.0]
3
+ def up
4
+ create_table :cm_variant_blocks, if_not_exists: true do |t|
5
+ t.references :variant, null: false, foreign_key: { to_table: :spree_variants }
6
+ t.references :trip, null: false, foreign_key: { to_table: :cm_trips }
7
+ t.references :block, null: false, foreign_key: { to_table: :cm_blocks }
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ unless index_exists?(:cm_variant_blocks, [:variant_id, :trip_id, :block_id], unique: true, name: 'index_variant_blocks_on_variant_trip_block')
13
+ add_index :cm_variant_blocks, [:variant_id, :trip_id, :block_id], unique: true, name: 'index_variant_blocks_on_variant_trip_block'
14
+ end
15
+ end
16
+
17
+ def down
18
+ if index_exists?(:cm_variant_blocks, [:variant_id, :trip_id, :block_id], name: 'index_variant_blocks_on_variant_trip_block')
19
+ remove_index :cm_variant_blocks, name: 'index_variant_blocks_on_variant_trip_block'
20
+ end
21
+
22
+ drop_table :cm_variant_blocks, if_exists: true
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ class AddBlockIdToCmGuests < ActiveRecord::Migration[7.0]
2
+ def up
3
+ unless column_exists?(:cm_guests, :block_id)
4
+ add_reference :cm_guests, :block, foreign_key: { to_table: :cm_blocks }
5
+ end
6
+ end
7
+
8
+ def down
9
+ if column_exists?(:cm_guests, :block_id)
10
+ remove_column :cm_guests, :block_id
11
+ end
12
+ end
13
+ end
data/docker-compose.yml CHANGED
@@ -20,7 +20,7 @@ services:
20
20
 
21
21
  volumes:
22
22
  - .:/gem
23
- - /gem/vendor/bundle
23
+ - ./vendor/bundle:/gem/vendor/bundle
24
24
 
25
25
  # depends_on:
26
26
  # - db
data/lib/cm_app_logger.rb CHANGED
@@ -1,11 +1,18 @@
1
1
  # lib/cm_app_logger.rb
2
2
  module CmAppLogger
3
3
  def self.log(label:, data: nil)
4
- message = {
5
- label: label,
6
- data: data
7
- }
4
+ message = { label: label, data: data }
5
+ start_time = Time.current
6
+ Rails.logger.info(message.to_json)
7
+
8
+ return unless block_given?
9
+
10
+ # Capture the block’s return value and return it to preserve existing behavior for callers expecting that value.
11
+ block_result = yield
8
12
 
13
+ message[:start_time] = start_time
14
+ message[:duration_ms] = (Time.current - start_time) * 1000
9
15
  Rails.logger.info(message.to_json)
16
+ block_result
10
17
  end
11
18
  end
@@ -11,14 +11,9 @@ module SpreeCmCommissioner
11
11
  end
12
12
 
13
13
  def add_migrations
14
- gems = %i[
15
- spree_multi_vendor
16
- spree_cm_commissioner
17
- ]
18
-
19
- gems.each do |gem|
20
- run "bundle exec rake railties:install:migrations FROM=#{gem}"
21
- end
14
+ run 'bundle exec rake railties:install:migrations FROM=spree_multi_vendor'
15
+ run 'bundle exec rake railties:install:migrations FROM=spree_cm_commissioner'
16
+ run 'bundle exec rails generate paper_trail:install'
22
17
  end
23
18
 
24
19
  def run_migrations
@@ -40,9 +35,17 @@ module SpreeCmCommissioner
40
35
  after: %r{//= require spree/backend}, verbose: true
41
36
 
42
37
  # For NPM support
43
- template 'app/javascript/spree_cm_commissioner/utilities.js'
44
- inject_into_file 'app/javascript/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
45
- after: %r{import "@spree/dashboard"}, verbose: true
38
+ if File.exist?(File.join(destination_root, 'app/javascript/spree_dashboard'))
39
+ template 'app/javascript/spree_dashboard/spree_cm_commissioner/utilities.js'
40
+ inject_into_file 'app/javascript/spree_dashboard/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
41
+ after: %r{import "@spree/dashboard"}, verbose: true
42
+ else
43
+ Logger.new($stdout).debug <<~MSG
44
+ SpreeCmCommissioner: JavaScript files for the dashboard are missing.
45
+ Please move your JavaScript files to the appropriate location in
46
+ app/javascript/spree_dashboard.
47
+ MSG
48
+ end
46
49
  end
47
50
 
48
51
  def install_telegram_web_bot
@@ -6,3 +6,7 @@ const $ = jquery;
6
6
  document.addEventListener("spree:load", function () {
7
7
  $('[data-toggle="popover"]').popover();
8
8
  });
9
+
10
+ document.documentElement.addEventListener("turbo:frame-load", (event) => {
11
+ $('[data-toggle="popover"]').popover();
12
+ });