spree_cm_commissioner 1.11.0.pre.pre3 → 1.12.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 (166) 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/stock_managements_controller.rb +1 -62
  8. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  9. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  10. data/app/controllers/spree/api/v2/storefront/waiting_room_sessions_controller.rb +1 -0
  11. data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
  12. data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
  13. data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
  14. data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
  15. data/app/controllers/spree/api/v2/tenant/waiting_room_sessions_controller.rb +30 -0
  16. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +17 -0
  17. data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
  18. data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
  19. data/app/interactors/spree_cm_commissioner/create_event.rb +7 -26
  20. data/app/interactors/spree_cm_commissioner/create_ticket.rb +95 -0
  21. data/app/interactors/spree_cm_commissioner/event_line_items_date_syncer.rb +19 -0
  22. data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
  23. data/app/interactors/spree_cm_commissioner/organizers_transactional_email_notifier.rb +27 -0
  24. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
  25. data/app/interactors/spree_cm_commissioner/product_event_id_to_children_syncer.rb +15 -0
  26. data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
  27. data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
  28. data/app/interactors/spree_cm_commissioner/transactional_email_sender.rb +50 -0
  29. data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
  30. data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
  31. data/app/interactors/spree_cm_commissioner/waiting_room_session_creator.rb +7 -14
  32. data/app/interactors/spree_cm_commissioner/waiting_room_session_firebase_logger.rb +30 -0
  33. data/app/jobs/spree_cm_commissioner/ensure_event_for_product_line_item_guests_job.rb +13 -0
  34. data/app/jobs/spree_cm_commissioner/event_line_items_date_syncer_job.rb +8 -0
  35. data/app/jobs/spree_cm_commissioner/product_event_id_to_children_syncer_job.rb +8 -0
  36. data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
  37. data/app/jobs/spree_cm_commissioner/waiting_room_session_firebase_logger_job.rb +13 -0
  38. data/app/mailers/spree_cm_commissioner/event_transactional_mailer.rb +23 -0
  39. data/app/mailers/spree_cm_commissioner/pin_code_mailer.rb +1 -0
  40. data/app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb +2 -0
  41. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +10 -6
  42. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +14 -26
  43. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +4 -3
  44. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  45. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
  46. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +8 -10
  47. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
  48. data/app/models/spree_cm_commissioner/event_ticket_google_wallet.rb +2 -2
  49. data/app/models/spree_cm_commissioner/guest.rb +1 -1
  50. data/app/models/spree_cm_commissioner/line_item_decorator.rb +10 -16
  51. data/app/models/spree_cm_commissioner/option_type_decorator.rb +6 -0
  52. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
  53. data/app/models/spree_cm_commissioner/product_decorator.rb +17 -14
  54. data/app/models/spree_cm_commissioner/role_decorator.rb +3 -0
  55. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
  56. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  57. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  58. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -14
  59. data/app/models/spree_cm_commissioner/taxon_decorator.rb +24 -3
  60. data/app/models/spree_cm_commissioner/transactional_email.rb +6 -0
  61. data/app/models/spree_cm_commissioner/user_decorator.rb +6 -0
  62. data/app/models/spree_cm_commissioner/variant_decorator.rb +27 -34
  63. data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
  64. data/app/models/spree_cm_commissioner/vendor_decorator.rb +9 -1
  65. data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +9 -0
  66. data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
  67. data/app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface +2 -2
  68. data/app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface +3 -1
  69. data/app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface +3 -1
  70. data/app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface +3 -1
  71. data/app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface +3 -1
  72. data/app/overrides/spree/admin/taxons/_form/purchasable_on_status.html.erb.deface +3 -1
  73. data/app/overrides/spree/admin/taxons/_form/show_badge_status.html.erb.deface +3 -1
  74. data/app/overrides/spree/admin/taxons/_form/to_date_form_date.html.erb.deface +3 -4
  75. data/app/overrides/spree/admin/users/_form/roles_fields.html.erb.deface +1 -1
  76. data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
  77. data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
  78. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +40 -0
  79. data/app/overrides/spree/admin/variants/edit/variant_status.html.erb.deface +6 -3
  80. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  81. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  82. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  83. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  84. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  85. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +2 -0
  86. data/app/serializers/spree/v2/tenant/waiting_room_session_serializer.rb +9 -0
  87. data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
  88. data/app/services/spree_cm_commissioner/user_roles_assigner.rb +62 -0
  89. data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
  90. data/app/views/spree/admin/shared/_taxon_tabs.html.erb +19 -19
  91. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +1 -3
  92. data/app/views/spree/admin/stock_managements/index.html.erb +5 -40
  93. data/app/views/spree/shared/_base_mailer_header.html.erb +10 -2
  94. data/app/views/spree_cm_commissioner/event_transactional_mailer/_event_banner.html.erb +3 -0
  95. data/app/views/spree_cm_commissioner/event_transactional_mailer/_mailer_stylesheets.html.erb +315 -0
  96. data/app/views/spree_cm_commissioner/event_transactional_mailer/_note.html.erb +8 -0
  97. data/app/views/spree_cm_commissioner/event_transactional_mailer/_share_button.html.erb +3 -0
  98. data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_organizer.html.erb +59 -0
  99. data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_participant.html.erb +52 -0
  100. data/app/views/spree_cm_commissioner/layouts/event_transactional_mailer.html.erb +14 -0
  101. data/config/initializers/spree_permitted_attributes.rb +0 -5
  102. data/config/locales/en.yml +36 -0
  103. data/config/locales/km.yml +2 -0
  104. data/config/routes.rb +5 -11
  105. data/db/migrate/20250509033437_create_spree_cm_commissioner_transactional_emails.rb +12 -0
  106. data/db/migrate/20250509075429_add_max_order_quantity_to_spree_product.rb +5 -0
  107. data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
  108. data/db/migrate/20250520042602_add_event_to_spree_products.rb +7 -0
  109. data/db/migrate/20250520044533_add_event_to_spree_line_items.rb +7 -0
  110. data/db/migrate/20250521024345_add_tenant_id_to_cm_waiting_room_sessions.rb +6 -0
  111. data/db/migrate/20250521095539_add_kyc_to_spree_variants.rb +5 -0
  112. data/docker-compose.yml +1 -1
  113. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +3 -11
  114. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  115. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  116. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  117. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  118. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +5 -18
  119. data/lib/spree_cm_commissioner/test_helper/factories/role.rb +7 -0
  120. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  121. data/lib/spree_cm_commissioner/test_helper/factories/taxon_home_banner_factory.rb +5 -0
  122. data/lib/spree_cm_commissioner/test_helper/factories/transactional_email_factory.rb +6 -0
  123. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -41
  124. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  125. data/lib/spree_cm_commissioner/version.rb +1 -1
  126. data/lib/spree_cm_commissioner.rb +0 -34
  127. data/lib/tasks/ensure_event_for_product_line_item_guests.rake +7 -0
  128. data/lib/tasks/update_invalid_self_root_places.rake +9 -0
  129. data/lib/tasks/update_orphan_root_places.rake +1 -0
  130. data/spree_cm_commissioner.gemspec +0 -5
  131. metadata +49 -82
  132. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  133. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
  134. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
  135. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
  136. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  137. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
  138. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
  139. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
  140. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -24
  141. data/app/interactors/spree_cm_commissioner/user_roles_assigner.rb +0 -22
  142. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
  143. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  144. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
  145. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
  146. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  147. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  148. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -56
  149. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
  150. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
  151. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
  152. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
  153. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  154. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  155. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -23
  156. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -35
  157. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  158. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  159. data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
  160. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
  161. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
  162. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  163. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  164. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  165. data/lib/tasks/ensure_correct_product_type.rake +0 -7
  166. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -0,0 +1,20 @@
