spree_cm_commissioner 1.11.0.pre.pre4 → 1.13.0

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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +143 -12
  3. data/.gitignore +1 -2
  4. data/Gemfile.lock +1 -22
  5. data/Rakefile +4 -33
  6. data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
  7. data/app/controllers/spree/admin/product_places_controller.rb +2 -0
  8. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -62
  9. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +70 -0
  10. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  11. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  12. data/app/controllers/spree/api/v2/storefront/waiting_room_sessions_controller.rb +1 -0
  13. data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
  14. data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
  15. data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
  16. data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
  17. data/app/controllers/spree/api/v2/tenant/waiting_room_sessions_controller.rb +30 -0
  18. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +17 -0
  19. data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
  20. data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
  21. data/app/interactors/spree_cm_commissioner/create_event.rb +7 -26
  22. data/app/interactors/spree_cm_commissioner/create_ticket.rb +95 -0
  23. data/app/interactors/spree_cm_commissioner/event_line_items_date_syncer.rb +19 -0
  24. data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
  25. data/app/interactors/spree_cm_commissioner/order_importer/multi_guest.rb +31 -0
  26. data/app/interactors/spree_cm_commissioner/organizers_transactional_email_notifier.rb +27 -0
  27. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
  28. data/app/interactors/spree_cm_commissioner/product_event_id_to_children_syncer.rb +15 -0
  29. data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
  30. data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
  31. data/app/interactors/spree_cm_commissioner/transactional_email_sender.rb +50 -0
  32. data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
  33. data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
  34. data/app/interactors/spree_cm_commissioner/waiting_room_session_creator.rb +7 -14
  35. data/app/interactors/spree_cm_commissioner/waiting_room_session_firebase_logger.rb +30 -0
  36. data/app/jobs/spree_cm_commissioner/ensure_event_for_product_line_item_guests_job.rb +13 -0
  37. data/app/jobs/spree_cm_commissioner/event_line_items_date_syncer_job.rb +8 -0
  38. data/app/jobs/spree_cm_commissioner/product_event_id_to_children_syncer_job.rb +8 -0
  39. data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
  40. data/app/jobs/spree_cm_commissioner/waiting_room_session_firebase_logger_job.rb +13 -0
  41. data/app/mailers/spree_cm_commissioner/event_transactional_mailer.rb +23 -0
  42. data/app/mailers/spree_cm_commissioner/pin_code_mailer.rb +1 -0
  43. data/app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb +2 -0
  44. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +10 -6
  45. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +13 -26
  46. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +4 -3
  47. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  48. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
  49. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +8 -10
  50. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
  51. data/app/models/spree_cm_commissioner/event_ticket_google_wallet.rb +2 -2
  52. data/app/models/spree_cm_commissioner/guest.rb +1 -1
  53. data/app/models/spree_cm_commissioner/invite_guest.rb +23 -0
  54. data/app/models/spree_cm_commissioner/line_item_decorator.rb +10 -16
  55. data/app/models/spree_cm_commissioner/option_type_decorator.rb +6 -0
  56. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
  57. data/app/models/spree_cm_commissioner/place.rb +1 -1
  58. data/app/models/spree_cm_commissioner/product_decorator.rb +17 -14
  59. data/app/models/spree_cm_commissioner/product_place.rb +1 -0
  60. data/app/models/spree_cm_commissioner/role_decorator.rb +3 -0
  61. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
  62. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  63. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  64. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -14
  65. data/app/models/spree_cm_commissioner/taxon_decorator.rb +26 -3
  66. data/app/models/spree_cm_commissioner/transactional_email.rb +6 -0
  67. data/app/models/spree_cm_commissioner/user_decorator.rb +6 -0
  68. data/app/models/spree_cm_commissioner/variant_decorator.rb +27 -34
  69. data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
  70. data/app/models/spree_cm_commissioner/vendor_decorator.rb +9 -1
  71. data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +9 -0
  72. data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
  73. data/app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface +2 -2
  74. data/app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface +3 -1
  75. data/app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface +3 -1
  76. data/app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface +3 -1
  77. data/app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface +3 -1
  78. data/app/overrides/spree/admin/taxons/_form/purchasable_on_status.html.erb.deface +3 -1
  79. data/app/overrides/spree/admin/taxons/_form/show_badge_status.html.erb.deface +3 -1
  80. data/app/overrides/spree/admin/taxons/_form/to_date_form_date.html.erb.deface +3 -4
  81. data/app/overrides/spree/admin/users/_form/roles_fields.html.erb.deface +1 -1
  82. data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
  83. data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
  84. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +40 -0
  85. data/app/overrides/spree/admin/variants/edit/variant_status.html.erb.deface +6 -3
  86. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  87. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  88. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  89. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  90. data/app/serializers/spree/v2/organizer/invite_guest_serializer.rb +13 -0
  91. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  92. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +2 -0
  93. data/app/serializers/spree/v2/tenant/waiting_room_session_serializer.rb +9 -0
  94. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +2 -1
  95. data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
  96. data/app/services/spree_cm_commissioner/user_roles_assigner.rb +62 -0
  97. data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
  98. data/app/views/spree/admin/shared/_taxon_tabs.html.erb +19 -19
  99. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +1 -3
  100. data/app/views/spree/admin/stock_managements/index.html.erb +5 -40
  101. data/app/views/spree/shared/_base_mailer_header.html.erb +10 -2
  102. data/app/views/spree_cm_commissioner/event_transactional_mailer/_event_banner.html.erb +3 -0
  103. data/app/views/spree_cm_commissioner/event_transactional_mailer/_mailer_stylesheets.html.erb +317 -0
  104. data/app/views/spree_cm_commissioner/event_transactional_mailer/_note.html.erb +8 -0
  105. data/app/views/spree_cm_commissioner/event_transactional_mailer/_share_button.html.erb +3 -0
  106. data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_organizer.html.erb +59 -0
  107. data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_participant.html.erb +52 -0
  108. data/app/views/spree_cm_commissioner/layouts/event_transactional_mailer.html.erb +14 -0
  109. data/config/initializers/spree_permitted_attributes.rb +0 -5
  110. data/config/locales/en.yml +36 -0
  111. data/config/locales/km.yml +2 -0
  112. data/config/routes.rb +6 -11
  113. data/db/migrate/20250422014417_create_spree_cm_commissioner_invite_guest.rb +21 -0
  114. data/db/migrate/20250509033437_create_spree_cm_commissioner_transactional_emails.rb +12 -0
  115. data/db/migrate/20250509075429_add_max_order_quantity_to_spree_product.rb +5 -0
  116. data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
  117. data/db/migrate/20250520042602_add_event_to_spree_products.rb +7 -0
  118. data/db/migrate/20250520044533_add_event_to_spree_line_items.rb +7 -0
  119. data/db/migrate/20250521024345_add_tenant_id_to_cm_waiting_room_sessions.rb +6 -0
  120. data/db/migrate/20250521095539_add_kyc_to_spree_variants.rb +5 -0
  121. data/docker-compose.yml +1 -1
  122. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +3 -11
  123. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  124. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  125. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  126. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  127. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +5 -18
  128. data/lib/spree_cm_commissioner/test_helper/factories/role.rb +7 -0
  129. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  130. data/lib/spree_cm_commissioner/test_helper/factories/taxon_home_banner_factory.rb +5 -0
  131. data/lib/spree_cm_commissioner/test_helper/factories/transactional_email_factory.rb +6 -0
  132. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -41
  133. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  134. data/lib/spree_cm_commissioner/version.rb +1 -1
  135. data/lib/spree_cm_commissioner.rb +0 -34
  136. data/lib/tasks/ensure_event_for_product_line_item_guests.rake +7 -0
  137. data/lib/tasks/update_invalid_self_root_places.rake +9 -0
  138. data/lib/tasks/update_orphan_root_places.rake +1 -0
  139. data/spree_cm_commissioner.gemspec +0 -5
  140. metadata +54 -82
  141. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  142. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
  143. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
  144. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
  145. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  146. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
  147. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
  148. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
  149. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -24
  150. data/app/interactors/spree_cm_commissioner/user_roles_assigner.rb +0 -22
  151. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
  152. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  153. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
  154. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
  155. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  156. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  157. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -56
  158. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
  159. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
  160. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
  161. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
  162. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  163. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  164. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -23
  165. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -35
  166. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  167. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  168. data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
  169. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
  170. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
  171. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  172. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  173. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  174. data/lib/tasks/ensure_correct_product_type.rake +0 -7
  175. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -0,0 +1,59 @@
