Netsuite: SuiteTalk search sample Codes With PHP_Toolkit

Create a SuiteTalk Transaction Search that Contains a specific item

Posted on October 15, 2018 in Netsuite, PHP

Recently, I have involved in NetSuite ERP implementation for a client. I have successfully integrated Magento and Netsuite with some automation, Order Import, blanket order import, Sample Order import, etc. This tutorial is about what I have learned through testing and evaluating the new ERP System. In NetSuite, I have created some search php scripts with SuiteTalk( Web Services). First, the goal is to find all the sales orders contain a specific item. Then I narrow it down to the sales orders not only contain the specific item but belong to a customer. There is not many tutorials online to fulfill this type of search query with PHP. So I created and presented it for you to evaluate it. This code is based on another NetSuite PHP API Client, “ryanwinchester/netsuite-php”. You can look it up in Github with that “Keywords”. All these scripts are working on Netsuite 2017_1 or above.

Search based on a specific item


<?php
require 'vendor/autoload.php';

use NetSuite\NetSuiteService;

use NetSuite\Classes\SearchRequest;
use NetSuite\Classes\SearchEnumMultiSelectField;
use NetSuite\Classes\SearchMultiSelectField;
use NetSuite\Classes\TransactionSearchBasic;
use NetSuite\Classes\TransactionSearch;
use NetSuite\Classes\TransactionSearchAdvanced;
use NetSuite\Classes\TransactionSearchRow;
use NetSuite\Classes\TransactionSearchRowBasic;
use NetSuite\Classes\ItemSearchBasic;

use NetSuite\Classes\RecordRef;
//contains some login credential info
include 'config.php';

$service = new NetSuiteService($config);
$service->setSearchPreferences(false, 20);

$search = new TransactionSearch();
$basic = new TransactionSearchBasic();
$tsRow = new TransactionSearchRow();
$rowBasic = new TransactionSearchRowBasic();
$advanced = new TransactionSearchAdvanced(); 

//We are searching sales Order record
$searchEnumMultiSelectField = new SearchEnumMultiSelectField();
setFields($searchEnumMultiSelectField, array('operator' => 'anyOf', 'searchValue' => '_salesOrder'));
$basic->type = $searchEnumMultiSelectField;

//We are searching sales order with a specific item (internalId is 5571)
$searchValue = new RecordRef();
$searchValue->type = 'lotNumberedInventoryItem';
$searchValue->internalId = 5571;

$searchMultiSelectField = new SearchMultiSelectField();
setFields($searchMultiSelectField, array('operator' => 'anyOf', 'searchValue' => $searchValue));
$basic->item = $searchMultiSelectField;

$search->basic = $basic;

$request = new SearchRequest();
$request->searchRecord = $search;

$searchResponse = $service->search($request);

if (!$searchResponse->searchResult->status->isSuccess) {
    var_dump($searchResponse->searchResult->status->statusDetail);
    echo "SEARCH ERROR\n";
} else {
    $result = $searchResponse->searchResult;
    $count = $result->totalRecords;
    $records = $result->recordList;

    foreach($records->record as $record){
        var_dump($record->tranId);
    }
    echo "\n";
    echo $count . " records were found.\n";
}

custom linked product

Search based on both specific item and customer


<?php
require 'vendor/autoload.php';

use NetSuite\NetSuiteService;

use NetSuite\Classes\SearchRequest;
use NetSuite\Classes\SearchEnumMultiSelectField;
use NetSuite\Classes\SearchMultiSelectField;
use NetSuite\Classes\TransactionSearchBasic;
use NetSuite\Classes\TransactionSearch;
use NetSuite\Classes\TransactionSearchAdvanced;
use NetSuite\Classes\TransactionSearchRow;
use NetSuite\Classes\TransactionSearchRowBasic;
use NetSuite\Classes\ItemSearchBasic;

use NetSuite\Classes\RecordRef;
//contains some login credential info
include 'config.php';

$service = new NetSuiteService($config);
$service->setSearchPreferences(false, 20);

$search = new TransactionSearch();
$basic = new TransactionSearchBasic();
$tsRow = new TransactionSearchRow();
$rowBasic = new TransactionSearchRowBasic();
$advanced = new TransactionSearchAdvanced(); 

