Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fulfillment order related read requests #633

Merged
merged 2 commits into from
Jan 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/shopify_api/resources/assigned_fulfillment_order.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module ShopifyAPI
class AssignedFulfillmentOrder < Base
def self.find(scope, *args)
assigned_fulfillment_orders = super(scope, *args)
assigned_fulfillment_orders.map { |afo| FulfillmentOrder.new(afo.attributes) }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wont this cause complications? You find assigned fulfilments and then if you update that FulfillmentOrder it will hit the fulfillments endpoint. Why are you returning FulfillmentOrders from AssignedFulfillmentOrder. (this may just be me not understanding the work that you are doing)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AssignedFulfillmentOrders are just FulfillmentOrders that just happen to be assigned. We didn't want to create two different ActiveResource types for subsequent actions common to both AssignedFulfillmentOrders and FulfillmentOrders so we convert the first to the second.

end
end
end
20 changes: 20 additions & 0 deletions lib/shopify_api/resources/fulfillment_order.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module ShopifyAPI
class FulfillmentOrder < Base
def self.find(scope, *args)
if scope == :all
order_id = args.first&.dig(:params, :order_id)
raise ShopifyAPI::ValidationException, "'order_id' is required" if order_id.blank?

order = ::ShopifyAPI::Order.new(id: order_id)
order.fulfillment_orders(args.first[:params].except(:order_id))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to support the case of all here. If a user wants to get all fulfillment_orders for an order, they can call order.fulfillment_orders. Support calling .all with a param order_id seems redundant IMO.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that FulfillmentOrder can be queried as a top-level resource with find it would be unexpected from an ActiveResource implementation to not support all in some meaningful way.

else
super(scope, *args)
end
end

def fulfillments(options = {})
fulfillment_hashes = get(:fulfillments, options)
fulfillment_hashes.map { |fulfillment_hash| Fulfillment.new(fulfillment_hash) }
end
end
end
5 changes: 5 additions & 0 deletions lib/shopify_api/resources/order.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ def capture(amount = "", currency: nil)
Transaction.create(capture_transaction)
end

def fulfillment_orders(options = {})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this not be done with a has_many?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That doesn't quite work for us because FulfillmentOrder is both a top-level resource (i.e. /fulfillment_orders/:id) as well as defined within an order (/orders/:order_id/fulfillments). We resolved this by creating the FulfillmentOrder ActiveResource as a top-level one (no :order_id prefix_option) then handling the order.fulfillment_orders with method implementation rather than association.

fulfillment_order_hashes = get(:fulfillment_orders, options)
fulfillment_order_hashes.map { |fulfillment_order_hash| FulfillmentOrder.new(fulfillment_order_hash) }
end

class ClientDetails < Base
end
end
Expand Down
41 changes: 41 additions & 0 deletions test/assigned_fulfillment_order_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
require 'test_helper'

class AssignedFulFillmentOrderTest < Test::Unit::TestCase
context "AssignedFulfillmentOrder" do
context "#all" do
should "list assigned fulfillment orders by assigned_status" do
fulfillment_order_fixture = load_fixture('assigned_fulfillment_orders')
fake 'assigned_fulfillment_orders.json?assigned_status=cancellation_requested', method: :get,
karmakaze marked this conversation as resolved.
Show resolved Hide resolved
body: fulfillment_order_fixture, extension: false

assigned_fulfillment_orders = ShopifyAPI::AssignedFulfillmentOrder.all(
params: { assigned_status: 'cancellation_requested' }
karmakaze marked this conversation as resolved.
Show resolved Hide resolved
)

assert_equal 2, assigned_fulfillment_orders.count
assigned_fulfillment_orders.each do |fulfillment_order|
assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
assert_equal 'in_progress', fulfillment_order.status
assert_equal 'cancellation_accepted', fulfillment_order.request_status
end
end

should "be able to list assigned fulfillment orders by location_ids" do
fulfillment_order_fixture = load_fixture('assigned_fulfillment_orders')
assigned_location_id = 905684977
fake "assigned_fulfillment_orders.json?location_ids%5B%5D=#{assigned_location_id}", method: :get,
body: fulfillment_order_fixture, extension: false

assigned_fulfillment_orders = ShopifyAPI::AssignedFulfillmentOrder.all(
params: { location_ids: [assigned_location_id] }
)

