spree_cm_commissioner 1.21.0 → 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 (241) 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/event_blazer_queries_controller.rb +4 -11
  12. data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
  13. data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
  14. data/app/controllers/spree/admin/tenants_controller.rb +0 -8
  15. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
  16. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  17. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  18. data/app/controllers/spree/api/v2/storefront/dynamic_field_options_controller.rb +1 -5
  19. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +5 -31
  20. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  21. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +0 -2
  22. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  23. data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb +0 -11
  24. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +17 -31
  25. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +84 -37
  26. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  27. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  28. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  29. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  30. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +1 -0
  31. data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
  32. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  33. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  34. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  35. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  36. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  37. data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +3 -7
  38. data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +3 -11
  39. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +6 -12
  40. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +1 -7
  41. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +1 -5
  42. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  43. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  44. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  45. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  46. data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
  47. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  48. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  49. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  50. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +9 -15
  51. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -13
  52. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  53. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  54. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  55. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  56. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  57. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -4
  58. data/app/models/spree_cm_commissioner/block.rb +23 -0
  59. data/app/models/spree_cm_commissioner/dynamic_field.rb +3 -17
  60. data/app/models/spree_cm_commissioner/dynamic_field_option.rb +1 -7
  61. data/app/models/spree_cm_commissioner/guest.rb +19 -1
  62. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +3 -21
  63. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  64. data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
  65. data/app/models/spree_cm_commissioner/invite.rb +6 -4
  66. data/app/models/spree_cm_commissioner/invite_team.rb +1 -3
  67. data/app/models/spree_cm_commissioner/line_item_decorator.rb +46 -78
  68. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  69. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  70. data/app/models/spree_cm_commissioner/order_decorator.rb +30 -1
  71. data/app/models/spree_cm_commissioner/pin_code.rb +2 -3
  72. data/app/models/spree_cm_commissioner/place.rb +1 -3
  73. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  74. data/app/models/spree_cm_commissioner/product_decorator.rb +10 -4
  75. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  76. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  77. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  78. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  79. data/app/models/spree_cm_commissioner/reserved_block.rb +30 -0
  80. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  81. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  82. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  83. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  84. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  85. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  86. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  87. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  88. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  89. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  90. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  91. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  92. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  93. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  94. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  95. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  96. data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +8 -0
  97. data/app/models/spree_cm_commissioner/taxon_decorator.rb +2 -6
  98. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  99. data/app/models/spree_cm_commissioner/trip.rb +12 -10
  100. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  101. data/app/models/spree_cm_commissioner/trip_stop.rb +2 -3
  102. data/app/models/spree_cm_commissioner/user_identity_provider.rb +4 -26
  103. data/app/models/spree_cm_commissioner/user_taxon.rb +0 -1
  104. data/app/models/spree_cm_commissioner/variant_block.rb +9 -0
  105. data/app/models/spree_cm_commissioner/variant_decorator.rb +36 -47
  106. data/app/models/spree_cm_commissioner/variant_options.rb +0 -23
  107. data/app/models/spree_cm_commissioner/vehicle.rb +9 -14
  108. data/app/models/spree_cm_commissioner/vendor_decorator.rb +7 -10
  109. data/app/models/spree_cm_commissioner/vendor_place.rb +6 -5
  110. data/app/models/spree_cm_commissioner/vendor_stop.rb +1 -2
  111. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
  112. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +3 -45
  113. data/app/queries/spree_cm_commissioner/trip_query.rb +23 -26
  114. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  115. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  116. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  117. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  118. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +1 -0
  119. data/app/serializers/spree/v2/tenant/user_serializer.rb +0 -1
  120. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +1 -4
  121. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +3 -1
  122. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +3 -1
  123. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +1 -2
  124. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +15 -23
  125. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
  126. data/app/views/blazer/queries/_content.html.erb +0 -8
  127. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  128. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  129. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  130. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  131. data/app/views/spree/admin/tenants/_form.html.erb +42 -109
  132. data/config/initializers/paper_trail.rb +1 -0
  133. data/config/initializers/spree_permitted_attributes.rb +5 -2
  134. data/config/locales/en.yml +0 -5
  135. data/config/routes.rb +22 -6
  136. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  137. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  138. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  139. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  140. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  141. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  142. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  143. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  144. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  145. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  146. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  147. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  148. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  149. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  150. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  151. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  152. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  153. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  154. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  155. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  156. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  157. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  158. data/docker-compose.yml +1 -1
  159. data/lib/cm_app_logger.rb +11 -4
  160. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  161. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  162. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  163. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  164. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +9 -0
  165. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  166. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  167. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  168. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  169. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  170. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  171. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  172. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  173. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +8 -0
  174. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +8 -0
  175. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  176. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  177. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +10 -3
  178. data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
  179. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  180. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  181. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  182. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  183. data/lib/spree_cm_commissioner/version.rb +1 -1
  184. data/lib/spree_cm_commissioner.rb +35 -1
  185. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  186. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  187. data/lib/tasks/generate_inventory_items.rake +7 -0
  188. data/spree_cm_commissioner.gemspec +7 -0
  189. metadata +135 -57
  190. data/app/assets/images/cm-hangmeas-checkout_image.svg +0 -63
  191. data/app/assets/images/cm-hangmeas-failed.svg +0 -56
  192. data/app/assets/images/cm-hangmeas-loader.svg +0 -50
  193. data/app/assets/images/cm-hangmeas-success.svg +0 -51
  194. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +0 -65
  195. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +0 -60
  196. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  197. data/app/controllers/spree/admin/trip_blazer_queries_controller.rb +0 -35
  198. data/app/controllers/spree/api/v2/organizer/invite_crews_controller.rb +0 -33
  199. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  200. data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +0 -27
  201. data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +0 -27
  202. data/app/interactors/spree_cm_commissioner/crew_invite_link_handler.rb +0 -48
  203. data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +0 -144
  204. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +0 -30
  205. data/app/models/spree_cm_commissioner/blazer_queryable.rb +0 -8
  206. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  207. data/app/models/spree_cm_commissioner/crew_invite_link.rb +0 -4
  208. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  209. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  210. data/app/models/spree_cm_commissioner/pin_code_telegram.rb +0 -28
  211. data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +0 -11
  212. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  213. data/app/models/spree_cm_commissioner/telegram_chat.rb +0 -6
  214. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  215. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  216. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +0 -18
  217. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  218. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  219. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  220. data/app/serializers/spree/v2/organizer/invite_crews_serializer.rb +0 -11
  221. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  222. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +0 -5
  223. data/db/migrate/20250630103536_create_cm_telegram_chats.rb +0 -13
  224. data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +0 -6
  225. data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +0 -5
  226. data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +0 -5
  227. data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +0 -7
  228. data/db/migrate/20250711092937_add_position_to_cm_dynamic_fields.rb +0 -11
  229. data/db/migrate/20250711093045_add_position_to_cm_dynamic_field_options.rb +0 -11
  230. data/db/migrate/20250714121508_rename_cm_taxon_blazer_query_to_blazer_queryables.rb +0 -7
  231. data/db/migrate/20250714124323_make_cm_blazer_queryables_polymorphic.rb +0 -19
  232. data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +0 -13
  233. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  234. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  235. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  236. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  237. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  238. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  239. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  240. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  241. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -1,12 +1,11 @@