1
+ <table role="presentation" align="center">
2
+ <tr>
3
+ <td class="container">
4
+ <div class="header">
5
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/event_banner' %>
6
+ <h1><%= t('mail.event_engagement_mailer.organizer.header_title') %></h1>
7
+ <h2><%= t('mail.event_engagement_mailer.organizer.header_subtitle', event_name: @event.name) %></h2>
8
+ </div>
9
+
10
+ <div class="intro">
11
+ <p><%= t('mail.event_engagement_mailer.organizer.hello', event_name: @event.name).html_safe %></p>
12
+ <p><%= t('mail.event_engagement_mailer.organizer.intro') %></p>
13
+ </div>
14
+
15
+ <div class="impact-section">
16
+ <h3><%= t('mail.event_engagement_mailer.organizer.impact_title') %></h3>
17
+ <ul class="impact-list">
18
+ <li>
19
+ <span>📸</span>
20
+ <div><%= t('mail.event_engagement_mailer.organizer.impact_post_highlights').html_safe %></div>
21
+ </li>
22
+ <li>
23
+ <span>💬</span>
24
+ <div><%= t('mail.event_engagement_mailer.organizer.impact_engage_posts').html_safe %></div>
25
+ </li>
26
+ <li>
27
+ <span>⚡</span>
28
+ <div><%= t('mail.event_engagement_mailer.organizer.impact_sneak_peek').html_safe %></div>
29
+ </li>
30
+ <li>
31
+ <span>📹</span>
32
+ <div><%= t('mail.event_engagement_mailer.organizer.impact_go_live').html_safe %></div>
33
+ </li>
34
+ <li>
35
+ <span>📣</span>
36
+ <div>
37
+ <%= t('mail.event_engagement_mailer.organizer.impact_hashtag', hashtag: @event.name.gsub(/\s+/, "").gsub(/[^0-9a-z]/i, '')).html_safe %>
38
+ </div>
39
+ </li>
40
+ </ul>
41
+ </div>
42
+
43
+ <div class="closing">
44
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/share_button' %>
45
+ <p><%= t('mail.event_engagement_mailer.organizer.closing_visibility') %></p>
46
+ <p><%= t('mail.event_engagement_mailer.organizer.closing_call_to_action', event_name: @event.name) %></p>
47
+ </div>
48
+
49
+ <div class="signature">
50
+ <p><%= t('mail.event_engagement_mailer.organizer.signature_best') %></p>
51
+ <p><%= t('mail.event_engagement_mailer.organizer.signature_team', event_name: @event.name) %></p>
52
+ </div>
53
+ </td>
54
+ </tr>
55
+ <tr>
56
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/note' %>
57
+ </tr>
58
+ </table>
59
+
@@ -0,0 +1,52 @@
1
+ <table role="presentation" align="center">
2
+ <tr>
3
+ <td class="container">
4
+ <div class="header">
5
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/event_banner' %>
6
+ <h1><%= t('mail.event_engagement_mailer.participant.header_title') %></h1>
7
+ <h2><%= t('mail.event_engagement_mailer.participant.header_subtitle', event_name: @event.name) %></h2>
8
+ </div>
9
+
10
+ <div class="intro">
11
+ <p><%= t('mail.event_engagement_mailer.participant.hello', event_name: @event.name).html_safe %></p>
12
+ <p><%= t('mail.event_engagement_mailer.participant.intro', event_name: @event.name) %></p>
13
+ </div>
14
+
15
+ <div class="impact-section">
16
+ <h3><%= t('mail.event_engagement_mailer.participant.impact_title') %></h3>
17
+ <ul class="impact-list">
18
+ <li>
19
+ <span>📸</span>
20
+ <div><%= t('mail.event_engagement_mailer.participant.impact_share_experience', hashtag: @event.name.gsub(/\s+/, "").gsub(/[^0-9a-z]/i, '')).html_safe %></div>
21
+ </li>
22
+ <li>
23
+ <span>🌍</span>
24
+ <div><%= t('mail.event_engagement_mailer.participant.impact_create_awareness').html_safe %></div>
25
+ </li>
26
+ <li>
27
+ <span>🏷️</span>
28
+ <div><%= t('mail.event_engagement_mailer.participant.impact_tag_us').html_safe %></div>
29
+ </li>
30
+ <li>
31
+ <span>👥</span>
32
+ <div><%= t('mail.event_engagement_mailer.participant.impact_invite_others').html_safe %></div>
33
+ </li>
34
+ </ul>
35
+ </div>
36
+
37
+ <div class="closing">
38
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/share_button' %>
39
+ <p><%= t('mail.event_engagement_mailer.participant.closing') %></p>
40
+ <p><%= t('mail.event_engagement_mailer.participant.closing_thank_you') %></p>
41
+ </div>
42
+
43
+ <div class="signature">
44
+ <p><%= t('mail.event_engagement_mailer.participant.signature_regards') %></p>
45
+ <p> <%= @participant.full_name || @participant.email %> </p>
46
+ </div>
47
+ </td>
48
+ </tr>
49
+ <tr>
50
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/note' %>
51
+ </tr>
52
+ </table>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
5
+ <meta name="x-apple-disable-message-reformatting"/>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
7
+ <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
9
+ <%= render partial: 'spree_cm_commissioner/event_transactional_mailer/mailer_stylesheets' %>
10
+ </head>
11
+ <body>
12
+ <%= yield %>
13
+ </body>
14
+ </html>
@@ -55,10 +55,5 @@ module Spree
55
55
  age
