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.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_build_gem.yml +143 -12
- data/.gitignore +1 -2
- data/Gemfile.lock +1 -22
- data/Rakefile +4 -33
- data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -62
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/controllers/spree/api/v2/storefront/waiting_room_sessions_controller.rb +1 -0
- data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
- data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
- data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/waiting_room_sessions_controller.rb +30 -0
- data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +17 -0
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
- data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
- data/app/interactors/spree_cm_commissioner/create_event.rb +7 -26
- data/app/interactors/spree_cm_commissioner/create_ticket.rb +95 -0
- data/app/interactors/spree_cm_commissioner/event_line_items_date_syncer.rb +19 -0
- data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
- data/app/interactors/spree_cm_commissioner/organizers_transactional_email_notifier.rb +27 -0
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
- data/app/interactors/spree_cm_commissioner/product_event_id_to_children_syncer.rb +15 -0
- data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
- data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
- data/app/interactors/spree_cm_commissioner/transactional_email_sender.rb +50 -0
- data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
- data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
- data/app/interactors/spree_cm_commissioner/waiting_room_session_creator.rb +7 -14
- data/app/interactors/spree_cm_commissioner/waiting_room_session_firebase_logger.rb +30 -0
- data/app/jobs/spree_cm_commissioner/ensure_event_for_product_line_item_guests_job.rb +13 -0
- data/app/jobs/spree_cm_commissioner/event_line_items_date_syncer_job.rb +8 -0
- data/app/jobs/spree_cm_commissioner/product_event_id_to_children_syncer_job.rb +8 -0
- data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
- data/app/jobs/spree_cm_commissioner/waiting_room_session_firebase_logger_job.rb +13 -0
- data/app/mailers/spree_cm_commissioner/event_transactional_mailer.rb +23 -0
- data/app/mailers/spree_cm_commissioner/pin_code_mailer.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb +2 -0
- data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +10 -6
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +14 -26
- data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +4 -3
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
- data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +8 -10
- data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
- data/app/models/spree_cm_commissioner/event_ticket_google_wallet.rb +2 -2
- data/app/models/spree_cm_commissioner/guest.rb +1 -1
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +10 -16
- data/app/models/spree_cm_commissioner/option_type_decorator.rb +6 -0
- data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
- data/app/models/spree_cm_commissioner/product_decorator.rb +17 -14
- data/app/models/spree_cm_commissioner/role_decorator.rb +3 -0
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -14
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +24 -3
- data/app/models/spree_cm_commissioner/transactional_email.rb +6 -0
- data/app/models/spree_cm_commissioner/user_decorator.rb +6 -0
- data/app/models/spree_cm_commissioner/variant_decorator.rb +27 -34
- data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +9 -1
- data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +9 -0
- data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
- data/app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface +2 -2
- data/app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/purchasable_on_status.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/show_badge_status.html.erb.deface +3 -1
- data/app/overrides/spree/admin/taxons/_form/to_date_form_date.html.erb.deface +3 -4
- data/app/overrides/spree/admin/users/_form/roles_fields.html.erb.deface +1 -1
- data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
- data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
- data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +40 -0
- data/app/overrides/spree/admin/variants/edit/variant_status.html.erb.deface +6 -3
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
- data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
- data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +2 -0
- data/app/serializers/spree/v2/tenant/waiting_room_session_serializer.rb +9 -0
- data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
- data/app/services/spree_cm_commissioner/user_roles_assigner.rb +62 -0
- data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
- data/app/views/spree/admin/shared/_taxon_tabs.html.erb +19 -19
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +1 -3
- data/app/views/spree/admin/stock_managements/index.html.erb +5 -40
- data/app/views/spree/shared/_base_mailer_header.html.erb +10 -2
- data/app/views/spree_cm_commissioner/event_transactional_mailer/_event_banner.html.erb +3 -0
- data/app/views/spree_cm_commissioner/event_transactional_mailer/_mailer_stylesheets.html.erb +315 -0
- data/app/views/spree_cm_commissioner/event_transactional_mailer/_note.html.erb +8 -0
- data/app/views/spree_cm_commissioner/event_transactional_mailer/_share_button.html.erb +3 -0
- data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_organizer.html.erb +59 -0
- data/app/views/spree_cm_commissioner/event_transactional_mailer/send_to_participant.html.erb +52 -0
- data/app/views/spree_cm_commissioner/layouts/event_transactional_mailer.html.erb +14 -0
- data/config/initializers/spree_permitted_attributes.rb +0 -5
- data/config/locales/en.yml +36 -0
- data/config/locales/km.yml +2 -0
- data/config/routes.rb +5 -11
- data/db/migrate/20250509033437_create_spree_cm_commissioner_transactional_emails.rb +12 -0
- data/db/migrate/20250509075429_add_max_order_quantity_to_spree_product.rb +5 -0
- data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
- data/db/migrate/20250520042602_add_event_to_spree_products.rb +7 -0
- data/db/migrate/20250520044533_add_event_to_spree_line_items.rb +7 -0
- data/db/migrate/20250521024345_add_tenant_id_to_cm_waiting_room_sessions.rb +6 -0
- data/db/migrate/20250521095539_add_kyc_to_spree_variants.rb +5 -0
- data/docker-compose.yml +1 -1
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +3 -11
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
- data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
- data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +5 -18
- data/lib/spree_cm_commissioner/test_helper/factories/role.rb +7 -0
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/taxon_home_banner_factory.rb +5 -0
- data/lib/spree_cm_commissioner/test_helper/factories/transactional_email_factory.rb +6 -0
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -41
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +0 -34
- data/lib/tasks/ensure_event_for_product_line_item_guests.rake +7 -0
- data/lib/tasks/update_invalid_self_root_places.rake +9 -0
- data/lib/tasks/update_orphan_root_places.rake +1 -0
- data/spree_cm_commissioner.gemspec +0 -5
- metadata +49 -82
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
- data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -24
- data/app/interactors/spree_cm_commissioner/user_roles_assigner.rb +0 -22
- data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
- data/app/models/spree_cm_commissioner/inventory.rb +0 -11
- data/app/models/spree_cm_commissioner/inventory_item.rb +0 -56
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
- data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -23
- data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -35
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
- data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
- data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
- data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
- data/lib/tasks/ensure_correct_product_type.rake +0 -7
- 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?(:
|
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?(:
|
16
|
-
<% if @taxon.depth != 1 %>
|
15
|
+
<% end if can?(:manage, SpreeCmCommissioner::TaxonVendor) && @taxon.depth == 2 %>
|
17
16
|
|
18
|
-
|
19
|
-
<%=
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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?(:
|
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?(:
|
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
|
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
|
-
|
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)
|
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
|
-
|
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
|
-
|
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,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,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>
|