diff --git a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee index a882def796..1fd92d36f7 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -77,5 +77,5 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, angular.forEach $scope.selected_orders, (order_id) -> params += 'order_ids[]='+order_id+'&' - $window.open('/admin/orders/bulk_invoice?'+params) + $window.open('/admin/orders/invoices/show?'+params) true diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb new file mode 100644 index 0000000000..4bfeb7dcc5 --- /dev/null +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -0,0 +1,29 @@ +require 'combine_pdf' + +module Spree + module Admin + class InvoicesController < Spree::Admin::BaseController + def show + combined_pdf = CombinePDF.new + + Spree::Order.where(id: params[:order_ids]).each do |order| + @order = order + pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8" + + combined_pdf << CombinePDF.parse(pdf_data) + end + + send_data combined_pdf.to_pdf, filename: "invoices.pdf", + type: "application/pdf", disposition: :inline + end + + private + + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + end + end +end diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index e9a3a7d92d..84e66451ba 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -1,5 +1,4 @@ require 'open_food_network/spree_api_key_loader' -require 'combine_pdf' Spree::Admin::OrdersController.class_eval do include OpenFoodNetwork::SpreeApiKeyLoader @@ -48,23 +47,6 @@ Spree::Admin::OrdersController.class_eval do respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } end - def bulk_invoice - orders = Spree::Order.where(id: params[:order_ids]) - - combined_pdf = CombinePDF.new - - orders.each do |order| - @order = order - pdf_data = render_to_string pdf: "invoice-#{order.number}.pdf", template: invoice_template, - formats: [:html], encoding: "UTF-8" - - combined_pdf << CombinePDF.parse(pdf_data) - end - - send_data combined_pdf.to_pdf, filename: "invoices.pdf", - type: "application/pdf", disposition: :inline - end - def print render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8" end diff --git a/config/routes/spree.rb b/config/routes/spree.rb index a203ab0fb0..1912bb8a2a 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -74,6 +74,10 @@ Spree::Core::Engine.routes.prepend do get :print, on: :member get :print_ticket, on: :member get :managed, on: :collection + + collection do + resources :invoices, only: [:show] + end end end diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb new file mode 100644 index 0000000000..80cb2f4244 --- /dev/null +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe Spree::Admin::InvoicesController, type: :controller do + let(:order) { create(:order_with_totals_and_distribution) } + + before do + controller.stub spree_current_user: create(:admin_user) + end + + describe "#create" do + it "enqueues a job to create a bulk invoice and returns the filename" do + expect do + spree_post :create, order_ids: [order.id] + end.to enqueue_job BulkInvoiceJob + end + end + + describe "#poll" do + let(:invoice_id) { '479186263' } + + context "when the file is available" do + it "returns true" do + allow(File).to receive(:exist?).and_return(true) + spree_get :poll, invoice_id: invoice_id + + expect(response.body).to eq({ created: true }.to_json) + expect(response.status).to eq 200 + end + end + + context "when the file is not available" do + it "returns false" do + spree_get :poll, invoice_id: invoice_id + + expect(response.body).to eq({ created: false }.to_json) + expect(response.status).to eq 422 + end + end + end +end \ No newline at end of file