From bd2a1b3e223c2372f66e9b830b89913f4f4f9b85 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Mon, 7 Aug 2023 14:53:55 +0100 Subject: [PATCH 01/10] check if invoices feature is enabled for the current user before printing a single invoice --- app/controllers/spree/admin/orders_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index df5fb872ec..921316334a 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -99,7 +99,7 @@ module Spree end def print - if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) + if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, spree_current_user) @order = @order.invoices.find(params[:invoice_id]).presenter end From adecf64cf303485dc75f29bc806b1f1828e2f88c Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Mon, 7 Aug 2023 14:55:50 +0100 Subject: [PATCH 02/10] update bulk invoice job to check if the invoices feature is enabled for the current user --- app/jobs/bulk_invoice_job.rb | 13 +++++++++++-- app/reflexes/admin/orders_reflex.rb | 3 ++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb index b7f0012018..ae2351497c 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/jobs/bulk_invoice_job.rb @@ -3,10 +3,13 @@ class BulkInvoiceJob < ApplicationJob include CableReady::Broadcaster delegate :render, to: ActionController::Base + attr_reader :options def perform(order_ids, filepath, options = {}) + @options = options orders = sorted_orders(order_ids) - orders.filter!(&:invoiceable?) if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) + orders.filter!(&:invoiceable?) if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, + current_user) orders.each(&method(:generate_invoice)) ensure_directory_exists filepath @@ -29,7 +32,7 @@ class BulkInvoiceJob < ApplicationJob end def generate_invoice(order) - renderer_data = if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) + renderer_data = if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, current_user) OrderInvoiceGenerator.new(order).generate_or_update_latest_invoice order.invoices.first.presenter else @@ -58,4 +61,10 @@ class BulkInvoiceJob < ApplicationJob def pdf @pdf ||= CombinePDF.new end + + def current_user + return unless options[:current_user_id] + + @current_user ||= Spree::User.find(options[:current_user_id]) + end end diff --git a/app/reflexes/admin/orders_reflex.rb b/app/reflexes/admin/orders_reflex.rb index 0a9640147d..6e9d9b5871 100644 --- a/app/reflexes/admin/orders_reflex.rb +++ b/app/reflexes/admin/orders_reflex.rb @@ -37,7 +37,8 @@ module Admin BulkInvoiceJob.perform_later( params[:bulk_ids], "tmp/invoices/#{Time.zone.now.to_i}-#{SecureRandom.hex(2)}.pdf", - channel: SessionChannel.for_request(request) + channel: SessionChannel.for_request(request), + current_user_id: current_user.id ) morph :nothing From 614c8a506046c582677469d9f1a828fd38340c66 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Mon, 7 Aug 2023 14:56:44 +0100 Subject: [PATCH 03/10] update order mailer to check if invoices feature is enabled for the current user --- app/controllers/spree/admin/orders_controller.rb | 3 ++- app/mailers/spree/order_mailer.rb | 11 +++++++++-- app/reflexes/admin/orders_reflex.rb | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index 921316334a..e176f03f82 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -90,7 +90,8 @@ module Spree end def invoice - Spree::OrderMailer.invoice_email(@order.id).deliver_later + Spree::OrderMailer.invoice_email(@order.id, + current_user_id: spree_current_user.id ).deliver_later flash[:success] = t('admin.orders.invoice_email_sent') respond_with(@order) { |format| diff --git a/app/mailers/spree/order_mailer.rb b/app/mailers/spree/order_mailer.rb index 1c34a2f326..ada221c60a 100644 --- a/app/mailers/spree/order_mailer.rb +++ b/app/mailers/spree/order_mailer.rb @@ -46,9 +46,12 @@ module Spree end end - def invoice_email(order_or_order_id) + def invoice_email(order_or_order_id, options = {}) @order = find_order(order_or_order_id) - renderer_data = if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) + current_user = if options[:current_user_id].present? + find_user(options[:current_user_id]) + end + renderer_data = if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, current_user) OrderInvoiceGenerator.new(@order).generate_or_update_latest_invoice @order.invoices.first.presenter else @@ -80,5 +83,9 @@ module Spree def attach_file(filename, file) attachments[filename] = file if file.present? end + + def find_user(current_user_id) + Spree::User.find(current_user_id) + end end end diff --git a/app/reflexes/admin/orders_reflex.rb b/app/reflexes/admin/orders_reflex.rb index 6e9d9b5871..bafa51dd68 100644 --- a/app/reflexes/admin/orders_reflex.rb +++ b/app/reflexes/admin/orders_reflex.rb @@ -75,7 +75,7 @@ module Admin editable_orders.where(id: params[:bulk_ids]).find_each do |o| next unless o.distributor.can_invoice? && o.invoiceable? - Spree::OrderMailer.invoice_email(o.id).deliver_later + Spree::OrderMailer.invoice_email(o.id, current_user_id: current_user.id).deliver_later count += 1 end From dce096a56e857f77fdc0e20931a7d77c90d798dc Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Mon, 7 Aug 2023 15:48:36 +0100 Subject: [PATCH 04/10] check if invoices feature is enabled for the current user before showing invoices tab --- app/views/spree/admin/shared/_order_tabs.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/spree/admin/shared/_order_tabs.html.haml b/app/views/spree/admin/shared/_order_tabs.html.haml index 1c89c24f1f..7072f84b13 100644 --- a/app/views/spree/admin/shared/_order_tabs.html.haml +++ b/app/views/spree/admin/shared/_order_tabs.html.haml @@ -61,7 +61,7 @@ %li{ class: adjustments_classes } = link_to_with_icon 'icon-cogs', t(:adjustments), spree.admin_order_adjustments_url(@order) - - if feature?(:invoices) && @order.can_show_invoice? + - if feature?(:invoices, spree_current_user) && @order.can_show_invoice? - invoices_classes = "active" if current == 'Invoices' %li{ class: invoices_classes } = link_to_with_icon 'icon-cogs', t(:invoices), spree.admin_order_invoices_url(@order) From 3f4eab2a0aa362110f7cc60b659dcf6c8ed06517 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Sun, 20 Aug 2023 07:28:32 +0100 Subject: [PATCH 05/10] update the invoice renderer to check if the feature is enable for individual user --- app/controllers/spree/admin/orders_controller.rb | 2 +- app/jobs/bulk_invoice_job.rb | 2 +- app/mailers/spree/order_mailer.rb | 2 +- app/services/invoice_renderer.rb | 12 +++++++----- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index e176f03f82..6811ed283c 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -104,7 +104,7 @@ module Spree @order = @order.invoices.find(params[:invoice_id]).presenter end - render_with_wicked_pdf InvoiceRenderer.new.args(@order) + render_with_wicked_pdf InvoiceRenderer.new.args(@order, spree_current_user) end private diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb index ae2351497c..3c360005fa 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/jobs/bulk_invoice_job.rb @@ -38,7 +38,7 @@ class BulkInvoiceJob < ApplicationJob else order end - invoice = renderer.render_to_string(renderer_data) + invoice = renderer.render_to_string(renderer_data, current_user) pdf << CombinePDF.parse(invoice) end diff --git a/app/mailers/spree/order_mailer.rb b/app/mailers/spree/order_mailer.rb index ada221c60a..e3430c7787 100644 --- a/app/mailers/spree/order_mailer.rb +++ b/app/mailers/spree/order_mailer.rb @@ -58,7 +58,7 @@ module Spree @order end - pdf = InvoiceRenderer.new.render_to_string(renderer_data) + pdf = InvoiceRenderer.new.render_to_string(renderer_data, current_user) attach_file("invoice-#{@order.number}.pdf", pdf) I18n.with_locale valid_locale(@order.user) do diff --git a/app/services/invoice_renderer.rb b/app/services/invoice_renderer.rb index d46ed37a33..cdf249eaa3 100644 --- a/app/services/invoice_renderer.rb +++ b/app/services/invoice_renderer.rb @@ -1,16 +1,18 @@ # frozen_string_literal: true class InvoiceRenderer - def initialize(renderer = ApplicationController.new) + def initialize(renderer = ApplicationController.new, user = nil) @renderer = renderer + @user = user end - def render_to_string(order) + def render_to_string(order, user = @user) renderer.instance_variable_set(:@order, order) - renderer.render_to_string_with_wicked_pdf(args(order)) + renderer.render_to_string_with_wicked_pdf(args(order, user)) end - def args(order) + def args(order, user = @user) + @user = user { pdf: "invoice-#{order.number}.pdf", template: invoice_template, @@ -24,7 +26,7 @@ class InvoiceRenderer attr_reader :renderer def invoice_template - if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) + if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, @user) invoice_presenter_template elsif Spree::Config.invoice_style2? "spree/admin/orders/invoice2" From f047deaf12e575c5af5b90332cfac49bc5fbcdc1 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Mon, 21 Aug 2023 16:01:06 +0100 Subject: [PATCH 06/10] load the latest invoice when user tries to print an order --- app/controllers/spree/admin/orders_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index 6811ed283c..4e2b729dd6 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -101,7 +101,12 @@ module Spree def print if OpenFoodNetwork::FeatureToggle.enabled?(:invoices, spree_current_user) - @order = @order.invoices.find(params[:invoice_id]).presenter + @order = if params[:invoice_id].present? + @order.invoices.find(params[:invoice_id]).presenter + else + OrderInvoiceGenerator.new(@order).generate_or_update_latest_invoice + @order.invoices.first.presenter + end end render_with_wicked_pdf InvoiceRenderer.new.args(@order, spree_current_user) From a9719a798f9752869ab50ba01ddfb4e25a9daffd Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Tue, 22 Aug 2023 09:07:58 +0100 Subject: [PATCH 07/10] fix order mailer tests --- spec/mailers/order_mailer_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/mailers/order_mailer_spec.rb b/spec/mailers/order_mailer_spec.rb index 019ec1f977..a9dabc395e 100644 --- a/spec/mailers/order_mailer_spec.rb +++ b/spec/mailers/order_mailer_spec.rb @@ -238,7 +238,7 @@ describe Spree::OrderMailer do it "should call the invoice render with order as argument" do expect(generator).not_to receive(:generate_or_update_latest_invoice) expect(order).not_to receive(:invoices) - expect(renderer).to receive(:render_to_string).with(order).and_return("invoice") + expect(renderer).to receive(:render_to_string).with(order, nil).and_return("invoice") expect { email.deliver_now }.to_not raise_error @@ -255,7 +255,7 @@ describe Spree::OrderMailer do it "should call the invoice renderer with invoice's presenter as argument" do expect(generator).to receive(:generate_or_update_latest_invoice) expect(order).to receive(:invoices).and_return([invoice]) - expect(renderer).to receive(:render_to_string).with(invoice.presenter) + expect(renderer).to receive(:render_to_string).with(invoice.presenter, nil) email.deliver_now end end From 13b366e7ffe247b1558f749fce130e546158de41 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Tue, 3 Oct 2023 11:23:24 +0100 Subject: [PATCH 08/10] list send invoice and print invoice under actions even when the invoice feature is enabled --- app/helpers/spree/admin/orders_helper.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/helpers/spree/admin/orders_helper.rb b/app/helpers/spree/admin/orders_helper.rb index e64648238c..81f9066f90 100644 --- a/app/helpers/spree/admin/orders_helper.rb +++ b/app/helpers/spree/admin/orders_helper.rb @@ -31,7 +31,6 @@ module Spree end def invoice_links - return [] if OpenFoodNetwork::FeatureToggle.enabled?(:invoices) return [] unless Spree::Config[:enable_invoices?] [send_invoice_link, print_invoice_link] From 95e7900585949628533463637550c0258ac389cb Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Tue, 3 Oct 2023 11:25:17 +0100 Subject: [PATCH 09/10] test print invoice button under ACTIONS --- spec/system/admin/orders/invoices_spec.rb | 65 ++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/spec/system/admin/orders/invoices_spec.rb b/spec/system/admin/orders/invoices_spec.rb index 311c6c8d53..a7d452dfc6 100644 --- a/spec/system/admin/orders/invoices_spec.rb +++ b/spec/system/admin/orders/invoices_spec.rb @@ -11,7 +11,9 @@ describe ' let(:user) { create(:user) } let(:product) { create(:simple_product) } - let(:distributor) { create(:distributor_enterprise, owner: user, charges_sales_tax: true) } + let(:distributor) { + create(:distributor_enterprise, owner: user, charges_sales_tax: true, abn: "123456") + } let(:order_cycle) do create(:simple_order_cycle, name: 'One', distributors: [distributor], variants: [product.variants.first]) @@ -104,6 +106,67 @@ describe ' end end + describe 'printing invoices' do + context 'when the order has no invoices' do + it 'creates an invoice for the order' do + expect(order.invoices.count).to eq 0 + page.find("#links-dropdown", text: "ACTIONS").click + click_link "Print Invoice" + new_window = windows.last + page.within_window new_window do + expect(order.invoices.count).to eq 1 + end + invoice = order.invoices.first + expect(invoice.cancelled).to eq false + expect(invoice.number).to eq 1 + end + end + + context 'when the order has an invoice' do + let!(:latest_invoice){ create(:invoice, order:, number: 1, cancelled: false) } + 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 + expect(order.invoices.count).to eq 1 + page.find("#links-dropdown", text: "ACTIONS").click + click_link "Print Invoice" + new_window = windows.last + page.within_window new_window do + expect(order.invoices.count).to eq 1 + end + expect(latest_invoice.reload.presenter.note).to eq 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 + expect(order.invoices.count).to eq 1 + page.find("#links-dropdown", text: "ACTIONS").click + click_link "Print Invoice" + new_window = windows.last + page.within_window new_window do + expect(order.invoices.count).to eq 2 + end + expect(latest_invoice.reload.cancelled).to eq true + expect(latest_invoice.presenter.sorted_line_items.first.quantity).to eq 1 + + new_invoice = order.invoices.first # first invoice is the latest + 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 + describe 'listing invoices' do let(:date){ Time.current.to_date } From 1c0ebfe61e307c5c77c3f677c8e07e3c0f7fbe41 Mon Sep 17 00:00:00 2001 From: David Cook Date: Thu, 5 Oct 2023 09:43:41 +1100 Subject: [PATCH 10/10] Add comment --- spec/system/admin/orders/invoices_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/system/admin/orders/invoices_spec.rb b/spec/system/admin/orders/invoices_spec.rb index a7d452dfc6..8440ad83f4 100644 --- a/spec/system/admin/orders/invoices_spec.rb +++ b/spec/system/admin/orders/invoices_spec.rb @@ -112,6 +112,7 @@ describe ' expect(order.invoices.count).to eq 0 page.find("#links-dropdown", text: "ACTIONS").click click_link "Print Invoice" + # wait for PDF to open in new window new_window = windows.last page.within_window new_window do expect(order.invoices.count).to eq 1