1
+ <% content_for(:page_tabs) do %>
2
+ <% if can?(:admin, Spree::CmsPage) %>
3
+ <%= content_tag :li, class: 'nav-item' do %>
4
+ <%= link_to_with_icon 'building.svg',
5
+ Spree::Store.default&.name || Spree.t(:store),
6
+ admin_cms_pages_url(tab: :default),
7
+ class: "nav-link #{'active' if params[:tab].blank? || params[:tab] == 'default'}" %>
8
+ <% end %>
9
+
10
+ <!-- Tenant Tabs -->
11
+ <% SpreeCmCommissioner::Tenant.all.each do |tenant| %>
12
+ <%= content_tag :li, class: 'nav-item' do %>
13
+ <%= link_to_with_icon 'building.svg',
14
+ tenant.name,
15
+ admin_cms_pages_url(tab: :tenants, tenant_id: tenant.id),
16
+ class: "nav-link #{'active' if params[:tenant_id].to_s == tenant.id.to_s}" %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -5,43 +5,43 @@
5
5
  Spree.t(:details),
6
6
  edit_admin_taxonomy_taxon_url(@taxonomy.id, @taxon.id),
7
7
  class: "nav-link #{'active' if current == :details}" %>
8
- <% end if can?(:admin, Spree::Taxonomy) %>
8
+ <% end if can?(:manage, Spree::Taxonomy) %>
9
9
 
