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

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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +3 -0
  3. data/.github/workflows/test_and_build_gem.yml +2 -16
  4. data/.gitignore +1 -2
  5. data/Gemfile.lock +1 -32
  6. data/Rakefile +4 -33
  7. data/app/assets/images/cm-hangmeas-checkout_image.svg +63 -0
  8. data/app/assets/images/cm-hangmeas-failed.svg +56 -0
  9. data/app/assets/images/cm-hangmeas-loader.svg +50 -0
  10. data/app/assets/images/cm-hangmeas-success.svg +51 -0
  11. data/app/assets/images/mailer/mail.png +0 -0
  12. data/app/assets/images/mailer/tenant_phone.png +0 -0
  13. data/app/assets/images/mailer/tenant_user.png +0 -0
  14. data/app/assets/javascripts/spree_cm_commissioner/backend.js +1 -0
  15. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +65 -0
  16. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +11 -8
  17. data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +1 -0
  18. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +60 -0
  19. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +2 -1
  20. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +44 -0
  21. data/app/controllers/spree/admin/event_blazer_queries_controller.rb +11 -4
  22. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -63
  23. data/app/controllers/spree/admin/tenants_controller.rb +8 -0
  24. data/app/controllers/spree/admin/trip_blazer_queries_controller.rb +35 -0
  25. data/app/controllers/spree/api/v2/operator/pie_chart_events_controller.rb +46 -0
  26. data/app/controllers/spree/api/v2/organizer/invite_crews_controller.rb +33 -0
  27. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
  28. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  29. data/app/controllers/spree/api/v2/storefront/dynamic_field_options_controller.rb +5 -1
  30. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +30 -4
  31. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  32. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +2 -0
  33. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  34. data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb +11 -0
  35. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +31 -17
  36. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +24 -81
  37. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +20 -0
  38. data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +27 -0
  39. data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +27 -0
  40. data/app/interactors/spree_cm_commissioner/create_ticket.rb +6 -5
  41. data/app/interactors/spree_cm_commissioner/create_vendor.rb +44 -0
  42. data/app/interactors/spree_cm_commissioner/crew_invite_link_handler.rb +48 -0
  43. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +0 -1
  44. data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
  45. data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +144 -0
  46. data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +7 -3
  47. data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +11 -3
  48. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +12 -6
  49. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +7 -1
  50. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
  51. data/app/jobs/spree_cm_commissioner/application_job.rb +0 -20
  52. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +0 -20
  53. data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
  54. data/app/mailers/spree/order_mailer_decorator.rb +18 -3
  55. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
  56. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +33 -9
  57. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +13 -1
  58. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -39
  59. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +3 -1
  60. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  61. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  62. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +5 -0
  63. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +4 -2
  64. data/app/models/spree_cm_commissioner/blazer_queryable.rb +8 -0
  65. data/app/models/spree_cm_commissioner/branch.rb +12 -0
  66. data/app/models/spree_cm_commissioner/chart_type.rb +10 -0
  67. data/app/models/spree_cm_commissioner/crew_invite_link.rb +4 -0
  68. data/app/models/spree_cm_commissioner/dynamic_field.rb +37 -3
  69. data/app/models/spree_cm_commissioner/dynamic_field_option.rb +7 -1
  70. data/app/models/spree_cm_commissioner/guest.rb +57 -19
  71. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +61 -3
  72. data/app/models/spree_cm_commissioner/invite.rb +4 -6
  73. data/app/models/spree_cm_commissioner/invite_team.rb +3 -1
  74. data/app/models/spree_cm_commissioner/line_item_decorator.rb +78 -46
  75. data/app/models/spree_cm_commissioner/line_item_seat.rb +10 -0
  76. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  77. data/app/models/spree_cm_commissioner/option_type_decorator.rb +11 -1
  78. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +8 -0
  79. data/app/models/spree_cm_commissioner/order_decorator.rb +1 -30
  80. data/app/models/spree_cm_commissioner/pin_code.rb +3 -2
  81. data/app/models/spree_cm_commissioner/pin_code_telegram.rb +28 -0
  82. data/app/models/spree_cm_commissioner/place.rb +3 -1
  83. data/app/models/spree_cm_commissioner/product_decorator.rb +26 -10
  84. data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +11 -0
  85. data/app/models/spree_cm_commissioner/service_calendar.rb +2 -0
  86. data/app/models/spree_cm_commissioner/state_decorator.rb +1 -0
  87. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -26
  88. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  89. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  90. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -17
  91. data/app/models/spree_cm_commissioner/stop.rb +23 -0
  92. data/app/models/spree_cm_commissioner/taxon_decorator.rb +6 -2
  93. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +6 -0
  94. data/app/models/spree_cm_commissioner/telegram_chat.rb +6 -0
  95. data/app/models/spree_cm_commissioner/trip.rb +10 -12
  96. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  97. data/app/models/spree_cm_commissioner/trip_stop.rb +3 -2
  98. data/app/models/spree_cm_commissioner/user_decorator.rb +6 -0
  99. data/app/models/spree_cm_commissioner/user_identity_provider.rb +26 -4
  100. data/app/models/spree_cm_commissioner/user_taxon.rb +1 -0
  101. data/app/models/spree_cm_commissioner/variant_decorator.rb +47 -36
  102. data/app/models/spree_cm_commissioner/variant_options.rb +23 -0
  103. data/app/models/spree_cm_commissioner/vehicle.rb +14 -9
  104. data/app/models/spree_cm_commissioner/vehicle_seat.rb +11 -0
  105. data/app/models/spree_cm_commissioner/vehicle_type.rb +76 -0
  106. data/app/models/spree_cm_commissioner/vendor_decorator.rb +13 -7
  107. data/app/models/spree_cm_commissioner/vendor_place.rb +5 -6
  108. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  109. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
  110. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
  111. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
  112. data/app/queries/spree_cm_commissioner/pie_chart_event_queries.rb +179 -0
  113. data/app/queries/spree_cm_commissioner/trip_query.rb +26 -23
  114. data/app/queries/spree_cm_commissioner/trip_search_query.rb +76 -0
  115. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  116. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  117. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  118. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  119. data/app/serializables/spree_cm_commissioner/pie_chart_event.rb +11 -0
  120. data/app/serializers/spree/v2/organizer/invite_crews_serializer.rb +11 -0
  121. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  122. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +0 -1
  123. data/app/serializers/spree/v2/tenant/user_serializer.rb +1 -0
  124. data/app/serializers/spree_cm_commissioner/v2/operator/chart_type_serializer.rb +10 -0
  125. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
  126. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
  127. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
  128. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
  129. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +23 -15
  130. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
  131. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +11 -0
  132. data/app/views/blazer/queries/_content.html.erb +8 -0
  133. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +2 -7
  134. data/app/views/spree/admin/stock_managements/index.html.erb +6 -55
  135. data/app/views/spree/admin/tenant_vendors/index.html.erb +9 -2
  136. data/app/views/spree/admin/tenants/_form.html.erb +118 -42
  137. data/app/views/spree/admin/tenants/edit.html.erb +2 -1
  138. data/app/views/spree/admin/tenants/index.html.erb +7 -1
  139. data/app/views/spree/admin/vendors/_form.html.erb +14 -0
  140. data/app/views/spree/order_mailer/confirm_email.html.erb +27 -16
  141. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +5 -1
  142. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +41 -4
  143. data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +42 -0
  144. data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +25 -0
  145. data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +19 -0
  146. data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +33 -0
  147. data/config/initializers/spree_permitted_attributes.rb +2 -5
  148. data/config/locales/en.yml +10 -1
  149. data/config/routes.rb +7 -22
  150. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +1 -3
  151. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
  152. data/db/migrate/20250630103536_create_cm_telegram_chats.rb +13 -0
  153. data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
  154. data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
  155. data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
  156. data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +7 -0
  157. data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +6 -0
  158. data/db/migrate/20250711092937_add_position_to_cm_dynamic_fields.rb +11 -0
  159. data/db/migrate/20250711093045_add_position_to_cm_dynamic_field_options.rb +11 -0
  160. data/db/migrate/20250714121508_rename_cm_taxon_blazer_query_to_blazer_queryables.rb +7 -0
  161. data/db/migrate/20250714124323_make_cm_blazer_queryables_polymorphic.rb +19 -0
  162. data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +13 -0
  163. data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +5 -0
  164. data/docker-compose.yml +1 -1
  165. data/lib/cm_app_logger.rb +4 -11
  166. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -14
  167. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  168. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  169. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +12 -0
  170. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +8 -0
  171. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +8 -0
  172. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +0 -10
  173. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  174. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  175. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +7 -0
  176. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +30 -6
  177. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +36 -0
  178. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +34 -18
  179. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  180. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +14 -0
  181. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +8 -0
  182. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -10
  183. data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
  184. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +19 -41
  185. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  186. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +8 -0
  187. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +96 -0
  188. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  189. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +11 -0
  190. data/lib/spree_cm_commissioner/version.rb +1 -1
  191. data/lib/spree_cm_commissioner.rb +1 -35
  192. data/spree_cm_commissioner.gemspec +0 -7
  193. metadata +70 -133
  194. data/app/controllers/spree/admin/inventory_items_controller.rb +0 -83
  195. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  196. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -37
  197. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -32
  198. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
  199. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  200. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +0 -44
  201. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
  202. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
  203. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
  204. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -32
  205. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
  206. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  207. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
  208. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
  209. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  210. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +0 -44
  211. data/app/models/spree_cm_commissioner/block.rb +0 -23
  212. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  213. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -69
  214. data/app/models/spree_cm_commissioner/price_decorator.rb +0 -9
  215. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -41
  216. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
  217. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
  218. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -25
  219. data/app/models/spree_cm_commissioner/reserved_block.rb +0 -30
  220. data/app/models/spree_cm_commissioner/seat_layout.rb +0 -20
  221. data/app/models/spree_cm_commissioner/seat_section.rb +0 -16
  222. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +0 -30
  223. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +0 -53
  224. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +0 -49
  225. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +0 -4
  226. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +0 -4
  227. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +0 -4
  228. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +0 -4
  229. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  230. data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +0 -8
  231. data/app/models/spree_cm_commissioner/variant_block.rb +0 -9
  232. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  233. data/app/views/spree/admin/inventory_items/show.html.erb +0 -72
  234. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -56
  235. data/config/initializers/paper_trail.rb +0 -1
  236. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  237. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  238. data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
  239. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
  240. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
  241. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +0 -7
  242. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +0 -5
  243. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +0 -5
  244. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +0 -9
  245. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +0 -5
  246. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +0 -9
  247. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +0 -5
  248. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +0 -5
  249. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +0 -5
  250. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +0 -6
  251. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +0 -17
  252. data/db/migrate/20250620090002_create_cm_seat_sections.rb +0 -18
  253. data/db/migrate/20250620090003_create_cm_blocks.rb +0 -18
  254. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +0 -29
  255. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +0 -24
  256. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +0 -13
  257. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  258. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +0 -9
  259. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  260. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +0 -27
  261. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +0 -8
  262. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +0 -8
  263. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
  264. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +0 -7
  265. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  266. data/lib/tasks/ensure_correct_product_type.rake +0 -7
  267. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  class SmsPinCodeJob < SpreeCmCommissioner::SmsJob