1
1
  module SpreeCmCommissioner
2
2
  module Organizer
3
3
  class ExportGuestCsvService
4
- attr_reader :event_id, :columns, :filters
4
+ attr_reader :event_id, :columns
5
5
 
6
- def initialize(event_id, columns, filters = {})
6
+ def initialize(event_id, columns)
7
7
  @event_id = event_id
8
8
  @columns = columns
9
- @filters = filters
10
9
  end
11
10
 
12
11
  def call
@@ -19,7 +18,7 @@ module SpreeCmCommissioner
19
18
  private
20
19
 
21
20
  def headers
22
- columns.map { |col| col.titleize(keep_id_suffix: true) }.uniq
21
+ columns.map(&:humanize).uniq
23
22
  end
24
23
 
25
24
  def build_row(guest)
@@ -29,8 +28,10 @@ module SpreeCmCommissioner
29
28
  def fetch_value(guest, column)
30
29
  if guest_field?(column)
31
30
  fetch_guest_value(guest, column)
32
- else
31
+ elsif option_type_field?(column)
33
32
  fetch_option_value(guest, column)
33
+ else
34
+ ''
34
35
  end
35
36
  end
36
37
 
@@ -38,21 +39,19 @@ module SpreeCmCommissioner
38
39
  SpreeCmCommissioner::KycBitwise::ORDERED_BIT_FIELDS.include?(column.to_sym)
