Ruby on rails 通过RubyonRails中的API在ZohoBooks中创建采购订单

Ruby on rails 通过RubyonRails中的API在ZohoBooks中创建采购订单,ruby-on-rails,ruby,zoho,zohobooks,Ruby On Rails,Ruby,Zoho,Zohobooks,我正在使用Zoho Books API创建采购订单 - 唯一需要的项目似乎是供应商id和行项目。但是,在创建作业后,我收到以下信息: ZohoBooks::BadRequestError:无法为非采购项目创建采购订单。 代码如下: ``` 这和我们制作发票时使用的代码是一样的,所以我遗漏了一些神奇的东西,让Zoho知道这是一个采购项目,而没有任何关于这可能是什么的指示。我通过聊天询问,得到了以下信息:您收到此错误消息的原因是,只有在添加商品的购买信息时,您才能创建采购订单。因此,答案比我想象的

我正在使用Zoho Books API创建采购订单

-

唯一需要的项目似乎是供应商id和行项目。但是,在创建作业后,我收到以下信息:

ZohoBooks::BadRequestError:无法为非采购项目创建采购订单。

代码如下:

```


这和我们制作发票时使用的代码是一样的,所以我遗漏了一些神奇的东西,让Zoho知道这是一个采购项目,而没有任何关于这可能是什么的指示。我通过聊天询问,得到了以下信息:您收到此错误消息的原因是,只有在添加商品的购买信息时,您才能创建采购订单。

因此,答案比我想象的要简单,尽管它花费的时间比我想发现的时间要长。最后,我决定尝试添加属性,即使它们被定义为可选的。通过包含项目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
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