Создание заказа на покупку в zoho books через API в Ruby on Rails - PullRequest
0 голосов
/ 28 июня 2018

Я использую API Zoho Books для создания заказа на покупку

(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

Это тот же код, который мы используем для выставления счетов, и он работает, поэтому мне не хватает чего-то волшебного, чтобы Зоо знал, что это предмет покупки, без каких-либо указаний на то, что это может быть. Я спросил через чат и получил следующее: 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.

1 Ответ

0 голосов
/ 06 июля 2018

Таким образом, ответ оказался проще, чем я думал, хотя потребовалось больше времени, чем мне хотелось бы раскрыть. В конце концов я решил попробовать добавить атрибуты, даже если они были определены как необязательные. Включение идентификатора товара позволило создать заказ на покупку.

Мой окончательный код:

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
...