13 Aug Netsuite: How to create custom invoices and regular invoices for Sales Order using Netsuite Webservice
Well, guys I’ve been struggling with how to create invoices using the netsuite webservice whether you are using Php, Ruby, Python or a different language basically what you have to do is to send in you request the following information in this format for custom invoices which means a custom list of item with quantity:
<env:Body>
<platformMsgs:add>
<platformMsgs:record xsi:type="tranSales:Invoice">
<tranSales:createdFrom internalId="60237"/>
<tranSales:tranDate>2015-08-13T19:00:00Z</tranSales:tranDate>
<tranSales:itemList>
<tranSales:item>
<tranSales:item internalId="2866"/>
<tranSales:orderLine>1</tranSales:orderLine>
<tranSales:quantity>3.0</tranSales:quantity>
</tranSales:item>
</tranSales:itemList>
<tranSales:customFieldList>
<platformCore:customField xsi:type="platformCore:StringCustomFieldRef" scriptId="mycustom_field_goes_here">
<platformCore:value>somevaluehere</platformCore:value>
</platformCore:customField>
</tranSales:customFieldList>
</platformMsgs:record>
</platformMsgs:add>
</env:Body>
Let me explain to you what it means each node:
<tranSales:item internalId="2866"/>
This is the internal_id from the product you are adding to the invoice if you don’t know which one it is you have a make a search by sku or id or something and them grab the internal
<tranSales:orderLine>1</tranSales:orderLine>:
This is the number of the line in the original sale order(order) you just need to add this reference in order to be able to create the association to the sale order in the node:
<tranSales:createdFrom internalId="60237"/>
If you don’t want to build a custom invoice with a specific items(item_list) you just need to create an invoice with the createdFrom(Sale Order) attribute and the invoice should include all the items included in the sale order, this is the Xml request you should send to Netsuite webservice:
<env:Body>
<platformMsgs:add>
<platformMsgs:record xsi:type="tranSales:Invoice">
<tranSales:createdFrom internalId="60237"/>
<tranSales:tranDate>2015-08-13T19:00:00Z</tranSales:tranDate>
</platformMsgs:record>
</platformMsgs:add>
</env:Body>
and now some of the code made in Ruby for creating custom invoices(specific items and quantity from an invoice) and regular invoices for one Sale order remember that I’m using this Gem:https://github.com/NetSweet/netsuite
The following code is creating one invoice per fulfillment(sales order can have multiple item fulfillments)
def create_fulfillment_invoices(order)
fulfillments = search_sale_order_fulfillments(order.ns_sales_order_id).results
fulfillments.each do |fulfillment|
invoice = NetSuite::Records::Invoice.new
invoice.created_from = NetSuite::Records::RecordRef.new(:internal_id => order.ns_sales_order_id)
invoice.tran_date = (Time.now + 19.hours).xmlschema
item_list = NetSuite::Records::InvoiceItemList.new
item_list.item = build_invoice_item_fulfillment(fulfillment.internal_id, order.ns_sales_order_id)
invoice.item_list = item_list
invoice.add
end
end
def search_sale_order_fulfillments(sale_order_id)
order_fulfillment_conditions = [
{
field: 'createdFrom',
operator: 'anyOf',
type: 'SearchRecordField',
value: [ NetSuite::Records::SalesOrder.new(internal_id: sale_order_id) ]
},
{
field: 'type',
operator: 'anyOf',
type: 'SearchEnumMultiSelectField',
value: [ "_itemFulfillment" ]
}
]
NetSuite::Records::Transaction.search(
criteria: {
basic: order_fulfillment_conditions
}
)
end
def build_invoice_item_fulfillment(fulfillment_internal_id, sale_order_internal_id, is_last_fulfillment)
fulfillment_details = NetSuite::Records::ItemFulfillment.get(internal_id: fulfillment_internal_id)
items_included = fulfillment_details.attributes[:item_list].item.map do |item|
internal_id = item.attributes[:item].internal_id
line = item.attributes[:order_line]
quantity = item.attributes[:quantity]
build_invoice_item_list(internal_id, quantity, line)
end
include_shipping_item_last_invoice(items_included, is_last_fulfillment, sale_order_internal_id)
end
def build_invoice_item_list(internal_id, quantity, line)
NetSuite::Records::InvoiceItem.new({
item: { internal_id: internal_id },
order_line: line,
quantity: quantity.to_f
})
end
def include_shipping_item_last_invoice(items_included, is_last_fulfillment, sale_order_internal_id)
if is_last_fulfillment
add_shipping_item = append_shipping_item(sale_order_internal_id)
items_included << add_shipping_item if add_shipping_item
else
items_included
end
end
def append_shipping_item(sale_order_internal_id)
sale_order = NetSuite::Records::SalesOrder.get(internal_id: sale_order_internal_id)
sale_order_items = sale_order.item_list.items
shipping_item = sale_order_items.find{ |sale_order_item| sale_order_item.attributes[:item].attributes[:name] == 'Shipping Item'}
if shipping_item
build_shipping_item(shipping_item)
end
end
def build_shipping_item(item)
line = item.attributes[:line]
internal_id = item.attributes[:item].internal_id
quantity = item.attributes[:quantity]
amount = item.attributes[:amount].try(:to_f)
NetSuite::Records::InvoiceItem.new({
item: { internal_id: internal_id },
order_line: line,
quantity: quantity.to_f,
amount: amount
})
end
If you just want to create a invoice for a sale order that includes the same details, items, subtotal and total this is what you’re looking for:
def create invoice = NetSuite::Records::Invoice.new # create the reference to the internal_id sale order within Netsuite invoice.created_from = NetSuite::Records::RecordRef.new(:internal_id => sale_order_internal_id_from_netsuite) invoice.tran_date = (Time.now + 19.hours).xmlschema invoice.add end
Some relevant terms and resources:
Invoice
https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2014_1/schema/record/invoice.html?mode=package
InvoiceItemList
https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2014_1/schema/other/invoiceitemlist.html?mode=package
InvoiceItem
https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2014_1/schema/other/invoiceitem.html?mode=package
Some Ruby classes used in this post:
NetSuite::Records::Invoice.new
NetSuite::Records::InvoiceItemList.new
NetSuite::Records::InvoiceItem.new
NetSuite::Records::ItemFulfillment
NetSuite::Records::SalesOrder.get
NetSuite::Records::InventoryItem
That’s it guys hope you learn stuff in this post, see you later.
No Comments