Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do export an invoice or current statement using Acumatica's SOAP API via PHP?

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.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at PX.Api.SyExportContext..ctor(SYMapping mapping, IEnumerable1 fields, String[] providerFields, Dictionary2 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();
}
}
}
}

UPDATE

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();

?>

SOAP XML REQUEST

<?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>

END POINT RESPONSE

<?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>
like image 342
Jeremy Leys Avatar asked Dec 16 '16 04:12

Jeremy Leys


1 Answers

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.

like image 188
Mikaël DELSOL Avatar answered Nov 15 '22 00:11

Mikaël DELSOL