From f263ef7dc00f1d85f629ef276dc08806b39b5156 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 5 Oct 2018 22:00:27 +0100 Subject: [PATCH 01/35] Add selectable checkboxes --- .../admin/orders/controllers/orders_controller.js.coffee | 7 +++++++ app/views/spree/admin/orders/index.html.haml | 5 +++++ config/locales/en.yml | 1 + 3 files changed, 13 insertions(+) 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 ad5bfff97d..fe85d427fd 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -8,6 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {id: 50, name: t('js.admin.orders.index.per_page', results: 50)}, {id: 100, name: t('js.admin.orders.index.per_page', results: 100)} ] + $scope.selected = {} + $scope.select_all = false $scope.initialise = -> $scope.per_page = 15 @@ -36,6 +38,11 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, page: page }) + $scope.toggleAll = -> + $scope.select_all = !$scope.select_all + $scope.orders.forEach (order) -> + $scope.selected[order.id] = $scope.select_all + $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" $scope.sorting = sort.predicate + ' desc' if sort.reverse diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 3c0efc3793..47635c4a86 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -24,6 +24,9 @@ %col{style: "width: 10%"} %thead %tr + %th + = t('.select_all') + %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} %th = t(:products_distributor) %th @@ -39,6 +42,8 @@ %th.actions %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} + %td.align-center + %input{type: 'checkbox', 'ng-model' => 'selected[order.id]'} %td.align-center {{order.distributor_name}} %td.align-center diff --git a/config/locales/en.yml b/config/locales/en.yml index b226b15044..6f13fd6291 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2695,6 +2695,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using no_orders_found: "No Orders Found" results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." + select_all: "Select All" invoice: issued_on: Issued on tax_invoice: TAX INVOICE From 9a71236abd2278ddf30f8cd230d5542a4bb65a72 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 14 Oct 2018 12:27:11 +0100 Subject: [PATCH 02/35] Add combine_pdf gem --- Gemfile | 1 + Gemfile.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index f354ea0512..2b8329cd12 100644 --- a/Gemfile +++ b/Gemfile @@ -72,6 +72,7 @@ gem 'paper_trail', '~> 3.0.8' gem 'diffy' gem 'skylight', '< 2.0' +gem 'combine_pdf' gem 'wicked_pdf' gem 'wkhtmltopdf-binary' diff --git a/Gemfile.lock b/Gemfile.lock index 11590c4cea..1b9a604ecb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -228,6 +228,8 @@ GEM execjs coffee-script-source (1.10.0) colorize (0.8.1) + combine_pdf (1.0.15) + ruby-rc4 (>= 0.1.5) compass (1.0.3) chunky_png (~> 1.2) compass-core (~> 1.0.2) @@ -673,6 +675,7 @@ GEM unicode-display_width (~> 1.0, >= 1.0.1) ruby-ole (1.2.12.1) ruby-progressbar (1.10.0) + ruby-rc4 (0.1.5) rubyzip (1.2.2) safe_yaml (1.0.4) sass (3.3.14) @@ -771,6 +774,7 @@ DEPENDENCIES byebug (~> 9.0.0) capybara (>= 2.15.4) coffee-rails (~> 3.2.1) + combine_pdf compass-rails custom_error_message! daemons From 96d530b473a5ddb03f8b12769d1e0787f57b690c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 14 Oct 2018 12:30:20 +0100 Subject: [PATCH 03/35] Tidy up invoice template selection --- .../spree/admin/orders_controller_decorator.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index f7e1b56929..bac3509be3 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -37,8 +37,7 @@ Spree::Admin::OrdersController.class_eval do end def invoice - template = if Spree::Config.invoice_style2? then "spree/admin/orders/invoice2" else "spree/admin/orders/invoice" end - pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: template, formats: [:html], encoding: "UTF-8" + pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, formats: [:html], encoding: "UTF-8" Spree::OrderMailer.invoice_email(@order.id, pdf).deliver flash[:success] = t('admin.orders.invoice_email_sent') @@ -46,8 +45,7 @@ Spree::Admin::OrdersController.class_eval do end def print - template = if Spree::Config.invoice_style2? then "spree/admin/orders/invoice2" else "spree/admin/orders/invoice" end - render pdf: "invoice-#{@order.number}", template: template, encoding: "UTF-8" + render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8" end def print_ticket @@ -60,6 +58,10 @@ Spree::Admin::OrdersController.class_eval do private + def invoice_template + Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice" + end + def require_distributor_abn unless @order.distributor.abn.present? flash[:error] = t(:must_have_valid_business_number, enterprise_name: @order.distributor.name) From 4ec0f0ff739caaa59fafdf261094ff31a83adf68 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 13:44:21 +0100 Subject: [PATCH 04/35] Add bulk invoices printing --- .../controllers/orders_controller.js.coffee | 10 +++++++- app/assets/stylesheets/admin/orders.css.scss | 7 ++++++ .../admin/orders_controller_decorator.rb | 23 ++++++++++++++++++- app/models/spree/ability_decorator.rb | 4 +++- app/views/spree/admin/orders/index.html.haml | 5 +++- config/locales/en.yml | 1 + 6 files changed, 46 insertions(+), 4 deletions(-) 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 fe85d427fd..6aec2e8496 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -53,3 +53,11 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) + + $scope.bulkInvoice = -> + params = '' + angular.forEach $scope.selected, (selected, order_id) -> + params += 'order_ids[]='+order_id+'&' if selected + + $window.open('/admin/orders/bulk_invoice?'+params) + true diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 0955d9fd46..d92fc11f6f 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -103,3 +103,10 @@ table.index td.actions { font-size: 1.2em; } } + +.index-controls { + + button { + float: right; + } +} diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index bac3509be3..cebbda5cc6 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -1,4 +1,5 @@ require 'open_food_network/spree_api_key_loader' +require 'combine_pdf' Spree::Admin::OrdersController.class_eval do include OpenFoodNetwork::SpreeApiKeyLoader @@ -37,13 +38,33 @@ Spree::Admin::OrdersController.class_eval do end def invoice - pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, formats: [:html], encoding: "UTF-8" + pdf = render_to_string pdf: "invoice-#{@order.number}.pdf", + template: invoice_template, + formats: [:html], encoding: "UTF-8" + Spree::OrderMailer.invoice_email(@order.id, pdf).deliver flash[:success] = t('admin.orders.invoice_email_sent') respond_with(@order) { |format| format.html { redirect_to edit_admin_order_path(@order) } } end + def bulk_invoice + orders = params[:order_ids] + + combined_pdf = CombinePDF.new + + orders.each do |order_id| + @order = Spree::Order.find(order_id) + 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/app/models/spree/ability_decorator.rb b/app/models/spree/ability_decorator.rb index 9d0941a220..2c68470840 100644 --- a/app/models/spree/ability_decorator.rb +++ b/app/models/spree/ability_decorator.rb @@ -210,7 +210,9 @@ class AbilityDecorator # during the order creation process from the admin backend order.distributor.nil? || user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user) end - can [:admin, :bulk_management, :managed], Spree::Order if user.admin? || user.enterprises.any?(&:is_distributor) + can [:admin, :bulk_management, :managed, :bulk_invoice], Spree::Order do + user.admin? || user.enterprises.any?(&:is_distributor) + end can [:admin, :visible], Enterprise can [:admin, :index, :create, :update, :destroy], :line_item can [:admin, :index, :create], Spree::LineItem diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 47635c4a86..75a9a4b0fb 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -16,9 +16,12 @@ - content_for :table_filter do = render partial: 'filters' -.row +.row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' + %button{'ng-click' => 'bulkInvoice()'} + = t('.print_invoices') + %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } %colgroup %col{style: "width: 10%"} diff --git a/config/locales/en.yml b/config/locales/en.yml index 6f13fd6291..b9e2d509a9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2696,6 +2696,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." select_all: "Select All" + print_invoices: "Print Invoices" invoice: issued_on: Issued on tax_invoice: TAX INVOICE From 42cf96e6354a9bab5b681ea12d3253bc572b49fc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 14:24:19 +0100 Subject: [PATCH 05/35] Disable button unless orders selected --- .../controllers/orders_controller.js.coffee | 19 +++++++++++++++---- app/assets/stylesheets/admin/orders.css.scss | 4 ++++ app/views/spree/admin/orders/index.html.haml | 4 ++-- 3 files changed, 21 insertions(+), 6 deletions(-) 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 6aec2e8496..842afefee6 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -8,7 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {id: 50, name: t('js.admin.orders.index.per_page', results: 50)}, {id: 100, name: t('js.admin.orders.index.per_page', results: 100)} ] - $scope.selected = {} + $scope.selected_orders = {} + $scope.selected = false $scope.select_all = false $scope.initialise = -> @@ -41,7 +42,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.toggleAll = -> $scope.select_all = !$scope.select_all $scope.orders.forEach (order) -> - $scope.selected[order.id] = $scope.select_all + $scope.selected_orders[order.id] = $scope.select_all $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" @@ -50,13 +51,23 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() , true + $scope.$watchCollection 'selected_orders', (selected_orders) -> + if selected_orders + orders_selected = false + angular.forEach selected_orders, (checked, order_id) -> + if checked + orders_selected = true + return + + $scope.selected = orders_selected + $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) $scope.bulkInvoice = -> params = '' - angular.forEach $scope.selected, (selected, order_id) -> + angular.forEach $scope.selected_orders, (selected, order_id) -> params += 'order_ids[]='+order_id+'&' if selected $window.open('/admin/orders/bulk_invoice?'+params) diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index d92fc11f6f..5f53152901 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -108,5 +108,9 @@ table.index td.actions { button { float: right; + + &:disabled { + background-color: $disabled-button; + } } } diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 75a9a4b0fb..96cddca13b 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()'} + %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => '!selected'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } @@ -46,7 +46,7 @@ %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} %td.align-center - %input{type: 'checkbox', 'ng-model' => 'selected[order.id]'} + %input{type: 'checkbox', 'ng-model' => 'selected_orders[order.id]'} %td.align-center {{order.distributor_name}} %td.align-center From 5cc8bad42b2bd1b7dd6aed9ef745e57b71f28ecb Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 17:40:55 +0100 Subject: [PATCH 06/35] Improve UI layout for select all option --- app/views/spree/admin/orders/index.html.haml | 3 +-- config/locales/en.yml | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 96cddca13b..ee1f4adad8 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -24,11 +24,10 @@ %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } %colgroup - %col{style: "width: 10%"} + %col{style: "width: 3%"} %thead %tr %th - = t('.select_all') %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} %th = t(:products_distributor) diff --git a/config/locales/en.yml b/config/locales/en.yml index b9e2d509a9..3f9c2f4b1b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2695,7 +2695,6 @@ See the %{link} to find out more about %{sitename}'s features and to start using no_orders_found: "No Orders Found" results_found: "%{number} Results found." viewing: "Viewing %{start} to %{end}." - select_all: "Select All" print_invoices: "Print Invoices" invoice: issued_on: Issued on From 24207053e465132eb5df3e6c966d0a9dc072bfc2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 17:53:37 +0100 Subject: [PATCH 07/35] Reset selected orders on filter change --- .../admin/orders/controllers/orders_controller.js.coffee | 7 ++++++- app/views/spree/admin/orders/index.html.haml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) 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 842afefee6..a89c97791f 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -20,6 +20,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() $scope.fetchResults = (page=1) -> + $scope.resetSelected() Orders.index({ 'q[completed_at_lt]': $scope['q']['completed_at_lt'], 'q[completed_at_gt]': $scope['q']['completed_at_gt'], @@ -39,8 +40,12 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, page: page }) + $scope.resetSelected = -> + $scope.selected_orders = {} + $scope.selected = false + $scope.select_all = false + $scope.toggleAll = -> - $scope.select_all = !$scope.select_all $scope.orders.forEach (order) -> $scope.selected_orders[order.id] = $scope.select_all diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index ee1f4adad8..114c177d22 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -28,7 +28,7 @@ %thead %tr %th - %input{type: 'checkbox', 'ng-click' => 'toggleAll()'} + %input{type: 'checkbox', 'ng-click' => 'toggleAll()', 'ng-model' => 'select_all'} %th = t(:products_distributor) %th From f3585befff5811afc5f6d2e8d37bf5edae7002a9 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 15 Oct 2018 18:10:00 +0100 Subject: [PATCH 08/35] Fix customer missing from some order records - guest checkout? --- app/views/spree/admin/orders/invoice.html.haml | 5 +++-- app/views/spree/admin/orders/invoice2.html.haml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/spree/admin/orders/invoice.html.haml b/app/views/spree/admin/orders/invoice.html.haml index 0982ccc21f..982ef43f59 100644 --- a/app/views/spree/admin/orders/invoice.html.haml +++ b/app/views/spree/admin/orders/invoice.html.haml @@ -30,13 +30,14 @@   %td{ :align => "right" } %strong= "#{t('.to')}: #{@order.ship_address.full_name}" - - if @order.customer.code.present? + - if @order.andand.customer.andand.code.present? %br = "#{t('.code')}: #{@order.customer.code}" %br = @order.ship_address.full_address %br - = "#{@order.customer.email}," + - if @order.andand.customer.andand.email.present? + = "#{@order.customer.email}," = "#{@order.bill_address.phone}" = render 'spree/admin/orders/invoice_table' diff --git a/app/views/spree/admin/orders/invoice2.html.haml b/app/views/spree/admin/orders/invoice2.html.haml index 89f28ab308..837b2be21a 100644 --- a/app/views/spree/admin/orders/invoice2.html.haml +++ b/app/views/spree/admin/orders/invoice2.html.haml @@ -45,7 +45,7 @@ = t :invoice_billing_address %br %strong= @order.ship_address.full_name - - if @order.customer.code.present? + - if @order.andand.customer.andand.code.present? %br = "Code: #{@order.customer.code}" %br From 5279210254cd44c21dfde5c1127ff2921b49f11c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 24 Oct 2018 00:00:09 +0100 Subject: [PATCH 09/35] Improve invoice order querying --- .../spree/admin/orders_controller_decorator.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index cebbda5cc6..e9a3a7d92d 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -49,13 +49,13 @@ Spree::Admin::OrdersController.class_eval do end def bulk_invoice - orders = params[:order_ids] + orders = Spree::Order.where(id: params[:order_ids]) combined_pdf = CombinePDF.new - orders.each do |order_id| - @order = Spree::Order.find(order_id) - pdf_data = render_to_string pdf: "invoice-#{@order.number}.pdf", template: invoice_template, + 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) From 4a88fb0626dc91c9a2fc35ac69123dbf42043863 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 26 Oct 2018 21:00:26 +0100 Subject: [PATCH 10/35] Use simpler array for selected ids --- .../controllers/orders_controller.js.coffee | 32 ++++++++++--------- app/views/spree/admin/orders/index.html.haml | 4 +-- 2 files changed, 19 insertions(+), 17 deletions(-) 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 a89c97791f..a882def796 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -8,7 +8,8 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, {id: 50, name: t('js.admin.orders.index.per_page', results: 50)}, {id: 100, name: t('js.admin.orders.index.per_page', results: 100)} ] - $scope.selected_orders = {} + $scope.selected_orders = [] + $scope.checkboxes = {} $scope.selected = false $scope.select_all = false @@ -41,13 +42,24 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, }) $scope.resetSelected = -> - $scope.selected_orders = {} + $scope.selected_orders.length = 0 $scope.selected = false $scope.select_all = false + $scope.checkboxes = {} + + $scope.toggleSelection = (id) -> + index = $scope.selected_orders.indexOf(id) + + if index == -1 + $scope.selected_orders.push(id) + else + $scope.selected_orders.splice(index, 1) $scope.toggleAll = -> + $scope.selected_orders.length = 0 $scope.orders.forEach (order) -> - $scope.selected_orders[order.id] = $scope.select_all + $scope.checkboxes[order.id] = $scope.select_all + $scope.selected_orders.push order.id if $scope.select_all $scope.$watch 'sortOptions', (sort) -> if sort && sort.predicate != "" @@ -56,24 +68,14 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.fetchResults() , true - $scope.$watchCollection 'selected_orders', (selected_orders) -> - if selected_orders - orders_selected = false - angular.forEach selected_orders, (checked, order_id) -> - if checked - orders_selected = true - return - - $scope.selected = orders_selected - $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) $scope.bulkInvoice = -> params = '' - angular.forEach $scope.selected_orders, (selected, order_id) -> - params += 'order_ids[]='+order_id+'&' if selected + angular.forEach $scope.selected_orders, (order_id) -> + params += 'order_ids[]='+order_id+'&' $window.open('/admin/orders/bulk_invoice?'+params) true diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 114c177d22..559f93eb72 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => '!selected'} + %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } @@ -45,7 +45,7 @@ %tbody %tr{ng: {repeat: 'order in orders track by $index', class: {even: "'even'", odd: "'odd'"}}, 'ng-class' => "'state-{{order.state}}'"} %td.align-center - %input{type: 'checkbox', 'ng-model' => 'selected_orders[order.id]'} + %input{type: 'checkbox', 'ng-model' => 'checkboxes[order.id]', 'ng-change' => 'toggleSelection(order.id)'} %td.align-center {{order.distributor_name}} %td.align-center From 7d82020657ba40e0a918a71ae22c047f97b42d95 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 5 Nov 2018 18:23:13 +0000 Subject: [PATCH 11/35] Move bulk invoice to new RESTful route --- .../controllers/orders_controller.js.coffee | 2 +- .../spree/admin/invoices_controller.rb | 29 ++++++++++++++ .../admin/orders_controller_decorator.rb | 18 --------- config/routes/spree.rb | 4 ++ .../spree/admin/invoices_controller_spec.rb | 40 +++++++++++++++++++ 5 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 app/controllers/spree/admin/invoices_controller.rb create mode 100644 spec/controllers/spree/admin/invoices_controller_spec.rb 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 From b0f75162ac412cbf07668d989825ee6b339cad3c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 18:06:47 +0000 Subject: [PATCH 12/35] Add delayed job for create bulk invoice --- .../controllers/orders_controller.js.coffee | 10 ++--- .../spree/admin/invoices_controller.rb | 22 +++------- app/jobs/bulk_invoice_job.rb | 44 +++++++++++++++++++ config/routes/spree.rb | 2 +- 4 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 app/jobs/bulk_invoice_job.rb 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 From 638dc6eada162c66794c9ebc1c7302dea6872635 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 22:46:49 +0000 Subject: [PATCH 13/35] Add polling and show action --- .../controllers/orders_controller.js.coffee | 37 ++++++++++++++++--- .../directives/invoices_modal.js.coffee | 5 +++ .../javascripts/admin/orders/orders.js.coffee | 2 +- .../admin/modals/bulk_invoice.html.haml | 16 ++++++++ app/assets/stylesheets/admin/orders.css.scss | 20 ++++++++++ .../spree/admin/invoices_controller.rb | 28 +++++++++++++- app/jobs/bulk_invoice_job.rb | 35 ++++++++---------- app/views/spree/admin/orders/index.html.haml | 2 +- config/locales/en.yml | 4 ++ config/routes/spree.rb | 4 +- 10 files changed, 124 insertions(+), 29 deletions(-) create mode 100644 app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee create mode 100644 app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml 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 896ffd7384..729674a8f3 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $window, $filter) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $timeout, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -12,6 +12,7 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.checkboxes = {} $scope.selected = false $scope.select_all = false + $scope.poll = 0 $scope.initialise = -> $scope.per_page = 15 @@ -72,8 +73,32 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.page = newPage $scope.fetchResults(newPage) - $scope.bulkInvoice = -> - $http.post("/admin/orders/invoices", {order_ids: $scope.selected_orders}).success (data) -> - console.log(data) - .error (data) -> - console.log(data) + $scope.createBulkInvoice = -> + $scope.invoice_id = null + $scope.poll = 1 + $scope.loading = true + $scope.message = null + $scope.error = null + + $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> + $scope.invoice_id = data + $scope.pollBulkInvoice() + + $scope.pollBulkInvoice = -> + console.log('Polling... ') + + $timeout(-> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 + $scope.loading = false + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return + + $scope.pollBulkInvoice() + , 5000) diff --git a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee new file mode 100644 index 0000000000..b774f05b57 --- /dev/null +++ b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee @@ -0,0 +1,5 @@ +angular.module("admin.orders").directive "invoicesModal", ($modal) -> + restrict: 'C' + link: (scope, elem, attrs, ctrl) -> + elem.on "click", (ev) => + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'bulk-invoice-modal') diff --git a/app/assets/javascripts/admin/orders/orders.js.coffee b/app/assets/javascripts/admin/orders/orders.js.coffee index 4e1ec754e3..1a8b267d30 100644 --- a/app/assets/javascripts/admin/orders/orders.js.coffee +++ b/app/assets/javascripts/admin/orders/orders.js.coffee @@ -1 +1 @@ -angular.module("admin.orders", ['admin.indexUtils', 'ngResource']) +angular.module("admin.orders", ['admin.indexUtils', 'ngResource', 'mm.foundation']) diff --git a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml new file mode 100644 index 0000000000..5e39dbab23 --- /dev/null +++ b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml @@ -0,0 +1,16 @@ +%a.close-reveal-modal{ ng: { click: '$close()' } } + %i.fa.fa-times-circle + +%h4.modal-title + = t('js.admin.orders.index.compiling_invoices') + +%p.message{ ng: { show: 'message' } } + {{message}} +%p.error{ ng: { show: 'error' } } + {{error}} + +%img.spinner{ src: "/assets/spinning-circles.svg", ng: { show: "loading" } } + +%a.button{ target: '_blank', ng: { click: 'showBulkInvoice()', href: '/admin/orders/invoices/{{invoice_id}}', show: "!loading && !error" } } + = t('js.admin.orders.index.view_file') + diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 5f53152901..2c0c37e657 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -114,3 +114,23 @@ table.index td.actions { } } } + +.bulk-invoice-modal { + text-align: center; + + .modal-title { + margin-bottom: 1.5em; + } + + .message { + margin-bottom: 1em; + } + + .error { + margin-bottom: 1em; + } + + .spinner { + + } +} diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 05062c8bab..84a0082233 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -1,17 +1,43 @@ module Spree module Admin class InvoicesController < Spree::Admin::BaseController + respond_to :json + def create - Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], filename) + Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], directory, filename) render text: filename, status: :ok end + def show + invoice_id = params[:id] + + send_file(filepath(invoice_id), type: 'application/pdf', disposition: :inline) + end + + def poll + invoice_id = params[:invoice_id] + + if File.exist? filepath(invoice_id) + render json: { created: true }, status: :ok + else + render json: { created: false }, status: :unprocessable_entity + end + end + private def filename @filename ||= Time.zone.now.to_i.to_s end + + def directory + 'tmp/invoices' + end + + def filepath(invoice_id) + @filepath ||= "#{directory}/#{invoice_id}.pdf" + end end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/jobs/bulk_invoice_job.rb index 4859606d77..b2c4745ed1 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/jobs/bulk_invoice_job.rb @@ -1,18 +1,15 @@ -BulkInvoiceJob = Struct.new(:order_ids, :filename) do +class BulkInvoiceJob include WickedPdf::PdfHelper - def perform - generate_pdf - rescue StandardError => e - log e + def initialize(order_ids, directory, filename) + @order_ids = order_ids + @directory = directory + @filename = filename end - private - - def generate_pdf + def perform pdf = CombinePDF.new - orders = Spree::Order.where(id: order_ids) - renderer = ApplicationController.new + orders = Spree::Order.where(id: @order_ids) orders.each do |order| invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", @@ -23,21 +20,21 @@ BulkInvoiceJob = Struct.new(:order_ids, :filename) do pdf << CombinePDF.parse(invoice) end - pdf.save "#{directory}/#{filename}.pdf" + pdf.save "#{file_directory}/#{@filename}.pdf" + end + + private + + def renderer + ApplicationController.new 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' + def file_directory + dir = @directory Dir.mkdir(dir) unless File.exist?(dir) dir end diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index 559f93eb72..d09afe342a 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button{'ng-click' => 'bulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} + %button.invoices-modal{'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } diff --git a/config/locales/en.yml b/config/locales/en.yml index 3f9c2f4b1b..12699b347c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2590,6 +2590,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using orders: index: per_page: "%{results} per page" + view_file: View File + compiling_invoices: Compiling Invoices + bulk_invoice_created: Bulk Invoice created + bulk_invoice_failed: Failed to create Bulk Invoice resend_user_email_confirmation: resend: "Resend" sending: "Resend..." diff --git a/config/routes/spree.rb b/config/routes/spree.rb index e3e86455f6..2e9dc0b5c8 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -76,7 +76,9 @@ Spree::Core::Engine.routes.prepend do get :managed, on: :collection collection do - resources :invoices, only: [:create] + resources :invoices, only: [:create, :show] do + get :poll + end end end end From 6b6a41cfbcace496d2994adbb78ec7988c64bce2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 19 Nov 2018 23:06:02 +0000 Subject: [PATCH 14/35] Update CSS --- .../admin/orders/directives/invoices_modal.js.coffee | 2 +- .../admin/products/directives/image_modal.js.coffee | 2 +- app/assets/stylesheets/admin/all.scss | 1 - .../simple_modal.css.scss} | 2 +- app/assets/stylesheets/admin/orders.css.scss | 10 +++------- spec/features/admin/bulk_product_update_spec.rb | 8 ++++---- 6 files changed, 10 insertions(+), 15 deletions(-) rename app/assets/stylesheets/admin/{pages/product_image_upload_modal.css.scss => components/simple_modal.css.scss} (87%) diff --git a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee index b774f05b57..0f2eabe778 100644 --- a/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee +++ b/app/assets/javascripts/admin/orders/directives/invoices_modal.js.coffee @@ -2,4 +2,4 @@ angular.module("admin.orders").directive "invoicesModal", ($modal) -> restrict: 'C' link: (scope, elem, attrs, ctrl) -> elem.on "click", (ev) => - scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'bulk-invoice-modal') + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/bulk_invoice.html', controller: ctrl, scope: scope, windowClass: 'simple-modal') diff --git a/app/assets/javascripts/admin/products/directives/image_modal.js.coffee b/app/assets/javascripts/admin/products/directives/image_modal.js.coffee index 526c14bf2a..69ca1731fd 100644 --- a/app/assets/javascripts/admin/products/directives/image_modal.js.coffee +++ b/app/assets/javascripts/admin/products/directives/image_modal.js.coffee @@ -2,5 +2,5 @@ angular.module("ofn.admin").directive "imageModal", ($modal, ProductImageService restrict: 'C' link: (scope, elem, attrs, ctrl) -> elem.on "click", (ev) => - scope.uploadModal = $modal.open(templateUrl: 'admin/modals/image_upload.html', controller: ctrl, scope: scope, windowClass: 'product-image-upload') + scope.uploadModal = $modal.open(templateUrl: 'admin/modals/image_upload.html', controller: ctrl, scope: scope, windowClass: 'simple-modal') ProductImageService.configure(scope.product) diff --git a/app/assets/stylesheets/admin/all.scss b/app/assets/stylesheets/admin/all.scss index 637f0b5d2c..4a16154bf4 100644 --- a/app/assets/stylesheets/admin/all.scss +++ b/app/assets/stylesheets/admin/all.scss @@ -17,4 +17,3 @@ @import 'variables'; @import 'components/*'; @import '*'; -@import 'pages/*'; diff --git a/app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss b/app/assets/stylesheets/admin/components/simple_modal.css.scss similarity index 87% rename from app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss rename to app/assets/stylesheets/admin/components/simple_modal.css.scss index 4dffade73e..453fe6da4f 100644 --- a/app/assets/stylesheets/admin/pages/product_image_upload_modal.css.scss +++ b/app/assets/stylesheets/admin/components/simple_modal.css.scss @@ -1,6 +1,6 @@ @import '../variables'; -.reveal-modal.product-image-upload { +.reveal-modal.simple-modal { width: 300px; .close-reveal-modal { diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 2c0c37e657..6355a4499c 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -115,22 +115,18 @@ table.index td.actions { } } -.bulk-invoice-modal { +.simple-modal { text-align: center; .modal-title { margin-bottom: 1.5em; } - .message { + .message, .error { margin-bottom: 1em; } .error { - margin-bottom: 1em; - } - - .spinner { - + color: $warning-red; } } diff --git a/spec/features/admin/bulk_product_update_spec.rb b/spec/features/admin/bulk_product_update_spec.rb index 5ea80b6e5e..10edf3ecb8 100644 --- a/spec/features/admin/bulk_product_update_spec.rb +++ b/spec/features/admin/bulk_product_update_spec.rb @@ -759,9 +759,9 @@ feature %q{ end # Shows upload modal - expect(page).to have_selector "div.reveal-modal.product-image-upload" + expect(page).to have_selector "div.reveal-modal" - within "div.reveal-modal.product-image-upload" do + within "div.reveal-modal" do # Shows preview of current image expect(page).to have_css "img.preview" @@ -773,7 +773,7 @@ feature %q{ expect(page).to have_no_css "img.spinner", visible: true end - expect(page).to have_no_selector "div.reveal-modal.product-image-upload" + expect(page).to have_no_selector "div.reveal-modal" within "table#listing_products tr#p_#{product.id}" do # New thumbnail is shown in image column @@ -783,7 +783,7 @@ feature %q{ page.find("a.image-modal").trigger('click') end - expect(page).to have_selector "div.reveal-modal.product-image-upload" + expect(page).to have_selector "div.reveal-modal" end end end From bb814f91effa369c531c92ed47af00570bd259bd Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 19:18:15 +0000 Subject: [PATCH 15/35] Extract timeout to named function --- .../controllers/orders_controller.js.coffee | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) 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 729674a8f3..a391950a7b 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -85,20 +85,20 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.pollBulkInvoice() $scope.pollBulkInvoice = -> - console.log('Polling... ') + $timeout($scope.nextPoll, 5000) - $timeout(-> - $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.nextPoll = -> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 $scope.loading = false - $scope.message = t('js.admin.orders.index.bulk_invoice_created') + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return - .error (data) -> - $scope.poll++ + $scope.pollBulkInvoice() - if $scope.poll > 10 - $scope.loading = false - $scope.error = t('js.admin.orders.index.bulk_invoice_failed') - return - - $scope.pollBulkInvoice() - , 5000) From 003014daf8ffa542d0f4c87edb46445db00f894c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 19:28:22 +0000 Subject: [PATCH 16/35] Extract invoice methods from ordersCtrl --- .../bulk_invoice_controller.js.coffee | 30 +++++++++++++++++ .../controllers/orders_controller.js.coffee | 32 +------------------ app/views/spree/admin/orders/index.html.haml | 2 +- 3 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee new file mode 100644 index 0000000000..177045f1d2 --- /dev/null +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -0,0 +1,30 @@ +angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $timeout) -> + $scope.createBulkInvoice = -> + $scope.invoice_id = null + $scope.poll = 1 + $scope.loading = true + $scope.message = null + $scope.error = null + + $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> + $scope.invoice_id = data + $scope.pollBulkInvoice() + + $scope.pollBulkInvoice = -> + $timeout($scope.nextPoll, 5000) + + $scope.nextPoll = -> + $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> + $scope.loading = false + $scope.message = t('js.admin.orders.index.bulk_invoice_created') + + .error (data) -> + $scope.poll++ + + if $scope.poll > 10 + $scope.loading = false + $scope.error = t('js.admin.orders.index.bulk_invoice_failed') + return + + $scope.pollBulkInvoice() + 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 a391950a7b..7adbba40c3 100644 --- a/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/orders_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $http, $timeout, $window, $filter) -> +angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, Orders, SortOptions, $window, $filter) -> $scope.RequestMonitor = RequestMonitor $scope.pagination = Orders.pagination $scope.orders = Orders.all @@ -72,33 +72,3 @@ angular.module("admin.orders").controller "ordersCtrl", ($scope, RequestMonitor, $scope.changePage = (newPage) -> $scope.page = newPage $scope.fetchResults(newPage) - - $scope.createBulkInvoice = -> - $scope.invoice_id = null - $scope.poll = 1 - $scope.loading = true - $scope.message = null - $scope.error = null - - $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> - $scope.invoice_id = data - $scope.pollBulkInvoice() - - $scope.pollBulkInvoice = -> - $timeout($scope.nextPoll, 5000) - - $scope.nextPoll = -> - $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> - $scope.loading = false - $scope.message = t('js.admin.orders.index.bulk_invoice_created') - - .error (data) -> - $scope.poll++ - - if $scope.poll > 10 - $scope.loading = false - $scope.error = t('js.admin.orders.index.bulk_invoice_failed') - return - - $scope.pollBulkInvoice() - diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index d09afe342a..5d98bc4a22 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -19,7 +19,7 @@ .row.index-controls{'ng-show' => '!RequestMonitor.loading && orders.length > 0'} = render partial: 'per_page_controls' - %button.invoices-modal{'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} + %button.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()', 'ng-disabled' => 'selected_orders.length == 0'} = t('.print_invoices') %table#listing_orders.index.responsive{width: "100%", 'ng-init' => 'initialise()', 'ng-show' => "!RequestMonitor.loading && orders.length > 0" } From 4f9f8adcd6bed2aa2b8ddd499c03ea7c6358a469 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 22 Nov 2018 22:57:05 +0000 Subject: [PATCH 17/35] Add Service and remove Job --- .../spree/admin/invoices_controller.rb | 24 +++-------- .../bulk_invoice_service.rb} | 37 ++++++++++++----- .../spree/admin/invoices_controller_spec.rb | 9 +++-- spec/services/bulk_invoice_service_spec.rb | 40 +++++++++++++++++++ 4 files changed, 78 insertions(+), 32 deletions(-) rename app/{jobs/bulk_invoice_job.rb => services/bulk_invoice_service.rb} (53%) create mode 100644 spec/services/bulk_invoice_service_spec.rb diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 84a0082233..204f6e80a8 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -4,40 +4,28 @@ module Spree respond_to :json def create - Delayed::Job.enqueue BulkInvoiceJob.new(params[:order_ids], directory, filename) + invoice_service = BulkInvoiceService.new + invoice_service.create_bulk_invoice(params[:order_ids]) - render text: filename, status: :ok + render json: invoice_service.id, status: :ok end def show invoice_id = params[:id] + invoice_pdf = BulkInvoiceService.new.filepath(invoice_id) - send_file(filepath(invoice_id), type: 'application/pdf', disposition: :inline) + send_file(invoice_pdf, type: 'application/pdf', disposition: :inline) end def poll invoice_id = params[:invoice_id] - if File.exist? filepath(invoice_id) + if BulkInvoiceService.new.invoice_created? invoice_id render json: { created: true }, status: :ok else render json: { created: false }, status: :unprocessable_entity end end - - private - - def filename - @filename ||= Time.zone.now.to_i.to_s - end - - def directory - 'tmp/invoices' - end - - def filepath(invoice_id) - @filepath ||= "#{directory}/#{invoice_id}.pdf" - end end end end diff --git a/app/jobs/bulk_invoice_job.rb b/app/services/bulk_invoice_service.rb similarity index 53% rename from app/jobs/bulk_invoice_job.rb rename to app/services/bulk_invoice_service.rb index b2c4745ed1..7108a747e5 100644 --- a/app/jobs/bulk_invoice_job.rb +++ b/app/services/bulk_invoice_service.rb @@ -1,15 +1,14 @@ -class BulkInvoiceJob +class BulkInvoiceService include WickedPdf::PdfHelper + attr_reader :id - def initialize(order_ids, directory, filename) - @order_ids = order_ids - @directory = directory - @filename = filename + def initialize + @id = new_invoice_id end - def perform + def create_bulk_invoice(order_ids) pdf = CombinePDF.new - orders = Spree::Order.where(id: @order_ids) + orders = Spree::Order.where(id: order_ids) orders.each do |order| invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf", @@ -20,11 +19,28 @@ class BulkInvoiceJob pdf << CombinePDF.parse(invoice) end - pdf.save "#{file_directory}/#{@filename}.pdf" + pdf.save "#{file_directory}/#{@id}.pdf" + end + handle_asynchronously :create_bulk_invoice + + def invoice_created?(invoice_id) + File.exist? filepath(invoice_id) + end + + def filepath(invoice_id) + "#{directory}/#{invoice_id}.pdf" end private + def new_invoice_id + Time.zone.now.to_i.to_s + end + + def directory + 'tmp/invoices' + end + def renderer ApplicationController.new end @@ -34,8 +50,7 @@ class BulkInvoiceJob end def file_directory - dir = @directory - Dir.mkdir(dir) unless File.exist?(dir) - dir + Dir.mkdir(directory) unless File.exist?(directory) + directory end end diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb index 80cb2f4244..efc2dc5b23 100644 --- a/spec/controllers/spree/admin/invoices_controller_spec.rb +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -2,16 +2,19 @@ require 'spec_helper' describe Spree::Admin::InvoicesController, type: :controller do let(:order) { create(:order_with_totals_and_distribution) } + let(:user) { create(:admin_user) } before do - controller.stub spree_current_user: create(:admin_user) + allow(controller).to receive(:spree_current_user) { 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.to enqueue_job Delayed::PerformableMethod + + expect(Delayed::Job.last.payload_object.method_name).to eq :create_bulk_invoice_without_delay end end @@ -37,4 +40,4 @@ describe Spree::Admin::InvoicesController, type: :controller do end end end -end \ No newline at end of file +end diff --git a/spec/services/bulk_invoice_service_spec.rb b/spec/services/bulk_invoice_service_spec.rb new file mode 100644 index 0000000000..4611a46846 --- /dev/null +++ b/spec/services/bulk_invoice_service_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe BulkInvoiceService do + let(:service) { BulkInvoiceService.new } + + describe "#start_pdf_job" do + it "starts a background process to create a pdf with multiple invoices" do + expect do + service.start_pdf_job [1, 2] + end.to enqueue_job Delayed::PerformableMethod + + expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay + end + end + + describe "#invoice_created?" do + context "when the invoice has been created" do + it "returns true" do + allow(File).to receive(:exist?).and_return(true) + + created = service.invoice_created? '45891723' + expect(created).to be_truthy + end + end + + context "when the invoice has not been created" do + it "returns false" do + created = service.invoice_created? '1234567' + expect(created).to_not be_truthy + end + end + end + + describe "#filepath" do + it "returns the filepath of a given invoice" do + filepath = service.filepath '1234567' + expect(filepath).to eq 'tmp/invoices/1234567.pdf' + end + end +end From 66ac61f591ddf4ac6245ebe7892025cd4306d84b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 25 Nov 2018 18:18:35 +0000 Subject: [PATCH 18/35] Rename background processing method --- app/controllers/spree/admin/invoices_controller.rb | 2 +- app/services/bulk_invoice_service.rb | 4 ++-- spec/controllers/spree/admin/invoices_controller_spec.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 204f6e80a8..230d01322b 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -5,7 +5,7 @@ module Spree def create invoice_service = BulkInvoiceService.new - invoice_service.create_bulk_invoice(params[:order_ids]) + invoice_service.start_pdf_job(params[:order_ids]) render json: invoice_service.id, status: :ok end diff --git a/app/services/bulk_invoice_service.rb b/app/services/bulk_invoice_service.rb index 7108a747e5..397020635e 100644 --- a/app/services/bulk_invoice_service.rb +++ b/app/services/bulk_invoice_service.rb @@ -6,7 +6,7 @@ class BulkInvoiceService @id = new_invoice_id end - def create_bulk_invoice(order_ids) + def start_pdf_job(order_ids) pdf = CombinePDF.new orders = Spree::Order.where(id: order_ids) @@ -21,7 +21,7 @@ class BulkInvoiceService pdf.save "#{file_directory}/#{@id}.pdf" end - handle_asynchronously :create_bulk_invoice + handle_asynchronously :start_pdf_job def invoice_created?(invoice_id) File.exist? filepath(invoice_id) diff --git a/spec/controllers/spree/admin/invoices_controller_spec.rb b/spec/controllers/spree/admin/invoices_controller_spec.rb index efc2dc5b23..1eff65ba2c 100644 --- a/spec/controllers/spree/admin/invoices_controller_spec.rb +++ b/spec/controllers/spree/admin/invoices_controller_spec.rb @@ -14,7 +14,7 @@ describe Spree::Admin::InvoicesController, type: :controller do spree_post :create, order_ids: [order.id] end.to enqueue_job Delayed::PerformableMethod - expect(Delayed::Job.last.payload_object.method_name).to eq :create_bulk_invoice_without_delay + expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay end end From 0e478ff501334eddc633cb7384eb087bf51fc2fc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 14:20:26 +0000 Subject: [PATCH 19/35] Increase polling to 150 seconds maximum before showing error message. --- .../admin/orders/controllers/bulk_invoice_controller.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee index 177045f1d2..9c8e5e8286 100644 --- a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -21,7 +21,7 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti .error (data) -> $scope.poll++ - if $scope.poll > 10 + if $scope.poll > 30 $scope.loading = false $scope.error = t('js.admin.orders.index.bulk_invoice_failed') return From e624faaacb42e1a993edfff929c941574f733265 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 14:31:04 +0000 Subject: [PATCH 20/35] Add 'please wait' message to bulk invoice modal --- .../templates/admin/modals/bulk_invoice.html.haml | 5 ++--- app/assets/stylesheets/admin/orders.css.scss | 4 ++++ config/locales/en.yml | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml index 5e39dbab23..16ddb39508 100644 --- a/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml +++ b/app/assets/javascripts/templates/admin/modals/bulk_invoice.html.haml @@ -1,6 +1,3 @@ -%a.close-reveal-modal{ ng: { click: '$close()' } } - %i.fa.fa-times-circle - %h4.modal-title = t('js.admin.orders.index.compiling_invoices') @@ -10,6 +7,8 @@ {{error}} %img.spinner{ src: "/assets/spinning-circles.svg", ng: { show: "loading" } } +%p{ ng: { show: "loading" } } + = t('js.admin.orders.index.please_wait') %a.button{ target: '_blank', ng: { click: 'showBulkInvoice()', href: '/admin/orders/invoices/{{invoice_id}}', show: "!loading && !error" } } = t('js.admin.orders.index.view_file') diff --git a/app/assets/stylesheets/admin/orders.css.scss b/app/assets/stylesheets/admin/orders.css.scss index 6355a4499c..4858c0685a 100644 --- a/app/assets/stylesheets/admin/orders.css.scss +++ b/app/assets/stylesheets/admin/orders.css.scss @@ -126,6 +126,10 @@ table.index td.actions { margin-bottom: 1em; } + .spinner { + margin-bottom: 1em; + } + .error { color: $warning-red; } diff --git a/config/locales/en.yml b/config/locales/en.yml index 12699b347c..932fb97207 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2594,6 +2594,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using compiling_invoices: Compiling Invoices bulk_invoice_created: Bulk Invoice created bulk_invoice_failed: Failed to create Bulk Invoice + please_wait: Please wait until the PDF is ready before closing this modal. resend_user_email_confirmation: resend: "Resend" sending: "Resend..." From 4d3aed8467ac419519102f5801e763581ae9253a Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 17 Jan 2019 14:49:43 +1100 Subject: [PATCH 21/35] Avoid deprecation warnings of momentjs --- app/views/layouts/_i18n_script.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_i18n_script.html.haml b/app/views/layouts/_i18n_script.html.haml index 40884082ac..70cfafba83 100644 --- a/app/views/layouts/_i18n_script.html.haml +++ b/app/views/layouts/_i18n_script.html.haml @@ -2,4 +2,4 @@ I18n.default_locale = "#{I18n.default_locale}"; I18n.locale = "#{I18n.locale}"; I18n.fallbacks = true; - moment.lang([I18n.locale, 'en']); + moment.locale([I18n.locale, 'en']); From e7e208061f554a4c2d540f26ea39eb9bbb420443 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 21 Dec 2018 20:01:16 +0000 Subject: [PATCH 22/35] Assign polling numbers to variables and add comments --- .../orders/controllers/bulk_invoice_controller.js.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee index 9c8e5e8286..0442564e2e 100644 --- a/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee +++ b/app/assets/javascripts/admin/orders/controllers/bulk_invoice_controller.js.coffee @@ -5,13 +5,15 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti $scope.loading = true $scope.message = null $scope.error = null + $scope.poll_wait = 5 # 5 Seconds between each check + $scope.poll_retries = 80 # Maximum checks before stopping $http.post('/admin/orders/invoices', {order_ids: $scope.selected_orders}).success (data) -> $scope.invoice_id = data $scope.pollBulkInvoice() $scope.pollBulkInvoice = -> - $timeout($scope.nextPoll, 5000) + $timeout($scope.nextPoll, $scope.poll_wait * 1000) $scope.nextPoll = -> $http.get('/admin/orders/invoices/'+$scope.invoice_id+'/poll').success (data) -> @@ -21,7 +23,7 @@ angular.module("admin.orders").controller "bulkInvoiceCtrl", ($scope, $http, $ti .error (data) -> $scope.poll++ - if $scope.poll > 30 + if $scope.poll > $scope.poll_retries $scope.loading = false $scope.error = t('js.admin.orders.index.bulk_invoice_failed') return From adfa6b306cced6f57418af3285e0de4524eb37d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 17 Jan 2019 19:08:33 +0000 Subject: [PATCH 23/35] Bump paper_trail from 3.0.9 to 5.2.3 Bumps [paper_trail](https://github.com/airblade/paper_trail) from 3.0.9 to 5.2.3. - [Release notes](https://github.com/airblade/paper_trail/releases) - [Changelog](https://github.com/paper-trail-gem/paper_trail/blob/master/CHANGELOG.md) - [Commits](https://github.com/airblade/paper_trail/compare/v3.0.9...v5.2.3) Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 3f59333669..f36ddced18 100644 --- a/Gemfile +++ b/Gemfile @@ -68,7 +68,7 @@ gem 'roadie-rails', '~> 1.1.1' gem 'figaro' gem 'blockenspiel' gem 'acts-as-taggable-on', '~> 3.4' -gem 'paper_trail', '~> 3.0.8' +gem 'paper_trail', '~> 5.2.3' gem 'diffy' gem 'skylight', '< 2.0' diff --git a/Gemfile.lock b/Gemfile.lock index f6f333df16..e4c65940d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -551,9 +551,9 @@ GEM rack (>= 1.2, < 3) oj (3.7.4) orm_adapter (0.5.0) - paper_trail (3.0.9) - activerecord (>= 3.0, < 5.0) - activesupport (>= 3.0, < 5.0) + paper_trail (5.2.3) + activerecord (>= 3.0, < 6.0) + request_store (~> 1.1) paperclip (3.5.4) activemodel (>= 3.0.0) activesupport (>= 3.0.0) @@ -629,6 +629,8 @@ GEM json (~> 1.4) redcarpet (3.2.3) ref (2.0.0) + request_store (1.4.1) + rack (>= 1.4) roadie (3.4.0) css_parser (~> 1.4) nokogiri (~> 1.5) @@ -748,9 +750,6 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - websocket-driver (0.7.0) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) whenever (0.10.0) chronic (>= 0.6.3) wicked_pdf (1.1.0) @@ -819,7 +818,7 @@ DEPENDENCIES oauth2 (~> 1.4.1) ofn-qz! oj - paper_trail (~> 3.0.8) + paper_trail (~> 5.2.3) paperclip pg pry-byebug (>= 3.4.3) From 560e52a0ce26a5d985d4bc4f1275781cef02c313 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 17 Jan 2019 19:17:20 +0000 Subject: [PATCH 24/35] Bump delayed_job_active_record from 4.1.2 to 4.1.3 Bumps [delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record) from 4.1.2 to 4.1.3. - [Release notes](https://github.com/collectiveidea/delayed_job_active_record/releases) - [Commits](https://github.com/collectiveidea/delayed_job_active_record/compare/v4.1.2...v4.1.3) Signed-off-by: dependabot[bot] --- Gemfile.lock | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f6f333df16..59995a7842 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -264,8 +264,8 @@ GEM debugger-linecache (1.2.0) delayed_job (4.1.5) activesupport (>= 3.0, < 5.3) - delayed_job_active_record (4.1.2) - activerecord (>= 3.0, < 5.2) + delayed_job_active_record (4.1.3) + activerecord (>= 3.0, < 5.3) delayed_job (>= 3.0, < 5) devise (2.2.8) bcrypt-ruby (~> 3.0) @@ -748,9 +748,6 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - websocket-driver (0.7.0) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) whenever (0.10.0) chronic (>= 0.6.3) wicked_pdf (1.1.0) From 2e993542a787b45020e94da726b137aca6e1d9b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 17 Jan 2019 19:20:09 +0000 Subject: [PATCH 25/35] Bump foundation-rails from 5.5.0.0 to 5.5.2.1 Bumps [foundation-rails](http://foundation.zurb.com) from 5.5.0.0 to 5.5.2.1. Signed-off-by: dependabot[bot] --- Gemfile.lock | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f6f333df16..4d53ab0eac 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -450,9 +450,9 @@ GEM foundation-icons-sass-rails (3.0.0) railties (>= 3.1.1) sass-rails (>= 3.1.1) - foundation-rails (5.5.0.0) + foundation-rails (5.5.2.1) railties (>= 3.1.0) - sass (>= 3.2.0, < 3.4) + sass (>= 3.3.0, < 3.5) fuubar (2.3.2) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) @@ -748,9 +748,6 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - websocket-driver (0.7.0) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) whenever (0.10.0) chronic (>= 0.6.3) wicked_pdf (1.1.0) From 1e01cf81ec00f36d5036548e63a6946454b40d2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 18 Jan 2019 16:51:42 +0000 Subject: [PATCH 26/35] Bump diffy from 3.1.0 to 3.3.0 Bumps [diffy](https://github.com/samg/diffy) from 3.1.0 to 3.3.0. - [Release notes](https://github.com/samg/diffy/releases) - [Changelog](https://github.com/samg/diffy/blob/master/CHANGELOG) - [Commits](https://github.com/samg/diffy/compare/3.1.0...3.3.0) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 36c333e36d..d79b08ea13 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -277,7 +277,7 @@ GEM devise-encryptable (0.1.2) devise (>= 2.1.0) diff-lcs (1.3) - diffy (3.1.0) + diffy (3.3.0) docile (1.3.1) dry-inflector (0.1.2) em-websocket (0.5.1) From 49e3aa50700652598714ad8968752247b392fe44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 18 Jan 2019 16:52:13 +0000 Subject: [PATCH 27/35] Bump daemons from 1.2.2 to 1.3.1 Bumps [daemons](https://github.com/thuehlinger/daemons) from 1.2.2 to 1.3.1. - [Release notes](https://github.com/thuehlinger/daemons/releases) - [Changelog](https://github.com/thuehlinger/daemons/blob/master/Releases) - [Commits](https://github.com/thuehlinger/daemons/compare/v1.2.2...v1.3.1) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 36c333e36d..9007d3212e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -256,7 +256,7 @@ GEM safe_yaml (~> 1.0.0) css_parser (1.6.0) addressable - daemons (1.2.2) + daemons (1.3.1) dalli (2.7.2) database_cleaner (0.7.1) db2fog (0.9.0) From 3929689d485324c6f5eb090f9ba19c4cae5dbcce Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 18 Jan 2019 19:06:42 +0000 Subject: [PATCH 28/35] Ensure login via modal is completed --- spec/features/consumer/shopping/embedded_shopfronts_spec.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/features/consumer/shopping/embedded_shopfronts_spec.rb b/spec/features/consumer/shopping/embedded_shopfronts_spec.rb index 5a97040e32..4a70dbf672 100644 --- a/spec/features/consumer/shopping/embedded_shopfronts_spec.rb +++ b/spec/features/consumer/shopping/embedded_shopfronts_spec.rb @@ -115,13 +115,15 @@ feature "Using embedded shopfront functionality", js: true do end def login_with_modal - expect(page).to have_selector 'div.login-modal', visible: true + page.has_selector? 'div.login-modal', visible: true within 'div.login-modal' do fill_in "Email", with: user.email fill_in "Password", with: user.password find('input[type="submit"]').click end + + page.has_no_selector? 'div.login-modal', visible: true end def logout_via_navigation From 6f7a351ffa847fda427d59065717e086cb2b2ce7 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 18 Jan 2019 14:51:35 +0000 Subject: [PATCH 29/35] Update knapsack report to get build jobs more balanced --- knapsack_rspec_report.json | 560 ++++++++++++++++++++----------------- 1 file changed, 307 insertions(+), 253 deletions(-) diff --git a/knapsack_rspec_report.json b/knapsack_rspec_report.json index b37b9e78ab..48e60e521d 100644 --- a/knapsack_rspec_report.json +++ b/knapsack_rspec_report.json @@ -1,255 +1,309 @@ { - "spec/controllers/admin/accounts_and_billing_settings_controller_spec.rb": 5.231297254562378, - "spec/controllers/admin/bulk_line_items_controller_spec.rb": 22.596107006072998, - "spec/controllers/admin/business_model_configuration_controller_spec.rb": 0.2459728717803955, - "spec/controllers/admin/column_preferences_controller_spec.rb": 0.20803070068359375, - "spec/controllers/admin/customers_controller_spec.rb": 1.376739263534546, - "spec/controllers/admin/enterprises_controller_spec.rb": 6.768229722976685, - "spec/controllers/admin/inventory_items_controller_spec.rb": 3.054029941558838, - "spec/controllers/admin/order_cycles_controller_spec.rb": 3.0542848110198975, - "spec/controllers/admin/stripe_accounts_controller_spec.rb": 0.8989059925079346, - "spec/controllers/admin/stripe_connect_settings_controller_spec.rb": 0.2587745189666748, - "spec/controllers/admin/tag_rules_controller_spec.rb": 0.2904040813446045, - "spec/controllers/admin/variant_overrides_controller_spec.rb": 4.612747669219971, - "spec/controllers/api/enterprises_controller_spec.rb": 0.2900538444519043, - "spec/controllers/api/order_cycles_controller_spec.rb": 2.348436117172241, - "spec/controllers/api/statuses_controller_spec.rb": 0.042992353439331055, - "spec/controllers/base_controller_spec.rb": 0.02629542350769043, - "spec/controllers/cart_controller_spec.rb": 1.225327968597412, - "spec/controllers/checkout_controller_spec.rb": 3.6859514713287354, - "spec/controllers/enterprise_confirmations_controller_spec.rb": 1.194505214691162, - "spec/controllers/enterprises_controller_spec.rb": 4.918919563293457, - "spec/controllers/groups_controller_spec.rb": 0.6275069713592529, - "spec/controllers/line_items_controller_spec.rb": 14.443254947662354, - "spec/controllers/registration_controller_spec.rb": 0.14096307754516602, - "spec/controllers/shop_controller_spec.rb": 8.100497722625732, - "spec/controllers/shops_controller_spec.rb": 0.3084068298339844, - "spec/controllers/spree/admin/adjustments_controller_spec.rb": 1.329253911972046, - "spec/controllers/spree/admin/base_controller_spec.rb": 0.7723827362060547, - "spec/controllers/spree/admin/line_items_controller_spec.rb": 8.575975179672241, - "spec/controllers/spree/admin/orders_controller_spec.rb": 19.742189645767212, - "spec/controllers/spree/admin/overview_controller_spec.rb": 0.9424021244049072, - "spec/controllers/spree/admin/payment_methods_controller_spec.rb": 1.973388671875, - "spec/controllers/spree/admin/payments_controller_spec.rb": 1.269498586654663, - "spec/controllers/spree/admin/products_controller_spec.rb": 2.335909843444824, - "spec/controllers/spree/admin/reports_controller_spec.rb": 67.61368489265442, - "spec/controllers/spree/admin/search_controller_spec.rb": 1.2840144634246826, - "spec/controllers/spree/admin/variants_controller_spec.rb": 2.7421791553497314, - "spec/controllers/spree/api/line_items_controller_spec.rb": 0.46973514556884766, - "spec/controllers/spree/api/products_controller_spec.rb": 6.981335401535034, - "spec/controllers/spree/api/variants_controller_spec.rb": 4.626863479614258, - "spec/controllers/spree/checkout_controller_spec.rb": 0.3406698703765869, - "spec/controllers/spree/credit_cards_controller_spec.rb": 0.2609858512878418, - "spec/controllers/spree/orders_controller_spec.rb": 15.727391958236694, - "spec/controllers/spree/paypal_controller_spec.rb": 0.44188451766967773, - "spec/controllers/spree/store_controller_spec.rb": 0.0373380184173584, - "spec/controllers/spree/user_sessions_controller_spec.rb": 0.0863029956817627, - "spec/controllers/spree/users_controller_spec.rb": 3.2287402153015137, - "spec/controllers/stripe/callbacks_controller_spec.rb": 0.6100258827209473, - "spec/controllers/stripe/webhooks_controller_spec.rb": 0.2559084892272949, - "spec/controllers/user_passwords_controller_spec.rb": 0.36202287673950195, - "spec/controllers/user_registrations_controller_spec.rb": 0.9115951061248779, - "spec/features/admin/account_spec.rb": 0.3465397357940674, - "spec/features/admin/accounts_and_billing_settings_spec.rb": 26.03809142112732, - "spec/features/admin/adjustments_spec.rb": 6.25669527053833, - "spec/features/admin/authentication_spec.rb": 21.786041259765625, - "spec/features/admin/bulk_order_management_spec.rb": 115.93249201774597, - "spec/features/admin/bulk_product_update_spec.rb": 68.58272576332092, - "spec/features/admin/business_model_configuration_spec.rb": 2.94291353225708, - "spec/features/admin/caching_spec.rb": 1.3311190605163574, - "spec/features/admin/content_spec.rb": 3.0220959186553955, - "spec/features/admin/customers_spec.rb": 49.07428789138794, - "spec/features/admin/enterprise_fees_spec.rb": 48.00747013092041, - "spec/features/admin/enterprise_groups_spec.rb": 9.854930400848389, - "spec/features/admin/enterprise_relationships_spec.rb": 12.521416187286377, - "spec/features/admin/enterprise_roles_spec.rb": 5.4587085247039795, - "spec/features/admin/enterprise_user_spec.rb": 3.196011781692505, - "spec/features/admin/enterprises/index_spec.rb": 7.11551308631897, - "spec/features/admin/enterprises_spec.rb": 41.415743350982666, - "spec/features/admin/external_services_spec.rb": 0.42931294441223145, - "spec/features/admin/image_settings_spec.rb": 0.6306824684143066, - "spec/features/admin/multilingual_spec.rb": 2.5018086433410645, - "spec/features/admin/order_cycles_spec.rb": 88.5523087978363, - "spec/features/admin/orders_spec.rb": 83.61423802375793, - "spec/features/admin/overview_spec.rb": 7.7071874141693115, - "spec/features/admin/payment_method_spec.rb": 59.937379360198975, - "spec/features/admin/product_import_spec.rb": 28.90480065345764, - "spec/features/admin/products_spec.rb": 24.375163078308105, - "spec/features/admin/reports_spec.rb": 148.31510734558105, - "spec/features/admin/shipping_methods_spec.rb": 41.64254307746887, - "spec/features/admin/tag_rules_spec.rb": 24.11813521385193, - "spec/features/admin/tax_settings_spec.rb": 0.7185473442077637, - "spec/features/admin/variant_overrides_spec.rb": 64.81467270851135, - "spec/features/admin/variants_spec.rb": 4.787501096725464, - "spec/features/consumer/account/cards_spec.rb": 2.3101065158843994, - "spec/features/consumer/account/settings_spec.rb": 1.8829660415649414, - "spec/features/consumer/account_spec.rb": 9.903708934783936, - "spec/features/consumer/authentication_spec.rb": 15.550791501998901, - "spec/features/consumer/external_services_spec.rb": 0.6487374305725098, - "spec/features/consumer/groups_spec.rb": 8.367521286010742, - "spec/features/consumer/multilingual_spec.rb": 7.053480386734009, - "spec/features/consumer/producers_spec.rb": 18.65375566482544, - "spec/features/consumer/registration_spec.rb": 7.43431282043457, - "spec/features/consumer/shopping/cart_spec.rb": 17.678903579711914, - "spec/features/consumer/shopping/checkout_auth_spec.rb": 8.467353820800781, - "spec/features/consumer/shopping/checkout_spec.rb": 133.41244983673096, - "spec/features/consumer/shopping/embedded_shopfronts_spec.rb": 25.706701517105103, - "spec/features/consumer/shopping/orders_spec.rb": 22.137547492980957, - "spec/features/consumer/shopping/products_spec.rb": 5.580048084259033, - "spec/features/consumer/shopping/shopping_spec.rb": 90.50256371498108, - "spec/features/consumer/shopping/variant_overrides_spec.rb": 79.63850092887878, - "spec/features/consumer/shops_spec.rb": 31.536261081695557, - "spec/features/consumer/sitemap_spec.rb": 0.1925489902496338, - "spec/helpers/admin/business_model_configuration_helper_spec.rb": 2.6311347484588623, - "spec/helpers/checkout_helper_spec.rb": 0.4003927707672119, - "spec/helpers/enterprises_helper_spec.rb": 4.848005533218384, - "spec/helpers/groups_helper_spec.rb": 0.0399932861328125, - "spec/helpers/html_helper_spec.rb": 0.13132405281066895, - "spec/helpers/i18n_helper_spec.rb": 0.6523675918579102, - "spec/helpers/injection_helper_spec.rb": 25.931228160858154, - "spec/helpers/navigation_helper_spec.rb": 0.14050841331481934, - "spec/helpers/order_cycles_helper_spec.rb": 1.0060243606567383, - "spec/helpers/products_helper_spec.rb": 0.30429863929748535, - "spec/helpers/shared_helper_spec.rb": 0.12117528915405273, - "spec/helpers/shop_helper_spec.rb": 0.1214911937713623, - "spec/helpers/spree/admin/base_helper_spec.rb": 0.01846480369567871, - "spec/helpers/spree/orders_helper_spec.rb": 0.17263531684875488, - "spec/jobs/confirm_order_job_spec.rb": 0.09812569618225098, - "spec/jobs/confirm_signup_job_spec.rb": 0.05832862854003906, - "spec/jobs/finalize_account_invoices_spec.rb": 8.195128202438354, - "spec/jobs/heartbeat_job_spec.rb": 0.03887796401977539, - "spec/jobs/order_cycle_notification_job_spec.rb": 3.3479576110839844, - "spec/jobs/products_cache_integrity_checker_job_spec.rb": 0.39238452911376953, - "spec/jobs/refresh_products_cache_job_spec.rb": 0.18103408813476562, - "spec/jobs/update_account_invoices_spec.rb": 23.458678722381592, - "spec/jobs/update_billable_periods_spec.rb": 8.034762144088745, - "spec/jobs/welcome_enterprise_job_spec.rb": 0.11145663261413574, - "spec/lib/open_food_network/bulk_coop_report_spec.rb": 7.599647283554077, - "spec/lib/open_food_network/cached_products_renderer_spec.rb": 0.1418139934539795, - "spec/lib/open_food_network/customers_report_spec.rb": 3.9353175163269043, - "spec/lib/open_food_network/distribution_change_validator_spec.rb": 0.8315308094024658, - "spec/lib/open_food_network/enterprise_fee_applicator_spec.rb": 1.2710399627685547, - "spec/lib/open_food_network/enterprise_fee_calculator_spec.rb": 12.885159969329834, - "spec/lib/open_food_network/enterprise_injection_data_spec.rb": 0.4765431880950928, - "spec/lib/open_food_network/enterprise_issue_validator_spec.rb": 0.13011479377746582, - "spec/lib/open_food_network/feature_toggle_spec.rb": 0.03280758857727051, - "spec/lib/open_food_network/group_buy_report_spec.rb": 6.7778332233428955, - "spec/lib/open_food_network/last_used_address_spec.rb": 0.09460186958312988, - "spec/lib/open_food_network/lettuce_share_report_spec.rb": 4.594276428222656, - "spec/lib/open_food_network/option_value_namer_spec.rb": 0.21388483047485352, - "spec/lib/open_food_network/order_and_distributor_report_spec.rb": 1.823974847793579, - "spec/lib/open_food_network/order_cycle_form_applicator_spec.rb": 10.872497081756592, - "spec/lib/open_food_network/order_cycle_management_report_spec.rb": 3.632455587387085, - "spec/lib/open_food_network/order_cycle_permissions_spec.rb": 38.506632566452026, - "spec/lib/open_food_network/order_grouper_spec.rb": 0.7316944599151611, - "spec/lib/open_food_network/orders_and_fulfillments_report_spec.rb": 8.427381753921509, - "spec/lib/open_food_network/packing_report_spec.rb": 10.03055715560913, - "spec/lib/open_food_network/permissions_spec.rb": 16.32823085784912, - "spec/lib/open_food_network/products_and_inventory_report_spec.rb": 6.8276660442352295, - "spec/lib/open_food_network/products_cache_refreshment_spec.rb": 0.5387349128723145, - "spec/lib/open_food_network/products_cache_spec.rb": 22.35028576850891, - "spec/lib/open_food_network/products_renderer_spec.rb": 8.424294710159302, - "spec/lib/open_food_network/property_merge_spec.rb": 0.3863382339477539, - "spec/lib/open_food_network/referer_parser_spec.rb": 0.04019641876220703, - "spec/lib/open_food_network/reports/report_spec.rb": 0.7350554466247559, - "spec/lib/open_food_network/reports/row_spec.rb": 0.026851654052734375, - "spec/lib/open_food_network/reports/rule_spec.rb": 0.09334635734558105, - "spec/lib/open_food_network/sales_tax_report_spec.rb": 0.1878979206085205, - "spec/lib/open_food_network/scope_variant_to_hub_spec.rb": 7.45311975479126, - "spec/lib/open_food_network/tag_rule_applicator_spec.rb": 3.5973258018493652, - "spec/lib/open_food_network/user_balance_calculator_spec.rb": 11.818486452102661, - "spec/lib/open_food_network/users_and_enterprises_report_spec.rb": 0.6276686191558838, - "spec/lib/open_food_network/xero_invoices_report_spec.rb": 1.8177030086517334, - "spec/lib/spree/localized_number_spec.rb": 0.29198145866394043, - "spec/lib/spree/product_filters_spec.rb": 0.29789209365844727, - "spec/lib/stripe/account_connector_spec.rb": 0.524559497833252, - "spec/lib/stripe/webhook_handler_spec.rb": 0.1431596279144287, - "spec/mailers/enterprise_mailer_spec.rb": 1.193335771560669, - "spec/mailers/order_mailer_spec.rb": 3.0489273071289062, - "spec/mailers/producer_mailer_spec.rb": 42.81753611564636, - "spec/mailers/user_mailer_spec.rb": 0.2511627674102783, - "spec/models/adjustment_metadata_spec.rb": 0.3891136646270752, - "spec/models/billable_period_spec.rb": 8.415679931640625, - "spec/models/calculator/flat_percent_per_item_spec.rb": 0.07378292083740234, - "spec/models/calculator/weight_spec.rb": 0.0426182746887207, - "spec/models/cart_spec.rb": 9.241716384887695, - "spec/models/column_preference_spec.rb": 0.22501087188720703, - "spec/models/content_configuration_spec.rb": 0.021521329879760742, - "spec/models/coordinator_fee_spec.rb": 0.27747178077697754, - "spec/models/customer_spec.rb": 1.515493631362915, - "spec/models/enterprise_caching_spec.rb": 6.312411785125732, - "spec/models/enterprise_fee_spec.rb": 7.028886079788208, - "spec/models/enterprise_group_spec.rb": 0.7585678100585938, - "spec/models/enterprise_relationship_spec.rb": 12.410935878753662, - "spec/models/enterprise_spec.rb": 25.358253717422485, - "spec/models/exchange_fee_spec.rb": 0.5882563591003418, - "spec/models/exchange_spec.rb": 21.202465295791626, - "spec/models/inventory_item_spec.rb": 0.6087477207183838, - "spec/models/model_set_spec.rb": 0.3002743721008301, - "spec/models/order_cycle_spec.rb": 40.94192624092102, - "spec/models/producer_property_spec.rb": 3.9750430583953857, - "spec/models/product_distribution_spec.rb": 4.241419792175293, - "spec/models/product_importer_spec.rb": 0.14985227584838867, - "spec/models/spree/ability_spec.rb": 22.765486240386963, - "spec/models/spree/addresses_spec.rb": 0.14852142333984375, - "spec/models/spree/adjustment_spec.rb": 17.481226205825806, - "spec/models/spree/calculator/flat_percent_item_total_spec.rb": 0.049912214279174805, - "spec/models/spree/calculator/flat_rate_spec.rb": 0.036081552505493164, - "spec/models/spree/calculator/flexi_rate_spec.rb": 0.08440423011779785, - "spec/models/spree/calculator/per_item_spec.rb": 0.044466495513916016, - "spec/models/spree/calculator/price_sack_spec.rb": 0.3801143169403076, - "spec/models/spree/classification_spec.rb": 1.6538631916046143, - "spec/models/spree/gateway/stripe_connect_spec.rb": 0.07758426666259766, - "spec/models/spree/image_spec.rb": 3.194413661956787, - "spec/models/spree/line_item_spec.rb": 29.77402400970459, - "spec/models/spree/option_type_spec.rb": 0.6066544055938721, - "spec/models/spree/option_value_spec.rb": 0.6264123916625977, - "spec/models/spree/order_populator_spec.rb": 3.1494662761688232, - "spec/models/spree/order_spec.rb": 38.655128955841064, - "spec/models/spree/order_updater_spec.rb": 0.09711384773254395, - "spec/models/spree/payment_method_spec.rb": 0.5516519546508789, - "spec/models/spree/payment_spec.rb": 6.465588808059692, - "spec/models/spree/preference_spec.rb": 0.08811593055725098, - "spec/models/spree/preferences/file_configuration_spec.rb": 0.08510112762451172, - "spec/models/spree/price_spec.rb": 1.648946762084961, - "spec/models/spree/product_property_spec.rb": 0.5287599563598633, - "spec/models/spree/product_spec.rb": 28.76319146156311, - "spec/models/spree/property_spec.rb": 10.249433517456055, - "spec/models/spree/shipping_method_spec.rb": 3.900803565979004, - "spec/models/spree/tax_rate_spec.rb": 0.5018000602722168, - "spec/models/spree/taxon_spec.rb": 3.4304709434509277, - "spec/models/spree/user_spec.rb": 1.047358751296997, - "spec/models/spree/variant_spec.rb": 31.87218427658081, - "spec/models/stripe_account_spec.rb": 0.4948694705963135, - "spec/models/tag_rule/discount_order_spec.rb": 0.25345325469970703, - "spec/models/tag_rule/filter_order_cycles_spec.rb": 0.650986909866333, - "spec/models/tag_rule/filter_payment_methods_spec.rb": 0.5120558738708496, - "spec/models/tag_rule/filter_products_spec.rb": 0.3211348056793213, - "spec/models/tag_rule/filter_shipping_methods_spec.rb": 1.702136516571045, - "spec/models/tag_rule_spec.rb": 0.12991762161254883, - "spec/models/variant_override_spec.rb": 10.835025072097778, - "spec/performance/injection_helper_spec.rb": 25.893826007843018, - "spec/performance/orders_controller_spec.rb": 11.951191425323486, - "spec/performance/shop_controller_spec.rb": 25.32699728012085, - "spec/requests/checkout/failed_checkout_spec.rb": 4.827032566070557, - "spec/requests/checkout/paypal_spec.rb": 3.488879680633545, - "spec/requests/checkout/stripe_connect_spec.rb": 24.675408363342285, - "spec/requests/embedded_shopfronts_headers_spec.rb": 1.0479702949523926, - "spec/requests/large_request_spec.rb": 0.0511469841003418, - "spec/requests/shop_spec.rb": 2.5200445652008057, - "spec/serializers/admin/customer_serializer_spec.rb": 0.5285234451293945, - "spec/serializers/admin/enterprise_serializer_spec.rb": 0.11949610710144043, - "spec/serializers/admin/exchange_serializer_spec.rb": 4.8692967891693115, - "spec/serializers/admin/for_order_cycle/enterprise_serializer_spec.rb": 2.398012399673462, - "spec/serializers/admin/for_order_cycle/supplied_product_serializer_spec.rb": 0.727931022644043, - "spec/serializers/admin/index_enterprise_serializer_spec.rb": 0.46167540550231934, - "spec/serializers/admin/variant_override_serializer_spec.rb": 0.3426964282989502, - "spec/serializers/credit_card_serializer_spec.rb": 0.036983489990234375, - "spec/serializers/enterprise_serializer_spec.rb": 0.3069310188293457, - "spec/serializers/order_serializer_spec.rb": 3.8332817554473877, - "spec/serializers/spree/product_serializer_spec.rb": 1.4425926208496094, - "spec/serializers/spree/variant_serializer_spec.rb": 0.35779905319213867, - "spec/serializers/variant_serializer_spec.rb": 0.3632540702819824, - "spec/services/reset_order_service_spec.rb": 0.058028221130371094, - "spec/views/json/producers.json.rabl_spec.rb": 0.16114568710327148 + "spec/features/admin/reports_spec.rb": 32.33485126495361, + "spec/features/consumer/shopping/checkout_spec.rb": 77.00147581100464, + "spec/features/admin/bulk_order_management_spec.rb": 94.23817181587219, + "spec/features/consumer/shopping/shopping_spec.rb": 57.57538843154907, + "spec/features/admin/order_cycles_spec.rb": 67.14056634902954, + "spec/features/admin/orders_spec.rb": 159.83089971542358, + "spec/features/consumer/shopping/variant_overrides_spec.rb": 47.86229372024536, + "spec/features/admin/bulk_product_update_spec.rb": 49.01330375671387, + "spec/controllers/spree/admin/reports_controller_spec.rb": 17.4490065574646, + "spec/features/admin/variant_overrides_spec.rb": 74.03039908409119, + "spec/features/admin/payment_method_spec.rb": 45.823960065841675, + "spec/features/admin/customers_spec.rb": 20.979352474212646, + "spec/features/admin/enterprise_fees_spec.rb": 9.658112525939941, + "spec/mailers/producer_mailer_spec.rb": 15.770819425582886, + "spec/features/admin/shipping_methods_spec.rb": 35.69040298461914, + "spec/features/admin/enterprises_spec.rb": 34.00054430961609, + "spec/models/order_cycle_spec.rb": 18.42837905883789, + "spec/models/spree/order_spec.rb": 18.210355758666992, + "spec/lib/open_food_network/order_cycle_permissions_spec.rb": 16.405953884124756, + "spec/models/spree/variant_spec.rb": 11.72682499885559, + "spec/features/consumer/shops_spec.rb": 17.858718395233154, + "spec/models/spree/line_item_spec.rb": 15.752468585968018, + "spec/features/admin/product_import_spec.rb": 50.21386241912842, + "spec/models/spree/product_spec.rb": 27.079585075378418, + "spec/features/admin/accounts_and_billing_settings_spec.rb": 6.299689292907715, + "spec/helpers/injection_helper_spec.rb": 21.95306968688965, + "spec/features/consumer/shopping/embedded_shopfronts_spec.rb": 20.062220335006714, + "spec/models/enterprise_spec.rb": 12.435938835144043, + "spec/requests/checkout/stripe_connect_spec.rb": 14.232444524765015, + "spec/features/admin/products_spec.rb": 18.0501868724823, + "spec/features/admin/tag_rules_spec.rb": 30.391066312789917, + "spec/jobs/update_account_invoices_spec.rb": 19.378047943115234, + "spec/models/spree/ability_spec.rb": 15.214293479919434, + "spec/controllers/admin/bulk_line_items_controller_spec.rb": 17.393607139587402, + "spec/lib/open_food_network/products_cache_spec.rb": 10.823762893676758, + "spec/features/consumer/shopping/orders_spec.rb": 21.081857681274414, + "spec/features/admin/authentication_spec.rb": 2.2332425117492676, + "spec/models/exchange_spec.rb": 17.91614556312561, + "spec/controllers/spree/admin/orders_controller_spec.rb": 2.875645160675049, + "spec/features/consumer/producers_spec.rb": 12.087966918945312, + "spec/features/consumer/shopping/cart_spec.rb": 15.776587009429932, + "spec/models/spree/adjustment_spec.rb": 13.07254433631897, + "spec/lib/open_food_network/permissions_spec.rb": 11.84789776802063, + "spec/controllers/spree/orders_controller_spec.rb": 14.896740198135376, + "spec/features/consumer/authentication_spec.rb": 33.218215227127075, + "spec/controllers/line_items_controller_spec.rb": 8.155129432678223, + "spec/lib/open_food_network/enterprise_fee_calculator_spec.rb": 7.666287422180176, + "spec/features/admin/enterprise_relationships_spec.rb": 43.569981813430786, + "spec/models/enterprise_relationship_spec.rb": 7.4758734703063965, + "spec/lib/open_food_network/user_balance_calculator_spec.rb": 6.231699228286743, + "spec/lib/open_food_network/order_cycle_form_applicator_spec.rb": 6.908574819564819, + "spec/models/variant_override_spec.rb": 10.530468702316284, + "spec/models/spree/property_spec.rb": 9.429662704467773, + "spec/lib/open_food_network/packing_report_spec.rb": 7.237605810165405, + "spec/features/consumer/account_spec.rb": 12.112054824829102, + "spec/features/admin/enterprise_groups_spec.rb": 13.501276969909668, + "spec/controllers/spree/admin/line_items_controller_spec.rb": 9.95481562614441, + "spec/features/consumer/shopping/checkout_auth_spec.rb": 15.980017900466919, + "spec/lib/open_food_network/orders_and_fulfillments_report_spec.rb": 9.05552625656128, + "spec/lib/open_food_network/products_renderer_spec.rb": 9.808923721313477, + "spec/models/billable_period_spec.rb": 6.25592041015625, + "spec/features/consumer/groups_spec.rb": 15.769269943237305, + "spec/jobs/finalize_account_invoices_spec.rb": 7.724737167358398, + "spec/controllers/shop_controller_spec.rb": 6.318046569824219, + "spec/jobs/update_billable_periods_spec.rb": 7.985617399215698, + "spec/features/admin/overview_spec.rb": 5.875292539596558, + "spec/lib/open_food_network/bulk_coop_report_spec.rb": 8.631716966629028, + "spec/lib/open_food_network/scope_variant_to_hub_spec.rb": 7.480527400970459, + "spec/features/consumer/registration_spec.rb": 15.464008808135986, + "spec/features/admin/enterprises/index_spec.rb": 8.804306507110596, + "spec/features/consumer/multilingual_spec.rb": 12.941055536270142, + "spec/models/enterprise_fee_spec.rb": 6.512692928314209, + "spec/controllers/spree/api/products_controller_spec.rb": 23.094619750976562, + "spec/lib/open_food_network/products_and_inventory_report_spec.rb": 6.146647214889526, + "spec/lib/open_food_network/group_buy_report_spec.rb": 7.309479713439941, + "spec/controllers/admin/enterprises_controller_spec.rb": 8.507089853286743, + "spec/models/spree/payment_spec.rb": 6.209627628326416, + "spec/models/enterprise_caching_spec.rb": 5.243179082870483, + "spec/features/admin/adjustments_spec.rb": 19.125513076782227, + "spec/features/consumer/shopping/products_spec.rb": 5.658825874328613, + "spec/features/admin/enterprise_roles_spec.rb": 29.700051069259644, + "spec/controllers/admin/accounts_and_billing_settings_controller_spec.rb": 6.680173873901367, + "spec/controllers/enterprises_controller_spec.rb": 6.170275926589966, + "spec/serializers/admin/exchange_serializer_spec.rb": 4.9370832443237305, + "spec/helpers/enterprises_helper_spec.rb": 6.1380486488342285, + "spec/requests/checkout/failed_checkout_spec.rb": 5.141269207000732, + "spec/features/admin/variants_spec.rb": 5.578074216842651, + "spec/controllers/spree/api/variants_controller_spec.rb": 6.177022218704224, + "spec/controllers/admin/variant_overrides_controller_spec.rb": 7.0243120193481445, + "spec/lib/open_food_network/lettuce_share_report_spec.rb": 4.769379615783691, + "spec/models/product_distribution_spec.rb": 4.708523988723755, + "spec/models/producer_property_spec.rb": 4.007659435272217, + "spec/lib/open_food_network/customers_report_spec.rb": 3.967031240463257, + "spec/models/spree/shipping_method_spec.rb": 3.9209978580474854, + "spec/serializers/order_serializer_spec.rb": 4.256126165390015, + "spec/controllers/checkout_controller_spec.rb": 3.0183393955230713, + "spec/lib/open_food_network/order_cycle_management_report_spec.rb": 4.342913389205933, + "spec/lib/open_food_network/tag_rule_applicator_spec.rb": 2.8956594467163086, + "spec/requests/checkout/paypal_spec.rb": 3.242757558822632, + "spec/models/spree/taxon_spec.rb": 2.6591672897338867, + "spec/jobs/order_cycle_notification_job_spec.rb": 7.261902570724487, + "spec/controllers/spree/users_controller_spec.rb": 4.461893081665039, + "spec/features/admin/enterprise_user_spec.rb": 1.8945939540863037, + "spec/models/spree/image_spec.rb": 7.035736799240112, + "spec/controllers/admin/order_cycles_controller_spec.rb": 6.570413589477539, + "spec/controllers/admin/inventory_items_controller_spec.rb": 5.356866121292114, + "spec/mailers/order_mailer_spec.rb": 2.959702253341675, + "spec/features/admin/content_spec.rb": 2.2846784591674805, + "spec/features/admin/business_model_configuration_spec.rb": 4.798251628875732, + "spec/controllers/spree/admin/variants_controller_spec.rb": 2.9895830154418945, + "spec/helpers/admin/business_model_configuration_helper_spec.rb": 1.979982614517212, + "spec/requests/shop_spec.rb": 2.024279832839966, + "spec/features/admin/multilingual_spec.rb": 2.4140639305114746, + "spec/serializers/admin/for_order_cycle/enterprise_serializer_spec.rb": 1.8156287670135498, + "spec/controllers/api/order_cycles_controller_spec.rb": 3.219752311706543, + "spec/controllers/spree/admin/products_controller_spec.rb": 3.8355960845947266, + "spec/features/consumer/account/cards_spec.rb": 5.2247536182403564, + "spec/controllers/spree/admin/payment_methods_controller_spec.rb": 1.5910978317260742, + "spec/features/consumer/account/settings_spec.rb": 4.064767599105835, + "spec/lib/open_food_network/order_and_distributor_report_spec.rb": 1.1203935146331787, + "spec/lib/open_food_network/xero_invoices_report_spec.rb": 1.3188152313232422, + "spec/models/tag_rule/filter_shipping_methods_spec.rb": 0.6650290489196777, + "spec/models/spree/classification_spec.rb": 1.2654993534088135, + "spec/models/spree/price_spec.rb": 1.1041407585144043, + "spec/models/customer_spec.rb": 0.7916696071624756, + "spec/serializers/spree/product_serializer_spec.rb": 0.37619686126708984, + "spec/controllers/admin/customers_controller_spec.rb": 2.5230135917663574, + "spec/features/admin/caching_spec.rb": 1.4437370300292969, + "spec/controllers/spree/admin/adjustments_controller_spec.rb": 1.5684552192687988, + "spec/controllers/spree/admin/search_controller_spec.rb": 1.4993338584899902, + "spec/lib/open_food_network/enterprise_fee_applicator_spec.rb": 1.3289968967437744, + "spec/controllers/spree/admin/payments_controller_spec.rb": 3.292015790939331, + "spec/controllers/cart_controller_spec.rb": 3.664259433746338, + "spec/mailers/enterprise_mailer_spec.rb": 0.5742535591125488, + "spec/requests/embedded_shopfronts_headers_spec.rb": 1.6032977104187012, + "spec/models/spree/user_spec.rb": 1.711313009262085, + "spec/helpers/order_cycles_helper_spec.rb": 0.9428033828735352, + "spec/controllers/spree/admin/overview_controller_spec.rb": 1.1397759914398193, + "spec/controllers/user_registrations_controller_spec.rb": 0.6588938236236572, + "spec/controllers/admin/stripe_accounts_controller_spec.rb": 1.113358497619629, + "spec/lib/open_food_network/distribution_change_validator_spec.rb": 0.33763647079467773, + "spec/controllers/spree/admin/base_controller_spec.rb": 0.622990608215332, + "spec/models/enterprise_group_spec.rb": 0.7090797424316406, + "spec/lib/open_food_network/reports/report_spec.rb": 0.0767061710357666, + "spec/lib/open_food_network/order_grouper_spec.rb": 0.11199069023132324, + "spec/serializers/admin/for_order_cycle/supplied_product_serializer_spec.rb": 0.9957091808319092, + "spec/features/admin/tax_settings_spec.rb": 0.9661068916320801, + "spec/helpers/i18n_helper_spec.rb": 0.8701028823852539, + "spec/models/tag_rule/filter_order_cycles_spec.rb": 0.3305675983428955, + "spec/features/consumer/external_services_spec.rb": 0.9473350048065186, + "spec/features/admin/image_settings_spec.rb": 0.46965694427490234, + "spec/lib/open_food_network/users_and_enterprises_report_spec.rb": 0.7615146636962891, + "spec/controllers/groups_controller_spec.rb": 0.4524867534637451, + "spec/models/spree/option_value_spec.rb": 0.8891236782073975, + "spec/controllers/stripe/callbacks_controller_spec.rb": 0.43110227584838867, + "spec/models/inventory_item_spec.rb": 0.4617447853088379, + "spec/models/spree/option_type_spec.rb": 0.6955554485321045, + "spec/models/exchange_fee_spec.rb": 0.39018726348876953, + "spec/models/spree/payment_method_spec.rb": 0.6151621341705322, + "spec/lib/open_food_network/products_cache_refreshment_spec.rb": 0.5684990882873535, + "spec/models/spree/product_property_spec.rb": 0.7597665786743164, + "spec/serializers/admin/customer_serializer_spec.rb": 0.3018529415130615, + "spec/lib/stripe/account_connector_spec.rb": 0.6714019775390625, + "spec/models/tag_rule/filter_payment_methods_spec.rb": 0.6152024269104004, + "spec/models/spree/tax_rate_spec.rb": 0.9070453643798828, + "spec/models/stripe_account_spec.rb": 0.9363245964050293, + "spec/lib/open_food_network/enterprise_injection_data_spec.rb": 0.588266134262085, + "spec/controllers/spree/api/line_items_controller_spec.rb": 0.7344372272491455, + "spec/serializers/admin/index_enterprise_serializer_spec.rb": 0.36326169967651367, + "spec/controllers/spree/paypal_controller_spec.rb": 0.6771812438964844, + "spec/features/admin/external_services_spec.rb": 0.5037212371826172, + "spec/helpers/checkout_helper_spec.rb": 0.42232465744018555, + "spec/jobs/products_cache_integrity_checker_job_spec.rb": 0.7178783416748047, + "spec/models/adjustment_metadata_spec.rb": 0.6224956512451172, + "spec/lib/open_food_network/property_merge_spec.rb": 0.6959686279296875, + "spec/models/spree/calculator/price_sack_spec.rb": 1.1158838272094727, + "spec/serializers/variant_serializer_spec.rb": 0.4318654537200928, + "spec/controllers/user_passwords_controller_spec.rb": 0.301785945892334, + "spec/serializers/spree/variant_serializer_spec.rb": 0.6210694313049316, + "spec/features/admin/account_spec.rb": 0.3046414852142334, + "spec/serializers/admin/variant_override_serializer_spec.rb": 0.48795247077941895, + "spec/controllers/spree/checkout_controller_spec.rb": 0.61478590965271, + "spec/models/tag_rule/filter_products_spec.rb": 0.36420536041259766, + "spec/controllers/shops_controller_spec.rb": 0.33568739891052246, + "spec/serializers/enterprise_serializer_spec.rb": 0.4055449962615967, + "spec/helpers/products_helper_spec.rb": 0.022896528244018555, + "spec/models/model_set_spec.rb": 0.36487340927124023, + "spec/lib/spree/product_filters_spec.rb": 0.21588540077209473, + "spec/lib/spree/localized_number_spec.rb": 0.06534337997436523, + "spec/controllers/admin/tag_rules_controller_spec.rb": 0.4858670234680176, + "spec/controllers/api/enterprises_controller_spec.rb": 0.4562549591064453, + "spec/models/coordinator_fee_spec.rb": 0.21390938758850098, + "spec/controllers/spree/credit_cards_controller_spec.rb": 0.5004193782806396, + "spec/controllers/admin/stripe_connect_settings_controller_spec.rb": 0.5603137016296387, + "spec/controllers/stripe/webhooks_controller_spec.rb": 0.2895209789276123, + "spec/models/tag_rule/discount_order_spec.rb": 0.2420346736907959, + "spec/mailers/user_mailer_spec.rb": 0.4904506206512451, + "spec/controllers/admin/business_model_configuration_controller_spec.rb": 0.3073740005493164, + "spec/models/column_preference_spec.rb": 0.3346238136291504, + "spec/lib/open_food_network/option_value_namer_spec.rb": 0.19263029098510742, + "spec/controllers/admin/column_preferences_controller_spec.rb": 0.2986152172088623, + "spec/features/consumer/sitemap_spec.rb": 0.15889477729797363, + "spec/lib/open_food_network/sales_tax_report_spec.rb": 0.16881132125854492, + "spec/jobs/refresh_products_cache_job_spec.rb": 0.23363757133483887, + "spec/helpers/spree/orders_helper_spec.rb": 0.24251747131347656, + "spec/models/product_importer_spec.rb": 67.91179466247559, + "spec/models/spree/addresses_spec.rb": 0.19700169563293457, + "spec/lib/stripe/webhook_handler_spec.rb": 0.0821237564086914, + "spec/lib/open_food_network/cached_products_renderer_spec.rb": 0.09258484840393066, + "spec/controllers/registration_controller_spec.rb": 0.16367411613464355, + "spec/helpers/navigation_helper_spec.rb": 0.10421156883239746, + "spec/helpers/html_helper_spec.rb": 0.08945608139038086, + "spec/lib/open_food_network/enterprise_issue_validator_spec.rb": 0.09908699989318848, + "spec/models/tag_rule_spec.rb": 0.13741326332092285, + "spec/helpers/shop_helper_spec.rb": 0.10476374626159668, + "spec/helpers/shared_helper_spec.rb": 0.12041997909545898, + "spec/serializers/admin/enterprise_serializer_spec.rb": 4.03584623336792, + "spec/jobs/welcome_enterprise_job_spec.rb": 0.1159980297088623, + "spec/jobs/confirm_order_job_spec.rb": 0.1445786952972412, + "spec/models/spree/order_updater_spec.rb": 0.14549851417541504, + "spec/lib/open_food_network/reports/rule_spec.rb": 0.053559303283691406, + "spec/models/spree/preference_spec.rb": 0.09516620635986328, + "spec/controllers/spree/user_sessions_controller_spec.rb": 0.07596278190612793, + "spec/models/spree/preferences/file_configuration_spec.rb": 0.10176324844360352, + "spec/models/spree/calculator/flexi_rate_spec.rb": 0.9587721824645996, + "spec/models/spree/gateway/stripe_connect_spec.rb": 0.10944485664367676, + "spec/models/calculator/flat_percent_per_item_spec.rb": 0.05350542068481445, + "spec/jobs/confirm_signup_job_spec.rb": 0.04313993453979492, + "spec/services/reset_order_service_spec.rb": 0.0422053337097168, + "spec/requests/large_request_spec.rb": 0.034685611724853516, + "spec/models/spree/calculator/flat_percent_item_total_spec.rb": 0.48168349266052246, + "spec/models/spree/calculator/per_item_spec.rb": 0.6495146751403809, + "spec/controllers/api/statuses_controller_spec.rb": 0.05134892463684082, + "spec/models/calculator/weight_spec.rb": 1.9623024463653564, + "spec/lib/open_food_network/referer_parser_spec.rb": 0.043326616287231445, + "spec/helpers/groups_helper_spec.rb": 0.03603482246398926, + "spec/jobs/heartbeat_job_spec.rb": 0.04319405555725098, + "spec/controllers/spree/store_controller_spec.rb": 0.08073163032531738, + "spec/serializers/credit_card_serializer_spec.rb": 0.03305196762084961, + "spec/models/spree/calculator/flat_rate_spec.rb": 0.038320064544677734, + "spec/lib/open_food_network/feature_toggle_spec.rb": 0.028753995895385742, + "spec/lib/open_food_network/reports/row_spec.rb": 0.007825613021850586, + "spec/controllers/base_controller_spec.rb": 0.0468297004699707, + "spec/models/content_configuration_spec.rb": 0.008506536483764648, + "spec/helpers/spree/admin/base_helper_spec.rb": 0.012420415878295898, + "spec/controllers/admin/manager_invitations_controller_spec.rb": 1.3456997871398926, + "spec/controllers/admin/proxy_orders_controller_spec.rb": 22.670846700668335, + "spec/controllers/admin/schedules_controller_spec.rb": 4.846573352813721, + "spec/controllers/admin/subscription_line_items_controller_spec.rb": 4.154810190200806, + "spec/controllers/admin/subscriptions_controller_spec.rb": 59.745051860809326, + "spec/controllers/api/customers_controller_spec.rb": 1.0889270305633545, + "spec/controllers/api/enterprise_fees_controller_spec.rb": 0.9713332653045654, + "spec/controllers/api/logos_controller_spec.rb": 10.562519788742065, + "spec/controllers/api/orders_controller_spec.rb": 68.20941090583801, + "spec/controllers/api/product_images_controller_spec.rb": 11.653367519378662, + "spec/controllers/api/promo_images_controller_spec.rb": 12.199374914169312, + "spec/controllers/spree/admin/orders/customer_details_controller_spec.rb": 3.364267110824585, + "spec/controllers/user_confirmations_controller_spec.rb": 0.9946258068084717, + "spec/features/admin/enterprises/images_spec.rb": 19.77446460723877, + "spec/features/admin/payments_spec.rb": 5.545417785644531, + "spec/features/admin/schedules_spec.rb": 9.83488130569458, + "spec/features/admin/subscriptions_spec.rb": 172.63386392593384, + "spec/features/admin/users_spec.rb": 1.8667120933532715, + "spec/features/consumer/confirm_invitation_spec.rb": 0.3510591983795166, + "spec/features/consumer/cookies_spec.rb": 31.55128788948059, + "spec/features/consumer/footer_links_spec.rb": 4.672946214675903, + "spec/features/consumer/shopping/embedded_groups_spec.rb": 10.020016193389893, + "spec/helpers/admin/subscriptions_helper_spec.rb": 1.2239062786102295, + "spec/jobs/subscription_confirm_job_spec.rb": 14.0101900100708, + "spec/jobs/subscription_placement_job_spec.rb": 18.96518325805664, + "spec/lib/open_food_network/address_finder_spec.rb": 7.734933853149414, + "spec/lib/open_food_network/error_logger_spec.rb": 0.0177459716796875, + "spec/lib/open_food_network/i18n_config_spec.rb": 0.13827753067016602, + "spec/lib/open_food_network/proxy_order_syncer_spec.rb": 12.332154273986816, + "spec/lib/open_food_network/scope_variants_to_search_spec.rb": 4.17158579826355, + "spec/lib/open_food_network/subscription_payment_updater_spec.rb": 4.926745891571045, + "spec/lib/open_food_network/subscription_summarizer_spec.rb": 0.11625027656555176, + "spec/lib/open_food_network/subscription_summary_spec.rb": 0.29581689834594727, + "spec/mailers/subscription_mailer_spec.rb": 25.19981551170349, + "spec/models/feature_flags_spec.rb": 0.027124881744384766, + "spec/models/product_import/entry_processor_spec.rb": 0.06680822372436523, + "spec/models/product_import/inventory_reset_strategy_spec.rb": 3.047563314437866, + "spec/models/product_import/products_reset_strategy_spec.rb": 1.8938241004943848, + "spec/models/product_import/reset_absent_spec.rb": 0.060455322265625, + "spec/models/product_import/settings_spec.rb": 0.1914045810699463, + "spec/models/proxy_order_spec.rb": 7.8513572216033936, + "spec/models/spree/credit_card_spec.rb": 0.16306042671203613, + "spec/models/spree/order/checkout_spec.rb": 0.09793758392333984, + "spec/models/spree/product_set_spec.rb": 1.5329344272613525, + "spec/models/subscription_line_item_spec.rb": 0.04518294334411621, + "spec/models/subscription_spec.rb": 1.2008378505706787, + "spec/serializers/admin/subscription_customer_serializer_spec.rb": 0.08684515953063965, + "spec/serializers/api/cached_enterprise_serializer_spec.rb": 0.4596261978149414, + "spec/services/cart_service_spec.rb": 1.7087152004241943, + "spec/services/create_mail_method_spec.rb": 0.05048108100891113, + "spec/services/embedded_page_service_spec.rb": 0.05376935005187988, + "spec/services/order_cycle_form_spec.rb": 1.1136021614074707, + "spec/services/order_factory_spec.rb": 8.494149684906006, + "spec/services/order_syncer_spec.rb": 33.37830352783203, + "spec/services/restart_checkout_spec.rb": 0.5339229106903076, + "spec/services/search_orders_spec.rb": 0.4092221260070801, + "spec/services/subscription_estimator_spec.rb": 8.709576606750488, + "spec/services/subscription_form_spec.rb": 2.8538384437561035, + "spec/services/subscription_validator_spec.rb": 0.6807353496551514, + "spec/services/subscriptions_count_spec.rb": 1.5725765228271484, + "spec/services/tax_rate_finder_spec.rb": 3.2112464904785156, + "spec/services/variants_stock_levels_spec.rb": 3.1623952388763428 } From d155bb142c0519e814d0f32985549b8612125997 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Sat, 19 Jan 2019 15:53:05 +0000 Subject: [PATCH 30/35] Make proxy order spec a bit more resilient by allowing two secs diff in timestamps --- spec/models/proxy_order_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/proxy_order_spec.rb b/spec/models/proxy_order_spec.rb index b84089c015..e96ffff831 100644 --- a/spec/models/proxy_order_spec.rb +++ b/spec/models/proxy_order_spec.rb @@ -196,6 +196,6 @@ describe ProxyOrder, type: :model do # We still need to use be_within, because the Database timestamp is not as # accurate as the Rails timestamp. If we use `eq`, we have differing nano # seconds. - expect(subject.reload.canceled_at).to be_within(1.second).of Time.zone.now + expect(subject.reload.canceled_at).to be_within(2.second).of Time.zone.now end end From 34372575159048d9edbbfb7aca6710f89f55125f Mon Sep 17 00:00:00 2001 From: Brases Date: Sat, 19 Jan 2019 20:22:57 +0000 Subject: [PATCH 31/35] Fix wording in order confirmation email template Fixes issue #3063 "Repeated translation in Order Confirmation Screen and Email". Now "Ready for" (collection time) is not repeated in place of "Collection details" (collection instructions) --- app/views/spree/order_mailer/_shipping.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/spree/order_mailer/_shipping.html.haml b/app/views/spree/order_mailer/_shipping.html.haml index 195ae77465..a020f2774f 100644 --- a/app/views/spree/order_mailer/_shipping.html.haml +++ b/app/views/spree/order_mailer/_shipping.html.haml @@ -50,6 +50,6 @@ - if @order.order_cycle.andand.pickup_instructions_for(@order.distributor).present? %p %strong - = t :email_shipping_collection_time + = t :email_shipping_collection_instructions %br #{@order.order_cycle.pickup_instructions_for(@order.distributor)} From 972bfd5e625546eacca5f4fbc37536ba124f4d1a Mon Sep 17 00:00:00 2001 From: nozakis Date: Wed, 7 Nov 2018 22:35:25 -0600 Subject: [PATCH 32/35] Fixed bad margins on the account settings error page. --- app/assets/stylesheets/darkswarm/forms.css.scss | 8 ++++++++ app/views/spree/users/edit.html.haml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/darkswarm/forms.css.scss b/app/assets/stylesheets/darkswarm/forms.css.scss index 9ca7f6f391..b44b32220f 100644 --- a/app/assets/stylesheets/darkswarm/forms.css.scss +++ b/app/assets/stylesheets/darkswarm/forms.css.scss @@ -4,3 +4,11 @@ fieldset { border: 0; } + +.user-form { + margin-left: auto; + margin-right: auto; + max-width: 1184px; + padding-left: .9375rem; + padding-right: .9375rem; +} diff --git a/app/views/spree/users/edit.html.haml b/app/views/spree/users/edit.html.haml index 29e600582c..2c586290e3 100644 --- a/app/views/spree/users/edit.html.haml +++ b/app/views/spree/users/edit.html.haml @@ -1,3 +1,3 @@ .darkswarm - .row + .user-form = render 'form' From 6b7273f685d2d52b40b8932ed33c5ee4c5949c77 Mon Sep 17 00:00:00 2001 From: Kevin Christianson Date: Fri, 18 Jan 2019 17:37:38 -0600 Subject: [PATCH 33/35] Convert sass files to scss --- .../darkswarm/_shop-navigation.css.sass | 86 ------------- .../darkswarm/_shop-navigation.css.scss | 103 +++++++++++++++ .../stylesheets/darkswarm/checkout.css.sass | 86 ------------- .../stylesheets/darkswarm/checkout.css.scss | 117 ++++++++++++++++++ 4 files changed, 220 insertions(+), 172 deletions(-) delete mode 100644 app/assets/stylesheets/darkswarm/_shop-navigation.css.sass create mode 100644 app/assets/stylesheets/darkswarm/_shop-navigation.css.scss delete mode 100644 app/assets/stylesheets/darkswarm/checkout.css.sass create mode 100644 app/assets/stylesheets/darkswarm/checkout.css.scss diff --git a/app/assets/stylesheets/darkswarm/_shop-navigation.css.sass b/app/assets/stylesheets/darkswarm/_shop-navigation.css.sass deleted file mode 100644 index 288450b015..0000000000 --- a/app/assets/stylesheets/darkswarm/_shop-navigation.css.sass +++ /dev/null @@ -1,86 +0,0 @@ -@import typography - -.darkswarm - - navigation - display: block - background: #f7f7f7 - - distributor.details - box-sizing: border-box - display: block - min-height: 150px - padding: 30px 0px 20px 0px - select - width: 200px - position: relative - img - display: block - height: 100px - width: 100px - margin-right: 12px - - location - @include headingFont - @media all and (max-width: 768px) - location, location + small - display: block - - #distributor_title h3 - margin-top: 0 - @media all and (max-width: 768px) - margin-bottom: 8px - - - ordercycle - text-align: right - p - max-width: 400px - h4 i - margin-right: 0.3rem - @media all and (max-width: 640px) - float: left - clear: left - text-align: left - padding: 12px 10px - width: 100% - margin-top: 10px - background: #e5e5e5 - p - max-width: 100% - float: right - form.custom - text-align: right - & > strong - line-height: 2.5 - font-size: 1.29em - padding-right: 14px - @media all and (max-width: 768px) - select - width: inherit - display: inline-block - border-width: 1px - border-color: #999 - color: #666 - font-size: 1em - margin-bottom: 0 - padding: 8px 20px 8px 12px - @media all and (max-width: 768px) - font-size: 0.875em - @media screen and (-webkit-min-device-pixel-ratio:0) - font-size: 16px - closing - @include headingFont - @media all and (max-width: 768px) - font-size: 1.2em - padding-bottom: 10px - color: black - font-size: 1.5em - display: block - padding-bottom: 12px - span - @media all and (max-width: 768px) - font-size: 0.875em - - - diff --git a/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss b/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss new file mode 100644 index 0000000000..bd0580958f --- /dev/null +++ b/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss @@ -0,0 +1,103 @@ +@import "typography"; + +.darkswarm navigation { + display: block; + background: #f7f7f7; + + distributor.details { + box-sizing: border-box; + display: block; + min-height: 150px; + padding: 30px 0 20px 0; + position: relative; + select { + width: 200px; + } + img { + display: block; + height: 100px; + width: 100px; + margin-right: 12px; + } + + location { + @include headingFont; + } + @media all and (max-width: 768px) { + location, location + small { + display: block; + } + } + + #distributor_title h3 { + margin-top: 0; + @media all and (max-width: 768px) { + margin-bottom: 8px; + } + } + + + + ordercycle { + text-align: right; + float: right; + p { + max-width: 400px; + } + h4 i { + margin-right: 0.3rem; + } + @media all and (max-width: 640px) { + float: left; + clear: left; + text-align: left; + padding: 12px 10px; + width: 100%; + margin-top: 10px; + background: #e5e5e5; + p { + max-width: 100%; + } + } + form.custom { + text-align: right; + & > strong { + line-height: 2.5; + font-size: 1.29em; + padding-right: 14px; + } + select { + width: inherit; + display: inline-block; + border: 1px #999; + color: #666; + font-size: 1em; + margin-bottom: 0; + padding: 8px 20px 8px 12px; + @media all and (max-width: 768px) { + font-size: 0.875em; + } + @media screen and (-webkit-min-device-pixel-ratio: 0) { + font-size: 16px; + } + } + } + closing { + @include headingFont; + color: black; + font-size: 1.5em; + display: block; + padding-bottom: 12px; + @media all and (max-width: 768px) { + font-size: 1.2em; + padding-bottom: 10px; + } + span { + @media all and (max-width: 768px) { + font-size: 0.875em; + } + } + } + } + } +} diff --git a/app/assets/stylesheets/darkswarm/checkout.css.sass b/app/assets/stylesheets/darkswarm/checkout.css.sass deleted file mode 100644 index ff18863259..0000000000 --- a/app/assets/stylesheets/darkswarm/checkout.css.sass +++ /dev/null @@ -1,86 +0,0 @@ -@import mixins -@import branding -@import animations - -.order-summary - background-color: #e1f0f5 - padding: 1em - width: 100% - border: none - color: inherit - -checkout - display: block - - @media all and (max-width: 640px) - &.row .row - margin-left: 0 - margin-right: 0 - - orderdetails - .button, table - width: 100% - @media all and (max-width: 640px) - form.edit_order - border: 1px solid $disabled-bright - margin-bottom: 2rem - - #details, #billing, #shipping, #payment - border: 0 - margin: 1em 0 - padding: 0 - .content - border: 1px solid #efefef - - h5 - margin: 0 - padding: 0.65em - background: #f7f7f7 - - .label - font-size: 1em - padding: 0.3rem 0.35rem 0.275rem - - // Logic to turn on & off the alerts for success against each fieldset - - label, label.alert, label.success, &.valid label.alert, &.dirty label.success - display: none - - &.dirty label.alert - display: inline - &.dirty.valid label.alert - display: none - &.valid label.success - display: inline - - h5.dirty - background: #f7ccc5 - h5.valid, h5.dirty.valid - background: #bfefd1 - - orderdetails table tr th - text-align: left - - // Logic to swap out up / down accordion icons - //Foundation overrides - dd > a - @include csstrans - background: $disabled-light !important - - dd > a:hover - background: $disabled-v-dark !important - color: white - - dd - span.accordion-up - display: none - span.accordion-down - display: inline - &.open - span.accordion-up - display: inline - span.accordion-down - display: none - - .error - color: #c82020 diff --git a/app/assets/stylesheets/darkswarm/checkout.css.scss b/app/assets/stylesheets/darkswarm/checkout.css.scss new file mode 100644 index 0000000000..458fd24d5e --- /dev/null +++ b/app/assets/stylesheets/darkswarm/checkout.css.scss @@ -0,0 +1,117 @@ +@import "mixins"; +@import "branding"; +@import "animations"; + +.order-summary { + background-color: #e1f0f5; + padding: 1em; + width: 100%; + border: none; + color: inherit; +} + +checkout { + display: block; + + @media all and (max-width: 640px) { + &.row .row { + margin-left: 0; + margin-right: 0; + } + } + + orderdetails { + .button, table { + width: 100%; + } + @media all and (max-width: 640px) { + form.edit_order { + border: 1px solid $disabled-bright; + margin-bottom: 2rem; + } + } + } + + #details, #billing, #shipping, #payment { + border: 0; + margin: 1em 0; + padding: 0; + .content { + border: 1px solid #efefef; + } + } + + h5 { + margin: 0; + padding: 0.65em; + background: #f7f7f7; + + .label { + font-size: 1em; + padding: 0.3rem 0.35rem 0.275rem; + } + + // Logic to turn on & off the alerts for success against each fieldset + + label, label.alert, label.success, &.valid label.alert, &.dirty label.success { + display: none; + } + + &.dirty label.alert { + display: inline; + } + &.dirty.valid label.alert { + display: none; + } + &.valid label.success { + display: inline; + } + } + + h5.dirty { + background: #f7ccc5; + } + + h5.valid, h5.dirty.valid { + background: #bfefd1; + } + + orderdetails table tr th { + text-align: left; + } + + + // Logic to swap out up / down accordion icons + //Foundation overrides + dd > a { + @include csstrans; + background: $disabled-light !important; + } + + dd > a:hover { + background: $disabled-v-dark !important; + color: white; + } + + dd { + span.accordion-up { + display: none; + } + span.accordion-down { + display: inline; + } + &.open { + span.accordion-up { + display: inline; + } + span.accordion-down { + display: none; + } + } + } + + .error { + color: #c82020; + } +} + From cf7f8b887f83fe00bf66a905d04e6ad939892896 Mon Sep 17 00:00:00 2001 From: Kristina Lim Date: Sat, 6 Oct 2018 08:49:30 +0800 Subject: [PATCH 34/35] Add tests for permissions for variant overrides --- spec/models/spree/ability_spec.rb | 84 +++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/spec/models/spree/ability_spec.rb b/spec/models/spree/ability_spec.rb index dcd290e195..ab9946c0ff 100644 --- a/spec/models/spree/ability_spec.rb +++ b/spec/models/spree/ability_spec.rb @@ -514,5 +514,89 @@ module Spree end end end + + describe "permissions for variant overrides" do + let!(:distributor) { create(:distributor_enterprise) } + let!(:producer) { create(:supplier_enterprise) } + let!(:product) { create(:product, supplier: producer) } + let!(:variant) { create(:variant, product: product) } + let!(:variant_override) { create(:variant_override, hub: distributor, variant: variant) } + + subject { user } + + let(:manage_actions) { [:admin, :index, :read, :update, :bulk_update, :bulk_reset] } + + describe "when admin" do + let(:user) { create(:admin_user) } + + it "should have permission" do + is_expected.to have_ability(manage_actions, for: variant_override) + end + end + + describe "when user of the producer" do + let(:user) { producer.owner } + + it "should not have permission" do + is_expected.not_to have_ability(manage_actions, for: variant_override) + end + end + + describe "when user of the distributor" do + let(:user) { distributor.owner } + + it "should not have permission" do + is_expected.not_to have_ability(manage_actions, for: variant_override) + end + end + + describe "when user of the distributor which is also the producer" do + let(:user) { distributor.owner } + let!(:distributor) { create(:distributor_enterprise, is_primary_producer: true, sells: "any") } + let!(:producer) { distributor } + + it "should have permission" do + is_expected.to have_ability(manage_actions, for: variant_override) + end + end + + describe "when owner of the distributor with add_to_order_cycle permission to the producer" do + let!(:unauthorized_enterprise) do + create(:enterprise, sells: "any").tap do |record| + create(:enterprise_relationship, parent: producer, child: record, permissions_list: [:add_to_order_cycle]) + end + end + let(:user) { unauthorized_enterprise.owner } + + it "should not have permission" do + is_expected.not_to have_ability(manage_actions, for: variant_override) + end + end + + describe "when owner of the enterprise with create_variant_overrides permission to the producer" do + let!(:authorized_enterprise) do + create(:enterprise, sells: "any").tap do |record| + create(:enterprise_relationship, parent: producer, child: record, permissions_list: [:create_variant_overrides]) + end + end + let(:user) { authorized_enterprise.owner } + + it "should not have permission" do + is_expected.not_to have_ability(manage_actions, for: variant_override) + end + + describe "when the enterprise is not a distributor" do + let!(:authorized_enterprise) do + create(:enterprise, sells: "none").tap do |record| + create(:enterprise_relationship, parent: producer, child: record, permissions_list: [:create_variant_overrides]) + end + end + + it "should not have permission" do + is_expected.not_to have_ability(manage_actions, for: variant_override) + end + end + end + end end end From 33ee46b22408ade6580456673d3e2d04a0464eda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 24 Jan 2019 19:16:56 +0000 Subject: [PATCH 35/35] Bump oj from 3.7.4 to 3.7.8 Bumps [oj](https://github.com/ohler55/oj) from 3.7.4 to 3.7.8. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/master/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.7.4...v3.7.8) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 41df6b00f7..4af1e20570 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -551,7 +551,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.7.4) + oj (3.7.8) orm_adapter (0.5.0) paper_trail (5.2.3) activerecord (>= 3.0, < 6.0)