3
- # options = { from: xxx, to: xxxx, body: xxxx }
3
+ # options = { to: xxxx, body: xxxx }
4
4
  def perform(options)
5
5
  SpreeCmCommissioner::Sms.call(options)
6
6
  end
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  module OrderMailerDecorator
3
- # overrided
4
3
  def cancel_email(order, resend: false)
5
4
  @order = order.respond_to?(:id) ? order : Spree::Order.find(order)
6
5
  return false if @order.email.blank?
@@ -12,18 +11,34 @@ module Spree
12
11
  @order = order.respond_to?(:id) ? order : Spree::Order.find(order)
13
12
  return false if @order.email.blank?
14
13
 
14
+ @tenant = @order.tenant
15
+ if @tenant.present?
16
+ @brand_color = @tenant.preferences[:brand_primary_color]
17
+ @vendor_logo_url = @tenant.active_vendor&.logo&.original_url
18
+ end
19
+
15
20
  @current_store = @order.store
16
21
  @product_type = @order.products.first&.product_type || 'accommodation'
17
22
 
18
- subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
23
+ subject = resend ? "[#{Spree.t(:resend).upcase}] " : ''
19
24
  subject += "#{@current_store&.name} Booking Confirmation ##{@order.number}"
20
25
 
21
- mail(to: @order.email, from: from_address, subject: subject, store_url: @current_store.url) do |format|
26
+ mail(to: @order.email, from: from_email_address, subject: subject, store_url: @current_store.url) do |format|
22
27
  format.html { render layout: 'spree_cm_commissioner/layouts/order_mailer' }