assert_equal 2, assigned_fulfillment_orders.count
assigned_fulfillment_orders.each do |fulfillment_order|
assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
assert_equal assigned_location_id, fulfillment_order.assigned_location_id
end
end
end
end
end
78 changes: 78 additions & 0 deletions test/fixtures/assigned_fulfillment_orders.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
[
{
"id": 519788021,
"order_id": 450789469,
"fulfillment_service_handle": "shipwire",
"status": "in_progress",
"requires_shipping": true,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:42-04:00",
"updated_at": "2016-07-12T11:23:42-04:00",
"happened_at": "2016-07-12T11:23:42-04:00",
"assigned_location_id": 905684977,
"request_status": "cancellation_accepted",
"delivery_category": null,
"fulfillment_order_line_items": [
{
"id": 519788021,
"shop_id": 690933842,
"fulfillment_order_id": 519788021,
"line_item_id": 466157049,
"variant_id": 43729076,
"inventory_item_id": 808950810,
"inventory_commitment_id": 273471403,
"quantity": 1,
"sku": "IPOD2008GREEN",
"vendor": null,
"variant_title": "green",
"product_title": "IPod Nano - 8gb",
"pre_tax_price": 398.00,
"currency": "USD",
"properties": null,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:54-04:00",
"updated_at": "2016-07-12T11:23:54-04:00"
}
]
},
{
"id": 519788022,
"order_id": 450789469,
"fulfillment_service_handle": "manual",
"status": "in_progress",
"requires_shipping": true,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:42-04:00",
"updated_at": "2016-07-12T11:23:42-04:00",
"happened_at": "2016-07-12T11:23:42-04:00",
"assigned_location_id": 905684977,
"request_status": "cancellation_accepted",
"delivery_category": null,
"fulfillment_order_line_items": [
{
"id": 519788021,
"shop_id": 690933842,
"fulfillment_order_id": 519788021,
"line_item_id": 466157049,
"variant_id": 43729076,
"inventory_item_id": 808950810,
"inventory_commitment_id": 273471403,
"quantity": 1,
"sku": "IPOD2008RED",
"vendor": null,
"variant_title": "red",
"product_title": "IPod Nano - 8gb",
"pre_tax_price": 398.00,
"currency": "USD",
"properties": null,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:54-04:00",
"updated_at": "2016-07-12T11:23:54-04:00"
}
]
}
]
38 changes: 38 additions & 0 deletions test/fixtures/fulfillment_order.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"id": 519788021,
"order_id": 450789469,
"fulfillment_service_handle": "shipwire",
"status": "open",
"requires_shipping": true,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:42-04:00",
"updated_at": "2016-07-12T11:23:42-04:00",
"happened_at": "2016-07-12T11:23:42-04:00",
"assigned_location_id": 905684977,
"request_status": "unsubmitted",
"delivery_category": null,
"fulfillment_order_line_items": [
{
"id": 519788021,
"shop_id": 690933842,
"fulfillment_order_id": 519788021,
"line_item_id": 466157049,
"variant_id": 43729076,
"inventory_item_id": 808950810,
"inventory_commitment_id": 273471403,
"quantity": 1,
"sku": "IPOD2008GREEN",
"vendor": null,
"variant_title": "green",
"product_title": "IPod Nano - 8gb",
"pre_tax_price": 398.00,
"currency": "USD",
"properties": null,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:54-04:00",
"updated_at": "2016-07-12T11:23:54-04:00"
}
]
}
78 changes: 78 additions & 0 deletions test/fixtures/fulfillment_orders.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
[
{
"id": 519788021,
"order_id": 450789469,
"fulfillment_service_handle": "shipwire",
"status": "open",
"requires_shipping": true,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:42-04:00",
"updated_at": "2016-07-12T11:23:42-04:00",
"happened_at": "2016-07-12T11:23:42-04:00",
"assigned_location_id": 905684977,
"request_status": "unsubmitted",
"delivery_category": null,
"fulfillment_order_line_items": [
{
"id": 519788021,
"shop_id": 690933842,
"fulfillment_order_id": 519788021,
"line_item_id": 466157049,
"variant_id": 43729076,
"inventory_item_id": 808950810,
"inventory_commitment_id": 273471403,
"quantity": 1,
"sku": "IPOD2008GREEN",
"vendor": null,
"variant_title": "green",
"product_title": "IPod Nano - 8gb",
"pre_tax_price": 398.00,
"currency": "USD",
"properties": null,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:54-04:00",
"updated_at": "2016-07-12T11:23:54-04:00"
}
]
},
{
"id": 519788022,
"order_id": 450789469,
"fulfillment_service_handle": "manual",
"status": "open",
"requires_shipping": true,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:42-04:00",
"updated_at": "2016-07-12T11:23:42-04:00",
"happened_at": "2016-07-12T11:23:42-04:00",
"assigned_location_id": 905684977,
"request_status": "unsubmitted",
"delivery_category": null,
"fulfillment_order_line_items": [
{
"id": 519788021,
"shop_id": 690933842,
"fulfillment_order_id": 519788021,
"line_item_id": 466157049,
"variant_id": 43729076,
"inventory_item_id": 808950810,
"inventory_commitment_id": 273471403,
"quantity": 1,
"sku": "IPOD2008RED",
"vendor": null,
"variant_title": "red",
"product_title": "IPod Nano - 8gb",
"pre_tax_price": 398.00,
"currency": "USD",
"properties": null,
"is_not_deleted": true,
"deleted_at": null,
"created_at": "2016-07-12T11:23:54-04:00",
"updated_at": "2016-07-12T11:23:54-04:00"
}
]
}
]
53 changes: 53 additions & 0 deletions test/fixtures/fulfillments.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
[
{
"created_at": "2014-03-07T16:14:08-05:00",
"id": 255858046,
"order_id": 450789469,
"service": "manual",
"status": "failure",
"tracking_company": null,
"updated_at": "2014-03-07T16:14:08-05:00",
"tracking_number": "1Z2345",
"tracking_numbers": [
"1Z2345"
],
"tracking_url": "http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber1=1Z2345&TypeOfInquiryNumber=T&AcceptUPSLicenseAgreement=yes&submit=Track",
"tracking_urls": [
"http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber1=1Z2345&TypeOfInquiryNumber=T&AcceptUPSLicenseAgreement=yes&submit=Track"
],
"receipt": {
"testcase": true,
"authorization": "123456"
},
"line_items": [
{
"fulfillment_service": "manual",
"fulfillment_status": null,
"grams": 200,
"id": 466157049,
"price": "199.00",
"product_id": 632910392,
"quantity": 1,
"requires_shipping": true,
"sku": "IPOD2008GREEN",
"taxable": true,
"title": "IPod Nano - 8gb",
"variant_id": 39072856,
"variant_title": "green",
"vendor": null,
"name": "IPod Nano - 8gb - green",
"variant_inventory_management": "shopify",
"properties": [
{
"name": "Custom Engraving",
"value": "Happy Birthday"
}
],
"product_exists": true,
"tax_lines": [

]
}
]
}
]
61 changes: 61 additions & 0 deletions test/fulfillment_order_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
require 'test_helper'

