From 0721800f5683447dc909bed7d74a5d2730e882a8 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:20:29 +0000 Subject: [PATCH 01/45] Remove jsuri.js --- .../javascripts/admin/spree/spree.js.coffee | 15 ++++++--------- vendor/assets/javascripts/jsuri.js | 2 -- 2 files changed, 6 insertions(+), 11 deletions(-) delete mode 100644 vendor/assets/javascripts/jsuri.js diff --git a/app/assets/javascripts/admin/spree/spree.js.coffee b/app/assets/javascripts/admin/spree/spree.js.coffee index c905ff48e7..b1d155127e 100644 --- a/app/assets/javascripts/admin/spree/spree.js.coffee +++ b/app/assets/javascripts/admin/spree/spree.js.coffee @@ -1,13 +1,10 @@ -#= require jsuri - class window.Spree # Helper function to take a URL and add query parameters to it - @url: (uri, query) -> - if uri.path == undefined - uri = new Uri(uri) - if query - $.each query, (key, value) -> - uri.addQueryParam(key, value) + @url: (uri) -> + if uri.pathname == undefined + uri = new URL(uri.toString()) if Spree.api_key - uri.addQueryParam('token', Spree.api_key) + params = new URLSearchParams(uri.search) + params.append('token', Spree.api_key) + return uri diff --git a/vendor/assets/javascripts/jsuri.js b/vendor/assets/javascripts/jsuri.js deleted file mode 100644 index dcf60f9796..0000000000 --- a/vendor/assets/javascripts/jsuri.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jsUri v1.1.1 | https://github.com/derek-watson/jsUri */ -var Query=function(a){"use strict";var b=function(a){var b=[],c,d,e,f;if(typeof a=="undefined"||a===null||a==="")return b;a.indexOf("?")===0&&(a=a.substring(1)),d=a.toString().split(/[&;]/);for(c=0;c0&&(a+="&"),a+=d.join("=");return a.length>0?"?"+a:a},e=function(a){a=decodeURIComponent(a),a=a.replace("+"," ");return a},f=function(a){var b,d;for(d=0;d0&&c.push([a,b]);return this},j=function(a,b,d){var f=-1,g,j;if(arguments.length===3){for(g=0;g Date: Wed, 5 Jan 2022 16:35:17 +0000 Subject: [PATCH 02/45] Update uses of (removed) jsuri interface --- .../admin/spree/taxons/taxon_tree_menu.js.coffee | 3 +-- .../javascripts/admin/spree/taxons/taxonomy.js.coffee | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee b/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee index 75135cdfcc..7fa04871ab 100644 --- a/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee +++ b/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee @@ -4,8 +4,7 @@ root.taxon_tree_menu = (obj, context) -> base_url = Spree.url(Spree.routes.taxonomy_taxons_path) admin_base_url = Spree.url(Spree.routes.admin_taxonomy_taxons_path) - edit_url = admin_base_url.clone() - edit_url.setPath(edit_url.path() + '/' + obj.attr("id") + "/edit"); + edit_url = Spree.url(Spree.routes.admin_taxonomy_taxons_path + '/' + obj.attr("id") + "/edit"); create: label: " " + Spree.translations.add, diff --git a/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee b/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee index 9ba35d692b..21f6a8b782 100644 --- a/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee +++ b/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee @@ -9,7 +9,7 @@ handle_move = (e, data) -> new_parent = data.rslt.np url = Spree.url(base_url).clone() - url.setPath url.path() + '/' + node.attr("id") + url.pathname = url.pathname + '/' + node.attr("id") $.ajax type: "POST", dataType: "json", @@ -41,7 +41,7 @@ handle_rename = (e, data) -> name = data.rslt.new_name url = Spree.url(base_url).clone() - url.setPath(url.path() + '/' + node.attr("id")) + url.pathname = url.pathname + '/' + node.attr("id") $.ajax type: "POST", @@ -73,7 +73,7 @@ root.setup_taxonomy_tree = (taxonomy_id) -> root.base_url = Spree.url(Spree.routes.taxonomy_taxons_path) $.ajax - url: base_url.path().replace("/taxons", "/jstree"), + url: base_url.pathname.replace("/taxons", "/jstree"), success: (taxonomy) -> last_rollback = null @@ -82,7 +82,7 @@ root.setup_taxonomy_tree = (taxonomy_id) -> data: taxonomy, ajax: url: (e) -> - base_url.path() + '/' + e.attr('id') + '/jstree' + base_url.pathname + '/' + e.attr('id') + '/jstree' themes: theme: "apple", url: "/assets/jquery.jstree/themes/apple/style.css" From 14a62f5d4978a4d101d82154317ddfc4d45df4de Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 5 Jan 2022 17:33:59 +0000 Subject: [PATCH 03/45] Change paths helpers to urls --- .../admin/spree/taxons/taxon_tree_menu.js.coffee | 6 +++--- .../javascripts/admin/spree/taxons/taxonomy.js.coffee | 2 +- app/views/spree/admin/shared/_routes.html.erb | 8 ++++---- app/views/spree/admin/taxonomies/edit.haml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee b/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee index 7fa04871ab..dca01a3aa3 100644 --- a/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee +++ b/app/assets/javascripts/admin/spree/taxons/taxon_tree_menu.js.coffee @@ -2,9 +2,9 @@ root = exports ? this root.taxon_tree_menu = (obj, context) -> - base_url = Spree.url(Spree.routes.taxonomy_taxons_path) - admin_base_url = Spree.url(Spree.routes.admin_taxonomy_taxons_path) - edit_url = Spree.url(Spree.routes.admin_taxonomy_taxons_path + '/' + obj.attr("id") + "/edit"); + base_url = Spree.url(Spree.routes.taxonomy_taxons) + admin_base_url = Spree.url(Spree.routes.admin_taxonomy_taxons) + edit_url = Spree.url(Spree.routes.admin_taxonomy_taxons + '/' + obj.attr("id") + "/edit"); create: label: " " + Spree.translations.add, diff --git a/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee b/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee index 21f6a8b782..6a8d902caa 100644 --- a/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee +++ b/app/assets/javascripts/admin/spree/taxons/taxonomy.js.coffee @@ -70,7 +70,7 @@ root = exports ? this root.setup_taxonomy_tree = (taxonomy_id) -> if taxonomy_id != undefined # this is defined within admin/taxonomies/edit - root.base_url = Spree.url(Spree.routes.taxonomy_taxons_path) + root.base_url = Spree.url(Spree.routes.taxonomy_taxons) $.ajax url: base_url.pathname.replace("/taxons", "/jstree"), diff --git a/app/views/spree/admin/shared/_routes.html.erb b/app/views/spree/admin/shared/_routes.html.erb index 418359b5e7..a0a854781f 100644 --- a/app/views/spree/admin/shared/_routes.html.erb +++ b/app/views/spree/admin/shared/_routes.html.erb @@ -6,9 +6,9 @@ Spree.routes = {} } Spree.routes = <%== { - :variants_search => spree.admin_search_variants_path(:format => 'json'), - :taxons_search => main_app.api_v0_taxons_path(:format => 'json'), - :orders_api => main_app.api_v0_orders_path, - :states_search => main_app.api_v0_states_path(:format => 'json') + :variants_search => spree.admin_search_variants_url(:format => 'json'), + :taxons_search => main_app.api_v0_taxons_url(:format => 'json'), + :orders_api => main_app.api_v0_orders_url, + :states_search => main_app.api_v0_states_url(:format => 'json') }.to_json %>; diff --git a/app/views/spree/admin/taxonomies/edit.haml b/app/views/spree/admin/taxonomies/edit.haml index 1f11fbb56c..4131f2571f 100755 --- a/app/views/spree/admin/taxonomies/edit.haml +++ b/app/views/spree/admin/taxonomies/edit.haml @@ -17,8 +17,8 @@ = label_tag nil, t("spree.tree") %br/ :javascript - Spree.routes.taxonomy_taxons_path = "#{main_app.api_v0_taxonomy_taxons_path(@taxonomy)}"; - Spree.routes.admin_taxonomy_taxons_path = "#{spree.admin_taxonomy_taxons_path(@taxonomy)}"; + Spree.routes.taxonomy_taxons = "#{main_app.api_v0_taxonomy_taxons_url(@taxonomy)}"; + Spree.routes.admin_taxonomy_taxons = "#{spree.admin_taxonomy_taxons_url(@taxonomy)}"; #taxonomy_tree.tree #progress{style: "display:none;"} = image_pack_tag 'select2-spinner.gif', title: 'Spinner', style: "vertical-align:bottom;" From e2b8108972591d92043efafd9d4433f0df7b793e Mon Sep 17 00:00:00 2001 From: Cillian O'Ruanaidh Date: Fri, 29 Oct 2021 17:43:27 +0100 Subject: [PATCH 04/45] If an order has out of stock line items display them and let admins remove them --- app/views/spree/admin/orders/_form.html.haml | 3 + .../_insufficient_stock_lines.html.haml | 39 +++++++++ app/webpacker/css/admin/sections/orders.scss | 10 +++ spec/system/admin/order_spec.rb | 21 +++++ .../spree/admin/orders/edit.html.haml_spec.rb | 79 ++++++++++++++++--- 5 files changed, 140 insertions(+), 12 deletions(-) create mode 100644 app/views/spree/admin/orders/_insufficient_stock_lines.html.haml diff --git a/app/views/spree/admin/orders/_form.html.haml b/app/views/spree/admin/orders/_form.html.haml index 72dbf3d81b..f902fe361c 100644 --- a/app/views/spree/admin/orders/_form.html.haml +++ b/app/views/spree/admin/orders/_form.html.haml @@ -2,6 +2,9 @@ - if @line_item.try(:errors).present? = render :partial => 'spree/shared/error_messages', :locals => { :target => @line_item } + - if !@order.completed? && @order.insufficient_stock_lines.any? + = render 'spree/admin/orders/insufficient_stock_lines', insufficient_stock_lines: @order.insufficient_stock_lines + = render :partial => "spree/admin/orders/shipment", :collection => @order.shipments, :locals => { :order => order } = render :partial => "spree/admin/orders/_form/adjustments", :locals => { :adjustments => @order.line_item_adjustments, :title => t(".line_item_adjustments")} diff --git a/app/views/spree/admin/orders/_insufficient_stock_lines.html.haml b/app/views/spree/admin/orders/_insufficient_stock_lines.html.haml new file mode 100644 index 0000000000..70a4ac14ce --- /dev/null +++ b/app/views/spree/admin/orders/_insufficient_stock_lines.html.haml @@ -0,0 +1,39 @@ +%div.insufficient-stock-items + %fieldset.no-border-bottom + %legend + = t("spree.orders.line_item.out_of_stock") + + %table + %colgroup + %col{ :style => "width: 10%;" } + %col{ :style => "width: 30%;" } + %col{ :style => "width: 15%;" } + %col{ :style => "width: 15%;" } + %col{ :style => "width: 15%;" } + %col{ :style => "width: 15%;" } + + %thead + %th{ :colspan => "2" } + = Spree.t(:item_description) + %th + = Spree.t(:price) + %th + = Spree.t(:quantity) + %th + = Spree.t(:total) + %th.orders-actions.actions + + - insufficient_stock_lines.each do |line_item| + %tr.insufficient-stock-item + %td + = render 'spree/shared/variant_thumbnail', variant: line_item.variant + %td + = line_item.variant.product_and_full_name + %td.align-center + = line_item.single_money.to_html + %td.align-center + = line_item.quantity + %td.align-center + = line_item.money.to_html + %td.actions + = link_to_delete line_item, { url: main_app.admin_bulk_line_item_path(line_item), no_text: true } diff --git a/app/webpacker/css/admin/sections/orders.scss b/app/webpacker/css/admin/sections/orders.scss index e8f4d79692..06cc6be17a 100644 --- a/app/webpacker/css/admin/sections/orders.scss +++ b/app/webpacker/css/admin/sections/orders.scss @@ -33,6 +33,16 @@ } } +.insufficient-stock-items { + legend { + color: $color-error; + } + + table tr:last-child th { + border-bottom: 1px solid $admin-table-border; + } +} + // Customize orduct add fieldset #add-line-item { fieldset { diff --git a/spec/system/admin/order_spec.rb b/spec/system/admin/order_spec.rb index 52bbc1fcaf..0e3aca106b 100644 --- a/spec/system/admin/order_spec.rb +++ b/spec/system/admin/order_spec.rb @@ -448,6 +448,27 @@ describe ' end end end + + context "when an incomplete order has some line items with insufficient stock" do + let(:incomplete_order) do + create(:order_with_line_items, user: user, distributor: distributor, + order_cycle: order_cycle) + end + + it "displays the out of stock line items and they can be deleted from the order" do + incomplete_order.line_items.first.variant.update!(on_demand: false, on_hand: 0) + + visit spree.edit_admin_order_path(incomplete_order) + + within ".insufficient-stock-items" do + expect(page).to have_content incomplete_order.products.first.name + accept_alert 'Are you sure?' do + find("a.delete-resource").click + end + expect(page).to_not have_content incomplete_order.products.first.name + end + end + end end it "creating an order with distributor and order cycle" do diff --git a/spec/views/spree/admin/orders/edit.html.haml_spec.rb b/spec/views/spree/admin/orders/edit.html.haml_spec.rb index d3817f8237..96c4f404af 100644 --- a/spec/views/spree/admin/orders/edit.html.haml_spec.rb +++ b/spec/views/spree/admin/orders/edit.html.haml_spec.rb @@ -22,21 +22,76 @@ describe "spree/admin/orders/edit.html.haml" do end allow(view).to receive_messages spree_current_user: create(:user) - - order = create(:completed_order_with_fees) - order.distributor = create(:distributor_enterprise) - assign(:order, order) - assign(:shops, [order.distributor]) - assign(:order_cycles, []) end - describe "order values" do - it "displays order shipping costs, transaction fee and order total" do - render + context "when order is complete" do + let(:order) { create(:completed_order_with_fees) } - expect(rendered).to have_content("Shipping Method\nUPS Ground $6.00") - expect(rendered).to have_content("Transaction fee:\n\n$10.00") - expect(rendered).to have_content("Order Total\n$36.00") + before do + order.distributor = create(:distributor_enterprise) + assign(:order, order) + assign(:shops, [order.distributor]) + assign(:order_cycles, []) + end + + describe "order values" do + it "displays order shipping costs, transaction fee and order total" do + render + + expect(rendered).to have_content("Shipping Method\nUPS Ground $6.00") + expect(rendered).to have_content("Transaction fee:\n\n$10.00") + expect(rendered).to have_content("Order Total\n$36.00") + end + end + + context "when some line items are out of stock" do + let!(:out_of_stock_line_item) do + line_item = order.line_items.first + line_item.variant.update!(on_demand: false, on_hand: 0) + line_item + end + + it "doesn't display a table of out of stock line items" do + render + + expect(rendered).to_not have_content "Out of Stock" + expect(rendered).to_not have_selector ".insufficient-stock-items", + text: out_of_stock_line_item.variant.display_name + end + end + end + + context "when order is incomplete" do + let(:order) { create(:order_with_line_items) } + + before do + assign(:order, order) + assign(:shops, [order.distributor]) + assign(:order_cycles, []) + end + + context "when some line items are out of stock" do + let!(:out_of_stock_line_item) do + line_item = order.line_items.first + line_item.variant.update!(on_demand: false, on_hand: 0) + line_item + end + + it "displays a table of out of stock line items" do + render + + expect(rendered).to have_content "Out of Stock" + expect(rendered).to have_selector ".insufficient-stock-items", + text: out_of_stock_line_item.variant.display_name + end + end + + context "when all line items are in stock" do + it "doesn't display a table of out of stock line items" do + render + + expect(rendered).to_not have_content "Out of Stock" + end end end end From cb5dd6eed9f3f31f850fa155580b433c8f775be5 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 28 Dec 2021 23:02:03 +0000 Subject: [PATCH 05/45] Move T&C checks to service --- app/helpers/terms_and_conditions_helper.rb | 4 ++-- app/services/terms_of_service.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/helpers/terms_and_conditions_helper.rb b/app/helpers/terms_and_conditions_helper.rb index ce53ac3ed9..35232da157 100644 --- a/app/helpers/terms_and_conditions_helper.rb +++ b/app/helpers/terms_and_conditions_helper.rb @@ -17,11 +17,11 @@ module TermsAndConditionsHelper end def platform_terms_required? - Spree::Config.shoppers_require_tos + TermsOfService.platform_terms_required? end def terms_and_conditions_activated? - current_order.distributor.terms_and_conditions.file? + TermsOfService.terms_and_conditions_activated?(current_order.distributor) end def all_terms_and_conditions_already_accepted? diff --git a/app/services/terms_of_service.rb b/app/services/terms_of_service.rb index dc84b14988..32ca768d0c 100644 --- a/app/services/terms_of_service.rb +++ b/app/services/terms_of_service.rb @@ -10,4 +10,12 @@ class TermsOfService TermsOfServiceFile.updated_at end end + + def self.platform_terms_required? + Spree::Config.shoppers_require_tos + end + + def self.terms_and_conditions_activated?(distributor) + distributor.terms_and_conditions.file? + end end From 58d3ad412a5db78ac92002a5491acdec758f48de Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:01:32 +0000 Subject: [PATCH 06/45] Rename method for clarity --- app/helpers/terms_and_conditions_helper.rb | 8 ++++---- app/services/terms_of_service.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/helpers/terms_and_conditions_helper.rb b/app/helpers/terms_and_conditions_helper.rb index 35232da157..2eb4773ecf 100644 --- a/app/helpers/terms_and_conditions_helper.rb +++ b/app/helpers/terms_and_conditions_helper.rb @@ -7,11 +7,11 @@ module TermsAndConditionsHelper end def render_terms_and_conditions - if platform_terms_required? && terms_and_conditions_activated? + if platform_terms_required? && distributor_terms_required? render("checkout/all_terms_and_conditions") elsif platform_terms_required? render "checkout/platform_terms_of_service" - elsif terms_and_conditions_activated? + elsif distributor_terms_required? render "checkout/terms_and_conditions" end end @@ -20,8 +20,8 @@ module TermsAndConditionsHelper TermsOfService.platform_terms_required? end - def terms_and_conditions_activated? - TermsOfService.terms_and_conditions_activated?(current_order.distributor) + def distributor_terms_required? + TermsOfService.distributor_terms_required?(current_order.distributor) end def all_terms_and_conditions_already_accepted? diff --git a/app/services/terms_of_service.rb b/app/services/terms_of_service.rb index 32ca768d0c..62e497f7ff 100644 --- a/app/services/terms_of_service.rb +++ b/app/services/terms_of_service.rb @@ -15,7 +15,7 @@ class TermsOfService Spree::Config.shoppers_require_tos end - def self.terms_and_conditions_activated?(distributor) + def self.distributor_terms_required?(distributor) distributor.terms_and_conditions.file? end end From f2c506a292944afe9a12066537a345dc2ef7e04a Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:02:53 +0000 Subject: [PATCH 07/45] Update and extract summary_step? check --- app/controllers/split_checkout_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 5e36409b1c..d6d6450651 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -41,7 +41,7 @@ class SplitCheckoutController < ::BaseController end def confirm_order - return unless @order.confirmation? && params[:confirm_order] + return unless summary_step? && @order.confirmation? return unless validate_summary! && @order.errors.empty? @order.confirm! @@ -57,6 +57,10 @@ class SplitCheckoutController < ::BaseController @order.errors.empty? end + def summary_step? + params[:step] == "summary" + end + def advance_order_state return if @order.complete? From 18cdf98aa116ce887c3c1df697d9fdf02c2c350b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 28 Dec 2021 23:14:34 +0000 Subject: [PATCH 08/45] Set terms and conditions accepted when completing checkout --- app/controllers/split_checkout_controller.rb | 2 ++ app/services/terms_of_service.rb | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index d6d6450651..6ff7c24188 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -44,6 +44,7 @@ class SplitCheckoutController < ::BaseController return unless summary_step? && @order.confirmation? return unless validate_summary! && @order.errors.empty? + @order.customer.touch :terms_and_conditions_accepted_at @order.confirm! end @@ -81,6 +82,7 @@ class SplitCheckoutController < ::BaseController def validate_summary! return true if params[:accept_terms] + return true unless TermsOfService.required?(@order.distributor) @order.errors.add(:terms_and_conditions, t("split_checkout.errors.terms_not_accepted")) end diff --git a/app/services/terms_of_service.rb b/app/services/terms_of_service.rb index 62e497f7ff..95cbf661d6 100644 --- a/app/services/terms_of_service.rb +++ b/app/services/terms_of_service.rb @@ -11,6 +11,10 @@ class TermsOfService end end + def self.required?(distributor) + platform_terms_required? || distributor_terms_required?(distributor) + end + def self.platform_terms_required? Spree::Config.shoppers_require_tos end From f8efff9a4e7f1345daaac1a7c97233f99651a78a Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 12 Jan 2022 22:11:31 +0000 Subject: [PATCH 09/45] Don't show terms of service unless required --- app/helpers/terms_and_conditions_helper.rb | 4 ++++ app/views/split_checkout/_summary.html.haml | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/helpers/terms_and_conditions_helper.rb b/app/helpers/terms_and_conditions_helper.rb index 2eb4773ecf..c30b57164b 100644 --- a/app/helpers/terms_and_conditions_helper.rb +++ b/app/helpers/terms_and_conditions_helper.rb @@ -16,6 +16,10 @@ module TermsAndConditionsHelper end end + def any_terms_required?(distributor) + TermsOfService.required?(distributor) + end + def platform_terms_required? TermsOfService.platform_terms_required? end diff --git a/app/views/split_checkout/_summary.html.haml b/app/views/split_checkout/_summary.html.haml index 57c9c18ab5..131f6f3e0e 100644 --- a/app/views/split_checkout/_summary.html.haml +++ b/app/views/split_checkout/_summary.html.haml @@ -71,15 +71,16 @@ = render 'spree/orders/summary', order: @order -%div.checkout-substep.medium-6 - %div.checkout-input - = f.check_box :accept_terms, { id: "accept_terms", name: "accept_terms", "checked": "#{all_terms_and_conditions_already_accepted?}" }, 1, nil - = f.label :accept_terms, t('split_checkout.step3.terms_and_conditions.message_html', terms_and_conditions_link: link_to( t("split_checkout.step3.terms_and_conditions.link_text"), @order.distributor.terms_and_conditions.url, target: '_blank'), tos_link: link_to_platform_terms), { for: "accept_terms" } +- if any_terms_required?(@order.distributor) + %div.checkout-substep.medium-6 + %div.checkout-input + = f.check_box :accept_terms, { id: "accept_terms", name: "accept_terms", "checked": "#{all_terms_and_conditions_already_accepted?}" }, 1, nil + = f.label :accept_terms, t('split_checkout.step3.terms_and_conditions.message_html', terms_and_conditions_link: link_to( t("split_checkout.step3.terms_and_conditions.link_text"), @order.distributor.terms_and_conditions.url, target: '_blank'), tos_link: link_to_platform_terms), { for: "accept_terms" } - = f.error_message_on :terms_and_conditions, standalone: true + = f.error_message_on :terms_and_conditions, standalone: true - %div.checkout-input - = t("split_checkout.step3.agree") + %div.checkout-input + = t("split_checkout.step3.agree") %div.checkout-submit.medium-6 = f.submit t("split_checkout.step3.submit"), name: "confirm_order", class: "button primary", disabled: @terms_and_conditions_accepted == false || @platform_tos_accepted == false From b850fd6fda635542d8f2bf128fdb04856d2684a2 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 12 Jan 2022 22:14:06 +0000 Subject: [PATCH 10/45] Add controller spec for split checkout --- .../split_checkout_controller_spec.rb | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 spec/controllers/split_checkout_controller_spec.rb diff --git a/spec/controllers/split_checkout_controller_spec.rb b/spec/controllers/split_checkout_controller_spec.rb new file mode 100644 index 0000000000..92f8cba389 --- /dev/null +++ b/spec/controllers/split_checkout_controller_spec.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe SplitCheckoutController, type: :controller do + let(:user) { order.user } + let(:address) { create(:address) } + let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) } + let(:order_cycle) { create(:order_cycle, distributors: [distributor]) } + let(:exchange) { order_cycle.exchanges.outgoing.first } + let(:order) { + create(:order_with_line_items, line_items_count: 1, distributor: distributor, + order_cycle: order_cycle) + } + let(:payment_method) { distributor.payment_methods.first } + let(:shipping_method) { distributor.shipping_methods.first } + + before do + allow(Flipper).to receive(:enabled?).with(:split_checkout) { true } + allow(Flipper).to receive(:enabled?).with(:split_checkout, anything) { true } + + exchange.variants << order.line_items.first.variant + allow(controller).to receive(:current_order) { order } + allow(controller).to receive(:spree_current_user) { user } + end + + describe "#edit" do + it "renders the checkout" do + get :edit, params: { step: "details" } + expect(response.status).to eq 200 + end + + it "redirects to current step if no step is given" do + get :edit + expect(response).to redirect_to checkout_step_path(:details) + end + + context "when line items in the cart are not valid" do + before { allow(controller).to receive(:valid_order_line_items?) { false } } + + it "redirects to cart" do + get :edit + expect(response).to redirect_to cart_path + end + end + end + + describe "#update" do + let(:checkout_params) { {} } + let(:params) { { step: step }.merge(checkout_params) } + + context "details step" do + let(:step) { "details" } + + context "with incomplete data" do + let(:checkout_params) { { order: { email: user.email } } } + + it "returns 422 and some feedback" do + put :update, params: params + + expect(response.status).to eq 422 + expect(flash[:error]).to eq "Saving failed, please update the highlighted fields." + expect(order.reload.state).to eq "cart" + end + end + + context "with complete data" do + let(:checkout_params) do + { + order: { + email: user.email, + bill_address_attributes: address.to_param, + ship_address_attributes: address.to_param + }, + shipping_method_id: shipping_method.id + } + end + + it "updates and redirects to payment step" do + put :update, params: params + + expect(response).to redirect_to checkout_step_path(:payment) + expect(order.reload.state).to eq "payment" + end + end + end + + context "payment step" do + let(:step) { "payment" } + + before do + order.bill_address = address + order.ship_address = address + order.select_shipping_method shipping_method.id + OrderWorkflow.new(order).advance_to_payment + end + + context "with incomplete data" do + let(:checkout_params) { { order: { email: user.email } } } + + it "returns 422 and some feedback" do + put :update, params: params + + expect(response.status).to eq 422 + expect(flash[:error]).to eq "Saving failed, please update the highlighted fields." + expect(order.reload.state).to eq "payment" + end + end + + context "with complete data" do + let(:checkout_params) do + { + order: { + payments_attributes: [ + { payment_method_id: payment_method.id } + ] + } + } + end + + it "updates and redirects to payment step" do + put :update, params: params + + expect(response).to redirect_to checkout_step_path(:summary) + expect(order.reload.state).to eq "confirmation" + end + end + end + + context "summary step" do + let(:step) { "summary" } + + before do + order.bill_address = address + order.ship_address = address + order.select_shipping_method shipping_method.id + OrderWorkflow.new(order).advance_to_payment + + order.payments << build(:payment, amount: order.total, payment_method: payment_method) + order.next + end + + describe "confirming the order" do + it "completes the order and redirects to order confirmation" do + put :update, params: params + + expect(response).to redirect_to order_path(order) + expect(order.reload.state).to eq "complete" + end + end + + context "when accepting T&Cs is required" do + before do + allow(TermsOfService).to receive(:platform_terms_required?) { true } + end + + describe "submitting without accepting the T&Cs" do + let(:checkout_params) { {} } + + it "returns 422 and some feedback" do + put :update, params: params + + expect(response.status).to eq 422 + expect(flash[:error]).to eq "Saving failed, please update the highlighted fields." + expect(order.reload.state).to eq "confirmation" + end + end + + describe "submitting and accepting the T&Cs" do + let(:checkout_params) { { accept_terms: true } } + + it "completes the order and redirects to order confirmation" do + put :update, params: params + + expect(response).to redirect_to order_path(order) + expect(order.reload.state).to eq "complete" + end + end + end + end + end +end From 1d4803c31abbef53c6104d81f4aa95db38308299 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 12 Jan 2022 22:40:04 +0000 Subject: [PATCH 11/45] Whitelist valid step param values --- app/controllers/split_checkout_controller.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 6ff7c24188..25775745f0 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -53,7 +53,8 @@ class SplitCheckoutController < ::BaseController @order.select_shipping_method(params[:shipping_method_id]) @order.update(order_params) - send("validate_#{params[:step]}!") + + validate_current_step! @order.errors.empty? end @@ -68,6 +69,11 @@ class SplitCheckoutController < ::BaseController OrderWorkflow.new(@order).advance_checkout(raw_params.slice(:shipping_method_id)) end + def validate_current_step! + step = params[:step].tap{ |step| ["details", "payment", "summary"].include? step } + send("validate_#{step}!") + end + def validate_details! return true if params[:shipping_method_id].present? From 7c2b3cdf5111c65a9e7f45522c6ecf923296a356 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:14:55 +0000 Subject: [PATCH 12/45] Fix param whitelisting Co-authored-by: Maikel --- app/controllers/split_checkout_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 25775745f0..a69d1dc5e0 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -70,7 +70,7 @@ class SplitCheckoutController < ::BaseController end def validate_current_step! - step = params[:step].tap{ |step| ["details", "payment", "summary"].include? step } + step = ([params[:step]] & ["details", "payment", "summary"]).first send("validate_#{step}!") end From f8a9d9ecfa160429e18234f2b5198468511f8cf4 Mon Sep 17 00:00:00 2001 From: Transifex-Openfoodnetwork Date: Tue, 18 Jan 2022 20:18:22 +1100 Subject: [PATCH 13/45] Updating translations for config/locales/fr.yml --- config/locales/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 113f04ca30..e99d06fcdd 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1353,6 +1353,7 @@ fr: terms_and_conditions: "CGU & CGV" failed: "La validation du paiement a échoué. Contactez-nous afin de finaliser votre commande." payment_cancelled_due_to_stock: "Paiement annulé : la commande n'a pas été finalisée car un ou plusieurs articles ne sont plus en stock." + order_not_loaded: "Aucune commande n'a été trouvée pour poursuivre le parcours d'achat." shops: hubs: show_closed_shops: "Afficher les boutiques fermées" @@ -3235,7 +3236,6 @@ fr: notice_messages: variant_deleted: "Variante supprimée" or: "Ou" - order_processed_successfully: "Commande traitée avec succès" payment_method_not_supported: "Mode de paiement non pris en charge" resend_authorization_email: "Renvoyer l'e-mail d'autorisation" rma_credit: "Crédit ARM" From 7d55bf9184ce550fe8d57986ce05177701609192 Mon Sep 17 00:00:00 2001 From: Transifex-Openfoodnetwork Date: Tue, 18 Jan 2022 20:18:34 +1100 Subject: [PATCH 14/45] Updating translations for config/locales/en_FR.yml --- config/locales/en_FR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en_FR.yml b/config/locales/en_FR.yml index 4c79272083..31383df1e1 100644 --- a/config/locales/en_FR.yml +++ b/config/locales/en_FR.yml @@ -1351,6 +1351,7 @@ en_FR: terms_and_conditions: "Terms and Conditions" failed: "The checkout failed. Please let us know so that we can process your order." payment_cancelled_due_to_stock: "Payment cancelled: the checkout could not be completed due to stock issues." + order_not_loaded: "No valid order found for checkout processing" shops: hubs: show_closed_shops: "Show closed shops" @@ -3206,7 +3207,6 @@ en_FR: notice_messages: variant_deleted: "Variant deleted" or: "Or" - order_processed_successfully: "Order processed successfully" payment_method_not_supported: "Payment method not supported" resend_authorization_email: "Resend authorization email" rma_credit: "RMA credit" From 9ac5a1d37994180b5eab6505f29240491174c98c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:21:14 +0000 Subject: [PATCH 15/45] Bump listen from 3.7.0 to 3.7.1 Bumps [listen](https://github.com/guard/listen) from 3.7.0 to 3.7.1. - [Release notes](https://github.com/guard/listen/releases) - [Commits](https://github.com/guard/listen/compare/v3.7.0...v3.7.1) --- updated-dependencies: - dependency-name: listen dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..646228fe82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -269,7 +269,7 @@ GEM concurrent-ruby (~> 1.1) websocket-driver (>= 0.6, < 0.8) ffaker (2.20.0) - ffi (1.15.4) + ffi (1.15.5) flipper (0.20.4) flipper-active_record (0.20.4) activerecord (>= 5.0, < 7) @@ -344,7 +344,7 @@ GEM letter_opener (1.7.0) launchy (~> 2.2) libv8-node (15.14.0.1) - listen (3.7.0) + listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) loofah (2.13.0) From 64ecc5757f9a00ecd447112bdca7dab996965ed6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:21:54 +0000 Subject: [PATCH 16/45] Bump stripe from 5.39.0 to 5.42.0 Bumps [stripe](https://github.com/stripe/stripe-ruby) from 5.39.0 to 5.42.0. - [Release notes](https://github.com/stripe/stripe-ruby/releases) - [Changelog](https://github.com/stripe/stripe-ruby/blob/master/CHANGELOG.md) - [Commits](https://github.com/stripe/stripe-ruby/compare/v5.39.0...v5.42.0) --- updated-dependencies: - dependency-name: stripe dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..6da64359e9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -613,7 +613,7 @@ GEM activerecord (>= 5.1) state_machines-activemodel (>= 0.8.0) stringex (2.8.5) - stripe (5.39.0) + stripe (5.42.0) temple (0.8.2) test-prof (1.0.7) test-unit (3.5.0) From 944a899931ef25ef415bbbb3daa2c7b734d73fe4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:22:31 +0000 Subject: [PATCH 17/45] Bump monetize from 1.11.0 to 1.12.0 Bumps [monetize](https://github.com/RubyMoney/monetize) from 1.11.0 to 1.12.0. - [Release notes](https://github.com/RubyMoney/monetize/releases) - [Changelog](https://github.com/RubyMoney/monetize/blob/main/CHANGELOG.md) - [Commits](https://github.com/RubyMoney/monetize/compare/v1.11.0...v1.12.0) --- updated-dependencies: - dependency-name: monetize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..02569633c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -366,9 +366,9 @@ GEM mini_racer (0.4.0) libv8-node (~> 15.14.0.0) minitest (5.15.0) - monetize (1.11.0) + monetize (1.12.0) money (~> 6.12) - money (6.14.1) + money (6.16.0) i18n (>= 0.6.4, <= 2) msgpack (1.4.2) multi_json (1.15.0) From 0c2c853e8e1a89078166a497d24bbb6e5fa580ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:23:17 +0000 Subject: [PATCH 18/45] Bump ddtrace from 0.53.0 to 0.54.1 Bumps [ddtrace](https://github.com/DataDog/dd-trace-rb) from 0.53.0 to 0.54.1. - [Release notes](https://github.com/DataDog/dd-trace-rb/releases) - [Changelog](https://github.com/DataDog/dd-trace-rb/blob/master/CHANGELOG.md) - [Commits](https://github.com/DataDog/dd-trace-rb/compare/v0.53.0...v0.54.1) --- updated-dependencies: - dependency-name: ddtrace dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..b232f193ea 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -220,9 +220,10 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - ddtrace (0.53.0) - ffi (~> 1.0) + ddtrace (0.54.1) + debase-ruby_core_source (= 0.10.12) msgpack + debase-ruby_core_source (0.10.12) debugger-linecache (1.2.0) devise (4.8.0) bcrypt (~> 3.0) @@ -269,7 +270,7 @@ GEM concurrent-ruby (~> 1.1) websocket-driver (>= 0.6, < 0.8) ffaker (2.20.0) - ffi (1.15.4) + ffi (1.15.5) flipper (0.20.4) flipper-active_record (0.20.4) activerecord (>= 5.0, < 7) From 661d678910f5cbbe53ae048bd72603eb7fbc5b51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:23:59 +0000 Subject: [PATCH 19/45] Bump rubocop-rails from 2.12.4 to 2.13.2 Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.12.4 to 2.13.2. - [Release notes](https://github.com/rubocop/rubocop-rails/releases) - [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.12.4...v2.13.2) --- updated-dependencies: - dependency-name: rubocop-rails dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..e9e8c5fd7f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -398,7 +398,7 @@ GEM parallel (1.21.0) paranoia (2.4.3) activerecord (>= 4.0, < 6.2) - parser (3.0.2.0) + parser (3.1.0.0) ast (~> 2.4.1) paypal-sdk-core (0.3.4) multi_json (~> 1.0) @@ -471,7 +471,7 @@ GEM method_source rake (>= 0.13) thor (~> 1.0) - rainbow (3.0.0) + rainbow (3.1.1) rake (13.0.6) ransack (2.4.2) activerecord (>= 5.2.4) @@ -482,7 +482,7 @@ GEM ffi (~> 1.0) redcarpet (3.5.1) redis (4.5.1) - regexp_parser (2.1.1) + regexp_parser (2.2.0) request_store (1.5.0) rack (>= 1.4) responders (3.0.1) @@ -547,9 +547,9 @@ GEM rubocop-ast (>= 1.12.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.12.0) + rubocop-ast (1.15.1) parser (>= 3.0.1.1) - rubocop-rails (2.12.4) + rubocop-rails (2.13.2) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.7.0, < 2.0) From c0e63d8299770e395440a489ad75fc2ec4c1982b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:24:29 +0000 Subject: [PATCH 20/45] Bump activerecord-import from 1.2.0 to 1.3.0 Bumps [activerecord-import](https://github.com/zdennis/activerecord-import) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/zdennis/activerecord-import/releases) - [Changelog](https://github.com/zdennis/activerecord-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/zdennis/activerecord-import/compare/v1.2.0...v1.3.0) --- updated-dependencies: - dependency-name: activerecord-import dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..05ed15c3ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -106,8 +106,8 @@ GEM activerecord (6.1.4.4) activemodel (= 6.1.4.4) activesupport (= 6.1.4.4) - activerecord-import (1.2.0) - activerecord (>= 3.2) + activerecord-import (1.3.0) + activerecord (>= 4.2) activerecord-postgresql-adapter (0.0.1) pg activerecord-session_store (2.0.0) From cfd8f81b3aeb70bfc645f25fb36970033e6760a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:24:56 +0000 Subject: [PATCH 21/45] Bump rails-i18n from 6.0.0 to 7.0.1 Bumps [rails-i18n](https://github.com/svenfuchs/rails-i18n) from 6.0.0 to 7.0.1. - [Release notes](https://github.com/svenfuchs/rails-i18n/releases) - [Changelog](https://github.com/svenfuchs/rails-i18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenfuchs/rails-i18n/commits) --- updated-dependencies: - dependency-name: rails-i18n dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2604c074a..18845c39c0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -461,9 +461,9 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.4.2) loofah (~> 2.3) - rails-i18n (6.0.0) + rails-i18n (7.0.1) i18n (>= 0.7, < 2) - railties (>= 6.0.0, < 7) + railties (>= 6.0.0, < 8) rails_safe_tasks (1.0.0) railties (6.1.4.4) actionpack (= 6.1.4.4) From 98968591fc31d12f0a53509479a2d8571e535eb3 Mon Sep 17 00:00:00 2001 From: Transifex-Openfoodnetwork Date: Tue, 18 Jan 2022 21:25:22 +1100 Subject: [PATCH 22/45] Updating translations for config/locales/de_DE.yml --- config/locales/de_DE.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index cdf354c99d..153329b915 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -1353,6 +1353,7 @@ de_DE: terms_and_conditions: "Allgemeinen Geschäftsbedingungen (AGB)" failed: "Der Bestellabschluss ist fehlgeschlagen. Bitte geben Sie uns Bescheid, damit wir Ihre Bestellung dennoch bearbeiten können." payment_cancelled_due_to_stock: "Zahlung storniert: Der Bestellabschluss konnte aufgrund von Problemen mit dem Lagerbestand nicht abgeschlossen werden." + order_not_loaded: "Keine gültige Bestellung für den Bestellabschluss gefunden." shops: hubs: show_closed_shops: "Geschlossene Läden anzeigen" @@ -3215,7 +3216,6 @@ de_DE: notice_messages: variant_deleted: "Produktvariante wurde gelöscht" or: "oder" - order_processed_successfully: "Ihre Bestellung wurde erfolgreich verarbeitet." payment_method_not_supported: "Zahlungsart wird nicht unterstützt" resend_authorization_email: "Autorisierungs-E-Mail erneut senden" rma_credit: "Gutschrift aus Retour" From 8455d79f9b877367975cde4c20c23c3fc44361ac Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Tue, 18 Jan 2022 20:35:08 +0100 Subject: [PATCH 23/45] Use the last payment method instead of the first for the Payment Method Report --- app/helpers/spree/reports_helper.rb | 2 +- lib/open_food_network/order_cycle_management_report.rb | 2 +- spec/helpers/spree/admin/reports_helper_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/spree/reports_helper.rb b/app/helpers/spree/reports_helper.rb index a06cb9fade..80bafa4c5a 100644 --- a/app/helpers/spree/reports_helper.rb +++ b/app/helpers/spree/reports_helper.rb @@ -6,7 +6,7 @@ module Spree module ReportsHelper def report_payment_method_options(orders) orders.map do |order| - payment_method = order.payments.first&.payment_method + payment_method = order.payments.last&.payment_method next unless payment_method diff --git a/lib/open_food_network/order_cycle_management_report.rb b/lib/open_food_network/order_cycle_management_report.rb index b08dec9726..d011b66467 100644 --- a/lib/open_food_network/order_cycle_management_report.rb +++ b/lib/open_food_network/order_cycle_management_report.rb @@ -94,7 +94,7 @@ module OpenFoodNetwork order.email, ba&.phone, order.shipping_method&.name, - order.payments.first&.payment_method&.name, + order.payments.last&.payment_method&.name, order.total, balance(order)] end diff --git a/spec/helpers/spree/admin/reports_helper_spec.rb b/spec/helpers/spree/admin/reports_helper_spec.rb index 46f8070a4c..a4460e2b4a 100644 --- a/spec/helpers/spree/admin/reports_helper_spec.rb +++ b/spec/helpers/spree/admin/reports_helper_spec.rb @@ -7,7 +7,7 @@ describe Spree::ReportsHelper, type: :helper do let(:order_with_payments) { create(:order_ready_to_ship) } let(:order_without_payments) { create(:order_with_line_items) } let(:orders) { [order_with_payments, order_without_payments] } - let(:payment_method) { order_with_payments.payments.first.payment_method } + let(:payment_method) { order_with_payments.payments.last.payment_method } it "returns payment method select options for given orders" do select_options = helper.report_payment_method_options([order_with_payments]) From 8ce27bed86c55df7628f0dd02502b0a3a95ec367 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 13 Jan 2022 21:44:25 +0000 Subject: [PATCH 24/45] Move guest checkout handling to the frontend --- app/controllers/split_checkout_controller.rb | 19 ++---------- app/views/split_checkout/_checkout.html.haml | 2 +- app/views/split_checkout/_guest.html.haml | 23 +++++++------- app/views/split_checkout/edit.html.haml | 8 ++++- .../controllers/guest_checkout_controller.js | 31 +++++++++++++++++++ config/routes.rb | 2 +- spec/system/consumer/split_checkout_spec.rb | 18 ++++------- 7 files changed, 61 insertions(+), 42 deletions(-) create mode 100644 app/webpacker/controllers/guest_checkout_controller.js diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 344ca96a36..6ec8532e13 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -16,16 +16,10 @@ class SplitCheckoutController < ::BaseController helper OrderHelper def edit - return redirect_to_step unless params[:step] - - return redirect_to_guest if !spree_current_user && - !@order.distributor.allow_guest_orders? && - params[:step] != "guest" + redirect_to_step unless params[:step] end def update - return redirect_to_guest if !spree_current_user && !@order.distributor.allow_guest_orders? - if confirm_order || update_order clear_invalid_payments advance_order_state @@ -33,10 +27,9 @@ class SplitCheckoutController < ::BaseController else flash.now[:error] = I18n.t('split_checkout.errors.global') - render operations: cable_car. + render status: :unprocessable_entity, operations: cable_car. replace("#checkout", partial("split_checkout/checkout")). - replace("#flashes", partial("shared/flashes", locals: { flashes: flash })), - status: :unprocessable_entity + replace("#flashes", partial("shared/flashes", locals: { flashes: flash })) end end @@ -91,13 +84,7 @@ class SplitCheckoutController < ::BaseController @order_params ||= Checkout::Params.new(@order, params).call end - def redirect_to_guest - redirect_to checkout_step_path(:guest) - end - def redirect_to_step - return redirect_to_guest if !spree_current_user && !params[:step] - case @order.state when "cart", "address", "delivery" redirect_to checkout_step_path(:details) diff --git a/app/views/split_checkout/_checkout.html.haml b/app/views/split_checkout/_checkout.html.haml index de3e5010c5..f26c8c4ca9 100644 --- a/app/views/split_checkout/_checkout.html.haml +++ b/app/views/split_checkout/_checkout.html.haml @@ -1,4 +1,4 @@ %checkout.row#checkout .small-12.medium-12.columns - = render partial: "split_checkout/tabs" unless checkout_step?(:guest) + = render partial: "split_checkout/tabs" = render partial: "split_checkout/form" diff --git a/app/views/split_checkout/_guest.html.haml b/app/views/split_checkout/_guest.html.haml index b0d9125405..189d7aa842 100644 --- a/app/views/split_checkout/_guest.html.haml +++ b/app/views/split_checkout/_guest.html.haml @@ -1,12 +1,13 @@ -.medium-10 - %div.checkout-guest-title - = t :checkout_headline +.checkout-step + .medium-10 + %div.checkout-guest-title + = t :checkout_headline - %div.checkout-submit{ class: "#{@order.distributor.allow_guest_orders? ? 'checkout-submit-inline' : 'medium-6' }" } - %a.primary.button{href: main_app.login_path} - = t :label_login - -if @order.distributor.allow_guest_orders? - %span.checkout-submit-or - or - %a.button.cancel{href: main_app.checkout_step_path(:details)} - = t :checkout_as_guest + %div.checkout-submit{ class: "#{@order.distributor.allow_guest_orders? ? 'checkout-submit-inline' : 'medium-6' }" } + %a.primary.button{ href: main_app.login_path } + = t :label_login + -if @order.distributor.allow_guest_orders? + %span.checkout-submit-or + or + %button.button.cancel{ "data-action": "click->guest-checkout#guestSelected" } + = t :checkout_as_guest diff --git a/app/views/split_checkout/edit.html.haml b/app/views/split_checkout/edit.html.haml index 282da26f2c..7043b31543 100644 --- a/app/views/split_checkout/edit.html.haml +++ b/app/views/split_checkout/edit.html.haml @@ -19,6 +19,12 @@ .sub-header.show-for-medium-down = render partial: "shopping_shared/order_cycles" - = render partial: "checkout" + .row{ "data-controller": "guest-checkout", "data-guest-checkout-distributor-value": @order.distributor.id } + %div{ style: "display: #{spree_current_user ? 'block' : 'none'}", "data-guest-checkout-target": "checkout" } + = render partial: "checkout" + + - unless spree_current_user + %div{ style: "display: block", "data-guest-checkout-target": "guest" } + = render partial: "guest" = render partial: "shared/footer" diff --git a/app/webpacker/controllers/guest_checkout_controller.js b/app/webpacker/controllers/guest_checkout_controller.js new file mode 100644 index 0000000000..a8ba6b18bb --- /dev/null +++ b/app/webpacker/controllers/guest_checkout_controller.js @@ -0,0 +1,31 @@ +import { Controller } from "stimulus" + +export default class extends Controller { + static targets = ["checkout", "guest"]; + static values = { + distributor: String, + session: { type: String, default: "guest-checkout" } + }; + + connect() { + if(!this.hasGuestTarget) { return } + + if(this.usingGuestCheckout()) { + this.showCheckout(); + } + } + + showCheckout() { + this.checkoutTarget.style.display = "block"; + this.guestTarget.style.display = "none"; + } + + guestSelected() { + this.showCheckout(); + sessionStorage.setItem(this.sessionValue, this.distributorValue); + } + + usingGuestCheckout() { + return sessionStorage.getItem(this.sessionValue) === this.distributorValue + } +} diff --git a/config/routes.rb b/config/routes.rb index 0fa8f94a0a..d6a135b3dd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,7 +87,7 @@ Openfoodnetwork::Application.routes.draw do constraints SplitCheckoutConstraint.new do get '/checkout', to: 'split_checkout#edit' - constraints step: /(guest|details|payment|summary)/ do + constraints step: /(details|payment|summary)/ do get '/checkout/:step', to: 'split_checkout#edit', as: :checkout_step put '/checkout/:step', to: 'split_checkout#update', as: :checkout_update end diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index 5a6f2cd0d9..281c81f003 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -53,26 +53,18 @@ describe "As a consumer, I want to checkout my order", js: true do context "guest checkout when distributor doesn't allow guest orders" do before do - visit checkout_path + visit checkout_step_path(:details) end it "should display the split checkout login page" do - expect(page).to have_content distributor.name expect(page).to have_content("Ok, ready to checkout?") expect(page).to have_content("Login") expect(page).to have_no_content("Checkout as guest") end - it "should be redirected if user enter the url" do - order.update(state: "payment") - get checkout_step_path(:details) - expect(response).to have_http_status(:redirect) - expect(page).to have_content("Ok, ready to checkout?") - end - it "should redirect to the login page when clicking the login button" do click_on "Login" - expect(page).to have_content("Login") + expect(page).to have_current_path "/" end end @@ -83,7 +75,7 @@ describe "As a consumer, I want to checkout my order", js: true do visit checkout_path end - it "should display the split checkout login/guest page" do + it "should display the split checkout login/guest form" do expect(page).to have_content distributor.name expect(page).to have_content("Ok, ready to checkout?") expect(page).to have_content("Login") @@ -126,7 +118,7 @@ describe "As a consumer, I want to checkout my order", js: true do it "should allow visit '/checkout/details'" do order.update(state: "payment") visit checkout_step_path(:details) - expect(page).to have_button("Next - Payment method") + expect(page).to have_current_path("/checkout/details") end end end @@ -236,8 +228,10 @@ describe "As a consumer, I want to checkout my order", js: true do before do variant.update!(on_demand: false, on_hand: 0) end + it "returns me to the cart with an error message" do visit checkout_path + expect(page).not_to have_selector 'closing', text: "Checkout now" expect(page).to have_selector 'closing', text: "Your shopping cart" expect(page).to have_content "An item in your cart has become unavailable" From 21ed136e0049743853750c90edcb979226485b41 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 13 Jan 2022 23:11:48 +0000 Subject: [PATCH 25/45] Enable opening login modal via broadcasted DOM Event --- app/assets/javascripts/darkswarm/directives/auth.js.coffee | 6 ++++++ app/views/split_checkout/_guest.html.haml | 2 +- app/webpacker/controllers/guest_checkout_controller.js | 4 ++++ spec/system/consumer/split_checkout_spec.rb | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/darkswarm/directives/auth.js.coffee b/app/assets/javascripts/darkswarm/directives/auth.js.coffee index f554e9de20..aaa8be0def 100644 --- a/app/assets/javascripts/darkswarm/directives/auth.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/auth.js.coffee @@ -3,3 +3,9 @@ angular.module('Darkswarm').directive 'auth', (AuthenticationService) -> link: (scope, elem, attrs) -> elem.bind "click", -> AuthenticationService.open '/' + attrs.auth + + window.addEventListener "login:modal:open", -> + AuthenticationService.open '/login' + + scope.$on "$destroy", -> + window.removeEventListener "login:modal:open" diff --git a/app/views/split_checkout/_guest.html.haml b/app/views/split_checkout/_guest.html.haml index 189d7aa842..fd9c8af083 100644 --- a/app/views/split_checkout/_guest.html.haml +++ b/app/views/split_checkout/_guest.html.haml @@ -4,7 +4,7 @@ = t :checkout_headline %div.checkout-submit{ class: "#{@order.distributor.allow_guest_orders? ? 'checkout-submit-inline' : 'medium-6' }" } - %a.primary.button{ href: main_app.login_path } + %button.button.primary{ "data-action": "click->guest-checkout#login" } = t :label_login -if @order.distributor.allow_guest_orders? %span.checkout-submit-or diff --git a/app/webpacker/controllers/guest_checkout_controller.js b/app/webpacker/controllers/guest_checkout_controller.js index a8ba6b18bb..450e6ca271 100644 --- a/app/webpacker/controllers/guest_checkout_controller.js +++ b/app/webpacker/controllers/guest_checkout_controller.js @@ -15,6 +15,10 @@ export default class extends Controller { } } + login() { + window.dispatchEvent(new Event("login:modal:open")) + } + showCheckout() { this.checkoutTarget.style.display = "block"; this.guestTarget.style.display = "none"; diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index 281c81f003..670c17a951 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -62,9 +62,9 @@ describe "As a consumer, I want to checkout my order", js: true do expect(page).to have_no_content("Checkout as guest") end - it "should redirect to the login page when clicking the login button" do + it "should show the login modal when clicking the login button" do click_on "Login" - expect(page).to have_current_path "/" + expect(page).to have_selector ".login-modal" end end From 8f37aa71f2da47ac6a8da4762e6edaacac0bb5ae Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sat, 15 Jan 2022 23:03:31 +0000 Subject: [PATCH 26/45] Save default addresses when requested during checkout --- app/models/spree/order.rb | 21 ++++++++++++++++++- app/services/checkout/params.rb | 1 + app/views/split_checkout/_details.html.haml | 8 +++---- .../split_checkout_controller_spec.rb | 16 ++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index ae82ac9a49..2bcc58eee6 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -30,7 +30,7 @@ module Spree go_to_state :complete end - attr_accessor :use_billing, :checkout_processing + attr_accessor :use_billing, :checkout_processing, :save_bill_address, :save_ship_address token_resource @@ -104,6 +104,8 @@ module Spree before_save :update_shipping_fees!, if: :complete? before_save :update_payment_fees!, if: :complete? + after_save_commit :save_default_addresses + # -- Scopes scope :not_empty, -> { left_outer_joins(:line_items).where.not(spree_line_items: { id: nil }) @@ -743,5 +745,22 @@ module Spree pending_payments.first.update_attribute :amount, total end + + def save_default_addresses + return unless save_bill_address || save_ship_address + + if save_bill_address + customer.bill_address_id = bill_address_id + user&.bill_address_id = bill_address_id + end + + if save_ship_address + customer.ship_address_id = ship_address_id + user&.ship_address_id = ship_address_id + end + + customer.save + user&.save + end end end diff --git a/app/services/checkout/params.rb b/app/services/checkout/params.rb index eaa0a0c815..10715c8acc 100644 --- a/app/services/checkout/params.rb +++ b/app/services/checkout/params.rb @@ -24,6 +24,7 @@ module Checkout def apply_strong_parameters @order_params = params.require(:order).permit( :email, :shipping_method_id, :special_instructions, :existing_card_id, + :save_bill_address, :save_ship_address, bill_address_attributes: ::PermittedAttributes::Address.attributes, ship_address_attributes: ::PermittedAttributes::Address.attributes, payments_attributes: [ diff --git a/app/views/split_checkout/_details.html.haml b/app/views/split_checkout/_details.html.haml index 4e0be37ac9..011e016fe7 100644 --- a/app/views/split_checkout/_details.html.haml +++ b/app/views/split_checkout/_details.html.haml @@ -60,8 +60,8 @@ - if spree_current_user||true %div.checkout-input - = f.check_box :checkout_default_bill_address - = f.label :checkout_default_bill_address, t(:checkout_default_bill_address) + = f.check_box :save_bill_address + = f.label :save_bill_address, t(:checkout_default_bill_address) %div.checkout-substep{ "data-controller": "toggle shippingmethod" } - selected_shipping_method = @order.shipping_method&.id || params[:shipping_method_id] @@ -136,8 +136,8 @@ - if spree_current_user %div.checkout-input{ "data-toggle-target": "content", style: "display: none" } - = f.check_box :default_ship_address, { id: "default_ship_address", name: "default_ship_address" } - = f.label :default_ship_address, t(:checkout_default_ship_address), { for: "default_ship_address" } + = f.check_box :save_ship_address + = f.label :save_ship_address, t(:checkout_default_ship_address) .div.checkout-input = f.label :special_instructions, t(:checkout_instructions) diff --git a/spec/controllers/split_checkout_controller_spec.rb b/spec/controllers/split_checkout_controller_spec.rb index 92f8cba389..9c8963a349 100644 --- a/spec/controllers/split_checkout_controller_spec.rb +++ b/spec/controllers/split_checkout_controller_spec.rb @@ -82,6 +82,22 @@ describe SplitCheckoutController, type: :controller do expect(response).to redirect_to checkout_step_path(:payment) expect(order.reload.state).to eq "payment" end + + describe "saving default addresses" do + it "updates default bill address on user and customer" do + put :update, params: params.merge({ order: { save_bill_address: true } }) + + expect(order.customer.bill_address).to eq(order.bill_address) + expect(order.user.bill_address).to eq(order.bill_address) + end + + it "updates default ship address on user and customer" do + put :update, params: params.merge({ order: { save_ship_address: true } }) + + expect(order.customer.ship_address).to eq(order.ship_address) + expect(order.user.ship_address).to eq(order.ship_address) + end + end end end From 8a944e3e7823bd53edd21313523632700fe2be59 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:41:35 +0000 Subject: [PATCH 27/45] Tidy up Order#save_default_addresses --- app/models/spree/order.rb | 13 +-------- app/services/default_address_updater.rb | 36 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 app/services/default_address_updater.rb diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 2bcc58eee6..8c33b8d759 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -749,18 +749,7 @@ module Spree def save_default_addresses return unless save_bill_address || save_ship_address - if save_bill_address - customer.bill_address_id = bill_address_id - user&.bill_address_id = bill_address_id - end - - if save_ship_address - customer.ship_address_id = ship_address_id - user&.ship_address_id = ship_address_id - end - - customer.save - user&.save + DefaultAddressUpdater.new(self).call end end end diff --git a/app/services/default_address_updater.rb b/app/services/default_address_updater.rb new file mode 100644 index 0000000000..57f219e746 --- /dev/null +++ b/app/services/default_address_updater.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class DefaultAddressUpdater + def initialize(order) + @order = order + end + + def call + assign_bill_addresses + assign_ship_addresses + + customer.save + user&.save + end + + private + + attr_reader :order + + delegate :save_ship_address, :save_bill_address, :customer, :user, + :bill_address_id, :ship_address_id, to: :order + + def assign_bill_addresses + return unless save_bill_address + + customer.bill_address_id = bill_address_id + user&.bill_address_id = bill_address_id + end + + def assign_ship_addresses + return unless save_ship_address + + customer.ship_address_id = ship_address_id + user&.ship_address_id = ship_address_id + end +end From 2b960a04c6a5a9596b1d873e567b6cbb6d6175ca Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:12:27 +0000 Subject: [PATCH 28/45] Move Order callback entirely into service --- app/models/spree/order.rb | 8 +------- app/services/default_address_updater.rb | 6 ++++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 8c33b8d759..aa08cca513 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -104,7 +104,7 @@ module Spree before_save :update_shipping_fees!, if: :complete? before_save :update_payment_fees!, if: :complete? - after_save_commit :save_default_addresses + after_save_commit DefaultAddressUpdater # -- Scopes scope :not_empty, -> { @@ -745,11 +745,5 @@ module Spree pending_payments.first.update_attribute :amount, total end - - def save_default_addresses - return unless save_bill_address || save_ship_address - - DefaultAddressUpdater.new(self).call - end end end diff --git a/app/services/default_address_updater.rb b/app/services/default_address_updater.rb index 57f219e746..89868373d7 100644 --- a/app/services/default_address_updater.rb +++ b/app/services/default_address_updater.rb @@ -1,6 +1,12 @@ # frozen_string_literal: true class DefaultAddressUpdater + def self.after_commit(order) + return unless order.save_bill_address || order.save_ship_address + + new(order).call + end + def initialize(order) @order = order end From ec2bb340233cb9415c780e1b840178ccc761f4b4 Mon Sep 17 00:00:00 2001 From: Transifex-Openfoodnetwork Date: Thu, 20 Jan 2022 01:30:50 +1100 Subject: [PATCH 29/45] Updating translations for config/locales/ru.yml --- config/locales/ru.yml | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/config/locales/ru.yml b/config/locales/ru.yml index ee6ea40012..19c2ad6ea9 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -72,6 +72,44 @@ ru: missing: "У клиента нет карты, с которой начисляется оплата." processing_error: "Произошла ошибка при обработке карты." rate_limit: "Произошла ошибка из-за того, что запросы попали в API слишком быстро. Сообщите нам, если вы постоянно сталкиваетесь с этой ошибкой." + authentication_required: "Карта была отклонена, так как транзакция требует аутентификации." + approve_with_id: "Платеж не может быть авторизован." + call_issuer: "Карта была отклонена по неизвестной причине." + card_not_supported: "Карта не поддерживает этот тип покупки." + card_velocity_exceeded: "Клиент превысил баланс или кредитный лимит, доступный на его карте." + currency_not_supported: "Карта не поддерживает указанную валюту." + do_not_honor: "Карта была отклонена по неизвестной причине." + do_not_try_again: "Карта была отклонена по неизвестной причине." + duplicate_transaction: "Слишком часто была отправлена транзакция с одинаковой суммой и данными кредитной карты." + fraudulent: "Платеж был отклонен, так как Stripe подозревает, что это мошенничество." + generic_decline: "Карта была отклонена по неизвестной причине." + incorrect_pin: "Введен неверный PIN-код. Этот код отклонения применяется только к платежам, совершенным с помощью устройства для чтения карт." + insufficient_funds: "На карте недостаточно средств для совершения покупки." + invalid_account: "Карта или счет, к которому привязана карта, недействительны." + invalid_amount: "Сумма платежа недействительна или превышает допустимую сумму." + invalid_pin: "Введен неверный PIN-код. Этот код отклонения применяется только к платежам, совершенным с помощью устройства для чтения карт." + issuer_not_available: "Не удалось связаться с эмитентом карты, поэтому платеж не мог быть авторизован." + lost_card: "Платеж был отклонен, поскольку заявлено, что карта утеряна." + merchant_blacklist: "Платеж был отклонен, поскольку пользователь Stripe в черном списке." + new_account_information_available: "Карта или счет, к которому привязана карта, недействительны." + no_action_taken: "Карта была отклонена по неизвестной причине." + not_permitted: "Оплата не разрешена." + offline_pin_required: "Карта была отклонена, так как требует PIN-код." + online_or_offline_pin_required: "Карта была отклонена, так как требует PIN-код." + pickup_card: "Карту нельзя использовать для этого платежа (возможно, она была утеряна или украдена)." + pin_try_exceeded: "Превышено допустимое количество попыток ввода PIN-кода." + reenter_transaction: "Платеж не может быть обработан эмитентом по неизвестной причине." + restricted_card: "Карту нельзя использовать для этого платежа (возможно, она была утеряна или украдена)." + revocation_of_all_authorizations: "Карта была отклонена по неизвестной причине." + revocation_of_authorization: "Карта была отклонена по неизвестной причине." + security_violation: "Карта была отклонена по неизвестной причине." + service_not_allowed: "Карта была отклонена по неизвестной причине." + stolen_card: "Платеж был отклонен, поскольку карта была украдена." + stop_payment_order: "Карта была отклонена по неизвестной причине." + testmode_decline: "Был использован номер тестовой карты Stripe." + transaction_not_allowed: "Карта была отклонена по неизвестной причине." + try_again_later: "Карта была отклонена по неизвестной причине." + withdrawal_count_limit_exceeded: "Клиент превысил баланс или кредитный лимит, доступный на его карте." activemodel: attributes: order_management/reports/enterprise_fee_summary/parameters: @@ -138,6 +176,9 @@ ru: already_registered: "Этот адрес электронной почты уже зарегистрирован. Пожалуйста, войдите, чтобы продолжить, или вернитесь и используйте другой адрес электронной почты." success: logged_in_succesfully: "Вы успешно вошли" + sessions: + signed_out: "Выполнен выход." + already_signed_out: "Выполнен выход." user_passwords: spree_user: updated_not_active: "Ваш пароль был сброшен, но ваш адрес электронной почты еще не подтвержден." @@ -1313,6 +1354,7 @@ ru: terms_and_conditions: "Условия и Положения" failed: "Оформить заказ не удалось. Сообщите нам, чтобы мы могли обработать ваш заказ." payment_cancelled_due_to_stock: "Платеж отменен: оформление заказа не может быть выполнено из-за проблем на складе." + order_not_loaded: "Не найден действительный заказ для оформления" shops: hubs: show_closed_shops: "Показать закрытые магазины" @@ -3221,7 +3263,6 @@ ru: notice_messages: variant_deleted: "Вариант удален" or: "Или" - order_processed_successfully: "Заказ успешно обработан" payment_method_not_supported: "Способ оплаты не поддерживается" resend_authorization_email: "Повторно отправить письмо для авторизации" rma_credit: "Кредит RMA" From d57e64cf7e78d6ddd5a4d12bc30d7bbcae1c909d Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:17:35 +0000 Subject: [PATCH 30/45] Add new order factories for checkout steps --- spec/factories/order_factory.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/spec/factories/order_factory.rb b/spec/factories/order_factory.rb index 0bd6a8c718..2baa4bc92a 100644 --- a/spec/factories/order_factory.rb +++ b/spec/factories/order_factory.rb @@ -11,6 +11,39 @@ FactoryBot.define do completed_at { nil } email { user&.email || customer.email } + factory :order_ready_for_details do + distributor { create(:distributor_enterprise, with_payment_and_shipping: true) } + order_cycle { create(:order_cycle, distributors: [distributor]) } + + after(:create) do |order| + order.line_items << build(:line_item, order: order) + order.updater.update_totals_and_states + + order.order_cycle.exchanges.outgoing.first.variants << order.line_items.first.variant + end + + factory :order_ready_for_payment do + bill_address + ship_address + + after(:create) do |order, evaluator| + order.select_shipping_method evaluator.shipping_method.id + OrderWorkflow.new(order).advance_to_payment + end + + factory :order_ready_for_confirmation do + transient do + payment_method { create(:payment_method, distributors: [distributor]) } + end + + after(:create) do |order, evaluator| + order.payments << build(:payment, amount: order.total, payment_method: evaluator.payment_method) + order.next! + end + end + end + end + factory :order_with_totals do after(:create) do |order| create(:line_item, order: order) From 49623f6b4a6b49e0d05016b7a2026b57c4a1de0c Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:18:08 +0000 Subject: [PATCH 31/45] Simplify test setup --- spec/system/consumer/split_checkout_spec.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index 670c17a951..20e2d15748 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -8,7 +8,7 @@ describe "As a consumer, I want to checkout my order", js: true do let!(:zone) { create(:zone_with_member) } let(:supplier) { create(:supplier_enterprise) } - let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true, allow_guest_orders: false) } + let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true) } let(:product) { create(:taxed_product, supplier: supplier, price: 10, zone: zone, tax_rate_amount: 0.1) } @@ -53,6 +53,7 @@ describe "As a consumer, I want to checkout my order", js: true do context "guest checkout when distributor doesn't allow guest orders" do before do + distributor.update_columns allow_guest_orders: false visit checkout_step_path(:details) end @@ -70,8 +71,6 @@ describe "As a consumer, I want to checkout my order", js: true do context "as a guest user" do before do - distributor.update!(allow_guest_orders: true) - order.update!(distributor_id: distributor.id) visit checkout_path end From fb8f5ee5ce977e6bc75ec518e747b736d8e3fe2b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:19:04 +0000 Subject: [PATCH 32/45] Increase flexibility in test setup --- spec/system/consumer/split_checkout_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index 20e2d15748..b544c033b6 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -19,7 +19,8 @@ describe "As a consumer, I want to checkout my order", js: true do } let(:order) { create(:order, order_cycle: order_cycle, distributor: distributor, bill_address_id: nil, - ship_address_id: nil, state: "cart") + ship_address_id: nil, state: "cart", + line_items: [create(:line_item, variant: variant)]) } let(:fee_tax_rate) { create(:tax_rate, amount: 0.10, zone: zone, included_in_price: true) } @@ -45,7 +46,6 @@ describe "As a consumer, I want to checkout my order", js: true do add_enterprise_fee enterprise_fee set_order order - add_product_to_cart order, product distributor.shipping_methods << free_shipping distributor.shipping_methods << shipping_with_fee From 0f154de2351311daeee8d93145a9f7d2b66ae751 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:24:47 +0000 Subject: [PATCH 33/45] Use OrderCompletion in split checkout for #order_completion_reset --- app/controllers/split_checkout_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 941bcf7b10..19eb4da3a0 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -8,6 +8,7 @@ class SplitCheckoutController < ::BaseController include OrderStockCheck include Spree::BaseHelper include CheckoutCallbacks + include OrderCompletion include CablecarResponses helper 'terms_and_conditions' @@ -45,6 +46,7 @@ class SplitCheckoutController < ::BaseController @order.customer.touch :terms_and_conditions_accepted_at @order.confirm! + order_completion_reset @order end def update_order From 2f7ef33cafe5fcc2f7f9b5e1d44234c1d19be99b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:29:12 +0000 Subject: [PATCH 34/45] Add test for maintaining hub selection after order completion --- spec/system/consumer/split_checkout_spec.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index b544c033b6..2fb01311dd 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -221,6 +221,25 @@ describe "As a consumer, I want to checkout my order", js: true do expect(page).to have_content("Select a shipping method") end end + + context "summary step" do + let(:order) { create(:order_ready_for_confirmation, distributor: distributor) } + + describe "completing the checkout" do + it "keeps the distributor selected for the current user after completion" do + visit checkout_step_path(:summary) + + expect(page).to have_content "Shopping @ #{distributor.name}" + + click_on "Complete order" + + expect(page).to have_content "Back To Store" + expect(order.reload.state).to eq "complete" + + expect(page).to have_content "Shopping @ #{distributor.name}" + end + end + end end context "when I have an out of stock product in my cart" do From 30df9e513905ca8bb6913bc67c14b778aaab9867 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jan 2022 22:50:55 +0000 Subject: [PATCH 35/45] Bump log4js from 6.3.0 to 6.4.0 Bumps [log4js](https://github.com/log4js-node/log4js-node) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/log4js-node/log4js-node/releases) - [Changelog](https://github.com/log4js-node/log4js-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/log4js-node/log4js-node/compare/v6.3.0...v6.4.0) --- updated-dependencies: - dependency-name: log4js dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 99 ++++++++++++++++++++++--------------------------------- 1 file changed, 40 insertions(+), 59 deletions(-) diff --git a/yarn.lock b/yarn.lock index 726c35f628..41288debb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5144,15 +5144,10 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - -date-format@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" - integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== +date-format@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.3.tgz#f63de5dc08dc02efd8ef32bf2a6918e486f35873" + integrity sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" @@ -5161,10 +5156,10 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: dependencies: ms "2.0.0" -debug@4, debug@~4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" @@ -5175,13 +5170,6 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -6131,15 +6119,10 @@ flatpickr@^4.6.9: resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499" integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw== -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatted@^3.2.2, flatted@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== flatten@^1.0.2: version "1.0.3" @@ -6250,14 +6233,14 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" @@ -6541,11 +6524,16 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -8209,13 +8197,6 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -8438,15 +8419,15 @@ lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17 integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log4js@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" - integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + version "6.4.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.4.0.tgz#3f63ccfc8033c83cd617a4d2d50e48be5944eae9" + integrity sha512-ysc/XUecZJuN8NoKOssk3V0cQ29xY4fra6fnigZa5VwxFsCsvdqsdnEuAxNN89LlHpbE4KUD3zGcn+kFqonSVQ== dependencies: - date-format "^3.0.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.4" + date-format "^4.0.3" + debug "^4.3.3" + flatted "^3.2.4" + rfdc "^1.3.0" + streamroller "^3.0.2" loglevel@^1.6.8: version "1.7.1" @@ -11070,7 +11051,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.1.4: +rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== @@ -11749,14 +11730,14 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -streamroller@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" - integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== +streamroller@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.0.2.tgz#30418d0eee3d6c93ec897f892ed098e3a81e68b7" + integrity sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA== dependencies: - date-format "^2.1.0" + date-format "^4.0.3" debug "^4.1.1" - fs-extra "^8.1.0" + fs-extra "^10.0.0" strict-uri-encode@^1.0.0: version "1.1.0" @@ -12489,7 +12470,7 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== From 5e21ae23c098cd4e5260a6769c8653e68ea8138b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jan 2022 09:49:33 +0000 Subject: [PATCH 36/45] Bump nanoid from 3.1.30 to 3.2.0 Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.2.0. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.2.0) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 726c35f628..6197fb6419 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8928,9 +8928,9 @@ nan@^2.12.1: integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanoid@^3.1.23: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== nanomatch@^1.2.9: version "1.2.13" From 205fb630cb074c349b3cd3131593ead360ea5614 Mon Sep 17 00:00:00 2001 From: Maikel Date: Mon, 24 Jan 2022 10:23:51 +1100 Subject: [PATCH 37/45] Fix typos in release task template --- .github/ISSUE_TEMPLATE/release.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md index c07cc658e6..c13f012764 100644 --- a/.github/ISSUE_TEMPLATE/release.md +++ b/.github/ISSUE_TEMPLATE/release.md @@ -28,7 +28,7 @@ assignees: ''
   git checkout master # same version as the release draft
   git fetch upstream