23
28
  format.text
24
29
  end
25
30
  end
26
31
 
32
+ private
33
+
34
+ def from_email_address
35
+ if @order.tenant.nil?
36
+ from_address
37
+ else
38
+ @order.tenant.active_vendor&.from_email
39
+ end
40
+ end
41
+
27
42
  def ticket_email(guest, email)
28
43
  @guest = guest
29
44
  @event = @guest.event
@@ -0,0 +1,30 @@
1
+ module SpreeCmCommissioner
2
+ module EventCheckInFlowable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ preference :group_check_in_enabled, :boolean, default: true
7
+ preference :individual_check_in_enabled, :boolean, default: true
8
+
9
+ before_validation :validate_at_least_one_check_in_flow_presence
10
+ end
11
+
12
+ def check_in_flows
13
+ flows = []
14
+ flows << 'group' if group_check_in_enabled?
15
+ flows << 'individual' if individual_check_in_enabled?
16
+ flows
17
+ end
18
+
19
+ def group_check_in_enabled? = preferred_group_check_in_enabled
20
+ def individual_check_in_enabled? = preferred_individual_check_in_enabled
21
+
22
+ private
23
+
24
+ def validate_at_least_one_check_in_flow_presence
25
+ return if check_in_flows.any?
26
+
27
+ errors.add(:check_in_flows, 'must have at least one flow selected')
28
+ end
29
+ end
30
+ end
@@ -18,23 +18,29 @@ module SpreeCmCommissioner
18
18
  def date_unit
