How do export an invoice or current statement using Acumatica's SOAP API via PHP?
I can generate SOAP PHP stub classes using https://www.wsdltophp.com/
Most of the examples I have found use .Net
The WSDL my client has provided me with is: http://erp.triode.co.nz/pmsdb/Soap/INEXPORT.asmx?WSDL
From what I can see, it seems that Acumatica has multiple WSDL's for different procedures. If someone could give me a point in the right direction that would be great. I can authenticate with the Acumatica endpoint, I just get stuck as to where to start with this use case.
***UPDATE****
OK I am using the Acumatica PHP helper files now which are quite helpful but stuck again unfortunately trying to export a list of invoices for one customer:
<?php
ini_set('memory_limit','512M');
ini_set('display_errors',true);
error_reporting(-1);
require_once('AcumaticaGate.php');
//$wsdl = "http://erp.triode.co.nz/pmsdb/Soap/AR402000.asmx?WSDL";
// $client = new AcumaticaGate('<user_login>', '<user_password>', '<folder_name>','http://<computer>/<website>');
//Can't provide credentials for security reasons unfortunately
$un = ""
$pw = "";
$client = new AcumaticaGate($un, $pw, 'AR402000','http://erp.triode.co.nz/pmsdb');
$customer_id = "DAR";
$doctype = "Invoice";
$selection = $client->Schema->GetSchemaResult->Selection;
$customer = $selection->Customer = $customer_id;
$all_docs = $selection->ShowAllDocuments = true;
$unreleased = $selection->IncludeUnreleasedDocuments = true;
$type_doc = $client->Schema->GetSchemaResult->Documents->TypeDisplayDocType;
// FILTERS
$filters = array();
array_push($filters,
$client->PrepareSimpleFilter(clone $type_doc, FilterCondition::Equals, $doctype));
$export_param = new Export();
$export_param->commands = array($customer, $all_docs, $unreleased);
$export_param->filters = $filters;
$export_param->breakOnError = true
$export_param->includeHeaders = false;
$export_param->topCount = 0;
$export = $client->Client->Export($export_param);
echo "<pre>";
print_r($export);
echo "</pre>";
// echo $client->Client->__getLastRequest();
?>
Getting error:
Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object. at PX.Api.SyImportContext.ParseCommand(SyCommand cmd) at PX.Api.SyExportContext.a(SYMappingField A_0) at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source) at PX.Api.SyExportContext..ctor(SYMapping mapping, IEnumerable1 fields, String[] providerFields, Dictionary
2 viewFilters, Boolean breakOnError, Int32 start, Int32 count, LinkedSelectorViews selectorViews, String rowFilterField) at PX.Api.ScreenUtils.ExportInternal(String screenId, Command[] commands, Filter[] filters, Int32 startRow, Int32 topCount, Boolean includeHeaders, Boolean breakOnError, PXGraph graph, Boolean bindGuids, Boolean mobile, Boolean isSelector, String forcePrima in /vagrant_www/triode-soap/AR402000/Screen.php on line 549
This is the .Net method I am trying to reverse engineer:
Example 4.3.4: Retrieving the List of Invoices of a Customer This example, which is provided for reference only, shows how to get the list of invoices for a customer (by customer ID) on the Customer Details form (AR402000; Finance > Accounts Receivable > Work Area > Explore).
class CustomerDetail
{
//Retrieving the list of invoices for the customer
//on the Customer Details form (AR402000)
public static void ExportInvoices()
{
//Input data
string customerID = "C000000003";
string docType = "Invoice";
using
(
//Connect to the web services and log in to Acumatica ERP
Screen context = WebServiceConnector.InitializeWebService()
)
{
try
{
//Get the schema of the Customer Details form (AR402000)
AR402000Content customerDetailSchema = context.AR402000GetSchema();
//Configure the list of commands
var commands = new Command[]
{
//Select the documents from the inquiry
new Value
{
Value = customerID,
LinkedCommand = customerDetailSchema.Selection.Customer
},
new Value
{
Value = "True",
LinkedCommand = customerDetailSchema.Selection.ShowAllDocuments
},
new Value
{
Value = "True",
LinkedCommand = customerDetailSchema.Selection.IncludeUnreleasedDocuments
},
//Get the values of the elements
customerDetailSchema.Documents.TypeDisplayDocType,
customerDetailSchema.Documents.ReferenceNbr,
customerDetailSchema.Documents.Date,
customerDetailSchema.Documents.Status
};
//Select for export only the orders of the needed customer
var filters = new Filter[]
{
new Filter
{
Field = customerDetailSchema.Documents.TypeDisplayDocType,
Condition = FilterCondition.Equals,
Value = docType
}
};
//Export the records
var custormerInvoices = context.AR402000Export(commands, filters, 0, true, false);
//Save the export results to a CSV file
IOHelper.SaveToCSVFile(custormerInvoices, string.Format(@"SOInvoices_Customer_{0}.csv", customerID));
}
finally
{
//Log out from Acumatica ERP
context.Logout();
}
}
}
}
Updated script and now getting an empty response from the API endpoint, at least it is not an error but still stuck unfortunately, so accepts but doesn't return anything:
NEW CODE
<?php
ini_set('memory_limit','512M');
ini_set('display_errors',true);
error_reporting(-1);
require_once('AcumaticaGate.php');
//$wsdl = "http://erp.triode.co.nz/pmsdb/Soap/INEXPORT.asmx?WSDL";
// $client = new AcumaticaGate('<user_login>', '<user_password>', '<folder_name>','http://<computer>/<website>');
$un = "";
$pw = "";
$client = new AcumaticaGate($un, $pw, 'AR402000','http://erp.triode.co.nz/pmsdb');
$customer_id = "3678";
$doctype = "Invoice";
$selection = $client->Schema->GetSchemaResult->Selection;
$customer = $selection->Customer;
$all_docs = $selection->ShowAllDocuments;
$unreleased = $selection->IncludeUnreleasedDocuments;
$type_doc = $client->Schema->GetSchemaResult->Documents->TypeDisplayDocType;
$command = array();
array_push($command, $client->PrepareValue($customer_id, $customer));
array_push($command, $client->PrepareValue('true', $all_docs));
array_push($command, $client->PrepareValue('true', $unreleased));
// FILTERS
$filters = array();
array_push($filters, $client->PrepareSimpleFilter(clone $type_doc, FilterCondition::Equals, $doctype));
array_push($filters, $client->PrepareSimpleFilter(clone $customer, FilterCondition::Equals, $customer_id));
$export_param = new Export();
$export_param->commands = $command;
$export_param->filters = $filters;
$export_param->breakOnError = true;
$export_param->includeHeaders = false;
$export_param->topCount = 0;
$export = $client->Client->Export($export_param);
// echo "<pre>";
// print_r($export);
// echo "</pre>";
echo $client->Client->__getLastRequest();
?>
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.acumatica.com/typed/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:Export>
<ns1:commands>
<ns1:Command xsi:type="ns1:Value">
<ns1:Value>3678</ns1:Value>
<ns1:LinkedCommand xsi:type="ns1:Field">
<ns1:FieldName>CustomerID</ns1:FieldName>
<ns1:ObjectName>Filter</ns1:ObjectName>
<ns1:Value>Customer</ns1:Value>
<ns1:Commit>true</ns1:Commit>
</ns1:LinkedCommand>
</ns1:Command>
<ns1:Command xsi:type="ns1:Value">
<ns1:Value>true</ns1:Value>
<ns1:LinkedCommand xsi:type="ns1:Field">
<ns1:FieldName>ShowAllDocs</ns1:FieldName>
<ns1:ObjectName>Filter</ns1:ObjectName>
<ns1:Value>ShowAllDocuments</ns1:Value>
<ns1:Commit>true</ns1:Commit>
</ns1:LinkedCommand>
</ns1:Command>
<ns1:Command xsi:type="ns1:Value">
<ns1:Value>true</ns1:Value>
<ns1:LinkedCommand xsi:type="ns1:Field">
<ns1:FieldName>IncludeUnreleased</ns1:FieldName>
<ns1:ObjectName>Filter</ns1:ObjectName>
<ns1:Value>IncludeUnreleasedDocuments</ns1:Value>
<ns1:Commit>true</ns1:Commit>
</ns1:LinkedCommand>
</ns1:Command>
</ns1:commands>
<ns1:filters>
<ns1:Filter>
<ns1:Field>
<ns1:FieldName>DisplayDocType</ns1:FieldName>
<ns1:ObjectName>Documents</ns1:ObjectName>
<ns1:Value>TypeDisplayDocType</ns1:Value>
</ns1:Field>
<ns1:Condition>Equals</ns1:Condition>
<ns1:Value xsi:type="xsd:string">Invoice</ns1:Value>
<ns1:OpenBrackets>0</ns1:OpenBrackets>
<ns1:CloseBrackets>0</ns1:CloseBrackets>
<ns1:Operator>And</ns1:Operator>
</ns1:Filter>
<ns1:Filter>
<ns1:Field>
<ns1:FieldName>CustomerID</ns1:FieldName>
<ns1:ObjectName>Filter</ns1:ObjectName>
<ns1:Value>Customer</ns1:Value>
<ns1:Commit>true</ns1:Commit>
</ns1:Field>
<ns1:Condition>Equals</ns1:Condition>
<ns1:Value xsi:type="xsd:string">3678</ns1:Value>
<ns1:OpenBrackets>0</ns1:OpenBrackets>
<ns1:CloseBrackets>0</ns1:CloseBrackets>
<ns1:Operator>And</ns1:Operator>
</ns1:Filter>
</ns1:filters>
<ns1:topCount>0</ns1:topCount>
<ns1:includeHeaders>false</ns1:includeHeaders>
<ns1:breakOnError>true</ns1:breakOnError>
</ns1:Export>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<ExportResponse xmlns="http://www.acumatica.com/typed/">
<ExportResult />
</ExportResponse>
</soap:Body>
</soap:Envelope>
As the wsdltophp.com author, I strongly advise you to use the new generator version from PackageGenerator, it should work better than with the previous version. If not, don't hesitate contacting me via email.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With