10
10
  <%= content_tag :li, class: 'nav-item' do %>
11
11
  <%= link_to_with_icon 'store.svg',
12
12
  Spree.t(:vendors),
13
13
  admin_taxonomy_taxon_taxon_vendors_url(@taxonomy.id, @taxon.id),
14
14
  class: "nav-link #{'active' if current == :vendors}" %>
15
- <% end if can?(:admin,SpreeCmCommissioner::TaxonVendor)%>
16
- <% if @taxon.depth != 1 %>
15
+ <% end if can?(:manage, SpreeCmCommissioner::TaxonVendor) && @taxon.depth == 2 %>
17
16
 
18
- <%= content_tag :li, class: 'nav-item' do %>
19
- <%= link_to_with_icon 'inbox.svg',
20
- Spree.t(:products),
21
- admin_taxonomy_taxon_classifications_url(@taxonomy.id, @taxon.id),
22
- class: "nav-link #{'active' if current == :products}" %>
23
- <% end if can?(:admin, Spree::Classification)%>
24
- <%else%>
17
+ <% if @taxon.depth != 1 %>
18
+ <%= content_tag :li, class: 'nav-item' do %>
19
+ <%= link_to_with_icon 'inbox.svg',
20
+ Spree.t(:products),
21
+ admin_taxonomy_taxon_classifications_url(@taxonomy.id, @taxon.id),
22
+ class: "nav-link #{'active' if current == :products}" %>
23
+ <% end if can?(:manage, Spree::Classification)%>
24
+ <% else %>
25
25
  <%= content_tag :li, class: 'nav-item' do %>
26
- <%= link_to_with_icon 'store.svg',
27
- Spree.t(:sections),
28
- admin_taxonomy_taxon_taxon_childrens_url(@taxonomy.id, @taxon.id),
29
- class: "nav-link #{'active' if current == :sections}" %>
30
- <% end if can?(:admin,Spree::Taxon)%>
31
- <%end%>
26
+ <%= link_to_with_icon 'store.svg',
27
+ Spree.t(:sections),
28
+ admin_taxonomy_taxon_taxon_childrens_url(@taxonomy.id, @taxon.id),
29
+ class: "nav-link #{'active' if current == :sections}" %>
30
+ <% end if can?(:manage, Spree::Taxon)%>
31
+ <% end %>
32
32
 
33
+ <%# user event only show for event %>
33
34
  <%= content_tag :li, class: 'nav-item' do %>
34
35
  <%= link_to_with_icon 'user.svg',
35
36
  Spree.t(:user_events),
36
- # admin_taxonomy_taxon_user_taxons_url(@taxonomy, @taxon.id),
37
37
  admin_user_events_path(params: {taxon_id: @taxon.id, taxonomy_id: @taxonomy}),
38
38
  class: "nav-link #{'active' if current == :user_events}" %>
39
- <% end if can?(:admin, SpreeCmCommissioner::UserTaxon) %>
39
+ <% end if can?(:manage, SpreeCmCommissioner::UserTaxon) && @taxon.event? && @taxon.depth == 1 %>
40
40
 
41
41
  <%= content_tag :li, class: 'nav-item' do %>
42
42
  <%= link_to_with_icon 'store.svg',
43
43
  Spree.t(:guest_card_classes),
44
44
  admin_taxonomy_taxon_guest_card_classes_url(@taxonomy.id, @taxon.id),
45
45
  class: "nav-link #{'active' if current == :guest_card_classes}" %>
46
- <% end if can?(:admin,SpreeCmCommissioner::GuestCardClasses)%>
46
+ <% end if can?(:manage, SpreeCmCommissioner::GuestCardClasses) && @taxon.event? && @taxon.depth == 1 %>
47
47
  <% end %>