19
19
  return nil unless permanent_stock?
20
20
 
21
- date_range.size
21
+ date_range_excluding_checkout.size if accommodation?
22
22
  end
23
23
 
24
- def date_range
24
+ def date_range_excluding_checkout
25
25
  return [] unless date_present?
26
26
 
27
- (from_date.to_date..to_date.to_date).to_a
27
+ date_range = (from_date.to_date..to_date.to_date).to_a
28
+ date_range.pop if date_range.size > 1
29
+ date_range
28
30
  end
29
31
 
30
- def checkin_date
31
- from_date&.to_date
32
- end
32
+ def date_range_including_checkout
33
+ return [] unless date_present?
33
34
 
34
- def checkout_date
35
- return to_date ? to_date.to_date - 1.day : nil if accommodation?
35
+ (from_date.to_date..to_date.to_date).to_a
36
+ end
36
37
 
37
- to_date&.to_date
38
+ def date_range
39
+ if accommodation?
40
+ date_range_excluding_checkout
41
+ else
42
+ date_range_including_checkout
43
+ end
38
44
  end
39
45
 
40
46
  private
@@ -49,6 +55,24 @@ module SpreeCmCommissioner
49
55
  def set_duration
50
56
  self.from_date ||= variant.start_date_time || event&.from_date
51
57
  self.to_date ||= variant.end_date_time || event&.to_date
58
+
59
+ return if persisted?
60
+
61
+ apply_variant_time(:from_date, variant.start_date_time)
62
+ apply_variant_time(:to_date, variant.end_date_time)
63
+ end
64
+
65
+ def apply_variant_time(field, variant_time)
66
+ field_value = send(field)
67
+
68
+ return unless field_value.present? && field_value.hour.zero? && variant_time.present?
69
+
70
+ send("#{field}=", field_value.change(
71
+ hour: variant_time.hour,
72
+ min: variant_time.min,
73
+ sec: variant_time.sec
74
+ )
75
+ )
52
76
  end
53
77
  end
54
78
  end
@@ -14,6 +14,13 @@ module SpreeCmCommissioner
14
14
  state_selection
15
15
  payment_option
16
16
  delivery_option
17
+ amenity
18
+ departure_time
19
+ duration
20
+ vehicle_id
21
+ origin
22
+ destination
23
+ place_id
17
24
  ].freeze
18
25
 
19
26
  RESERVED_OPTIONS = {
@@ -40,7 +47,12 @@ module SpreeCmCommissioner
40
47
  'bib-zerofill' => 'integer',
41
48
  'bib-display-prefix' => 'boolean',
42
49
  'bib-pre-generation-on-create' => 'boolean',
43
- 'seat-number-positions' => 'array'
50
+ 'seat-number-positions' => 'array',
51
+ 'origin' => 'place_id',
52
+ 'destination' => 'place_id',
53
+ 'departure-time' => 'time',
54
+ 'vehicle' => 'vehicle_id',
55
+ 'allow-seat-selection' => 'boolean'
44
56
  }.freeze
45
57
 
46
58
  included do
@@ -5,8 +5,6 @@ module SpreeCmCommissioner
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- state_machine.before_transition to: :payment, do: :hold_blocks!
9
-
10
8
  state_machine.before_transition to: :complete, do: :request, if: :need_confirmation?
11
9
  state_machine.before_transition to: :complete, do: :generate_bib_number
12
10
 
@@ -16,14 +14,10 @@ module SpreeCmCommissioner
16
14
  state_machine.after_transition to: :complete, do: :send_order_complete_telegram_alert_to_vendors, unless: :need_confirmation?
17
15
  state_machine.after_transition to: :complete, do: :send_order_complete_telegram_alert_to_store, unless: :need_confirmation?
18
16
 
19
- state_machine.around_transition to: :complete, do: :unstock_inventory!
20
-
21
17
  state_machine.after_transition to: :complete, do: :send_transaction_email_to_user, if: :user_has_email?
22
18
  state_machine.after_transition to: :resumed, do: :precalculate_conversion
23
- state_machine.around_transition to: :resumed, do: :unstock_inventory!
24
19
 
25
20
  state_machine.after_transition to: :canceled, do: :precalculate_conversion
26
- state_machine.after_transition to: :canceled, do: :restock_inventory!
27
21
 
28
22
  scope :accepted, -> { where(request_state: 'accepted') }
29
23
 
@@ -73,39 +67,6 @@ module SpreeCmCommissioner
73
67
  end
74
68
  end
75
69
 