56
56
  gender
57
57
  ]
58
-
59
- @@stock_movement_attributes += %i[
60
- originator_type
61
- originator_id
62
- ]
63
58
  end
64
59
  end
@@ -482,6 +482,39 @@ en:
482
482
  booking_details: "Booking Details"
483
483
  crew_invite_mailer:
484
484
  subject: "You're Invited to Join the Check-In Crew for %{event_name}!"
485
+ event_engagement_mailer:
486
+ organizer:
487
+ subject: "Let's Lead the Way for %{event_name}!"
488
+ header_title: "Let's Lead the Way! 🚀✨"
489
+ header_subtitle: "Engaging Our Community for %{event_name}"
490
+ hello: "Hello <strong>%{event_name}</strong> Team"
491
+ intro: "Our event is here, and we have an incredible opportunity to create buzz, inspire engagement, and build meaningful connections! By being actively present and sharing updates, highlights, and memorable moments, we can keep the momentum going and engage both current participants and future ones."
492
+ impact_title: "Here's How We Can Make an Impact:"
493
+ impact_post_highlights: "<strong>Post Daily Highlights</strong> – Share standout moments, quotes, and insights to keep participants excited and to show others what they’re missing."
494
+ impact_engage_posts: "<strong>Engage with Participants’ Posts</strong> – Like, share, and comment on posts by our participants! Responding to their experiences will make them feel valued and connected!"
495
+ impact_sneak_peek: "<strong>Create Sneak-Peek and Behind-the-Scenes Content</strong> – Showcase what goes into making this event happen, from setup to speaker interviews, to add a human touch and build excitement."
496
+ impact_go_live: "<strong>Go Live!</strong> – Host a quick live session or story on our social media to share the energy in real time. It could be an event walkthrough, an inspiring session, or even interviews with attendees or speakers."
497
+ impact_hashtag: "<strong>Use #%{hashtag}</strong> – Keep everything connected with our event’s hashtag, and tag any relevant profiles or partners to expand reach."
498
+ share_now: "Share Now"
499
+ closing_visibility: "Our visibility and engagement will not only enhance participants’ experiences but also lay the groundwork for more attendees and support in the future!"
500
+ closing_call_to_action: "Let’s make %{event_name} unforgettable, both in person and online! ✨"
501
+ signature_best: "Best,"
502
+ signature_team: "%{event_name} Team"
503
+ participant:
504
+ subject: "Let’s Spread the Word! 📣 Join Us in Amplifying Our Event’s Impact! 🌍✨"
505
+ header_title: "Let’s Spread the Word! 📣"
506
+ header_subtitle: "Join Us in Amplifying %{event_name}’s Impact! 🌍✨"
507
+ hello: "Hello <strong>%{event_name}</strong> Participant!"
508
+ intro: "We’re thrilled to have you with us for %{event_name}! Together, let’s make this event resonate far and wide! 📢 As—we come together for a healthier, more connected world, we invite you to join us in spreading the word. Sharing your experience can help amplify the impact, inspire others, and create new opportunities for networking and connection."
509
+ impact_title: "Here’s how you can help:"
510
+ impact_share_experience: "<strong>Share your Experience</strong>: Post photos, videos, and your thoughts with the hashtag #%{hashtag}."
511
+ impact_create_awareness: "<strong>Create Awareness for Our Cause</strong>: Tell others why this cause matters to you and why it should matter to them. <em>“In a gentle way, you can shake the world.”</em> — Mahatma Gandhi."
512
+ impact_tag_us: "<strong>Tag Us</strong>: In your posts to connect with our event community!"
513
+ impact_invite_others: "<strong>Invite Others</strong>: Tag friends or colleagues who should join in and be part of the conversation!"
514
+ share_now: "Share Now"
515
+ closing: "Let’s make a difference together. Every post counts, and with each share, we’re bringing more visibility to our shared cause. 🌟"
516
+ closing_thank_you: "Thank you for your passion and support!"
517
+ signature_regards: "Warm regards,"
485
518
 
