spree_multi_vendor 2.0.1

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 (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +44 -0
  5. data/Appraisals +11 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +26 -0
  8. data/README.md +166 -0
  9. data/Rakefile +21 -0
  10. data/app/controllers/spree/admin/vendor_settings_controller.rb +34 -0
  11. data/app/controllers/spree/admin/vendors_controller.rb +60 -0
  12. data/app/controllers/spree/api/v2/storefront/vendors_controller.rb +28 -0
  13. data/app/controllers/spree_multi_vendor/spree/admin/base_controller_decorator.rb +10 -0
  14. data/app/controllers/spree_multi_vendor/spree/admin/option_types_controller_decorator.rb +7 -0
  15. data/app/controllers/spree_multi_vendor/spree/admin/products_controller_decorator.rb +24 -0
  16. data/app/controllers/spree_multi_vendor/spree/admin/properties_controller_decorator.rb +7 -0
  17. data/app/controllers/spree_multi_vendor/spree/admin/resource_controller_decorator.rb +8 -0
  18. data/app/controllers/spree_multi_vendor/spree/admin/shipping_methods_controller_decorator.rb +7 -0
  19. data/app/controllers/spree_multi_vendor/spree/admin/stock_locations_controller_decorator.rb +7 -0
  20. data/app/controllers/spree_multi_vendor/spree/admin/users_controller_decorator.rb +13 -0
  21. data/app/controllers/spree_multi_vendor/spree/admin/variants_controller_decorator.rb +7 -0
  22. data/app/controllers/spree_multi_vendor/spree/api/v1/variants_controller_decorator.rb +22 -0
  23. data/app/finders/spree_multi_vendor/products_finder_decorator.rb +31 -0
  24. data/app/helpers/spree/admin/vendor_helper.rb +15 -0
  25. data/app/mailers/spree/vendor_mailer.rb +15 -0
  26. data/app/models/concerns/spree/vendor_concern.rb +11 -0
  27. data/app/models/spree/order_commission.rb +11 -0
  28. data/app/models/spree/vendor.rb +77 -0
  29. data/app/models/spree/vendor_ability.rb +140 -0
  30. data/app/models/spree/vendor_image.rb +18 -0
  31. data/app/models/spree/vendor_order_totals.rb +28 -0
  32. data/app/models/spree/vendor_user.rb +16 -0
  33. data/app/models/spree_multi_vendor/configuration.rb +10 -0
  34. data/app/models/spree_multi_vendor/spree/ability_decorator.rb +9 -0
  35. data/app/models/spree_multi_vendor/spree/base_decorator.rb +13 -0
  36. data/app/models/spree_multi_vendor/spree/line_item_decorator.rb +48 -0
  37. data/app/models/spree_multi_vendor/spree/order_decorator.rb +105 -0
  38. data/app/models/spree_multi_vendor/spree/shipment_decorator.rb +8 -0
  39. data/app/models/spree_multi_vendor/spree/stock/package_decorator.rb +14 -0
  40. data/app/models/spree_multi_vendor/spree/user_decorator.rb +8 -0
  41. data/app/models/spree_multi_vendor/spree/variant_decorator.rb +41 -0
  42. data/app/overrides/spree/admin/orders/_form.rb +13 -0
  43. data/app/overrides/spree/admin/orders/_line_items.rb +6 -0
  44. data/app/overrides/spree/admin/orders/_line_items_edit_form.rb +6 -0
  45. data/app/overrides/spree/admin/orders/index.rb +6 -0
  46. data/app/overrides/spree/admin/products/form.rb +29 -0
  47. data/app/overrides/spree/admin/products/new.rb +16 -0
  48. data/app/overrides/spree/admin/shared/_main_menu.rb +23 -0
  49. data/app/overrides/spree/admin/shared/_order_summary.rb +35 -0
  50. data/app/overrides/spree/admin/users/_form.rb +13 -0
  51. data/app/serializers/spree/v2/storefront/vendor_image_serializer.rb +11 -0
  52. data/app/serializers/spree/v2/storefront/vendor_order_totals_serializer.rb +18 -0
  53. data/app/serializers/spree/v2/storefront/vendor_serializer.rb +14 -0
  54. data/app/serializers/spree_multi_vendor/cart_serializer_decorator.rb +19 -0
  55. data/app/serializers/spree_multi_vendor/serializer_decorator.rb +23 -0
  56. data/app/services/spree/orders/generate_commissions.rb +34 -0
  57. data/app/views/spree/admin/translations/vendor.html.erb +21 -0
  58. data/app/views/spree/admin/vendor_settings/edit.html.erb +47 -0
  59. data/app/views/spree/admin/vendors/_form.html.erb +36 -0
  60. data/app/views/spree/admin/vendors/edit.html.erb +11 -0
  61. data/app/views/spree/admin/vendors/index.html.erb +83 -0
  62. data/app/views/spree/admin/vendors/new.html.erb +11 -0
  63. data/app/views/spree/vendor_mailer/vendor_notification_email.html.erb +81 -0
  64. data/app/views/spree/vendor_mailer/vendor_notification_email.text.erb +36 -0
  65. data/bin/rails +7 -0
  66. data/config/initializers/spree_permitted_attributes.rb +10 -0
  67. data/config/locales/en.yml +34 -0
  68. data/config/locales/es.yml +33 -0
  69. data/config/locales/fr.yml +33 -0
  70. data/config/routes.rb +19 -0
  71. data/db/default/vendors.rb +13 -0
  72. data/db/migrate/20170406102250_create_spree_vendors.rb +9 -0
  73. data/db/migrate/20170406102944_add_vendor_id_to_spree_models.rb +10 -0
  74. data/db/migrate/20170410111150_add_state_to_vendors.rb +6 -0
  75. data/db/migrate/20170412124925_add_deleted_at_to_spree_vendors.rb +6 -0
  76. data/db/migrate/20170413094447_create_spree_vendor_users.rb +11 -0
  77. data/db/migrate/20190212161426_add_slug_to_spree_vendors.rb +6 -0
  78. data/db/migrate/20190214120226_add_about_us_to_spree_vendors.rb +5 -0
  79. data/db/migrate/20190214142526_add_contact_us_to_spree_vendors.rb +5 -0
  80. data/db/migrate/20190305120337_add_commission_to_spree_vendors.rb +5 -0
  81. data/db/migrate/20190308091546_add_priority_to_vendor.rb +8 -0
  82. data/db/migrate/20190312130754_create_spree_order_commissions.rb +14 -0
  83. data/db/migrate/20190322133128_add_notification_email_to_vendors.rb +5 -0
  84. data/db/migrate/20200416030721_add_translations_to_vendor.rb +19 -0
  85. data/gemfiles/spree_4_2.gemfile +9 -0
  86. data/gemfiles/spree_master.gemfile +9 -0
  87. data/lib/generators/spree_multi_vendor/install/install_generator.rb +21 -0
  88. data/lib/generators/spree_multi_vendor/mailers_preview/mailers_preview_generator.rb +22 -0
  89. data/lib/generators/spree_multi_vendor/mailers_preview/templates/mailers/previews/vendor_notification_preview.rb +5 -0
  90. data/lib/spree_multi_vendor.rb +14 -0
  91. data/lib/spree_multi_vendor/engine.rb +24 -0
  92. data/lib/spree_multi_vendor/factories.rb +7 -0
  93. data/lib/spree_multi_vendor/version.rb +11 -0
  94. data/lib/tasks/vendors.rake +8 -0
  95. data/spec/factories/spree/vendor_factory.rb +22 -0
  96. data/spec/factories/spree/vendor_image_factory.rb +5 -0
  97. data/spec/factories/spree/vendor_user_factory.rb +6 -0
  98. data/spec/features/spree/admin/orders_spec.rb +36 -0
  99. data/spec/features/spree/admin/product_spec.rb +177 -0
  100. data/spec/features/spree/admin/shipping_method_spec.rb +72 -0
  101. data/spec/features/spree/admin/stock_location_spec.rb +90 -0
  102. data/spec/features/spree/admin/vendor_settings_spec.rb +76 -0
  103. data/spec/features/spree/admin/vendor_spec.rb +125 -0
  104. data/spec/fixtures/thinking-cat.jpg +0 -0
  105. data/spec/mailers/vendor_mailer_spec.rb +45 -0
  106. data/spec/models/spree/line_item_spec.rb +32 -0
  107. data/spec/models/spree/order_commission_spec.rb +8 -0
  108. data/spec/models/spree/order_spec.rb +179 -0
  109. data/spec/models/spree/product_spec.rb +19 -0
  110. data/spec/models/spree/variant_spec.rb +104 -0
  111. data/spec/models/spree/vendor_order_totals_spec.rb +33 -0
  112. data/spec/models/spree/vendor_spec.rb +57 -0
  113. data/spec/models/spree/vendor_user_spec.rb +12 -0
  114. data/spec/requests/spree/api/v2/storefront/cart_spec.rb +67 -0
  115. data/spec/requests/spree/api/v2/storefront/products_spec.rb +93 -0
  116. data/spec/requests/spree/api/v2/storefront/vendors_spec.rb +52 -0
  117. data/spec/serializers/spree/v2/storefront/stock_location_serializer_spec.rb +32 -0
  118. data/spec/serializers/spree/v2/storefront/vendor_image_serializer_spec.rb +18 -0
  119. data/spec/serializers/spree/v2/storefront/vendor_order_totals_serializer_spec.rb +54 -0
  120. data/spec/serializers/spree/v2/storefront/vendor_serializer_spec.rb +34 -0
  121. data/spec/spec_helper.rb +11 -0
  122. data/spec/support/shoulda_matchers.rb +6 -0
  123. data/spree_multi_vendor.gemspec +41 -0
  124. metadata +313 -0
@@ -0,0 +1,13 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/admin/users/_form',
3
+ name: 'Add vendor select in user form',
4
+ insert_bottom: 'div[data-hook="admin_user_form_roles"]',
5
+ text: <<-HTML
6
+ <% if current_spree_user.respond_to?(:has_spree_role?) && current_spree_user.has_spree_role?(:admin) %>
7
+ <%= f.field_container :vendor_ids, class: ['form-group'] do %>
8
+ <%= f.label :vendor_ids, Spree.t(plural_resource_name(Spree::Vendor)) %>
9
+ <%= f.collection_select(:vendor_ids, Spree::Vendor.all, :id, :name, { }, { class: 'select2', multiple: true }) %>
10
+ <% end %>
11
+ <% end %>
12
+ HTML
13
+ )
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class VendorImageSerializer < BaseSerializer
5
+ set_type :vendor_image
6
+
7
+ attributes :styles
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class VendorOrderTotalsSerializer < BaseSerializer
5
+ set_type :vendor_totals
6
+
7
+ attributes :name, :subtotal, :ship_total, :total, :display_subtotal,
8
+ :display_ship_total, :display_total, :promo_total,
9
+ :display_promo_total, :included_tax_total,
10
+ :display_included_tax_total, :additional_tax_total,
11
+ :display_additional_tax_total, :item_count,
12
+ :pre_tax_item_amount, :display_pre_tax_item_amount,
13
+ :pre_tax_ship_amount, :display_pre_tax_ship_amount,
14
+ :pre_tax_total, :display_pre_tax_total
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class VendorSerializer < BaseSerializer
5
+ set_type :vendor
6
+
7
+ attributes :name, :about_us, :slug, :contact_us
8
+
9
+ has_one :image, serializer: :vendor_image
10
+ has_many :products
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module SpreeMultiVendor
2
+ module CartSerializerDecorator
3
+ def self.prepended(base)
4
+ base.has_many :vendors,
5
+ serializer: ::Spree::V2::Storefront::VendorSerializer,
6
+ record_type: :vendor,
7
+ id_method_name: :vendor_ids,
8
+ object_method_name: :vendor_list
9
+
10
+ base.has_many :vendor_totals,
11
+ serializer: ::Spree::V2::Storefront::VendorOrderTotalsSerializer,
12
+ record_type: :vendor_totals,
13
+ id_method_name: :vendor_ids,
14
+ object_method_name: :vendor_totals
15
+ end
16
+ end
17
+ end
18
+
19
+ Spree::V2::Storefront::CartSerializer.prepend(SpreeMultiVendor::CartSerializerDecorator)
@@ -0,0 +1,23 @@
1
+ module SpreeMultiVendor
2
+ module SerializerDecorator
3
+ def self.prepended(base)
4
+ base.belongs_to :vendor, serializer: ::Spree::V2::Storefront::VendorSerializer
5
+ end
6
+ end
7
+ end
8
+
9
+ SpreeMultiVendor.vendorized_models.each do |model|
10
+ serializer_class_name = "Spree::V2::Storefront::#{model.to_s.demodulize}Serializer".constantize
11
+
12
+ serializer_class_name.prepend(SpreeMultiVendor::SerializerDecorator)
13
+ rescue
14
+ end
15
+
16
+ # Variant model accesses Vendor via Product if not associated directly
17
+ unless SpreeMultiVendor.vendorized_models.include?(Spree::Variant)
18
+ Spree::V2::Storefront::VariantSerializer.prepend(SpreeMultiVendor::SerializerDecorator)
19
+ end
20
+
21
+ unless SpreeMultiVendor.vendorized_models.include?(Spree::LineItem)
22
+ Spree::V2::Storefront::LineItemSerializer.prepend(SpreeMultiVendor::SerializerDecorator)
23
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Orders
3
+ class GenerateCommissions
4
+ prepend Spree::ServiceModule::Base
5
+
6
+ def call(order:)
7
+ ActiveRecord::Base.transaction do
8
+ run :generate_order_commissions
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def generate_order_commissions(order:)
15
+ return failure(order) unless order.state == 'complete'
16
+
17
+ order.vendor_list.each do |vendor|
18
+ amount = if vendor.commission_rate.zero?
19
+ 0.0
20
+ else
21
+ order.vendor_pre_tax_item_amount(vendor) * vendor.commission_rate / 100
22
+ end
23
+
24
+ order.commissions.create!(
25
+ amount: amount,
26
+ vendor_id: vendor.id
27
+ )
28
+ end
29
+
30
+ success(order: order)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:editing_resource, resource: Spree::Vendor.model_name.human) %>
3
+ <% end %>
4
+
5
+ <%= render 'settings' %>
6
+
7
+ <div class="row translations">
8
+ <div class="col-md-4">
9
+ <%= render 'fields' %>
10
+ </div>
11
+ <div class="col-md-8">
12
+ <%= form_for [:admin, @resource.id, @resource], url: spree.admin_vendor_path(@vendor.id) do |f| %>
13
+ <%= render 'form_fields', f: f %>
14
+ <div class="form-actions" data-hook="buttons">
15
+ <%= button Spree.t(:update), 'update' %>
16
+ <span class="or"><%= Spree.t(:or) %></span>
17
+ <%= button_link_to Spree.t(:cancel), spree.edit_admin_vendor_url(@vendor.id), icon: 'remove' %>
18
+ </div>
19
+ <% end %>
20
+ </div>
21
+ </div>
@@ -0,0 +1,47 @@
1
+ <% content_for :page_title do %>
2
+ <%= @vendor.name %>
3
+ <% end %>
4
+
5
+ <%= form_for [:admin, @vendor], url: admin_vendor_settings_url do |f| %>
6
+ <fieldset>
7
+ <%= render partial: 'spree/shared/error_messages', locals: { target: @vendor } %>
8
+ <div class="form-group">
9
+ <%= f.field_container :name do %>
10
+ <%= f.label :name %>
11
+ <%= f.text_field :name, class: 'form-control' %>
12
+ <% end %>
13
+ </div>
14
+ <% if Spree.version.to_f >= 3.6 %>
15
+ <div class="form-group">
16
+ <%= f.field_container :image do %>
17
+ <%= f.label :image %>
18
+ <%= f.file_field :image %>
19
+ <%= image_tag main_app.url_for(@vendor.image.url(:small)) if @vendor.image %>
20
+ <% end %>
21
+ </div>
22
+ <% end %>
23
+ <div class="form-group">
24
+ <%= f.field_container :about_us do %>
25
+ <%= f.label :about_us %>
26
+ <%= f.text_area :about_us, class: 'form-control' %>
27
+ <% end %>
28
+ </div>
29
+ <div class="form-group">
30
+ <%= f.field_container :contact_us do %>
31
+ <%= f.label :contact_us %>
32
+ <%= f.text_area :contact_us, class: 'form-control' %>
33
+ <% end %>
34
+ </div>
35
+ <div class="form-group">
36
+ <%= f.field_container :notification_email do %>
37
+ <%= f.label :notification_email %>
38
+ <%= f.email_field :notification_email, class: 'form-control' %>
39
+ <% end %>
40
+ </div>
41
+ <div class="form-actions" data-hook="buttons">
42
+ <%= button Spree.t('actions.update'), 'save' %>
43
+ <span class="or"><%= Spree.t(:or) %></span>
44
+ <%= button_link_to Spree.t('actions.cancel'), admin_vendor_settings_url, icon: 'delete' %>
45
+ </div>
46
+ </fieldset>
47
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%= render partial: 'spree/shared/error_messages', locals: { target: @vendor } %>
2
+ <div class="form-group">
3
+ <%= f.field_container :name do %>
4
+ <%= f.label :name %>
5
+ <%= f.text_field :name, class: 'form-control' %>
6
+ <% end %>
7
+ <%= f.field_container :about_us do %>
8
+ <%= f.label :about_us %>
9
+ <%= f.text_area :about_us, class: 'form-control' %>
10
+ <% end %>
11
+ <%= f.field_container :contact_us do %>
12
+ <%= f.label :contact_us %>
13
+ <%= f.text_area :contact_us, class: 'form-control' %>
14
+ <% end %>
15
+ <%= f.field_container :state do %>
16
+ <%= f.label :state %>
17
+ <%= f.select :state,
18
+ options_for_select(vendor_state_options, selected: @vendor.state),
19
+ {}, class: 'select2', required: :required %>
20
+ <% end %>
21
+ <% if Spree.version.to_f >= 3.6 %>
22
+ <%= f.field_container :image do %>
23
+ <%= f.label :image %>
24
+ <%= f.file_field :image %>
25
+ <%= image_tag main_app.url_for(@vendor.image.url(:small)) if @vendor.image %>
26
+ <% end %>
27
+ <% end %>
28
+ <%= f.field_container :commission_rate do %>
29
+ <%= f.label :commission_rate %>
30
+ <%= f.number_field :commission_rate, step: '0.01', class: 'form-control' %>
31
+ <% end %>
32
+ <%= f.field_container :notification_email do%>
33
+ <%= f.label :notification_email %>
34
+ <%= f.email_field :notification_email, class: 'form-control' %>
35
+ <% end %>
36
+ </div>
@@ -0,0 +1,11 @@
1
+ <% content_for :page_title do %>
2
+ <%= link_to plural_resource_name(Spree::Vendor), spree.admin_vendors_url %> /
3
+ <%= @vendor.name %>
4
+ <% end %>
5
+
6
+ <%= form_for [:admin, @vendor] do |f| %>
7
+ <fieldset>
8
+ <%= render partial: 'form', locals: { f: f } %>
9
+ <%= render partial: 'spree/admin/shared/edit_resource_links' %>
10
+ </fieldset>
11
+ <% end %>
@@ -0,0 +1,83 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(plural_resource_name(Spree::Vendor)) %>
3
+ <% end %>
4
+
5
+ <% content_for :page_actions do %>
6
+ <%= button_link_to Spree.t(:new_vendor), new_object_url, { class: "btn-success", icon: 'add', id: 'admin_new_vendor' } %>
7
+ <% end if can?(:create, Spree::Vendor) %>
8
+
9
+ <% content_for :table_filter do %>
10
+ <div data-hook="admin_vendors_index_search">
11
+ <%= search_form_for [:admin, @search] do |f| %>
12
+ <div class="row">
13
+ <div class="col-md-6">
14
+ <div class="form-group">
15
+ <%= label_tag :q_name_cont, Spree.t(:name) %>
16
+ <%= f.text_field :name_cont, tabindex: 1, class: "form-control js-quick-search-target" %>
17
+ </div>
18
+ </div>
19
+ <div class="col-md-6">
20
+ <div class="form-group">
21
+ <%= label_tag :q_state_in, Spree.t(:state) %>
22
+ <%= f.select :state_in, options_for_select(vendor_state_options), { multiple: 'please select' }, class: 'select2', multiple: true %>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <div data-hook="admin_vendors_index_search_buttons" class="form-actions">
27
+ <%= button Spree.t(:filter_results), 'search' %>
28
+ </div>
29
+ <% end %>
30
+ </div>
31
+ <% end %>
32
+
33
+ <%= render partial: 'spree/admin/shared/index_table_options', locals: { collection: @collection } %>
34
+
35
+ <% if @vendors.any? %>
36
+ <table class="table sortable" data-hook="vendors_table" data-sortable-link="<%= update_positions_admin_vendors_url %>">
37
+ <thead>
38
+ <tr data-hook="vendors_header">
39
+ <th>
40
+ <%= Spree.t(:user) %>
41
+ </th>
42
+ <th>
43
+ <%= sort_link @search, :name, I18n.t(:name, scope: 'activerecord.attributes.spree/vendor') %>
44
+ </th>
45
+ <th>
46
+ <%= sort_link @search, :state, I18n.t(:state, scope: 'activerecord.attributes.spree/vendor') %>
47
+ </th>
48
+ <th class="actions"></th>
49
+ </tr>
50
+ </thead>
51
+ <tbody>
52
+ <% @vendors.each do |vendor| %>
53
+ <tr id="<%= spree_dom_id vendor %>" data-hook="vendors_row">
54
+ <td>
55
+ <%= vendor.users.first.email rescue nil %>
56
+ </td>
57
+ <td>
58
+ <%= vendor.name %>
59
+ </td>
60
+ <td>
61
+ <span class="label label-<%= vendor.state.downcase %>"><%= vendor.state.humanize.downcase %></span>
62
+ <span class="icon icon-filter filterable js-add-filter" data-ransack-field="q_state_eq" data-ransack-value="<%= vendor.state %>"></span>
63
+ </td>
64
+ <td class="actions actions-2 text-right">
65
+ <%= link_to_edit vendor, no_text: true, class: 'edit' if can?(:edit, vendor) %>
66
+ <!-- Add translation icon support -->
67
+ <%= link_to_with_icon 'translate',
68
+ nil,
69
+ spree.admin_translations_path('vendor', vendor.id),
70
+ title: Spree.t(:'i18n.translations'),
71
+ class: 'btn btn-sm btn-primary' if defined? (SpreeGlobalize)%>
72
+ </td>
73
+ </tr>
74
+ <% end %>
75
+ </tbody>
76
+ </table>
77
+ <% else %>
78
+ <div class="alert alert-info alpha twelve columns no-objects-found">
79
+ <%= Spree.t(:no_resource_found, resource: plural_resource_name(Spree::Vendor)) %>
80
+ </div>
81
+ <% end %>
82
+
83
+ <%= render partial: 'spree/admin/shared/index_table_options', locals: { collection: @collection } %>
@@ -0,0 +1,11 @@
1
+ <% content_for :page_title do %>
2
+ <%= link_to plural_resource_name(Spree::Vendor), spree.admin_vendors_url %> /
3
+ <%= Spree.t(:new_vendor) %>
4
+ <% end %>
5
+
6
+ <%= form_for [:admin, @vendor] do |f| %>
7
+ <fieldset>
8
+ <%= render partial: 'form', locals: { f: f } %>
9
+ <%= render partial: 'spree/admin/shared/new_resource_links' %>
10
+ </fieldset>
11
+ <% end %>
@@ -0,0 +1,81 @@
1
+ <table class="row header">
2
+ <tr>
3
+ <td>
4
+ <p class="lede">
5
+ <%= Spree.t('order_mailer.vendor_notification_email.dear_vendor') %>
6
+ </p>
7
+ <p>
8
+ <%= Spree.t('order_mailer.vendor_notification_email.order_summary', number: @order.number) %>
9
+ </p>
10
+ <table class="container">
11
+ <tr>
12
+ <td class="wrapper last">
13
+ <table class="twelve columns">
14
+ <%= render collection: @line_items, partial: 'spree/shared/mailer_line_item', as: :line_item %>
15
+ <tr>
16
+ <td class="six sub-columns">
17
+ <%= Spree.t('order_mailer.subtotal') %>
18
+ </td>
19
+ <td class="six sub-columns last right">
20
+ <%= Spree::Money.new(@subtotal, currency: @order.currency) %>
21
+ </td>
22
+ </tr>
23
+ <% if @order.line_item_adjustments.exists? %>
24
+ <% if @order.all_adjustments.promotion.eligible.exists? %>
25
+ <% @order.all_adjustments.promotion.eligible.group_by(&:label).each do |label, adjustments| %>
26
+ <tr>
27
+ <td class="six sub-columns">
28
+ <%= Spree.t(:promotion) %> <%= label %>:
29
+ </td>
30
+ <td class="six sub-columns last right">
31
+ <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
32
+ </td>
33
+ </tr>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+ <% @order.shipments.for_vendor(@vendor).group_by { |s| s.selected_shipping_rate.try(:name) }.each do |name, shipments| %>
38
+ <tr>
39
+ <td class="six sub-columns">
40
+ <%= Spree.t(:shipping) %> <%= name %>:
41
+ </td>
42
+ <td class="six sub-columns last right">
43
+ <%= Spree::Money.new(shipments.sum(&:discounted_cost), currency: @order.currency) %>
44
+ </td>
45
+ </tr>
46
+ <% end %>
47
+ <% if @order.all_adjustments.eligible.tax.exists? %>
48
+ <% @order.all_adjustments.eligible.tax.group_by(&:label).each do |label, adjustments| %>
49
+ <tr>
50
+ <td class="six sub-columns">
51
+ <%= Spree.t(:tax) %> <%= label %>:
52
+ </td>
53
+ <td class="six sub-columns last right">
54
+ <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
55
+ </td>
56
+ </tr>
57
+ <% end %>
58
+ <% end %>
59
+ <% @order.adjustments.eligible.each do |adjustment| %>
60
+ <% next if (adjustment.source_type == 'Spree::TaxRate') || (adjustment.amount == 0) %>
61
+ <%= render 'spree/order_mailer/adjustment', adjustment: adjustment %>
62
+ <% end %>
63
+ <tr>
64
+ <td class="six sub-columns">
65
+ <strong><%= Spree.t('order_mailer.total') %></strong>
66
+ </td>
67
+ <td class="six sub-columns last right">
68
+ <strong><%= Spree::Money.new(@total, currency: @order.currency) %></strong>
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </td>
73
+ </tr>
74
+ </table>
75
+ <p>
76
+ <%= Spree.t('order_mailer.vendor_notification_email.thanks') %>
77
+ </p>
78
+ </td>
79
+ <td class="expander"></td>
80
+ </tr>
81
+ </table>