diff --git a/app/views/spree/admin/invoices/_invoices_table.html.haml b/app/views/spree/admin/invoices/_invoices_table.html.haml index 7d312a7139..52cf9cb606 100644 --- a/app/views/spree/admin/invoices/_invoices_table.html.haml +++ b/app/views/spree/admin/invoices/_invoices_table.html.haml @@ -7,12 +7,12 @@ %th= t(:status) %th= t(:invoice_file) %tbody - - @order.invoices.each do |invoice| + - @order.invoices.order('number desc').each do |invoice| - tr_class = cycle('odd', 'even') - tr_id = spree_dom_id(invoice) %tr{:class => tr_class, "data-hook" => "invoice_row", :id => tr_id} %td.align-center.created_at - = pretty_time(invoice.date) + = invoice.presenter.invoice_date %td.align-center.label = invoice.number %td.align-center.label diff --git a/spec/system/admin/orders/invoices_spec.rb b/spec/system/admin/orders/invoices_spec.rb index cdd3a8de6e..e4a2c89f75 100644 --- a/spec/system/admin/orders/invoices_spec.rb +++ b/spec/system/admin/orders/invoices_spec.rb @@ -4,7 +4,7 @@ require 'system_helper' describe ' As an administrator - I want to create an invoice for an order + I want to list/create an invoice for an order ' do include WebHelper include AuthenticationHelper @@ -31,74 +31,114 @@ describe ' login_as_admin visit spree.edit_admin_order_path(order) end + describe 'creating invoices' do + context 'when the order has no invoices' do + it 'creates an invoice for the order' do + click_link 'Invoices' - context 'when the order has no invoices' do - it 'creates an invoice for the order' do - click_link 'Invoices' + expect { + click_link 'New Invoice' + expect(page).to have_no_link "New Invoice" + }.to change { order.invoices.count }.by(1) - expect { - click_link 'New Invoice' - expect(page).to have_no_link "New Invoice" - }.to change { order.invoices.count }.by(1) + invoice = order.invoices.first + expect(invoice.cancelled).to eq false + expect(invoice.number).to eq 1 + end + end - invoice = order.invoices.first - expect(invoice.cancelled).to eq false - expect(invoice.number).to eq 1 + context 'when the order has an invoice' do + let!(:latest_invoice){ create(:invoice, order:, number: 1, cancelled: false) } + + context 'order not updated since latest invoice' do + it 'should not render new invoice button' do + click_link 'Invoices' + expect(page).to_not have_link 'New Invoice' + end + end + + # For reference check: + # https://docs.google.com/spreadsheets/d/1hOM6UL4mWeRCFLcDQ3fTkbhbUQ2WvIUCCA1IerDBtUA/edit#gid=0 + context 'order updated since latest invoice' do + context 'changes require regenerating' do + let(:new_note){ 'new note' } + before do + order.update!(note: new_note) + end + + it 'updates the lastest invoice for the order' do + click_link 'Invoices' + expect { + click_link 'New Invoice' + expect(page).to have_no_link "New Invoice" + }.to change { order.reload.invoices.count }.by(0) + .and change { latest_invoice.reload.presenter.note }.from("").to(new_note) + + expect(latest_invoice.reload.cancelled).to eq false + end + end + + context 'changes require generating a new invoice' do + before do + order.line_items.first.update!(quantity: 2) + end + + it 'creates a new invoice for the order' do + click_link 'Invoices' + expect { + click_link 'New Invoice' + expect(page).to have_no_link "New Invoice" + }.to change { order.reload.invoices.count }.by(1) + + expect(latest_invoice.reload.cancelled).to eq true + expect(latest_invoice.presenter.sorted_line_items.first.quantity).to eq 1 + + new_invoice = order.invoices.last + expect(new_invoice.cancelled).to eq false + expect(new_invoice.number).to eq 2 + expect(new_invoice.presenter.sorted_line_items.first.quantity).to eq 2 + end + end + end end end - context 'when the order has an invoice' do - let!(:latest_invoice){ create(:invoice, order:, number: 1, cancelled: false) } - - context 'order not updated since latest invoice' do - it 'should not render new invoice button' do - click_link 'Invoices' - expect(page).to_not have_link 'New Invoice' - end + describe 'listing invoices' do + before do + create(:invoice, order:, number: 1, cancelled: true) + create(:invoice, order:, number: 2, cancelled: false) end - # For reference check: - # https://docs.google.com/spreadsheets/d/1hOM6UL4mWeRCFLcDQ3fTkbhbUQ2WvIUCCA1IerDBtUA/edit#gid=0 - context 'order updated since latest invoice' do - context 'changes require regenerating' do - let(:new_note){ 'new note' } - before do - order.update!(note: new_note) - end + let(:row1){ + [ + Time.current.to_date.to_s, + "2", + order.total, + "Active", + "Download" + ].join(" ") + } - it 'updates the lastest invoice for the order' do - click_link 'Invoices' - expect { - click_link 'New Invoice' - expect(page).to have_no_link "New Invoice" - }.to change { order.reload.invoices.count }.by(0) - .and change { latest_invoice.reload.presenter.note }.from("").to(new_note) + let(:row2){ + [ + Time.current.to_date.to_s, + "1", + order.total, + "Cancelled", + "Download" + ].join(" ") + } - expect(latest_invoice.reload.cancelled).to eq false - end - end + let(:table_content){ + [ + row1, + row2 + ].join(" ") + } - context 'changes require generating a new invoice' do - before do - order.line_items.first.update!(quantity: 2) - end - - it 'creates a new invoice for the order' do - click_link 'Invoices' - expect { - click_link 'New Invoice' - expect(page).to have_no_link "New Invoice" - }.to change { order.reload.invoices.count }.by(1) - - expect(latest_invoice.reload.cancelled).to eq true - expect(latest_invoice.presenter.sorted_line_items.first.quantity).to eq 1 - - new_invoice = order.invoices.last - expect(new_invoice.cancelled).to eq false - expect(new_invoice.number).to eq 2 - expect(new_invoice.presenter.sorted_line_items.first.quantity).to eq 2 - end - end + it 'should list the invoices on the reverse order of creation' do + click_link 'Invoices' + expect(page).to have_content table_content end end end