486
519
  invoice:
487
520
  empty_info: "<b>Invoice</b> not create yet"
@@ -532,6 +565,7 @@ en:
532
565
  cannot_delete_account: "You cannot delete this account because you own a special role"
533
566
  kyc:
534
567
  note: "<b>Note:</b> Select Required KYC Field For this Product"
568
+ variant_note: "<b>Note:</b> Select Required Guest Information Field For this Variant"
535
569
  allowed_upload_later: "<b>Allow upload later:</b> Check this box if you allow to upload later"
536
570
  video_on_demand:
537
571
  quality:
@@ -570,6 +604,8 @@ en:
570
604
  user_roles_assigner:
571
605
  user_not_found: 'User not found'
572
606
  roles_empty: 'Roles are empty'
607
+ roles_required: 'Roles are required'
608
+ user_already_assigned: 'User already assigned to this vendor'
573
609
  invite:
574
610
  url_not_found: 'Invite link not found or have been expired'
575
611
  accept_fail: 'Failed to accept invite'
@@ -411,6 +411,8 @@ km:
411
411
  user_roles_assigner:
412
412
  user_not_found: 'រកមិនឃើញអ្នកប្រើប្រាស់'
413
413
  roles_empty: 'តួនាទីគឺទទេ'
414
+ roles_required: 'តួនាទីត្រូវបានទាមទារ'
415
+ user_already_assigned: 'អ្នកប្រើប្រាស់បានបង្កើតតួនាទីរួចហើយ'
414
416
 
