Requirements
PHP 7.2+
json
libxml
Installation
Download or clone the php-sapb1 repository from https://github.com/syedhussim/php-sapb1.
git clone https://github.com/syedhussim/php-sapb1.git
Usage
Create an array to store your SAP Business One Service Layer configuration details.
Listing 1
$config = [
"https" => true,
"host" => "IP or Hostname",
"port" => 50000,
"sslOptions" => [
"cafile" => "path/to/certificate.crt",
"verify_peer" => true,
"verify_peer_name" => true,
],
"version" => 2
];
Create a new Service Layer session by calling the static createSession() method of the SAPClient class.
Listing 2
include "sapb1.phar";
use SAPb1\SAPClient;
$sap = SAPClient::createSession($config, "SAP UserName", "SAP Password", "Company");
The static createSession() method will return a new instance of SAPClient if the connection was successful. For subsequent requests to the Service Layer, you can use the B1 Session data stored in the $sap object. Requests made to the Service Layer using the B1 Session data will be much faster than the initial login request.
Listing 3
...
$session = $sap->getSession();
// For subsequent requests.
$sap = new SAPClient($config, $session);
SAPClient provides a service($name) method which returns a new instance of SAPb1\Service with the specified name. Using this Service object you can perform CRUD actions.
Querying A Service
The queryBuilder() method of the Service class returns a new instance of SAPb1\Query. The Query class allows you to use method chaining to filter the requested service.
The following code sample shows how to filter Sales Orders using the Orders service.
Listing 4
$sap = SAPClient::createSession($config, "SAP UserName", "SAP Password", "Company");
$orders = $sap->getService("Orders");
$result = $orders->queryBuilder()
->select("DocEntry,DocNum")
->orderBy("DocNum", "asc")
->limit(5)
->findAll();
The findAll() method will return a collection of records that match the search criteria. To return a specific record using an id use the find($id) method.
Listing 5
...
$orders = $sap->getService("Orders");
$result = $orders->queryBuilder()
->select("DocEntry,DocNum")
->find(123456);
// DocEntry value
Depending on the service, $id may be a numeric value or a string. If you want to know which field is used as the id for a service, call the getMetaData() method on the Service object as shown below.
Listing 6
...
$meta = $orders->getMetaData();
You can filter results based on conditions using Filter classes. The following code sample shows how to return Sales Orders for a particular business partner using the Equal filter class.
Listing 7
use SAPb1\Filters\Equal;
...
$orders = $sap->getService("Orders");
$result = $orders->queryBuilder()
->select("DocEntry,DocNum,CardCode")
->orderBy("DocNum", "asc")
->where(new Equal("CardCode", "BP Card Code"))
->limit(5)
->findAll();
You can use the where() method to add additional filters to further refine the search results.
Listing 8
use SAPb1\Filters\Equal;
use SAPb1\Filters\LessThan;
...
$orders = $sap->getService("Orders");
$result = $orders->queryBuilder()
->select("DocEntry,DocNum,CardCode")
->orderBy("DocNum", "asc")
->where(new Equal("CardCode", "BP Card Code"))
->where(new LessThan("DocEntry", 1000))
->limit(5)
->findAll();
Creating A Service
The following code sample shows how to create a new Sales Order using the create() method of the Service object.
Listing 9
...
$orders = $sap->getService("Orders");
$result = $orders->create([
"CardCode"=> "BP Card Code",
"DocDueDate"=> "Doc due date",
"DocumentLines"=> [
[
"ItemCode" => "Item Code",
"Quantity" => 100,
]
]
]);
You must provide any User Defined Fields that are required to create a Sales Order. If successful, the newly created Sales Order will be returned as an object.
Updating A Service
The following code sample demonstrates how to update a service using the update() method of the Service object.
Listing 10
...
$orders = $sap->getService("Orders");
$result = $orders->update(19925, [
"Comments"=> "Comment added here"
]);
Note that the first argument to the update() method is the id of the entity to update. In the case of a Sales Order the id is the DocEntry field. If the update is successful a boolean true value is returned.
Adding Headers
You can specify oData headers by calling the headers() method on a Service instance with an array of headers.
Listing 11
$orders = $sap->getService('Orders');
$orders->headers(['Prefer' => 'odata.maxpagesize=0']);
$result = $orders->queryBuilder()
->select('DocEntry,DocNum')
->find(123456); // DocEntry value
-
Stock Transfer Part 2
In the previous article I exaplined how to transfer stock between warehouses and bin enabled warehouses. In this article, I discuss how to transfer batch enabled items.
07 August 2020 - 4242 views -
Stock Transfer Part 1
The SAP B1 Service Layer provides an API to move stock between warehouses. This article explains the construction of the JSON payload data that is posted to the StockTransfers API.
12 December 2019 - 6692 views -
node-sapb1 Library Documentation v1
This article provides documentation on the SAPb1 NodeJs library.
01 August 2019 - 8479 views -
PHP Service Layer Example Part 2
This article is part 2 of PHP Service Layer Example. In the previous article, I explained how to initiate an authentication request to get a Service Layer session id and route id. In this article we use these details to execute a request to retrieve a list of business partners.
25 January 2018 - 10666 views -
PHP Service Layer Example Part 1
This article explains how to get connected to the Service Layer using PHP.
09 January 2018 - 14301 views -
Introduction To SAP Business One Service Layer
An introduction to the SAP Business One Service Layer.
08 December 2017 - 10593 views -
Updating Currency Rates
This article explains how to update currency rates using the SAP DI API.
04 July 2017 - 7480 views