在 Rails Ruby 中通过 API 在 zoho books 中创建采购订单
Create purchase order in zoho books via API in Ruby on Rails
我正在使用 Zoho Books API 创建采购订单
(https://www.zoho.com/books/api/v3/#Purchase-Order_Create_a_purchase_order) -
唯一需要的项目似乎是 vendor_id
和 line_items
。但是,在创建工作后,我收到以下消息:
ZohoBooks::BadRequestError: Purchase order cannot be created for a non-purchase item.
这是代码:
```
class CreatePurchaseOrderJob < ApplicationJob
queue_as :default
def perform(order_id)
@order = SupplierOrder.find(order_id)
create_purchase_order
end
private
attr_reader :order
def vendor
name = order.supplier.name
books.get_contact_with_options(contact_type: :vendor, contact_name: name)
end
def create_purchase_order
payload = {
vendor_id: vendor['contact_id'],
purchaseorder_number: order.reference,
reference_number: order.reference,
line_items: line_items
}
books.create_purchase_order(payload)
end
def line_items
order.rfq_line_item_prices.order(:id).map do |price|
line_item(price)
end
end
def line_item(price)
{
name: price.current_line_item.shape,
description: price.current_line_item&.name,
bcy_rate: price.unit_price.to_f,
rate: price.unit_price.to_f,
quantity: price.current_line_item.quantity,
tax_id: Registry.zoho_vat_tax_id,
item_custom_fields: [
{ label: 'Grade', value: price.current_line_item&.grade },
{ label: 'Finish', value: price.current_line_item&.finish },
{ label: 'Dimensions', value: price.current_line_item&.dimensions }
]
}
end
def books
@books ||= Registry.books
end
end
这与我们用来制作发票的代码相同,并且可以正常工作,所以我遗漏了一些神奇的东西,让 Zoho 知道这是一个购买项目,但没有任何指示可能是什么。我通过聊天询问并得到以下信息:The reason why you're getting this error message is because, You can create a purchase order only when you add the purchase info for an item.
所以答案比我想象的要容易,尽管它花费的时间比我想发现的要长。最终我决定尝试添加属性,即使它们被定义为可选。通过包含项目 ID,它允许创建采购订单。
我的最终代码:
class CreatePurchaseOrderJob < ApplicationJob
queue_as :default
def perform(order_id)
@order = SupplierOrder.find(order_id)
create_purchase_order
end
private
def payload
{
vendor_id: vendor['contact_id'],
reference_number: order&.reference,
line_items: line_items
}
end
attr_reader :order
def vendor
@vendor ||= books.find_or_create_vendor(order.supplier)
end
def create_purchase_order
begin
books.create_purchase_order(payload)
rescue Exception => e
Airbrake.notify(e)
end
end
def line_items
order.line_item_prices.order(:id).map do |price|
line_item(price)
end
end
def item_id(name)
books.find_or_create_item(name)['item_id']
end
def line_item(price)
{
item_id: item_id(price.current_line_item.shape),
description: price.current_line_item&.description,
bcy_rate: price.unit_price.to_f,
rate: price.unit_price.to_f,
quantity: price.current_line_item.quantity,
tax_id: Registry.vat_tax_id,
item_custom_fields: [
{ label: 'Grade', value: price.current_line_item&.grade },
{ label: 'Finish', value: price.current_line_item&.finish },
{ label: 'Dimensions', value: price.current_line_item&.dimensions }
]
}
end
def books
@books ||= Registry.books
end
end
我正在使用 Zoho Books API 创建采购订单
(https://www.zoho.com/books/api/v3/#Purchase-Order_Create_a_purchase_order) -
唯一需要的项目似乎是 vendor_id
和 line_items
。但是,在创建工作后,我收到以下消息:
ZohoBooks::BadRequestError: Purchase order cannot be created for a non-purchase item.
这是代码:
```
class CreatePurchaseOrderJob < ApplicationJob
queue_as :default
def perform(order_id)
@order = SupplierOrder.find(order_id)
create_purchase_order
end
private
attr_reader :order
def vendor
name = order.supplier.name
books.get_contact_with_options(contact_type: :vendor, contact_name: name)
end
def create_purchase_order
payload = {
vendor_id: vendor['contact_id'],
purchaseorder_number: order.reference,
reference_number: order.reference,
line_items: line_items
}
books.create_purchase_order(payload)
end
def line_items
order.rfq_line_item_prices.order(:id).map do |price|
line_item(price)
end
end
def line_item(price)
{
name: price.current_line_item.shape,
description: price.current_line_item&.name,
bcy_rate: price.unit_price.to_f,
rate: price.unit_price.to_f,
quantity: price.current_line_item.quantity,
tax_id: Registry.zoho_vat_tax_id,
item_custom_fields: [
{ label: 'Grade', value: price.current_line_item&.grade },
{ label: 'Finish', value: price.current_line_item&.finish },
{ label: 'Dimensions', value: price.current_line_item&.dimensions }
]
}
end
def books
@books ||= Registry.books
end
end
这与我们用来制作发票的代码相同,并且可以正常工作,所以我遗漏了一些神奇的东西,让 Zoho 知道这是一个购买项目,但没有任何指示可能是什么。我通过聊天询问并得到以下信息:The reason why you're getting this error message is because, You can create a purchase order only when you add the purchase info for an item.
所以答案比我想象的要容易,尽管它花费的时间比我想发现的要长。最终我决定尝试添加属性,即使它们被定义为可选。通过包含项目 ID,它允许创建采购订单。
我的最终代码:
class CreatePurchaseOrderJob < ApplicationJob
queue_as :default
def perform(order_id)
@order = SupplierOrder.find(order_id)
create_purchase_order
end
private
def payload
{
vendor_id: vendor['contact_id'],
reference_number: order&.reference,
line_items: line_items
}
end
attr_reader :order
def vendor
@vendor ||= books.find_or_create_vendor(order.supplier)
end
def create_purchase_order
begin
books.create_purchase_order(payload)
rescue Exception => e
Airbrake.notify(e)
end
end
def line_items
order.line_item_prices.order(:id).map do |price|
line_item(price)
end
end
def item_id(name)
books.find_or_create_item(name)['item_id']
end
def line_item(price)
{
item_id: item_id(price.current_line_item.shape),
description: price.current_line_item&.description,
bcy_rate: price.unit_price.to_f,
rate: price.unit_price.to_f,
quantity: price.current_line_item.quantity,
tax_id: Registry.vat_tax_id,
item_custom_fields: [
{ label: 'Grade', value: price.current_line_item&.grade },
{ label: 'Finish', value: price.current_line_item&.finish },
{ label: 'Dimensions', value: price.current_line_item&.dimensions }
]
}
end
def books
@books ||= Registry.books
end
end