415
417
  invite:
416
418
  url_not_found: 'រកមិនឃើញតំណអញ្ជើញ ឬផុតកំណត់ហើយ'
data/config/routes.rb CHANGED
@@ -138,11 +138,7 @@ Spree::Core::Engine.add_routes do
138
138
  end
139
139
  end
140
140
 
141
- resources :stock_managements do
142
- collection do
143
- get :calendar
144
- end
145
- end
141
+ resources :stock_managements
146
142
 
147
143
  resources :product_completion_steps do
148
144
  collection do
@@ -454,6 +450,7 @@ Spree::Core::Engine.add_routes do
454
450
  resources :images
455
451
  resource :s3_signed_urls
456
452
  resources :invites
453
+ resources :invite_guests, only: %i[show update]
457
454
  end
458
455
 
459
456
  namespace :tenant do
@@ -520,11 +517,12 @@ Spree::Core::Engine.add_routes do
520
517
  resource :reset_passwords, only: [:update]
521
518
  resource :change_passwords, only: [:update]
522
519
  resource :user_contacts, only: [:update]
520
+
521
+ resources :cms_pages, only: %i[index show]
522
+ resources :waiting_room_sessions, only: :create
523
523
  end
524
524
 
525
525
  namespace :storefront do
526
- resources :inventory_item
527
-
528
526
  resources :waiting_room_sessions, only: :create
529
527
  resources :vattanac_banks, only: %i[create]
530
528
  resource :cart, controller: :cart, only: %i[show create destroy] do
@@ -550,10 +548,7 @@ Spree::Core::Engine.add_routes do
550
548
  resource :cart_guests, only: %i[create destroy]
551
549
  resources :cart_payment_method_groups, only: %i[index]
552
550
 