@@ -17,11 +17,9 @@
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_product_stock_managements_path(product_id: params[:product_id], variant_id: variant.id, stock_location_id: stock_location.id), method: :post do %>
20
+ <%= form_tag admin_stock_items_path(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 %>
25
23
  <div class="input-group-append">
26
24
  <%= button_tag(class: 'btn btn-outline-success pl-2 pr-1') do %>
27
25
  <%= svg_icon(name: 'arrow-left-right.svg', classes: "icon", width: 14, height: 14) %>
@@ -19,7 +19,10 @@
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) %>
22
+ <%= small_image(variant) %>
23
+ <div class="mt-4">
24
+ Reserved Stock: <%= @reserved_stocks[variant.id] || 0 %></strong>
25
+ </div>
23
26
  </td>
24
27
  <td>
25
28
  <%= variant.sku_and_options_text %>
@@ -32,46 +35,14 @@
32
35
  <% end %>
33
36
  </div>
34
37
  <% end if can?(:update, @product) && can?(:update, variant) %>
35
-
36
- <% if defined?(@reserved_stocks) %>
37
- <div>
38
- <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
39
- <%= svg_icon name: "cart-check.svg", width: '14', height: '14' %>
40
- </span>
41
- <%= label_tag "reserved_stock#{variant.id}", "Reserved Stock: #{@reserved_stocks[variant.id] || 0}", class: "m-0" %>
42
- </div>
43
- <% end %>
44
-
45
38
  <% if variant.permanent_stock? %>
46
39
  <div>
47
40
  <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
48
41
  <%= svg_icon name: "info-circle-fill.svg", width: '14', height: '14' %>
49
42
  </span>
50
- <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock), class: "m-0" %>
43
+ <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock) %>
51
44
  </div>
52
45
  <% end %>
53
-
54
- <% if defined?(@inventory_items) %>
55
- <% @inventory_items[variant.id]&.each do |inventory_item| %>
56
- <div>
57
- <%= svg_icon name: "handbag.svg", width: '14', height: '14' %>
58
- <%= label_tag "max_capacity_#{ inventory_item.id }", "Max capacity: #{inventory_item.max_capacity}", class: "m-0" %>
59
- </div>
60
- <div>
61
- <%= svg_icon name: "approve.svg", width: '14', height: '14' %>
62
- <%= label_tag "quantity_available_#{ inventory_item.id }", "Quantity available: #{inventory_item.quantity_available}", class: "m-0" %>
63
-
64
- <% synced = inventory_item.quantity_available == @cached_inventory_items[inventory_item.id].quantity_available %>
65
- <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]) %>">
66
- <% if synced %>
67
- <%= svg_icon name: "cloud-check.svg", width: '14', height: '14', classes: 'text-success' %>
68
- <% else %>
69
- <%= svg_icon name: "cloud-slash.svg", width: '14', height: '14', classes: 'text-danger' %>
70
- <% end %>
71
- </span>
72
- </div>
73
- <% end %>
74
- <% end %>
75
46
  </td>
76
47
 
77
48
  <td colspan="3" class="stock_location_info">
@@ -82,9 +53,3 @@
82
53
  </tbody>
83
54
  </table>
84
55
  </div>
85
-
86
- <%= turbo_frame_tag "calendar", src: calendar_admin_product_stock_managements_path(year: params[:year]) do %>
87
- <div class="spinner-border mt-2" role="status">
88
- <span class="sr-only">Loading...</span>
89
- </div>
90
- <% end if @product.permanent_stock? %>
@@ -1,11 +1,19 @@
1
1
  <!-- override base_mailer_header.html.erb -->
2
2
  <tr>
3
3
  <td class="email-masthead">
4
- <%= link_to @sender_name, class: 'template-label' do %>
4
+ <% if defined?(@tenant) && @tenant.present? %>
5
5
  <% if @logo_path.present? %>
6
6
  <%= image_tag @logo_path, class: 'logo', alt: @sender_name, title: @sender_name %>
7
7
  <% else %>
8
- <%= @sender_name %>
8
+ <span class="template-label"><%= @sender_name %></span>
9
+ <% end %>
10
+ <% else %>
11
+ <%= link_to current_store.url, class: 'template-label' do %>
12
+ <% if @logo_path.present? %>
13
+ <%= image_tag @logo_path, class: 'logo', alt: current_store.name, title: current_store.name %>
14
+ <% else %>
15
+ <%= current_store.name %>
16
+ <% end %>
9
17
  <% end %>
10
18
  <% end %>
