From 40d627cb34d6a735d16d3e0fb12a7adb7f38e0a2 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Fri, 16 Oct 2015 15:10:08 +1100 Subject: [PATCH] Adding new route for printing an order to pdf --- .../admin/orders_controller_decorator.rb | 4 +++ app/models/spree/ability_decorator.rb | 2 +- app/views/spree/admin/orders/print.html.haml | 19 ++++++++++ config/routes.rb | 1 + .../spree/admin/orders_controller_spec.rb | 35 +++++++++++++++++++ 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 app/views/spree/admin/orders/print.html.haml diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index 88b1508a09..7749950854 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -49,6 +49,10 @@ Spree::Admin::OrdersController.class_eval do respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } end + def print + render pdf: "invoice-#{@order.number}", encoding: "UTF-8" + end + def update_distribution_charge @order.update_distribution_charge! end diff --git a/app/models/spree/ability_decorator.rb b/app/models/spree/ability_decorator.rb index 5e6dba10b6..241d1de114 100644 --- a/app/models/spree/ability_decorator.rb +++ b/app/models/spree/ability_decorator.rb @@ -142,7 +142,7 @@ class AbilityDecorator def add_order_management_abilities(user) # Enterprise User can only access orders that they are a distributor for can [:index, :create], Spree::Order - can [:read, :update, :fire, :resend, :invoice], Spree::Order do |order| + can [:read, :update, :fire, :resend, :invoice, :print], Spree::Order do |order| # We allow editing orders with a nil distributor as this state occurs # during the order creation process from the admin backend order.distributor.nil? || user.enterprises.include?(order.distributor) diff --git a/app/views/spree/admin/orders/print.html.haml b/app/views/spree/admin/orders/print.html.haml new file mode 100644 index 0000000000..f3fd436b91 --- /dev/null +++ b/app/views/spree/admin/orders/print.html.haml @@ -0,0 +1,19 @@ += wicked_pdf_stylesheet_link_tag "mail/email" + + +%table{:width => "100%"} + %tbody + %tr + %td{ :align => "left" } + %h4 + Order confirmation + %strong ##{@order.number} + %h5 + #{@order.bill_address.firstname} #{@order.bill_address.lastname} + %strong= " <#{@order.email}>" if @order.email + = @order.bill_address.phone if @order.bill_address.phone + %h5= "Customer Code: #{@order.customer.code}" + += render 'spree/order_mailer/order_summary' += render 'spree/order_mailer/payment' += render 'spree/order_mailer/shipping' diff --git a/config/routes.rb b/config/routes.rb index ca1c34d611..32a8c90e37 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -205,6 +205,7 @@ Spree::Core::Engine.routes.prepend do resources :orders do put :invoice, on: :member + get :print, on: :member get :managed, on: :collection end end diff --git a/spec/controllers/spree/admin/orders_controller_spec.rb b/spec/controllers/spree/admin/orders_controller_spec.rb index f19ab4cdbb..9b65dd1a61 100644 --- a/spec/controllers/spree/admin/orders_controller_spec.rb +++ b/spec/controllers/spree/admin/orders_controller_spec.rb @@ -201,4 +201,39 @@ describe Spree::Admin::OrdersController do end end end + + describe "#print" do + let!(:user) { create(:user) } + let!(:enterprise_user) { create(:user) } + let!(:order) { create(:order_with_distributor, bill_address: create(:address), ship_address: create(:address)) } + let!(:distributor) { order.distributor } + let(:params) { { id: order.number } } + + context "as a normal user" do + before { controller.stub spree_current_user: user } + + it "should prevent me from sending order invoices" do + spree_get :print, params + expect(response).to redirect_to spree.unauthorized_path + end + end + + context "as an enterprise user" do + context "which is not a manager of the distributor for an order" do + before { controller.stub spree_current_user: user } + it "should prevent me from sending order invoices" do + spree_get :print, params + expect(response).to redirect_to spree.unauthorized_path + end + end + + context "which is a manager of the distributor for an order" do + before { controller.stub spree_current_user: distributor.owner } + it "should allow me to send order invoices" do + spree_get :print, params + expect(response).to render_template :print + end + end + end + end end