Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Quickbooks Create an Invoice

See more QuickBooks Examples

Demonstrates how to create an invoice via the Quickbooks REST API.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.StringBuilder,
  Chilkat.Rest,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  jsonToken: TJsonObject;
  rest: TRest;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  sbAuth: TStringBuilder;
  jsonReq: TJsonObject;
  sbRequestBody: TStringBuilder;
  sbResponseBody: TStringBuilder;
  respStatusCode: Integer;
  jsonResponse: TJsonObject;
  LineNum: Integer;
  Amount: string;
  SalesItemLineDetailTaxCodeRefValue: string;
  SalesItemLineDetailItemRefName: string;
  SalesItemLineDetailItemRefValue: string;
  Id: string;
  DetailType: string;
  DefinitionId: string;
  invType: string;
  Name: string;
  InvoiceDocNumber: string;
  InvoiceSyncToken: string;
  InvoiceDomain: string;
  InvoiceBalance: string;
  InvoiceBillAddrCity: string;
  InvoiceBillAddrLine1: string;
  InvoiceBillAddrPostalCode: string;
  InvoiceBillAddrLat: string;
  InvoiceBillAddrLong: string;
  InvoiceBillAddrCountrySubDivisionCode: string;
  InvoiceBillAddrId: string;
  InvoiceTxnDate: string;
  InvoiceTotalAmt: string;
  InvoiceCustomerRefName: string;
  InvoiceCustomerRefValue: string;
  InvoiceShipAddrCity: string;
  InvoiceShipAddrLine1: string;
  InvoiceShipAddrPostalCode: string;
  InvoiceShipAddrLat: string;
  InvoiceShipAddrLong: string;
  InvoiceShipAddrCountrySubDivisionCode: string;
  InvoiceShipAddrId: string;
  InvoiceDueDate: string;
  InvoicePrintStatus: string;
  InvoiceDeposit: Integer;
  InvoiceSparse: Boolean;
  InvoiceEmailStatus: string;
  InvoiceApplyTaxAfterDiscount: Boolean;
  InvoiceId: string;
  InvoiceTxnTaxDetailTotalTax: Integer;
  InvoiceMetaDataCreateTime: string;
  InvoiceMetaDataLastUpdatedTime: string;
  time: string;
  i: Integer;
  count_i: Integer;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  First get our previously obtained OAuth2 access token.
  jsonToken := TJsonObject.Create;
  success := jsonToken.LoadFile('qa_data/tokens/qb-access-token.json');

  rest := TRest.Create;

  //  Connect to the REST server.
  bTls := True;
  port := 443;
  bAutoReconnect := True;
  success := rest.Connect('sandbox-quickbooks.api.intuit.com',port,bTls,bAutoReconnect);

  sbAuth := TStringBuilder.Create;
  sbAuth.Append('Bearer ');
  sbAuth.Append(jsonToken.StringOf('access_token'));
  rest.Authorization := sbAuth.GetAsString();

  //  --------------------------------------------------------------------------
  //  Note: The above code to setup the initial REST connection
  //  can be done once.  After connecting, any number of REST calls can be made.
  //  If the connection is lost, the next REST method call will automatically
  //  reconnect if needed.
  //  --------------------------------------------------------------------------

  //  Create the following JSON:

  //  {
  //    "Line": [
  //      {
  //        "DetailType": "SalesItemLineDetail",
  //        "Amount": 100.0,
  //        "SalesItemLineDetail": {
  //          "ItemRef": {
  //            "name": "Services",
  //            "value": "1"
  //          }
  //        }
  //      }
  //    ],
  //    "CustomerRef": {
  //      "value": "1"
  //    }
  //  }
  //  
  //  Use the this online tool to generate the code from sample JSON: 
  //  Generate Code to Create JSON

  jsonReq := TJsonObject.Create;
  jsonReq.UpdateString('Line[0].DetailType','SalesItemLineDetail');
  jsonReq.UpdateNumber('Line[0].Amount','100.0');
  jsonReq.UpdateString('Line[0].SalesItemLineDetail.ItemRef.name','Services');
  jsonReq.UpdateString('Line[0].SalesItemLineDetail.ItemRef.value','1');
  jsonReq.UpdateString('CustomerRef.value','1');

  sbRequestBody := TStringBuilder.Create;
  jsonReq.EmitSb(sbRequestBody);

  rest.AddHeader('Content-Type','application/json');
  rest.AddHeader('Accept','application/json');
  rest.AllowHeaderFolding := False;

  sbResponseBody := TStringBuilder.Create;
  success := rest.FullRequestSb('POST','/v3/company/<realmID>/invoice',sbRequestBody,sbResponseBody);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  respStatusCode := rest.ResponseStatusCode;

  //  Success is indicated by a 200 response status code.
  WriteLn('response status code = ' + respStatusCode);

  jsonResponse := TJsonObject.Create;
  jsonResponse.LoadSb(sbResponseBody);
  jsonResponse.EmitCompact := False;
  WriteLn(jsonResponse.Emit());

  if (rest.ResponseStatusCode <> 200) then
    begin
      WriteLn('Failed.');
      Exit;
    end;

  //  Sample output...
  //  (See the parsing code below..)
  //  
  //  Use the this online tool to generate parsing code from sample JSON: 
  //  Generate Parsing Code from JSON

  //  {
  //    "Invoice": {
  //      "DocNumber": "1069",
  //      "SyncToken": "0",
  //      "domain": "QBO",
  //      "Balance": 100.0,
  //      "BillAddr": {
  //        "City": "Bayshore",
  //        "Line1": "4581 Finch St.",
  //        "PostalCode": "94326",
  //        "Lat": "INVALID",
  //        "Long": "INVALID",
  //        "CountrySubDivisionCode": "CA",
  //        "Id": "2"
  //      },
  //      "TxnDate": "2015-07-24",
  //      "TotalAmt": 100.0,
  //      "CustomerRef": {
  //        "name": "Amy's Bird Sanctuary",
  //        "value": "1"
  //      },
  //      "ShipAddr": {
  //        "City": "Bayshore",
  //        "Line1": "4581 Finch St.",
  //        "PostalCode": "94326",
  //        "Lat": "INVALID",
  //        "Long": "INVALID",
  //        "CountrySubDivisionCode": "CA",
  //        "Id": "109"
  //      },
  //      "LinkedTxn": [
  //      ],
  //      "DueDate": "2015-08-23",
  //      "PrintStatus": "NeedToPrint",
  //      "Deposit": 0,
  //      "sparse": false,
  //      "EmailStatus": "NotSet",
  //      "Line": [
  //        {
  //          "LineNum": 1,
  //          "Amount": 100.0,
  //          "SalesItemLineDetail": {
  //            "TaxCodeRef": {
  //              "value": "NON"
  //            },
  //            "ItemRef": {
  //              "name": "Services",
  //              "value": "1"
  //            }
  //          },
  //          "Id": "1",
  //          "DetailType": "SalesItemLineDetail"
  //        },
  //        {
  //          "DetailType": "SubTotalLineDetail",
  //          "Amount": 100.0,
  //          "SubTotalLineDetail": {}
  //        }
  //      ],
  //      "ApplyTaxAfterDiscount": false,
  //      "CustomField": [
  //        {
  //          "DefinitionId": "1",
  //          "Type": "StringType",
  //          "Name": "Crew #"
  //        }
  //      ],
  //      "Id": "238",
  //      "TxnTaxDetail": {
  //        "TotalTax": 0
  //      },
  //      "MetaData": {
  //        "CreateTime": "2015-07-24T10:33:39-07:00",
  //        "LastUpdatedTime": "2015-07-24T10:33:39-07:00"
  //      }
  //    },
  //    "time": "2015-07-24T10:33:39.11-07:00"
  //  }
  //  

  InvoiceDocNumber := jsonResponse.StringOf('Invoice.DocNumber');
  InvoiceSyncToken := jsonResponse.StringOf('Invoice.SyncToken');
  InvoiceDomain := jsonResponse.StringOf('Invoice.domain');
  InvoiceBalance := jsonResponse.StringOf('Invoice.Balance');
  InvoiceBillAddrCity := jsonResponse.StringOf('Invoice.BillAddr.City');
  InvoiceBillAddrLine1 := jsonResponse.StringOf('Invoice.BillAddr.Line1');
  InvoiceBillAddrPostalCode := jsonResponse.StringOf('Invoice.BillAddr.PostalCode');
  InvoiceBillAddrLat := jsonResponse.StringOf('Invoice.BillAddr.Lat');
  InvoiceBillAddrLong := jsonResponse.StringOf('Invoice.BillAddr.Long');
  InvoiceBillAddrCountrySubDivisionCode := jsonResponse.StringOf('Invoice.BillAddr.CountrySubDivisionCode');
  InvoiceBillAddrId := jsonResponse.StringOf('Invoice.BillAddr.Id');
  InvoiceTxnDate := jsonResponse.StringOf('Invoice.TxnDate');
  InvoiceTotalAmt := jsonResponse.StringOf('Invoice.TotalAmt');
  InvoiceCustomerRefName := jsonResponse.StringOf('Invoice.CustomerRef.name');
  InvoiceCustomerRefValue := jsonResponse.StringOf('Invoice.CustomerRef.value');
  InvoiceShipAddrCity := jsonResponse.StringOf('Invoice.ShipAddr.City');
  InvoiceShipAddrLine1 := jsonResponse.StringOf('Invoice.ShipAddr.Line1');
  InvoiceShipAddrPostalCode := jsonResponse.StringOf('Invoice.ShipAddr.PostalCode');
  InvoiceShipAddrLat := jsonResponse.StringOf('Invoice.ShipAddr.Lat');
  InvoiceShipAddrLong := jsonResponse.StringOf('Invoice.ShipAddr.Long');
  InvoiceShipAddrCountrySubDivisionCode := jsonResponse.StringOf('Invoice.ShipAddr.CountrySubDivisionCode');
  InvoiceShipAddrId := jsonResponse.StringOf('Invoice.ShipAddr.Id');
  InvoiceDueDate := jsonResponse.StringOf('Invoice.DueDate');
  InvoicePrintStatus := jsonResponse.StringOf('Invoice.PrintStatus');
  InvoiceDeposit := jsonResponse.IntOf('Invoice.Deposit');
  InvoiceSparse := jsonResponse.BoolOf('Invoice.sparse');
  InvoiceEmailStatus := jsonResponse.StringOf('Invoice.EmailStatus');
  InvoiceApplyTaxAfterDiscount := jsonResponse.BoolOf('Invoice.ApplyTaxAfterDiscount');
  InvoiceId := jsonResponse.StringOf('Invoice.Id');
  InvoiceTxnTaxDetailTotalTax := jsonResponse.IntOf('Invoice.TxnTaxDetail.TotalTax');
  InvoiceMetaDataCreateTime := jsonResponse.StringOf('Invoice.MetaData.CreateTime');
  InvoiceMetaDataLastUpdatedTime := jsonResponse.StringOf('Invoice.MetaData.LastUpdatedTime');
  time := jsonResponse.StringOf('time');
  i := 0;
  count_i := jsonResponse.SizeOfArray('Invoice.LinkedTxn');
  while i < count_i do
    begin
      jsonResponse.I := i;
      i := i + 1;
    end;

  i := 0;
  count_i := jsonResponse.SizeOfArray('Invoice.Line');
  while i < count_i do
    begin
      jsonResponse.I := i;
      LineNum := jsonResponse.IntOf('Invoice.Line[i].LineNum');
      Amount := jsonResponse.StringOf('Invoice.Line[i].Amount');
      SalesItemLineDetailTaxCodeRefValue := jsonResponse.StringOf('Invoice.Line[i].SalesItemLineDetail.TaxCodeRef.value');
      SalesItemLineDetailItemRefName := jsonResponse.StringOf('Invoice.Line[i].SalesItemLineDetail.ItemRef.name');
      SalesItemLineDetailItemRefValue := jsonResponse.StringOf('Invoice.Line[i].SalesItemLineDetail.ItemRef.value');
      Id := jsonResponse.StringOf('Invoice.Line[i].Id');
      DetailType := jsonResponse.StringOf('Invoice.Line[i].DetailType');
      i := i + 1;
    end;

  i := 0;
  count_i := jsonResponse.SizeOfArray('Invoice.CustomField');
  while i < count_i do
    begin
      jsonResponse.I := i;
      DefinitionId := jsonResponse.StringOf('Invoice.CustomField[i].DefinitionId');
      invType := jsonResponse.StringOf('Invoice.CustomField[i].Type');
      Name := jsonResponse.StringOf('Invoice.CustomField[i].Name');
      i := i + 1;
    end;



  jsonToken.Free;
  rest.Free;
  sbAuth.Free;
  jsonReq.Free;
  sbRequestBody.Free;
  sbResponseBody.Free;
  jsonResponse.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.