From ef08977dbef4955a137e0ae45e7cbb22c17cd592 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Wed, 21 Oct 2015 16:23:48 +1100 Subject: [PATCH] Prevent invoices from being sent unless the distributor of an order has set their ABN --- .../admin/orders_controller_decorator.rb | 11 +++++++++ app/models/enterprise.rb | 4 ++++ .../edit/add_invoice_button.html.haml.deface | 5 +++- config/locales/en.yml | 2 ++ config/routes.rb | 2 +- .../spree/admin/orders_controller_spec.rb | 24 +++++++++++++++---- 6 files changed, 41 insertions(+), 7 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index c35d3f1977..c990c835a2 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -17,6 +17,8 @@ Spree::Admin::OrdersController.class_eval do # instead of the update_distribution_charge method. after_filter :update_distribution_charge, :only => :update + before_filter :require_distributor_abn, only: :invoice + respond_override :index => { :html => { :success => lambda { # Filter orders to only show those distributed by current user (or all for admin user) @@ -63,4 +65,13 @@ Spree::Admin::OrdersController.class_eval do @orders = permissions.editable_orders.order(:id).ransack(params[:q]).result.page(params[:page]).per(params[:per_page]) render json: @orders, each_serializer: Api::Admin::OrderSerializer end + + private + + def require_distributor_abn + unless @order.distributor.abn.present? + flash[:error] = t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) + respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } + end + end end diff --git a/app/models/enterprise.rb b/app/models/enterprise.rb index a0b8e91c40..7ad07734fe 100644 --- a/app/models/enterprise.rb +++ b/app/models/enterprise.rb @@ -334,6 +334,10 @@ class Enterprise < ActiveRecord::Base shop_trial_start_date.andand + Enterprise::SHOP_TRIAL_LENGTH.days end + def can_invoice? + abn.present? + end + protected def devise_mailer diff --git a/app/overrides/spree/admin/orders/edit/add_invoice_button.html.haml.deface b/app/overrides/spree/admin/orders/edit/add_invoice_button.html.haml.deface index 919ccad71a..11b4334cfc 100644 --- a/app/overrides/spree/admin/orders/edit/add_invoice_button.html.haml.deface +++ b/app/overrides/spree/admin/orders/edit/add_invoice_button.html.haml.deface @@ -1,3 +1,6 @@ / insert_after "code[erb-loud]:contains('button_link_to t(:resend)')" - if @order.complete? - %li= button_link_to t(:invoice), invoice_admin_order_url(@order), :method => :put, :icon => 'icon-email', :data => { :confirm => t(:are_you_sure) } + - if @order.distributor.can_invoice? + %li= button_link_to t(:invoice), invoice_admin_order_url(@order), :icon => 'icon-email', :data => { :confirm => t(:confirm_send_invoice) } + - else + %li= button_link_to t(:invoice), "#", :icon => 'icon-email', :data => { :confirm => t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) } diff --git a/config/locales/en.yml b/config/locales/en.yml index e6ede20009..c54180e6d5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -20,6 +20,8 @@ en: producers_join: Australian producers are now welcome to join the Open Food Network. charges_sales_tax: Charges GST? print: "Print" + confirm_send_invoice: "An invoice for this order will be sent to the customer. Are you sure you want to continue?" + must_have_valid_business_number: "%{enterprise_name} must have a valid ABN before invoices can be sent." logo: "Logo (640x130)" logo_mobile: "Mobile logo (75x26)" diff --git a/config/routes.rb b/config/routes.rb index 32a8c90e37..083e180212 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -204,7 +204,7 @@ Spree::Core::Engine.routes.prepend do end resources :orders do - put :invoice, on: :member + get :invoice, on: :member get :print, on: :member get :managed, on: :collection end diff --git a/spec/controllers/spree/admin/orders_controller_spec.rb b/spec/controllers/spree/admin/orders_controller_spec.rb index 03907beebf..d011e936d9 100644 --- a/spec/controllers/spree/admin/orders_controller_spec.rb +++ b/spec/controllers/spree/admin/orders_controller_spec.rb @@ -192,11 +192,25 @@ describe Spree::Admin::OrdersController do 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 - expect do - spree_get :invoice, params - end.to change{Spree::OrderMailer.deliveries.count}.by(1) - expect(response).to redirect_to spree.edit_admin_order_path(order) + context "when the distributor's ABN has not been set" do + before { distributor.update_attribute(:abn, "") } + it "should allow me to send order invoices" do + expect do + spree_get :invoice, params + end.to_not change{Spree::OrderMailer.deliveries.count} + expect(response).to redirect_to spree.edit_admin_order_path(order) + expect(flash[:error]).to eq "#{distributor.name} must have a valid ABN before invoices can be sent." + end + end + + context "when the distributor's ABN has been set" do + before { distributor.update_attribute(:abn, "123") } + it "should allow me to send order invoices" do + expect do + spree_get :invoice, params + end.to change{Spree::OrderMailer.deliveries.count}.by(1) + expect(response).to redirect_to spree.edit_admin_order_path(order) + end end end end