11
19
  </td>
@@ -0,0 +1,3 @@
1
+ <div class="banner">
2
+ <%= image_tag(main_app.rails_blob_url(@event.home_banner.attachment), class: "banner-image", alt: t('mail.event_engagement_mailer.organizer.header_title')) %>
3
+ </div>
@@ -0,0 +1,315 @@
1
+ <style>
2
+ body {
3
+ margin-top: 20px;
4
+ padding: 0;
5
+ font-family: 'Poppins', Arial, sans-serif;
6
+ line-height: 1.6;
7
+ background-color: #f4f4f4;
8
+ }
9
+
10
+ table {
11
+ border-collapse: collapse;
12
+ width: 100%;
13
+ max-width: 640px;
14
+ margin: 0 auto;
15
+ }
16
+
17
+ img {
18
+ border: 0;
19
+ line-height: 100%;
20
+ outline: none;
21
+ text-decoration: none;
22
+ max-width: 100%;
23
+ height: auto;
24
+ }
25
+
26
+ a {
27
+ color: #6444D8;
28
+ }
29
+
30
+ .container {
31
+ background-color: #ffffff;
32
+ border-radius: 8px;
33
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
34
+ padding: 24px;
35
+ margin: 16px auto;
36
+ }
37
+
38
+ .header {
39
+ text-align: left;
40
+ margin-bottom: 20px;
41
+ }
42
+
43
+ .header .icon {
44
+ font-size: 24px;
45
+ margin-bottom: 12px;
46
+ }
47
+
48
+ .main-title {
49
+ color: #6444D8;
50
+ }
51
+
52
+ .header h1 {
53
+ font-size: 24px;
54
+ font-weight: bold;
55
+ margin: 0;
56
+ }
57
+
58
+ .header h2 {
59
+ font-size: 18px;
60
+ margin: 8px 0 0;
61
+ }
62
+
63
+ .intro p {
64
+ color: #1f2937;
65
+ font-size: 14px;
66
+ margin: 0 0 8px;
67
+ text-align: left;
68
+ }
69
+
70
+ .impact-section {
71
+ background-color: #F1F2FE;
72
+ border-radius: 8px;
73
+ padding: 20px;
74
+ margin: 20px 0;
75
+ }
76
+
77
+ .impact-section h3 {
78
+ font-size: 14px;
79
+ font-weight: 600;
80
+ margin: 0 0 12px;
81
+ color: #1f2937;
82
+ text-align: left;
83
+ }
84
+
85
+ .impact-list {
86
+ list-style: none;
87
+ padding: 0;
88
+ margin: 0;
89
+ }
90
+
91
+ .impact-list li {
92
+ display: flex;
93
+ align-items: flex-start;
94
+ margin-bottom: 12px;
95
+ }
96
+
97
+ .impact-list span {
98
+ margin-right: 8px;
99
+ font-size: 14px;
100
+ flex-shrink: 0;
101
+ }
102
+
103
+ .impact-list div {
104
+ font-size: 14px;
105
+ color: #1f2937;
106
+ text-align: left;
107
+ }
108
+
109
+ .closing p {
110
+ font-size: 14px;
111
+ color: #1f2937;
112
+ margin: 0 0 8px;
113
+ text-align: left;
114
+ }
115
+
116
+ .closing p:last-child {
117
+ font-weight: 600;
118
+ }
119
+
120
+ .button-wrapper {
121
+ text-align: center;
122
+ margin: 20px 0;
123
+ }
124
+
125
+ .cta-button {
126
+ display: inline-block;
127
+ background-color: #6444D8;
128
+ color: #ffffff;
129
+ padding: 12px 24px;
130
+ border-radius: 24px;
131
+ text-decoration: none;
132
+ font-weight: 500;
133
+ font-size: 14px;
134
+ }
135
+
136
+ .cta-button:hover {
137
+ background-color: #7b5ce0;
138
+ text-decoration: none;
139
+ }
140
+
141
+ .signature {
142
+ text-align: left;
143
+ color: #4b5563;
144
+ margin: 20px 0;
145
+ }
146
+
147
+ .signature p {
148
+ margin: 0;
149
+ font-size: 14px;
150
+ }
151
+
152
+ .social-icons {
153
+ display: flex;
154
+ justify-content: flex-start;
155
+ gap: 16px;
156
+ margin: 12px 0 0;
157
+ }
158
+
159
+ .social-icons a {
160
+ font-size: 18px;
161
+ text-decoration: none;
162
+ color: #4b5563;
163
+ transition: color 0.3s ease;
164
+ }
165
+
166
+ .social-icons a:hover {
167
+ color: #6444D8;
168
+ }
169
+
170
+ .footer {
171
+ text-align: center;
172
+ color: #6b7280;
173
+ font-size: 12px;
174
+ padding: 16px;
175
+ }
176
+
177
+ .footer-content {
178
+ max-width: 100%;
179
+ }
180
+
181
+ .footer-brand {
182
+ font-size: 14px;
183
+ color: #1f2937;
184
+ margin: 0 0 8px;
185
+ }
186
+
187
+ .footer-text {
188
+ margin: 0 0 8px;
189
+ color: #6b7280;
190
+ }
191
+
192
+ .footer-links {
193
+ margin: 0 0 8px;
194
+ }
195
+
196
+ .footer-links a {
197
+ color: #6444D8;
198
+ text-decoration: none;
199
+ margin-right: 12px;
200
+ }
201
+
202
+ .footer-links a:hover {
203
+ text-decoration: underline;
204
+ }
205
+
206
+ .footer a {
207
+ color: #6444D8;
208
+ text-decoration: none;
209
+ }
210
+
211
+ .footer a:hover {
212
+ text-decoration: underline;
213
+ }
214
+
215
+ .footer-logo {
216
+ font-weight: bold;
217
+ color: #1f2937;
218
+ }
219
+
220
+ .footer-logo-icon {
221
+ font-weight: bold;
222
+ color: #6444D8;
223
+ }
224
+
225
+ .banner {
226
+ margin-bottom: 16px;
227
+ text-align: center;
228
+ }
229
+
230
+ .banner-image {
231
+ max-width: 100%;
232
+ height: auto;
233
+ border-radius: 8px;
234
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
235
+ }
236
+
237
+ @media only screen and (max-width: 600px) {
238
+ .container {
239
+ padding: 16px;
240
+ margin: 8px;
241
+ border-radius: 4px;
242
+ }
243
+
244
+ .header .icon {
245
+ font-size: 20px;
246
+ }
247
+
248
+ .header h1 {
249
+ font-size: 20px;
250
+ }
251
+
252
+ .header h2 {
253
+ font-size: 16px;
254
+ }
255
+
256
+ .intro p {
257
+ font-size: 13px;
258
+ }
259
+
260
+ .impact-section {
261
+ padding: 16px;
262
+ }
263
+
264
+ .impact-section h3 {
265
+ font-size: 13px;
266
+ }
267
+
268
+ .impact-list span {
269
+ font-size: 13px;
270
+ }
271
+
272
+ .impact-list div {
273
+ font-size: 13px;
274
+ }
275
+
276
+ .closing p {
277
+ font-size: 13px;
278
+ }
279
+
280
+ .cta-button {
281
+ padding: 10px 20px;
282
+ font-size: 13px;
283
+ }
284
+
285
+ .signature p {
286
+ font-size: 13px;
287
+ }
288
+
289
+ .social-icons a {
290
+ font-size: 16px;
291
+ }
292
+
293
+ .footer {
294
+ font-size: 11px;
295
+ padding: 12px;
296
+ }
297
+
298
+ .footer-brand {
299
+ font-size: 13px;
300
+ }
301
+
302
+ .footer-text {
303
+ font-size: 11px;
304
+ }
305
+
306
+ .footer-links a {
307
+ font-size: 11px;
308
+ margin-right: 8px;
309
+ }
310
+
311
+ .banner-image {
312
+ border-radius: 4px;
313
+ }
314
+ }
315
+ </style>
@@ -0,0 +1,8 @@
1
+
2
+ <td class="footer">
3
+ <div class="footer-content">
4
+ <p class="footer-text">This email was sent by <span class="footer-logo"><i>BookMe</i><span class="footer-logo-icon">+</span></span>
5
+ For support, contact us at <a href="mailto:info@bookme.plus">Info@bookme.plus</a>.
6
+ </p>
7
+ </div>
8
+ </td>
@@ -0,0 +1,3 @@
1
+ <div class="button-wrapper">
2
+ <a href="<%= @event.event_url %>" class="cta-button"><%= t('mail.event_engagement_mailer.organizer.share_now') %></a>
3
+ </div
@@ -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