diff --git a/api/app/controllers/spree/api/customer_returns_controller.rb b/api/app/controllers/spree/api/customer_returns_controller.rb index 6bc4b769896..5484522e997 100644 --- a/api/app/controllers/spree/api/customer_returns_controller.rb +++ b/api/app/controllers/spree/api/customer_returns_controller.rb @@ -4,13 +4,14 @@ module Spree module Api class CustomerReturnsController < Spree::Api::BaseController before_action :load_order + before_action :build_return_items_from_params, only: [:create] around_action :lock_order, only: [:create, :update, :destroy, :cancel] rescue_from Spree::Order::InsufficientStock, with: :insufficient_stock_error def create authorize! :create, CustomerReturn - @customer_return = CustomerReturn.create(customer_return_params) + if @customer_return.save respond_with(@customer_return, status: 201, default_template: :show) else @@ -62,6 +63,26 @@ def load_order def customer_return_params params.require(:customer_return).permit(permitted_customer_return_attributes) end + + def build_return_items_from_params + customer_return_attributes = customer_return_params + return_items_params = customer_return_attributes. + delete(:return_items_attributes) + + @customer_return = CustomerReturn.new(customer_return_attributes) + + @customer_return.return_items = return_items_params.map do |item_params| + return_item = if item_params[:id] + Spree::ReturnItem.find(item_params[:id]) + else + Spree::ReturnItem.new + end + + return_item.assign_attributes(item_params) + + return_item + end.compact + end end end end diff --git a/api/spec/requests/spree/api/customer_returns_controller_spec.rb b/api/spec/requests/spree/api/customer_returns_controller_spec.rb index 017160d4a71..4c307af04f2 100644 --- a/api/spec/requests/spree/api/customer_returns_controller_spec.rb +++ b/api/spec/requests/spree/api/customer_returns_controller_spec.rb @@ -159,7 +159,6 @@ module Spree end it "can create a new customer return" do - pending("fix for referrencing existing return items") expect { subject }.to change { Spree::CustomerReturn.count }. from(0).to(1) @@ -172,6 +171,23 @@ module Spree to_not change { return_item.reload.reception_status }. from("awaiting") end + + context "with reception_status_event provided for return item" do + let(:customer_return_params) do + { + stock_location_id: stock_location.id, + return_items_attributes: [ + return_item.attributes.merge(reception_status_event: "receive") + ] + } + end + + it "updates the reception status of the return item" do + expect { subject }. + to change { return_item.reload.reception_status }. + from("awaiting").to("received") + end + end end end end