76
- def unstock_inventory!
77
- ActiveRecord::Base.transaction do
78
- yield # Equal to block.call
79
-
80
- # After the transition is complete, the following code will execute first before proceeding to other `after_transition` callbacks.
81
- # This ensures that if `reserve_blocks!` or `unstock_inventory_in_redis!` fails, the state will be rolled back,
82
- # and neither the `finalize!` method nor any notifications will be triggered.
83
- # The payment will be reversed in vPago gem, and `Spree::Checkout::Complete` will be called, which checks `order.reload.complete?`.
84
- # This is critical because if the order state is complete, the payment will be marked as paid.
85
-
86
- reserve_blocks!
87
- unstock_inventory_in_redis!
88
-
89
- # We rollback only order state, and we keep payment state as it is.
90
- # We implement payment in vPago gem, and it will be reversed in the gem.
91
- # Some bank has api for refund, but some don't have the api to refund yet. So we keep the payment state as it is and refund manually.
92
- end
93
- rescue StandardError => e
94
- CmAppLogger.log(
95
- label: 'SpreeCmCommissioner::OrderStateMachine#reserve_inventory failed',
96
- data: { order_id: id, error: e.message, type: e.class.name, backtrace: e.backtrace&.first(5)&.join("\n") }
97
- )
98
-
99
- raise e
100
- end
101
-
102
- def restock_inventory!
103
- ActiveRecord::Base.transaction do
104
- cancel_blocks!
105
- restock_inventory_in_redis!
106
- end
107
- end
108
-
109
70
  def generate_bib_number
110
71
  line_items.find_each(&:generate_remaining_guests)
111
72
 
@@ -3,10 +3,12 @@ module SpreeCmCommissioner
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- delegate :subscribable?,
6
+ delegate :product_type,
7
+ :subscribable?,
7
8
  :allowed_upload_later?,
8
9
  :need_confirmation?, :need_confirmation,
9
10
  :allow_anonymous_booking,
11
+ :accommodation?, :service?, :ecommerce?,
10
12
  :allow_self_check_in,
11
13
  :allow_self_check_in?,
12
14
  :required_self_check_in_location,
@@ -6,20 +6,10 @@ module SpreeCmCommissioner
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  PRODUCT_TYPES = %i[accommodation service ecommerce transit].freeze
9
- PERMANENT_STOCK_PRODUCT_TYPES = %w[accommodation service transit].freeze
10
- PRE_INVENTORY_DAYS = { 'transit' => 90, 'accommodation' => 365, 'service' => 30 }.freeze
11
9
 
12
10
  included do
13
11
  enum product_type: PRODUCT_TYPES if table_exists? && column_names.include?('product_type')
14
12
  enum primary_product_type: PRODUCT_TYPES if table_exists? && column_names.include?('primary_product_type')
15
13
  end
16
-
17
- def permanent_stock?
18
- PERMANENT_STOCK_PRODUCT_TYPES.include?(product_type)
19
- end
20
-
21
- def pre_inventory_days
22
- PRE_INVENTORY_DAYS[product_type]
23
- end
24
14
  end
25
15
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5 }
6
+ enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5, transit: 6 }
7
7
  end
8
8
  end
9
9
  end
@@ -5,6 +5,11 @@ module SpreeCmCommissioner
5
5
  included do
6
6
  preference :assetlinks, :string, default: ''
7
7
  preference :apple_app_site_association, :string, default: ''
8
+ preference :payment_checkout_image, :string, default: ''
9
+ preference :payment_failed_image, :string, default: ''
10
+ preference :payment_success_image, :string, default: ''
11
+ preference :payment_loader, :string, default: ''
12
+ preference :brand_primary_color, :string, default: ''
8
13
  end
9
14
  end
10
15
  end
@@ -53,8 +53,9 @@ module SpreeCmCommissioner
53
53
  # No need to fallback to event start date to avoid n+1.
54
54
  # To get end_time duration of event, include event when needed instead.
55
55
  def start_date_time
56
- return nil if start_date.blank?
56
+ return nil if start_date.blank? && start_time.blank?
57
57
  return start_date if start_time.blank?
58
+ return start_time if start_date.blank?
58
59
 
59
60
  start_date.change(hour: start_time.hour, min: start_time.min, sec: start_time.sec)
60
61
  end
@@ -62,8 +63,9 @@ module SpreeCmCommissioner
62
63
  # No need to fallback to event end date to avoid n+1.
63
64
  # To get end_time duration of event, include event when needed instead.
64
65
  def end_date_time
65
- return nil if end_date.blank?
66
+ return nil if end_date.blank? && end_time.blank?
66
67
  return end_date if end_time.blank?
68
+ return end_time if end_date.blank?
67
69
 
68
70
  end_date.change(hour: end_time.hour, min: end_time.min, sec: end_time.sec)