39
40
  end
40
41
 
42
+ def option_type_field?(column)
43
+ Spree::OptionType.exists?(name: column)
44
+ end
45
+
41
46
  def fetch_guest_value(guest, column)
42
47
  column_mappings(guest)[column] || ''
43
48
  end
44
49
 
45
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
46
- def fetch_option_value(guest, column_name)
47
- return guest.formatted_bib_number if column_name == 'bib-prefix'
48
- return guest.line_item&.number if column_name == 'item_id'
49
- return guest.line_item&.order&.number if column_name == 'order_id'
50
- return guest.created_at if column_name == 'created_at'
51
- return guest.updated_at if column_name == 'updated_at'
50
+ def fetch_option_value(guest, option_type_name)
51
+ return guest.formatted_bib_number if option_type_name == 'bib-prefix'
52
52
 
53
- guest.line_item&.variant&.find_option_value_name_for(option_type_name: column_name) || ''
53
+ guest.line_item&.variant&.find_option_value_name_for(option_type_name: option_type_name)
54
54
  end
55
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
56
55
 
57
56
  def column_mappings(guest)
58
57
  {
@@ -78,19 +77,12 @@ module SpreeCmCommissioner
78
77
  end
79
78
 
80
79
  def guests_with_associations
81
- scope = event.guests.includes(
80
+ event.guests.includes(
82
81
  :occupation,
83
82
  :nationality,
84
83
  :id_card,
85
84
  line_item: { variant: { option_values: :option_type } }
86
- ).complete
87
- scope = scope.where('cm_guests.created_at >= ?', formatted_date_time(filters[:from_date])) if filters[:from_date].present?
88
- scope = scope.where('cm_guests.created_at <= ?', formatted_date_time(filters[:to_date])) if filters[:to_date].present?
89
- scope
90
- end
91
-
92
- def formatted_date_time(date)
93
- Time.zone.parse(date.to_s).strftime('%Y-%m-%d %H:%M:%S %z')
85
+ )
94
86
  end
95
87
 
96
88
  def event
@@ -32,7 +32,7 @@ module SpreeCmCommissioner
32
32
  options = { login: params[:username], password: params[:password], tenant_id: tenant_id }
33
33
  SpreeCmCommissioner::UserPasswordAuthenticator.call(options)
34
34
  when 'social_auth'
35
- options = { id_token: params[:id_token], tenant_id: tenant_id }
35
+ options = { id_token: params[:id_token] }
36
36
  SpreeCmCommissioner::UserIdTokenAuthenticator.call(options)
37
37
  when 'telegram_web_app_auth'
38
38
  options = { telegram_init_data: params[:telegram_init_data], telegram_bot_username: params[:tg_bot] }
@@ -47,14 +47,6 @@
47
47
  class: "btn btn-primary",
48
48
  style: "margin-left: 10px;" %>
49
49
  </div>
50
- <% elsif !@error && @success && params[:trip_id].present? %>
51
- <div>
52
- <%= link_to 'Save Trip',
53
- spree.admin_trip_blazer_queries_path(trip_id: params[:trip_id], blazer_query_id: @query.id),
54
- method: :post,
55
- class: "btn btn-primary",
56
- style: "margin-left: 10px;" %>
57
- </div>
58
50
  <% end %>
59
51
  </div>
60
52
 
@@ -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? %>
@@ -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: