mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
As an administrator
I want to create and edit orders
as an enterprise manager viewing the edit page with different shipping methods can edit shipping method
Failure/Error: expect(page).to have_content "Shipping: #{different_shipping_method_for_distributor1.name}"
expected to find text "Shipping: Different" in "Logged in as : owen@romaguera.ca Account Logout Store DASHBOARD PRODUCTS ORDER CYCLES ORDERS REPORTS ENTERPRISES CUSTOMERS Order # R813516688 CANCEL ACTIONS BACK TO ORDER LIST John Doe - ADD PRODUCT NAME OR SKU (ENTER AT LEAST FIRST 4 CHARACTERS OF PRODUCT NAME) Select a variant 100 - PENDING ITEM DESCRIPTION PRICE QUANTITY TOTAL Product #3 - 9924 - 1g, S $10.00 1 x none $10.00 Product #4 - 5548 - 1g, S $10.00 1 x none $10.00 Product #5 - 8080 - 1g, S $10.00 1 x none $10.00 Product #6 - 3591 - 1g, S $10.00 1 x none $10.00 Product #7 - 6461 - 1g, S $10.00 1 x none $10.00 Product #8 - 4071 - 1g, S $110.00 1 x none $110.00 SHIPPING METHOD Different $0.00 Normal $0.00 Different $0.00 Tracking: U10000 LINE ITEM ADJUSTMENTS NAME AMOUNT Tax 1 10.0%: $10.00 ORDER ADJUSTMENTS NAME AMOUNT Transaction fee: $0.00 ORDER TOTAL $160.00 DISTRIBUTION Distributor: Enterprise 4 Order cycle: Order Cycle 2 UPDATE AND RECALCULATE FEES or BACK ORDER INFORMATION STATUS COMPLETE TOTAL : $160.00 SHIPMENT : PENDING PAYMENT : BALANCE DUE DATE COMPLETED : November 08, 2020 1:51 AM ORDER DETAILS CUSTOMER DETAILS ADJUSTMENTS PAYMENTS RETURN AUTHORIZATIONS"
# ./spec/features/admin/order_spec.rb:291:in `block (5 levels) in <top (required)>'
113 lines
3.1 KiB
Ruby
113 lines
3.1 KiB
Ruby
require 'open_food_network/scope_variant_to_hub'
|
|
|
|
module Api
|
|
class ShipmentsController < Api::BaseController
|
|
respond_to :json
|
|
|
|
before_action :find_order
|
|
before_action :find_and_update_shipment, only: [:ship, :ready, :add, :remove]
|
|
|
|
def create
|
|
variant = scoped_variant(params[:variant_id])
|
|
quantity = params[:quantity].to_i
|
|
@shipment = get_or_create_shipment(params[:stock_location_id])
|
|
|
|
@order.contents.add(variant, quantity, nil, @shipment)
|
|
|
|
@shipment.refresh_rates
|
|
@shipment.save!
|
|
|
|
render json: @shipment.reload, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
def update
|
|
authorize! :read, Spree::Shipment
|
|
@shipment = @order.shipments.find_by!(number: params[:id])
|
|
params[:shipment] ||= []
|
|
unlock = params[:shipment].delete(:unlock)
|
|
|
|
if unlock == 'yes'
|
|
@shipment.adjustment.open
|
|
end
|
|
|
|
@shipment.update(shipment_params[:shipment])
|
|
|
|
if unlock == 'yes'
|
|
@shipment.adjustment.close
|
|
end
|
|
|
|
render json: @shipment.reload, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
def ready
|
|
authorize! :read, Spree::Shipment
|
|
unless @shipment.ready?
|
|
if @shipment.can_ready?
|
|
@shipment.ready!
|
|
else
|
|
render(json: { error: I18n.t(:cannot_ready, scope: "spree.api.shipment") },
|
|
status: :unprocessable_entity) && return
|
|
end
|
|
end
|
|
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
def ship
|
|
authorize! :read, Spree::Shipment
|
|
unless @shipment.shipped?
|
|
@shipment.ship!
|
|
end
|
|
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
def add
|
|
variant = scoped_variant(params[:variant_id])
|
|
quantity = params[:quantity].to_i
|
|
|
|
@order.contents.add(variant, quantity, nil, @shipment)
|
|
|
|
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
def remove
|
|
variant = scoped_variant(params[:variant_id])
|
|
quantity = params[:quantity].to_i
|
|
|
|
@order.contents.remove(variant, quantity, @shipment)
|
|
@shipment.reload if @shipment.persisted?
|
|
|
|
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
|
|
end
|
|
|
|
private
|
|
|
|
def find_order
|
|
@order = Spree::Order.find_by!(number: params[:order_id])
|
|
authorize! :read, @order
|
|
end
|
|
|
|
def find_and_update_shipment
|
|
@shipment = @order.shipments.find_by!(number: params[:id])
|
|
@shipment.update(shipment_params[:shipment]) if shipment_params[:shipment].present?
|
|
@shipment.reload
|
|
end
|
|
|
|
def scoped_variant(variant_id)
|
|
variant = Spree::Variant.find(variant_id)
|
|
OpenFoodNetwork::ScopeVariantToHub.new(@order.distributor).scope(variant)
|
|
variant
|
|
end
|
|
|
|
def get_or_create_shipment(stock_location_id)
|
|
@order.shipment || @order.shipments.create(stock_location_id: stock_location_id)
|
|
end
|
|
|
|
def shipment_params
|
|
params.permit(
|
|
[:id, :order_id, :variant_id, :quantity,
|
|
{ shipment: [:tracking, :selected_shipping_rate_id] }]
|
|
)
|
|
end
|
|
end
|
|
end
|