69
71
  end
@@ -0,0 +1,8 @@
1
+ module SpreeCmCommissioner
2
+ class BlazerQueryable < SpreeCmCommissioner::Base
3
+ belongs_to :queryable, polymorphic: true
4
+ belongs_to :blazer_query, class_name: 'Blazer::Query'
5
+
6
+ validates :queryable_id, uniqueness: { scope: %i[queryable_type blazer_query_id], message: I18n.t('event_blazer_queries.fail') }
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require_dependency 'spree_cm_commissioner'
2
+
3
+ module SpreeCmCommissioner
4
+ class Branch < SpreeCmCommissioner::Place
5
+ belongs_to :state, class_name: 'Spree::State', optional: true
6
+ belongs_to :vendor, class_name: 'Spree::Vendor'
7
+
8
+ def validate_reference?
9
+ false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module SpreeCmCommissioner
2
+ class ChartType
3
+ attr_reader :chart_type, :name
4
+
5
+ def initialize(chart_type)
6
+ @chart_type = chart_type.to_s
7
+ @name = @chart_type.humanize
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module SpreeCmCommissioner
2
+ class CrewInviteLink < Invite
3
+ end
4
+ end
@@ -1,20 +1,54 @@
1
1
  module SpreeCmCommissioner
2
2
  class DynamicField < SpreeCmCommissioner::Base
3
+ acts_as_list column: :position, scope: :vendor_id
4
+
3
5
  belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
4
6
 
5
7
  has_many :dynamic_field_options, class_name: 'SpreeCmCommissioner::DynamicFieldOption', dependent: :destroy
6
8
  has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :destroy
7
9
  has_many :product_dynamic_fields, class_name: 'SpreeCmCommissioner::ProductDynamicField', dependent: :destroy
8
10
 
9
- enum data_type: { string: 0, integer: 1, boolean: 2, checkbox: 3, radio: 4 }
11
+ enum data_type: { text: 0, number: 1, boolean: 2, checkbox: 3, radio: 4, selection: 5, textarea: 6 }
12
+ enum data_fill_stage: { pre_registration: 0, post_registration: 1, during_check_in: 2 }
10
13
 
11
14
  accepts_nested_attributes_for :dynamic_field_options, allow_destroy: true, reject_if: :all_blank
12
15
 
13
16
  validates :label, presence: true
14
17
  validates :data_type, presence: true
18
+ validates :configurations, presence: true, allow_blank: false
19
+ validate :validate_data_fill_stage_phase
20
+
21
+ def requires_dynamic_field_options?
22
+ checkbox? || radio? || selection?
23
+ end
24
+
25
+ def multiple_select
26
+ return nil unless selection?
27
+
28
+ configurations['multiple_select'] == true
29
+ end
30
+
31
+ def multiple_select=(value)
32
+ self.configurations ||= {}
33
+ self.configurations['multiple_select'] = ActiveModel::Type::Boolean.new.cast(value)
34
+ end
35
+
36
+ def required_at_stage?(stage)
37
+ data_fill_stage == stage.to_s
38
+ end
39
+
40
+ def display_label
41
+ label + " (#{data_fill_stage.humanize})"
42
+ end
43
+
44
+ private
45
+
46
+ def validate_data_fill_stage_phase
47
+ return if data_fill_stage.blank?
48
+
49
+ return if data_fill_stage.in?(self.class.data_fill_stages.keys)
15
50
 
16
- def selection?
17
- checkbox? || radio?
51
+ errors.add(:data_fill_stage, "must be one of: #{self.class.data_fill_stages.keys.join(', ')}")
18
52
  end
19
53
  end
20
54
  end
@@ -1,8 +1,14 @@
1
1
  module SpreeCmCommissioner
2
2
  class DynamicFieldOption < SpreeCmCommissioner::Base
3
+ acts_as_list column: :position, scope: :dynamic_field_id
4
+
3
5
  belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
6
+ has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :restrict_with_error
7
+
8
+ enum status: { active: 0, draft: 1, archived: 2 }
4
9
 
5
10
  validates :value, presence: true, uniqueness: { scope: :dynamic_field_id }
11
+ validates :status, presence: true
6
12
  validate :parent_field_must_be_selection_type
7
13
 
8
14
  private
@@ -10,7 +16,7 @@ module SpreeCmCommissioner
10
16
  def parent_field_must_be_selection_type
11
17
  return unless dynamic_field
12
18
 
13
- return if dynamic_field.selection?
19
+ return if dynamic_field.requires_dynamic_field_options?
14
20
 
15
21
  errors.add(:dynamic_field, 'must be a selection type field')
16
22
  end
@@ -24,16 +24,10 @@ module SpreeCmCommissioner
24
24
  scope :none_bib, -> { where(bib_prefix: [nil, '']) }
25
25
 
26
26
  belongs_to :line_item, class_name: 'Spree::LineItem'
27
-
28
27
  has_one :variant, class_name: 'Spree::Variant', through: :line_item
29
-
30
28
  belongs_to :user, class_name: 'Spree::User'
31
29
  belongs_to :occupation, class_name: 'Spree::Taxon'
32
30
  belongs_to :nationality, class_name: 'Spree::Taxon'
33
- belongs_to :block, class_name: 'SpreeCmCommissioner::Block', optional: true
34
-
35
- has_one :reserved_block, class_name: 'SpreeCmCommissioner::ReservedBlock'
36
-
37
31
  scope :checked_ins, -> { joins(:check_in) }
38
32
  scope :no_show, -> { left_outer_joins(:check_in).where(cm_check_ins: { id: nil }) }
39
33
 
@@ -54,14 +48,10 @@ module SpreeCmCommissioner
54
48
 
55
49
  before_create :generate_bib, if: -> { line_item.reload && variant.bib_pre_generation_on_create? }
56
50
 
57
- after_create :preload_order_block_ids, if: -> { block_id.present? }
58
- after_update :preload_order_block_ids, if: :saved_change_to_block_id?
59
- after_destroy :preload_order_block_ids
60
-
61
51
  validates :seat_number, uniqueness: { scope: :event_id }, allow_nil: true, if: -> { event_id.present? }
62
52
  validates :bib_index, uniqueness: true, allow_nil: true
63
53
 
64
- self.whitelisted_ransackable_associations = %w[id_card event]
54
+ self.whitelisted_ransackable_associations = %w[id_card event line_item]
65
55
  self.whitelisted_ransackable_attributes = %w[first_name last_name phone_number gender contact occupation_id card_type created_at check_in_status]
66
56
 
67
57
  def self.csv_importable_columns
@@ -223,6 +213,62 @@ module SpreeCmCommissioner
223
213
  save!
224
214
  end
225
215
 
216
+ def missing_dynamic_fields_for_stage(stage)
217
+ required_fields = line_item.product.dynamic_fields.where(data_fill_stage: stage)
218
+ filled_ids = guest_dynamic_fields.map(&:dynamic_field_id)
219
+
220
+ required_fields.reject { |field| filled_ids.include?(field.id) }
221
+ end
222
+
223
+ def all_required_dynamic_fields_completed?(stage)
224
+ missing_dynamic_fields_for_stage(stage).blank?
225
+ end
226
+
227
+ def validate_dynamic_fields_for_phase(phase)
228
+ required_fields = line_item.product.dynamic_fields.where(data_fill_stage: phase)
229
+ filled_ids = guest_dynamic_fields.map(&:dynamic_field_id)
230
+
231
+ required_fields.each do |field|
232
+ errors.add(:base, "#{field.label} is required for #{phase} phase") unless filled_ids.include?(field.id)
233
+ end
234
+ end
235
+
236
+ def pre_registration_completed?
237
+ return true unless line_item.product.dynamic_fields.pre_registration.any?
238
+
239
+ pre_registration_fields_completed?
240
+ end
241
+
242
+ def post_registration_completed?
243
+ return true unless line_item.product.dynamic_fields.post_registration.any?
244
+
245
+ post_registration_fields_completed?
246
+ end
247
+
248
+ def check_in_completed?
249
+ return true unless line_item.product.dynamic_fields.during_check_in.any?
250
+
251
+ check_in_fields_completed?
252
+ end
253
+
254
+ def current_collection_phase
255
+ if check_in.present?
256
+ :during_check_in
257
+ elsif line_item.order.completed?
258
+ :post_registration
259
+ else
260
+ :pre_registration
261
+ end
262
+ end
263
+
264
+ def phase_completion_status
265
+ {
266
+ pre_registration: pre_registration_completed?,
267
+ post_registration: post_registration_completed?,
268
+ during_check_in: check_in_completed?
269
+ }
270
+ end
271
+
226
272
  # bib_number: 345, bib_prefix: 5KM, bib_zerofill: 5 => return 5KM00345
227
273
  # bib_number: 345, bib_prefix: 5KM, bib_zerofill: 2 => return 5KM345
228
274
  def formatted_bib_number
@@ -237,14 +283,6 @@ module SpreeCmCommissioner
237
283
  filled_bib_number
238
284
  end
239
285
  end
240
-
241
- def preload_order_block_ids
242
- return if line_item.blank?
243
- return if line_item.order.blank?
244
-
245
- block_ids = line_item.order.blocks.pluck(:id)
246
- line_item.order.update(preload_block_ids: block_ids)
247
- end
248
286
  end
249
287
  end
250
288
  # rubocop:enable Metrics/ClassLength