553
- resources :accommodations, only: %i[index show] do
554
- resources :variants, only: %i[index show], module: :accommodations
555
- end
556
-
551
+ resources :accommodations, only: %i[index show]
557
552
  resources :line_items, only: %i[index show]
558
553
  resources :account_checker
559
554
  resource :account_recovers, only: [:update]
@@ -0,0 +1,21 @@
1
+ class CreateSpreeCmCommissionerInviteGuest < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_invite_guests, if_not_exists: true do |t|
4
+ t.references :variant, foreign_key: { to_table: :spree_variants }, null: true, index: true
5
+ t.references :order, foreign_key: { to_table: :spree_orders }, null: true, index: true
6
+ t.references :event, foreign_key: { to_table: :spree_taxons }, null: true, index: true
7
+ t.string :email, index: true
8
+ t.integer :quantity, default: 1
9
+ t.string :token, null: false, unique: true, index: true
10
+ t.integer :invite_type, default: 0
11
+ t.integer :claimed_status, default: 0
12
+ t.string :issued_to
13
+ t.datetime :expiration_date
14
+ t.text :remark
15
+ t.datetime :expires_at
16
+ t.datetime :claimed_at
17
+ t.datetime :email_send_at
18
+ t.timestamps
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ class CreateSpreeCmCommissionerTransactionalEmails < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_transactional_emails, if_not_exists: true do |t|
4
+ t.references :taxon, null: true, foreign_key: { to_table: :spree_taxons }
5
+ t.references :recipient, polymorphic: true, null: false
6
+ t.datetime :sent_at
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :cm_transactional_emails, [:taxon_id, :recipient_type, :recipient_id], unique: true, if_not_exists: true, name: 'idx_transactional_email_taxon_recipient'
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddMaxOrderQuantityToSpreeProduct < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_products, :max_order_quantity, :integer, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddTenantIdToSpreeCmsPages < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_cms_pages, :tenant_id, :integer, if_not_exists: true
4
+ add_index :spree_cms_pages, :tenant_id, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class AddEventToSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:spree_products, :event_id)
4
+ add_reference :spree_products, :event, index: true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class AddEventToSpreeLineItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:spree_line_items, :event_id)
4
+ add_reference :spree_line_items, :event, index: true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ class AddTenantIdToCmWaitingRoomSessions < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_waiting_room_sessions, :tenant_id, :integer, if_not_exists: true
4
+ add_index :cm_waiting_room_sessions, :tenant_id, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddKycToSpreeVariants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_variants, :kyc, :integer, if_not_exists: true
4
+ end
5
+ end
data/docker-compose.yml CHANGED
@@ -20,7 +20,7 @@ services:
20
20
 
21
21
  volumes:
22
22
  - .:/gem
23
- - ./vendor/bundle:/gem/vendor/bundle
23
+ - /gem/vendor/bundle
24
24
 
25
25
  # depends_on:
26
26
  # - db
@@ -40,17 +40,9 @@ module SpreeCmCommissioner
40
40
  after: %r{//= require spree/backend}, verbose: true
41
41
 
42
42
  # For NPM support
43
- if File.exist?(File.join(destination_root, 'app/javascript/spree_dashboard'))
44
- template 'app/javascript/spree_dashboard/spree_cm_commissioner/utilities.js'
45
- inject_into_file 'app/javascript/spree_dashboard/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
46
- after: %r{import "@spree/dashboard"}, verbose: true
47
- else
48
- Logger.new($stdout).debug <<~MSG
49
- SpreeCmCommissioner: JavaScript files for the dashboard are missing.
50
- Please move your JavaScript files to the appropriate location in
51
- app/javascript/spree_dashboard.
52
- MSG
53
- end
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
54
46
  end
55
47
 
56
48
  def install_telegram_web_bot
@@ -6,7 +6,3 @@ 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
- });
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  class CalendarEvent
3
3
  attr_reader :from_date, :to_date, :title, :options
4
4
 
5
- def initialize(from_date:, to_date:, title: nil, options: nil)
5
+ def initialize(from_date:, to_date:, title:, options:)
6
6
  @from_date = from_date
7
7
  @to_date = to_date
8
8
  @title = title
@@ -23,15 +23,5 @@ module SpreeCmCommissioner
23
23
  )
24
24
  end
25
25
  end