class FulFillmentOrderTest < Test::Unit::TestCase
def setup
super
fake "fulfillment_orders/519788021", method: :get,
body: load_fixture('fulfillment_order')

fake "orders/450789469/fulfillment_orders", method: :get,
body: load_fixture('fulfillment_orders')
end

context "FulfillmentOrder" do
context "#find" do
should "be able to find fulfillment order" do
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)
assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
assert_equal 519788021, fulfillment_order.id
assert_equal 450789469, fulfillment_order.order_id
end
end

context "#all" do
should "be able to list fulfillment orders for an order" do
fake 'orders/450789469/fulfillment_orders', method: :get, body: load_fixture('fulfillment_orders')

fulfillment_orders = ShopifyAPI::FulfillmentOrder.all(
params: { order_id: 450789469 }
)

assert_equal [519788021, 519788022], fulfillment_orders.map(&:id).sort
fulfillment_orders.each do |fulfillment_order|
assert fulfillment_order.is_a?(ShopifyAPI::FulfillmentOrder)
assert_equal 450789469, fulfillment_order.order_id
end
end

should "require order_id" do
assert_raises ShopifyAPI::ValidationException do
ShopifyAPI::FulfillmentOrder.all
end
end
end

context "#fulfillments" do
should "be able to list fulfillments for a fulfillment order" do
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(519788021)

fake "fulfillment_orders/#{fulfillment_order.id}/fulfillments", method: :get,
body: load_fixture('fulfillments')

fulfillments = fulfillment_order.fulfillments

assert_equal 1, fulfillments.count
fulfillment = fulfillments.first
assert fulfillment.is_a?(ShopifyAPI::Fulfillment)
assert_equal 450789469, fulfillment.order_id
end
end
end
end
Loading