@@ -2,9 +2,12 @@ module SpreeCmCommissioner
2
2
  class GuestDynamicField < SpreeCmCommissioner::Base
3
3
  belongs_to :guest, class_name: 'SpreeCmCommissioner::Guest', optional: false
4
4
  belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
5
+ belongs_to :dynamic_field_option, class_name: 'SpreeCmCommissioner::DynamicFieldOption', optional: true
5
6
 
6
7
  validates :value, presence: true
7
8
  validate :validate_value_format, if: -> { value.present? && dynamic_field.present? }
9
+ validate :validate_option_reference, if: -> { dynamic_field_option.present? }
10
+ validate :check_required_fields_based_on_phase
8
11
 
9
12
  private
10
13
 
@@ -12,14 +15,69 @@ module SpreeCmCommissioner
12
15
  return if dynamic_field.blank?
13
16
 
14
17
  case dynamic_field.data_type.to_s
15
- when 'integer'
18
+ when 'number'
16
19
  errors.add(:value, 'must be a number') unless value.to_s.match?(/\A\d+\z/)
17
20
  when 'boolean'
18
- errors.add(:value, 'must be true or false') unless %w[true false 1 0].include?(value.to_s.downcase)
19
- when 'checkbox', 'radio'
21
+ errors.add(:value, 'must be true or false') unless %w[true false].include?(value.to_s.downcase)
22
+ when 'checkbox', 'radio', 'selection'
23
+ validate_option_value
24
+ end
25
+ end
26
+
27
+ def validate_option_value
28
+ if dynamic_field_option.present?
29
+ self.value ||= dynamic_field_option.value
30
+ else
20
31
  valid_options = dynamic_field.dynamic_field_options.pluck(:id).map(&:to_s)
21
32
  errors.add(:value, 'is not a valid option') unless valid_options.include?(value)
22
33
  end
23
34
  end
35
+
36
+ def validate_option_reference
37
+ return if dynamic_field.blank? || dynamic_field_option.blank?
38
+ return if dynamic_field_option.dynamic_field_id == dynamic_field_id
39
+
40
+ errors.add(:dynamic_field_option, 'must belong to the same dynamic field')
41
+ end
42
+
43
+ def before_checkin_phase?
44
+ guest.present? && guest.line_item.present? && guest.check_in.nil?
45
+ end
46
+
47
+ def after_purchase_phase?
48
+ guest.present? && guest.line_item.present? && guest.line_item.completed? && guest.check_in.nil?
49
+ end
50
+
51
+ def during_checkin_phase?
52
+ guest.present? && guest.check_in.present?
53
+ end
54
+
55
+ def pre_registration_required?
56
+ dynamic_field.data_fill_stage.to_sym == :pre_registration &&
57
+ guest.line_item.order.completed? && guest.check_in.blank?
58
+ end
59
+
60
+ def post_registration_required?
61
+ dynamic_field.data_fill_stage.to_sym == :post_registration &&
62
+ guest.line_item.order.completed? && guest.check_in.blank?
63
+ end
64
+
65
+ def during_check_in_required?
66
+ dynamic_field.data_fill_stage.to_sym == :during_check_in &&
67
+ guest.check_in.present?
68
+ end
69
+
70
+ def check_required_fields_based_on_phase
71
+ return if dynamic_field.blank? || value.present?
72
+
73
+ case dynamic_field.data_fill_stage.to_sym
74
+ when :pre_registration
75
+ errors.add(:value, I18n.t('guest_dynamic_field.errors.pre_registration_required')) if pre_registration_required?
76
+ when :post_registration
77
+ errors.add(:value, I18n.t('guest_dynamic_field.errors.post_registration_required')) if post_registration_required?
78
+ when :during_check_in
79
+ errors.add(:value, I18n.t('guest_dynamic_field.errors.during_check_in_required')) if during_check_in_required?
80
+ end
81
+ end
24
82
  end
25
83
  end
@@ -5,16 +5,14 @@ module SpreeCmCommissioner
5
5
  has_many :invite_user_events, class_name: 'SpreeCmCommissioner::InviteUserEvent', dependent: :destroy
6
6
  scope :active, -> { where('expires_at > ?', Time.current) }
7
7
 
8
- after_create :set_expiration
9
-
10
- def set_expiration
11
- update(expires_at: 3.days.from_now)
12
- end
13
-
14
8
  def invite_url
15
9
  "#{Spree::Store.default.formatted_url}/invite/#{token}?utm_source=email"
16
10
  end
17
11
 
12
+ def invite_crew_link
13
+ "#{Spree::Store.default.formatted_url}/invite_crews/#{token}"
14
+ end
15
+
18
16
  def url_valid?
19
17
  expires_at.present? && expires_at > Time.current
20
18
  end