This script prints all billing invoice items from account, on this case we’ll use a large object mask in order to retrieve a lot of data. To avoid API errors related to “Time out” or or “size limit”, first we’ll get de ID of all SoftLayer_Billing_Invoice objects between two dates, on this case we’ll use the method SoftLayer_Account::getInvoices. After that, through loops we will retrieve all invoice items, here we’ll use the method SoftLayer_Billing_Invoice::getItems and “result limits” to avoid errors. See below for more information.
package main
import (
"fmt"
"strings"
"encoding/json"
"github.com/softlayer/softlayer-go/session"
"github.com/softlayer/softlayer-go/services"
)
func main() {
// SoftLayer API username and key
username := "set me"
apikey := "set me"
// Create a session
sess := session.New(username, apikey)
// Get SoftLayer_Account and SoftLayer_Billing_Invoice services
accountService := services.GetAccountService(sess)
invoiceService := services.GetBillingInvoiceService(sess)
// Object mask to get the ID of all SoftLayer_Billing_Invoice objects
mask := "id;createDate;typeCode"
// Object mask to get information about SoftLayer_Billing_Invoice_Items
itemMask := "id;recurringFee;recurringTaxAmount;oneTimeFee;oneTimeTaxAmount;description;" +
"hostName;domainName;hourlyRecurringFee;laborFee;laborTaxAmount;setupFee;" +
"setupTaxAmount;category[name];location[longName];billingItem[id;activeFlag;" +
"hourlyFlag;allowCancellationFlag;cancellationDate;orderItem[id;order[id;" +
"userRecord[id,username]]]]"
// Filter to get all RECURRING invoices between two dates
filter := `{"invoices":{
"createDate":{
"operation":"betweenDate",
"options":[{
"name":"startDate",
"value":["03/25/2017"]
},{
"name":"endDate",
"value": ["04/24/2017"]
}]
},
"typeCode":{
"operation":"RECURRING"
}
}}`
// Call method getInvoices() in order to retrieve SoftLayer_Billing_Invoice objects.
invoices, err := accountService.Filter(filter).Mask(mask).GetInvoices()
if err != nil {
fmt.Printf("\n Unable to retrieve invoices:\n - %s\n", err)
return
}
// Following loop is to get and print all items of each retrieved invoice
for _, invoice := range invoices {
// Print Id, createDate and typeCode of each invoice
fmt.Printf("\n\nINVOICE ID: %d\t CREATE DATE: %s\t TYPE CODE: %s\n\n",
*invoice.Id, *invoice.CreateDate, *invoice.TypeCode)
// Some invoices have hundred of items and to avoid limitSize or timeout errors
// we'll use result limits in order to get items 100 by 100.
limit := 100
offset := 0
hasItems := true
// Following loop is used to get and print items 100 by 100.
// 'hasItems' will turn FALSE if there isn't more items, the loop will end and
// code will continue with next invoice.
for hasItems {
// Call SoftLayer_Billing_Invoice::getItems method
items, err := invoiceService.Id(*invoice.Id).Mask(itemMask).Limit(limit).Offset(offset).GetItems()
if err != nil {
fmt.Printf("\n Unable to retrieve invoice's items:\n - %s\n", err)
return
}
// Following will print retrieved invoices
for _, item := range items {
jsonFormat, jsonErr := json.Marshal(item)
if jsonErr != nil {
fmt.Println(jsonErr)
return
}
fmt.Printf("\n%s", string(jsonFormat))
}
// hasItems will turn FALSE if invoice doesn't have more items and code will
// continue with next invoice.
if len(items) > 0 {
offset += limit
} else {
hasItems = false
}
}
// Print a single separator between invoices
fmt.Printf("\n\n%s", strings.Repeat("-", 150))
}
}