-  git diff upstream master -- config/locales/en.yml
+  git diff upstream/master -- config/locales/en.yml
   tx pull --force # if no changes or only additions in the locale
   git checkout --detach # if we need to commit new translations
   git commit -a -m "Update translations"
@@ -43,7 +43,6 @@ assignees: ''
   
   cd ofn-install
   git pull
-  (cd ../ofn-secrets && git pull)
   ansible-playbook --limit all-prod --extra-vars "git_version=vx.y.z" playbooks/deploy.yml
   
From 7eed639164f10b9d41c3143184a24bfdf4c74f45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 13:01:44 +0000 Subject: [PATCH 38/45] Bump node-fetch from 2.6.1 to 2.6.7 Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c133532248..54583b0206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8964,9 +8964,11 @@ no-case@^3.0.4: tslib "^2.0.3" node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" node-forge@^0.10.0: version "0.10.0" @@ -12213,6 +12215,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" @@ -12747,6 +12754,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -12930,6 +12942,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" From 06b2031914d264f9504b9cb209d809baddf701e4 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sat, 25 Dec 2021 17:32:55 +0000 Subject: [PATCH 39/45] Update Ruby to 3.0.2 --- .ruby-version | 2 +- Gemfile | 2 +- Gemfile.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ruby-version b/.ruby-version index 2c9b4ef42e..b502146930 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.3 +3.0.2 diff --git a/Gemfile b/Gemfile index 31fad37f59..46893c855e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby "2.7.3" +ruby "3.0.2" git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" } gem 'dotenv-rails', require: 'dotenv/rails-now' # Load ENV vars before other gems diff --git a/Gemfile.lock b/Gemfile.lock index f769251c6f..bd2165f3a8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -805,7 +805,7 @@ DEPENDENCIES wkhtmltopdf-binary RUBY VERSION - ruby 2.7.3p183 + ruby 3.0.2p107 BUNDLED WITH 2.1.4 From 783c0976536f664a49ffb9fb53bdd7015d195adc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:56:13 +0000 Subject: [PATCH 40/45] Update roo gem for Ruby 3 compatibility --- Gemfile | 2 +- Gemfile.lock | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 46893c855e..e16eeb329b 100644 --- a/Gemfile +++ b/Gemfile @@ -94,7 +94,7 @@ gem 'wicked_pdf' gem 'wkhtmltopdf-binary' gem 'immigrant' -gem 'roo', '~> 2.8.3' +gem 'roo', github: "roo-rb/roo" # master is currently needed for Ruby 3.x (awaiting new release) gem 'spreadsheet_architect' gem 'whenever', require: false diff --git a/Gemfile.lock b/Gemfile.lock index bd2165f3a8..0eea10bf40 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,6 +24,14 @@ GIT sass-rails thor (>= 0.14) +GIT + remote: https://github.com/roo-rb/roo.git + revision: 709464c77623be2bc09b2103405d90ded7604a75 + specs: + roo (2.8.3) + nokogiri (~> 1) + rubyzip (>= 1.3.0, < 3.0.0) + PATH remote: engines/catalog specs: @@ -500,9 +508,6 @@ GEM builder (>= 3.0) dry-inflector (~> 0.1) rubyzip (>= 1.0) - roo (2.8.3) - nokogiri (~> 1) - rubyzip (>= 1.3.0, < 3.0.0) rspec (3.10.0) rspec-core (~> 3.10.0) rspec-expectations (~> 3.10.0) @@ -769,7 +774,7 @@ DEPENDENCIES redis (>= 4.0) responders roadie-rails - roo (~> 2.8.3) + roo! rspec-rails (>= 3.5.2) rspec-retry rswag From 8ec7d3b651f2f1ea46dfe7437a8e3b7cab1ec0c1 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 10:59:53 +0000 Subject: [PATCH 41/45] Fix use of deprecated keyword args syntax in reports --- .../enterprise_fee_summary/data_representations/with_i18n.rb | 2 +- .../reports/enterprise_fee_summary/report_service_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/order_management/app/services/order_management/reports/enterprise_fee_summary/data_representations/with_i18n.rb b/engines/order_management/app/services/order_management/reports/enterprise_fee_summary/data_representations/with_i18n.rb index 92ce8859f5..4601efeaa3 100644 --- a/engines/order_management/app/services/order_management/reports/enterprise_fee_summary/data_representations/with_i18n.rb +++ b/engines/order_management/app/services/order_management/reports/enterprise_fee_summary/data_representations/with_i18n.rb @@ -8,7 +8,7 @@ module OrderManagement private def i18n_translate(translation_key, options = {}) - I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", options) + I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", **options) end end end diff --git a/engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/report_service_spec.rb b/engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/report_service_spec.rb index 88de4dccca..44cf80200d 100644 --- a/engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/report_service_spec.rb +++ b/engines/order_management/spec/services/order_management/reports/enterprise_fee_summary/report_service_spec.rb @@ -678,7 +678,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do # Helper methods for example group def i18n_translate(translation_key, options = {}) - I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", options) + I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", **options) end def expect_total_attributes(total, expected_attribute_list) From f7b65efb005e6fa3c40eb55bf59ae60ca0970ddf Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 11:22:49 +0000 Subject: [PATCH 42/45] Bump to Ruby 3.0.3 --- .ruby-version | 2 +- Gemfile | 2 +- Gemfile.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ruby-version b/.ruby-version index b502146930..75a22a26ac 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.0.2 +3.0.3 diff --git a/Gemfile b/Gemfile index e16eeb329b..eb50548752 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby "3.0.2" +ruby "3.0.3" git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" } gem 'dotenv-rails', require: 'dotenv/rails-now' # Load ENV vars before other gems diff --git a/Gemfile.lock b/Gemfile.lock index 0eea10bf40..f74aa25eb7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -810,7 +810,7 @@ DEPENDENCIES wkhtmltopdf-binary RUBY VERSION - ruby 3.0.2p107 + ruby 3.0.3p157 BUNDLED WITH 2.1.4 From 48a7cfa09e47a9bde4958e3e46452939d09d10ab Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 11:29:21 +0000 Subject: [PATCH 43/45] Fix more deprecated keyword arguments --- app/views/producers/_fat.html.haml | 2 +- spec/controllers/api/v0/base_controller_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/producers/_fat.html.haml b/app/views/producers/_fat.html.haml index c198621680..54e7c7298a 100644 --- a/app/views/producers/_fat.html.haml +++ b/app/views/producers/_fat.html.haml @@ -72,7 +72,7 @@ .columns.small-12.fat %div{"ng-if" => "::producer.name"} %label - = t :producers_buy_at_html, {enterprise: ''.html_safe} + = t :producers_buy_at_html, enterprise: ''.html_safe %div.show-for-medium-up{"ng-if" => "::!producer.name"}   .row.cta-container diff --git a/spec/controllers/api/v0/base_controller_spec.rb b/spec/controllers/api/v0/base_controller_spec.rb index ec9875723b..a2b9bdde62 100644 --- a/spec/controllers/api/v0/base_controller_spec.rb +++ b/spec/controllers/api/v0/base_controller_spec.rb @@ -38,7 +38,7 @@ describe Api::V0::BaseController do context "cannot make a request to the API" do it "with an invalid API key" do request.headers["X-Spree-Token"] = "fake_key" - get :index, {} + get :index, params: {} expect(json_response).to eq( "error" => "Invalid API key (fake_key) specified." ) expect(response.status).to eq(401) end From 21a3a6e338c61c8eee287fd9a866628a6595a511 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 18 Jan 2022 11:46:34 +0000 Subject: [PATCH 44/45] Update bootsnap --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f74aa25eb7..2c34e8a63f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -169,8 +169,8 @@ GEM bcrypt (3.1.16) bigdecimal (3.0.2) bindex (0.8.1) - bootsnap (1.9.1) - msgpack (~> 1.0) + bootsnap (1.10.1) + msgpack (~> 1.2) bugsnag (6.24.1) concurrent-ruby (~> 1.0) builder (3.2.4) From 41d56ce98b3743df8ec57d4d94fca2cd73015dba Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 24 Jan 2022 14:34:48 +0000 Subject: [PATCH 45/45] Add rexml This was previously included in Ruby, and has now been extracted. It's used by activemerchant and selenium and possibly others, but those gems don't currently declare it as a dependency. --- Gemfile | 1 + Gemfile.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index eb50548752..ee149950cf 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,7 @@ gem 'dotenv-rails', require: 'dotenv/rails-now' # Load ENV vars before other gem gem 'rails', '>= 6.1.4' gem 'activemerchant', '>= 1.78.0' +gem 'rexml' gem 'angular-rails-templates', '>= 0.3.0' gem 'awesome_nested_set' gem 'ransack', '2.4.2' diff --git a/Gemfile.lock b/Gemfile.lock index 2c34e8a63f..8707a67ca4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -773,6 +773,7 @@ DEPENDENCIES redcarpet redis (>= 4.0) responders + rexml roadie-rails roo! rspec-rails (>= 3.5.2)