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 1fd92d36f7..896ffd7384 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -73,9 +73,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults(newPage) $scope.bulkInvoice = -> - params = '' - angular.forEach $scope.selected_orders, (order_id) -> - params += 'order_ids[]='+order_id+'&' - - $window.open('/admin/orders/invoices/show?'+params) - true + $http.post("/admin/orders/invoices", {order_ids: $scope.selected_orders}).success (data) -> + console.log(data) + .error (data) -> + console.log(data) diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 4bfeb7dcc5..05062c8bab 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -1,28 +1,16 @@ -require 'combine_pdf' - module Spree module Admin class InvoicesController < Spree::Admin::BaseController - def show - combined_pdf = CombinePDF.new + def create + Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], filename) - 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 + render text: filename, status: :ok end private - def invoice_template - Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + def filename + @filename ||= Time.zone.now.to_i.to_s end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb new file mode 100644 index 0000000000..4859606d77 --- /dev/null +++ b/app/jobs/bulk_invoice_job.rb @@ -0,0 +1,44 @@ +BulkInvoiceJob = Struct.new(:order_ids, :filename) do + include WickedPdf::PdfHelper + + def perform + generate_pdf + rescue StandardError => e + log e + end + + private + + def generate_pdf + pdf = CombinePDF.new + orders = Spree::Order.where(id: order_ids) + renderer = ApplicationController.new + + orders.each do |order| + invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8", + locals: { :@order => order } + + pdf << CombinePDF.parse(invoice) + end + + pdf.save "#{directory}/#{filename}.pdf" + end + + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + + def log(error) + logger = Logger.new('bulkinvoice.log') + logger.debug e.message + logger.debug e.backtrace[0] + end + + def directory + dir = 'tmp/invoices' + Dir.mkdir(dir) unless File.exist?(dir) + dir + end +end diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 1912bb8a2a..e3e86455f6 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -76,7 +76,7 @@ Spree::Core::Engine.routes.prepend do get :managed, on: :collection collection do - resources :invoices, only: [:show] + resources :invoices, only: [:create] end end end