XeroAPI / xero-ruby

Xero Ruby SDK for OAuth 2.0 generated from XeroAPI/Xero-OpenAPI
http://developer.xero.com/
MIT License
58 stars 91 forks source link

Methods and method params plural naming - bug or feature? #172

Closed saboter closed 3 years ago

saboter commented 3 years ago

Hi,

just wondering if is there some specific reason why there is "plural" naming for some methods which indicates that there should/could be array of objects on input.

Example (https://github.com/XeroAPI/xero-ruby/blob/master/lib/xero-ruby/api/accounting_api.rb#L17040):

 def update_or_create_invoices(xero_tenant_id, invoices, opts = {})
      data, _status_code, _headers = update_or_create_invoices_with_http_info(xero_tenant_id, invoices, opts)
      data
  en

create_invoices method accepts invoices array, but update_or_create_invoices fails with:

No data has been processed for this endpoint. This endpoint is expecting Invoice data to be specifed in the request body.

It works if single invoice model object is used on input.

Thanks

SerKnight commented 3 years ago

Hey @saboter - Instead of having 2 functions createInvoice and createInvoices we opted to err on the side of bulk optionality to every endpoint, as that is the nature of what the Xero API supports for all endpoints.

https://xeroapi.github.io/xero-ruby/accounting/index.html#api-Accounting-createInvoices

It does create a bit more verbosity in how you structure calls, it lends itself to the pattern of how the API was created a bit more accurately.

invoices = {  
  invoices: [invoice]
} 
SerKnight commented 3 years ago

Sorry I re-read the question and missed a piece. Some endpoints will accept a single object, or an array of objects, such as POST invoice.

However to your point, I tested in our sample rails app the update_or_create_invoices method with an array of invoices and that worked okay. If you check the history tab in your API dashboard you should be able to see if the API Invoice POST payload looks as expected as well.

Screen Shot 2021-06-02 at 11 09 59 AM

def invoices_create
    trackingcategories = xero_client.accounting_api.get_tracking_categories(current_user.active_tenant_id).tracking_categories
    category = trackingcategories.first
    account = xero_client.accounting_api.get_accounts(current_user.active_tenant_id).accounts.sample
    account_code = account.code

    contacts = xero_client.accounting_api.get_contacts(current_user.active_tenant_id).contacts
    invoices = {
      invoices: [
        {
          type: XeroRuby::Accounting::Invoice::ACCREC,
          contact: {
            ContactId: contacts.sample.contact_id
          },
          LineItems: [
            {
              description: "Acme Tires Desc",
              quantity: 32.0,
              unit_amount: BigDecimal("20.99"),
              account_code: account_code,
              tax_type: XeroRuby::Accounting::TaxType::NONE,
              tracking: [
                {
                  tracking_category_id: category.tracking_category_id,
                  name: category.name,
                  option: category.options.sample.name
                }
              ]
            }
          ],
          date: "2019-03-11",
          due_date: "2018-12-10",
          reference: "Website Design",
          status: XeroRuby::Accounting::Invoice::DRAFT
        }
      ]
    }
    @invoices = xero_client.accounting_api.update_or_create_invoices(current_user.active_tenant_id, invoices).invoices
  end
saboter commented 3 years ago

Thank you very much for explanation @SerKnight .

My problem was that I did not used this format (just array was on input):

invoices = {  
  invoices: [invoice]
}