26
-
27
- def self.from_inventory_items(inventory_items)
28
- inventory_items.map do |item|
29
- CalendarEvent.new(
30
- from_date: item.inventory_date,
31
- to_date: item.inventory_date,
32
- options: { inventory_item: item }
33
- )
34
- end
35
- end
36
26
  end
37
27
  end
@@ -17,7 +17,7 @@ FactoryBot.define do
17
17
  end
18
18
 
19
19
  factory :cm_product_homepage_section_relatable do
20
- relatable { create(:cm_product) }
20
+ relatable { create(:product) }
21
21
  end
22
22
 
23
23
  factory :cm_taxon_homepage_section_relatable do
@@ -16,7 +16,7 @@ FactoryBot.define do
16
16
  variant { product.master }
17
17
 
18
18
  factory :cm_need_confirmation_line_item do
19
- product { create(:cm_product, need_confirmation: true) }
19
+ product { create(:product, need_confirmation: true) }
20
20
  end
21
21
 
22
22
  factory :cm_kyc_line_item do
@@ -1,19 +1,6 @@
1
1
  FactoryBot.define do
2
- factory :cm_product_in_stock, parent: :product_in_stock do
3
- product_type { :ecommerce }
4
- end
5
-
6
- factory :cm_product_with_option_types, parent: :product_with_option_types do
7
- product_type { :ecommerce }
8
- end
9
-
10
- factory :cm_base_product, parent: :base_product do
11
- product_type { :ecommerce }
12
- end
13
-
14
- factory :cm_product, parent: :product do
2
+ factory :cm_product, parent: :base_product do
15
3
  vendor { Spree::Vendor.first || create(:cm_vendor) }
16
- product_type { :ecommerce }
17
4
 
18
5
  before(:create) do |product|
19
6
  create(:stock_location) unless Spree::StockLocation.any?
@@ -98,7 +85,7 @@ FactoryBot.define do
98
85
  option_value2 = create(:cm_option_value, presentation: "#{evaluator.due_date} Days", name: evaluator.due_date.to_s, option_type: product.option_types[1])
99
86
  option_value3 = create(:cm_option_value, presentation: "#{evaluator.payment_option}", name: evaluator.payment_option.to_s, option_type: product.option_types[2])
100
87
 
101
- variant = create(:cm_variant, price: product.price, product: product)
88
+ variant = create(:variant, price: product.price, product: product)
102
89
  variant.option_values = [option_value1, option_value2, option_value3]
103
90
  variant.save!
104
91
 
@@ -116,7 +103,7 @@ FactoryBot.define do
116
103
  end
117
104
 
118
105
  after(:create) do |product, evaluator|
119
- variant = create(:cm_variant, price: product.price, product: product)
106
+ variant = create(:variant, price: product.price, product: product)
120
107
  variant.save!
121
108
 
122
109
  variant.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
@@ -149,12 +136,12 @@ FactoryBot.define do
149
136
  create(:cm_option_value, presentation: 'Yes', name: '1', option_type: product.option_types.find_by(name: 'bib-pre-generation-on-create'))
150
137
  end
151
138
 
152
- variant1 = create(:cm_variant, price: product.price, product: product)
139
+ variant1 = create(:variant, price: product.price, product: product)
153
140
  variant1.option_values = [option_value1]
154
141
  variant1.option_values << bib_pre_generation_option_value if evaluator.bib_pre_generation_on_create
155
142
  variant1.save!
156
143
 
157
- variant2 = create(:cm_variant, price: product.price, product: product)
144
+ variant2 = create(:variant, price: product.price, product: product)
158
145
  variant2.option_values = [option_value2]
159
146
  variant2.option_values << bib_pre_generation_option_value if evaluator.bib_pre_generation_on_create
160
147
  variant2.save!
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :cm_role, class: 'Spree::Role' do
3
+ sequence(:name) { |n| "Role_#{n}" }
4
+ presentation { 'test' }
5
+ vendor_id { nil }
6
+ end
7
+ end
@@ -24,8 +24,8 @@ FactoryBot.define do
24
24
  # variant will add itself to all stock_locations in an after_create
25
25
  # creating a product will automatically create a master variant
26
26
  store = Spree::Store.first || create(:store)
27
- product_1 = create(:cm_product, stores: [store])
28
- product_2 = create(:cm_product, stores: [store])
27
+ product_1 = create(:product, stores: [store])
28
+ product_2 = create(:product, stores: [store])
29
29
 