//We are searching sales Order record
$searchEnumMultiSelectField = new SearchEnumMultiSelectField();
setFields($searchEnumMultiSelectField, array('operator' => 'anyOf', 'searchValue' => '_salesOrder'));
$basic->type = $searchEnumMultiSelectField;

//We are searching sales order with a specific item (internalId is 5571)
$searchValue = new RecordRef();
$searchValue->type = 'lotNumberedInventoryItem';
$searchValue->internalId = 5571;

$searchMultiSelectField = new SearchMultiSelectField();
setFields($searchMultiSelectField, array('operator' => 'anyOf', 'searchValue' => $searchValue));
$basic->item = $searchMultiSelectField;

//We performed a search with a specific customer.(internalId = 2570)
$searchValue = new RecordRef();
$searchValue->type = 'customer';
$searchValue->internalId = 2570;

$searchMultiSelectField = new SearchMultiSelectField();
setFields($searchMultiSelectField, array('operator' => 'anyOf', 'searchValue' => $searchValue));
$basic->entity = $searchMultiSelectField;

$search->basic = $basic;

$request = new SearchRequest();
$request->searchRecord = $search;

$searchResponse = $service->search($request);

if (!$searchResponse->searchResult->status->isSuccess) {
    var_dump($searchResponse->searchResult->status->statusDetail);
    echo "SEARCH ERROR\n";
} else {
    $result = $searchResponse->searchResult;
    $count = $result->totalRecords;
    $records = $result->recordList;

    foreach($records->record as $record){
        var_dump($record->tranId);
    }
    echo "\n";
    echo $count . " records were found.\n";
}

The Search narrowed down further, with only 2 items returned

custom linked product


Search based on CustomList Field


<?php
    require 'vendor/autoload.php';

    use NetSuite\NetSuiteService;

    use NetSuite\Classes\SearchRequest;
    use NetSuite\Classes\SearchEnumMultiSelectField;
    use NetSuite\Classes\SearchMultiSelectField;
    use NetSuite\Classes\TransactionSearchBasic;
    use NetSuite\Classes\TransactionSearch;
    use NetSuite\Classes\SearchDoubleCustomField;
    use NetSuite\Classes\CustomListSearch;
    use NetSuite\Classes\SearchCustomFieldList;
    use NetSuite\Classes\DoubleCustomFieldRef;
    use NetSuite\Classes\SearchMultiSelectCustomField;
    
    use NetSuite\Classes\RecordRef;

    include 'config.php';

    $service = new NetSuiteService($config);
    $service->setSearchPreferences(false, 20);

    $basic = new TransactionSearchBasic();

    //Only search with _salesOrder type
    $searchEnumMultiSelectField = new SearchEnumMultiSelectField();
    setFields($searchEnumMultiSelectField, array('operator' => 'anyOf', 'searchValue' => '_salesOrder'));
    $basic->type = $searchEnumMultiSelectField;

    //find all sales order total amount greater than 84000
    //we created a custom field name 'custbody_stc_total_after_discount'
    //you need to change it accordingly
    $searchDoubleCustomField = new SearchDoubleCustomField();
    setFields($searchDoubleCustomField, array('operator' => 'greaterThan', 'searchValue' => 84000));
    $searchDoubleCustomField->scriptId = 'custbody_stc_total_after_discount';

    $searchCustomFieldList = new SearchCustomFieldList();
    $searchCustomFieldList->customField = $searchDoubleCustomField;
    $basic->customFieldList = $searchCustomFieldList;

    $request = new SearchRequest();
    $request->searchRecord = $basic;

    $searchResponse = $service->search($request);

    if (!$searchResponse->searchResult->status->isSuccess) {
        var_dump($searchResponse->searchResult->status->statusDetail);
        echo "SEARCH ERROR\n";
    } else {
        $result = $searchResponse->searchResult;
        $count = $result->totalRecords;
        $records = $result->recordList;

        foreach($records->record as $record) {
            var_dump($record->tranId);
        }

        echo "\n";

        echo $count . " records were found.\n";
    }


custom linked product

I will keep publishing some scripts such as creating SO, PO, Account, Customer etc.
Stay tune :)




comments powered by Disqus