diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree/line_item_decorator.rb index 11c9d36850..d4d5b450a4 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree/line_item_decorator.rb @@ -32,6 +32,13 @@ Spree::LineItem.class_eval do end } + scope :sorted_by_name_and_unit_value, + # Find line items that are from order sorted by variant name and unit value + joins(:variant=> :product). + reorder('spree_products.name asc, spree_variants.unit_value asc'). + select('spree_line_items.*') + + scope :supplied_by, lambda { |enterprise| joins(:product). where('spree_products.supplier_id = ?', enterprise) diff --git a/app/views/spree/order_mailer/_order_summary.html.haml b/app/views/spree/order_mailer/_order_summary.html.haml index 5d9dbc8e1f..4a13873d56 100644 --- a/app/views/spree/order_mailer/_order_summary.html.haml +++ b/app/views/spree/order_mailer/_order_summary.html.haml @@ -11,7 +11,7 @@ %h4 = t :email_order_summary_price %tbody - - @order.line_items.each do |item| + - @order.line_items.sorted_by_name_and_unit_value.each do |item| %tr %td = render 'spree/shared/line_item_name', line_item: item diff --git a/app/views/spree/orders/_summary.html.haml b/app/views/spree/orders/_summary.html.haml index b3276faede..02bc8d9fab 100644 --- a/app/views/spree/orders/_summary.html.haml +++ b/app/views/spree/orders/_summary.html.haml @@ -11,7 +11,7 @@ %th.text-right.total %span= t(:total) %tbody{"data-hook" => ""} - - order.line_items.each do |item| + - order.line_items.sorted_by_name_and_unit_value.each do |item| %tr.line_item{"data-hook" => "order_details_line_item_row", class: "variant-#{item.variant.id}" } %td(data-hook = "order_item_description") diff --git a/spec/models/spree/line_item_spec.rb b/spec/models/spree/line_item_spec.rb index cb1755f60c..0e48f2c24f 100644 --- a/spec/models/spree/line_item_spec.rb +++ b/spec/models/spree/line_item_spec.rb @@ -14,6 +14,18 @@ module Spree let(:li1) { create(:line_item, order: o, product: p1) } let(:li2) { create(:line_item, order: o, product: p2) } + + let(:p3) {create(:product, name: 'Clear Honey') } + let(:p4) {create(:product, name: 'Apricots') } + let(:v1) {create(:variant, product: p3, unit_value: 500) } + let(:v2) {create(:variant, product: p3, unit_value: 250) } + let(:v3) {create(:variant, product: p4, unit_value: 500) } + let(:v4) {create(:variant, product: p4, unit_value: 1000) } + let(:li3) { create(:line_item, order: o, product: p3, variant: v1) } + let(:li4) { create(:line_item, order: o, product: p3, variant: v2) } + let(:li5) { create(:line_item, order: o, product: p4, variant: v3) } + let(:li6) { create(:line_item, order: o, product: p4, variant: v4) } + it "finds line items for products supplied by a particular enterprise" do LineItem.supplied_by(s1).should == [li1] LineItem.supplied_by(s2).should == [li2] @@ -40,6 +52,10 @@ module Spree LineItem.without_tax.should == [li2] end end + + it "finds line items sorted by name and unit_value" do + o.line_items.sorted_by_name_and_unit_value.should == [li5,li6,li4,li3] + end end describe "capping quantity at stock level" do