30
30
  stock_location.stock_items.where(variant_id: product_1.master.id).first.adjust_count_on_hand(10)
31
31
  stock_location.stock_items.where(variant_id: product_2.master.id).first.adjust_count_on_hand(20)
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :cm_taxon_home_banner, class: SpreeCmCommissioner::TaxonHomeBanner do
3
+ attachment { Rack::Test::UploadedFile.new(Spree::Core::Engine.root.join('spec', 'fixtures', 'files', 'icon_256x256.png'), 'image/jpeg') }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :cm_transactional_email, class: SpreeCmCommissioner::TransactionalEmail do
3
+ recipient_id { 1 }
4
+ recipient_type { 'Spree::User'}
5
+ end
6
+ end
@@ -1,53 +1,19 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_base_variant, parent: :base_variant do
3
- is_master { false }
4
- product { create(:cm_product) }
5
-
6
3
  transient do
7
4
  total_inventory { 10 }
8
- backorderable { false }
9
- pregenerate_inventory_items { true }
10
- pre_inventory_days { nil } # optional for permanent only
11
5
  end
12
6
 
13
7
  after :create do |variant, evaluator|
14
8
  variant.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
15
- variant.stock_items.update_all(backorderable: evaluator.backorderable)
16
-
17
- # stock_items is created then enqueue create inventory items job
18
- # but we want to create inventory items directly in this factory without waiting for job
19
- if evaluator.pregenerate_inventory_items
20
- if variant.permanent_stock?
21
- SpreeCmCommissioner::Stock::PermanentInventoryItemsGenerator.call(variant_ids: [variant.id], pre_inventory_days: evaluator.pre_inventory_days || 3)
22
- else
23
- variant.create_default_non_permanent_inventory_item! unless variant.default_inventory_item_exist?
24
- end
25
- end
26
9
  end
27
10
  end
28
11
 
29
- factory :cm_variant, parent: :cm_base_variant do
30
- product { create(:cm_product) }
31
-
32
- transient do
33
- number_of_adults { nil }
34
- number_of_kids { nil }
35
- end
36
-
37
- after(:create) do |variant, evaluator|
38
- if evaluator.number_of_adults.present?
39
- number_of_adults = create(:cm_option_type, :number_of_adults)
40
- variant.product.option_types << number_of_adults
41
- variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_adults, name: evaluator.number_of_adults, option_type: number_of_adults)
42
- end
43
-
44
- if evaluator.number_of_kids.present?
45
- number_of_kids = create(:cm_option_type, :number_of_kids)
46
- variant.product.option_types << number_of_kids
47
- variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_kids, name: evaluator.number_of_kids, option_type: number_of_kids)
48
- end
49
-
50
- variant.save!
12
+ factory :cm_variant, parent: :variant do
13
+ product do
14
+ stock_locations = [create(:stock_location)]
15
+ product = create(:product, vendor: create(:active_vendor, stock_locations: stock_locations))
16
+ product
51
17
  end
52
18
  end
53
19
 
@@ -58,13 +24,12 @@ FactoryBot.define do
58
24
  duration { "1" }
59
25
  route { }
60
26
  end
61
-
62
27
  before(:create) do |trip, evaluator|
63
28
  trip.product = evaluator.route
64
29
 
65
30
  trip.option_values = [evaluator.departure_time, evaluator.duration]
66
- end
67
31
 
32
+ end
68
33
  after(:create) do |trip, evaluator|
69
34
  trip.stock_items = [create(:stock_item, variant: trip, stock_location: evaluator.product.vendor.stock_locations.first)]
70
35
  trip.stock_items.first.adjust_count_on_hand(10)
@@ -30,7 +30,7 @@ FactoryBot.define do
30
30
  if vendor.primary_product_type == :accommodation
31
31
  product = create(:cm_accommodation_product, vendor: vendor, total_inventory: evaluator.total_inventory)
32
32
  else
33
- product = create(:cm_product, vendor: vendor, product_type: vendor.primary_product_type)
33
+ product = create(:product, vendor: vendor, product_type: vendor.primary_product_type)
34
34
  product.master.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
35
35
  end
36
36
 
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.11.0-pre4'.freeze
2
+ VERSION = '1.13.0'.freeze
3
3
 
4
4
  module_function
5
5