PHP code example of intelli-dust / vario-ng
1. Go to this page and download the library: Download intelli-dust/vario-ng library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
intelli-dust / vario-ng example snippets
$client = new VarioNGClient([
'userName' => 'YOUR_USERNAME',
'password' => 'YOUR_PASSWORD',
'environment' => 'production' // or 'qa' for testing
]);
$client = new VarioNGClient([
'userName' => 'YOUR_USERNAME',
'password' => 'YOUR_PASSWORD',
'base_url' => 'https://vibe.volvocars.biz/ws/dcs/', // Custom URL
'environment' => 'production',
'user_agent' => 'MyApp/1.0',
'jwt_timeout' => 120 // minutes
]);
ok 1: Vytvorenie klienta
$client = new VarioNGClient([
'userName' => 'YOUR_USERNAME',
'password' => 'YOUR_PASSWORD',
'environment' => 'production' // alebo 'qa' pre testovanie
]);
// Krok 2: Prihlásenie (získanie JWT tokenu)
try {
$client->logIn();
// Token je automaticky uložený a bude sa používať pri všetkých požiadavkách
// Token je platný 120 minút a automaticky sa obnovuje pri expirácii
} catch (Exception $e) {
die("Login failed: " . $e->getMessage());
}
// Krok 1: Pripravte dáta v správnej štruktúre
$data = [
'authorizationID' => 'YOUR_CODE', // Retailer alebo Importer kód
// bodID sa vygeneruje automaticky, ak nie je poskytnutý
// requestedBy sa nastaví automaticky podľa metódy
// toDelete sa nastaví automaticky na 'N'
// ... špecifické dáta pre každý endpoint
];
// Krok 2: Odošlite dáta
try {
$response = $client->postJobCard($data); // alebo iná metóda
// Krok 3: Spracujte odpoveď
if ($response->details[0]->rc == '1') {
echo "Úspech! BodID: " . $response->bodID . "\n";
echo "Správa: " . $response->details[0]->message . "\n";
}
} catch (Exception $e) {
echo "Chyba: " . $e->getMessage() . "\n";
}
// Pre Job Card: retailerCode, woNumber, woYear
$deleteData = [
'authorizationID' => 'SK006',
'workOrder' => [
'retailerCode' => 'SK006',
'woNumber' => '202600024',
'woYear' => '2026'
]
];
try {
// Druhý parameter 'Y' značí delete operáciu
$response = $client->postJobCard($deleteData, 'Y');
echo "Zmazané!\n";
} catch (Exception $e) {
echo "Chyba pri mazaní: " . $e->getMessage() . "\n";
}
= INICIALIZÁCIA ===
$client = new VarioNGClient([
'userName' => 'IMP02108',
'password' => 'your_password',
'environment' => 'production'
]);
try {
// === AUTENTIFIKÁCIA ===
$client->logIn();
echo "✓ Prihlásený\n";
// === PRÍPRAVA DÁT ===
$jobCard = [
'authorizationID' => 'SK006',
'workOrder' => [
'retailerCode' => 'SK006',
'woNumber' => '202600024',
'woYear' => '2026',
'chassis' => 'TEST1234567890123',
'regNo' => 'AA-123BB',
'body' => 'S-90',
'woOpenDate' => '2026-01-09',
'woCloseDate' => '2026-01-09',
'custCode' => 'TEST001',
'custName' => 'Example Company s.r.o.',
'custPhone' => '0900123456',
'custEMail' => '[email protected] '
],
'wJobs' => [
[
'jobID' => '1',
'consumerNotes' => 'Service work'
]
],
'labor' => [
[
'seqNumber' => '1',
'jobID' => '1',
'operCode' => '17300-2',
'operDesc' => 'Service after 239713 km',
'qty' => 3.000,
'listPrice' => 204.00,
'netAmount' => 204.00,
'curCode' => 'EUR',
'technician' => 'Tech01'
]
],
'parts' => [
[
'seqNumber' => '1',
'jobID' => '1',
'spCode' => '32140029',
'spDesc' => 'Oil filter',
'usedQty' => 1.000,
'listPrice' => 20.14,
'curCode' => 'EUR',
'volvoOriginal' => 'Y'
]
]
];
// === ODOSLANIE ===
echo "Odosielam job card...\n";
$response = $client->postJobCard($jobCard);
// === SPRACOVANIE ODPOVEDE ===
echo "✓ Job card odoslaný\n";
echo " BodID: {$response->bodID}\n";
echo " AuthorizationID: {$response->authorizationID}\n";
echo " RC: {$response->details[0]->rc}\n";
echo " Správa: {$response->details[0]->message}\n";
// === MAZANIE (VOLITEĽNÉ) ===
echo "\nMažem job card...\n";
$response = $client->postJobCard($jobCard, 'Y');
echo "✓ Job card zmazaný\n";
} catch (Exception $e) {
// === ERROR HANDLING ===
echo "❌ Chyba: " . $e->getMessage() . "\n";
// Parsovanie error kódov
if (strpos($e->getMessage(), 'RC:4403') !== false) {
echo " → Chýba povinné pole\n";
} elseif (strpos($e->getMessage(), 'RC:164') !== false) {
echo " → JWT token expiroval, skúste znova\n";
} elseif (strpos($e->getMessage(), 'RC:4411') !== false) {
echo " → Duplicitný záznam\n";
}
}
// === RETAILER STOCK (D1) ===
$retailerStock = [
'authorizationID' => 'SK006',
'stockInventory' => [
'retailerCode' => 'SK006',
'stockMonth' => date('Ym'), // YYYYMM formát (napr. 202601)
'stockInventoryDet' => [
[
'spCode' => '32140029',
'spDesc' => 'Oil filter',
'onHand' => 150,
'allocated' => 25,
'unitCost' => 18.50,
'listPrice' => 22.00,
'curCode' => 'EUR',
'volvoOriginal' => 'Y'
]
// ... ďalšie položky
]
]
];
try {
$client->logIn();
$response = $client->postRetailerStockOnHand($retailerStock);
echo "✓ Retailer stock odoslaný pre mesiac: " . date('Ym') . "\n";
} catch (Exception $e) {
if (strpos($e->getMessage(), 'RC:4411') !== false) {
echo "Stock už bol odoslaný pre tento mesiac!\n";
} else {
echo "Chyba: " . $e->getMessage() . "\n";
}
}
// === IMPORTER STOCK (D2) ===
$importerStock = [
'authorizationID' => 'IMP021',
'stockInventory' => [
'importerCode' => 'IMP021',
'stockMonth' => date('Ym'),
'stockInventoryDet' => [
// ... položky inventára
]
]
];
$response = $client->postImporterStockOnHand($importerStock);
// Pre testovanie
$client = new VarioNGClient([
'userName' => 'test_user',
'password' => 'test_pass',
'environment' => 'qa' // QA endpoint
]);
// Keď testy prejdú, prepnite na production
$client = new VarioNGClient([
'userName' => 'prod_user',
'password' => 'prod_pass',
'environment' => 'production'
]);
try {
$response = $client->postJobCard($jobCard);
// Logujte bodID pre tracovanie
error_log("Job card sent: bodID={$response->bodID}, RC={$response->details[0]->rc}");
} catch (Exception $e) {
// Logujte chyby
error_log("Job card failed: " . $e->getMessage());
}
// Kontrola povinných polí
if (empty($jobCard['workOrder']['retailerCode'])) {
throw new Exception("retailerCode je povinný!");
}
if (empty($jobCard['workOrder']['woNumber'])) {
throw new Exception("woNumber je povinný!");
}
// Kontrola formátu dátumov
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $jobCard['workOrder']['woOpenDate'])) {
throw new Exception("Nesprávny formát dátumu! Použite YYYY-MM-DD");
}
try {
$client->logIn();
$response = $client->postJobCard($jobCard);
} catch (Exception $e) {
$errorMsg = $e->getMessage();
// Kontrola špecifických error kódov
if (strpos($errorMsg, 'RC:-1') !== false) {
// Autentifikácia zlyhala
echo "Nesprávne prihlasovacie údaje\n";
} elseif (strpos($errorMsg, 'RC:164') !== false) {
// JWT expiroval - automaticky obnovený, opakujte operáciu
echo "Token expiroval, opakujem...\n";
$response = $client->postJobCard($jobCard);
} elseif (strpos($errorMsg, 'RC:4403') !== false) {
// Chýba povinné pole
preg_match('/Field is: (\w+)/', $errorMsg, $matches);
echo "Chýba povinné pole: " . $matches[1] . "\n";
} elseif (strpos($errorMsg, 'RC:4417') !== false) {
// Duplicitný part code
echo "Duplicitný part code v zozname!\n";
} else {
// Iná chyba
echo "Neočakávaná chyba: {$errorMsg}\n";
}
}
// Ak odosielate viacero položiek, sledujte úspešnosť
$results = [];
foreach ($jobCards as $jobCard) {
try {
$response = $client->postJobCard($jobCard);
$results[] = [
'wo' => $jobCard['workOrder']['woNumber'],
'status' => 'success',
'bodID' => $response->bodID
];
} catch (Exception $e) {
$results[] = [
'wo' => $jobCard['workOrder']['woNumber'],
'status' => 'failed',
'error' => $e->getMessage()
];
}
}
// Report
echo "Úspešných: " . count(array_filter($results, fn($r) => $r['status'] === 'success')) . "\n";
echo "Neúspešných: " . count(array_filter($results, fn($r) => $r['status'] === 'failed')) . "\n";
$client->logIn();
foreach ($dailyJobCards as $jobCard) {
try {
$response = $client->postJobCard($jobCard);
echo "✓ WO {$jobCard['workOrder']['woNumber']} odoslaný\n";
} catch (Exception $e) {
echo "✗ WO {$jobCard['workOrder']['woNumber']} zlyhal: {$e->getMessage()}\n";
}
}
$client->logIn();
foreach ($salesInvoices as $invoice) {
$response = $client->postSalesPart($invoice);
}
if (date('d') == '01') {
$client->logIn();
// Retailer stock
$response = $client->postRetailerStockOnHand($retailerStock);
// Importer stock (ak máte centrálny sklad)
$response = $client->postImporterStockOnHand($importerStock);
}
$client->logIn();
// Najprv odošlite lead (ak ešte nebol odoslaný)
$response = $client->postLead($leadData);
// Potom car sales
$response = $client->postSalesCar($carSalesData);
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Dočasne upravte parseResponse() pre debugging
protected function parseResponse($response, $operationName) {
error_log("Raw response for {$operationName}: " . $response->response);
// ... zvyšok kódu
}
$json = json_encode($jobCard);
if (json_last_error() !== JSON_ERROR_NONE) {
die("Invalid JSON: " . json_last_error_msg());
}
try {
$client->logIn();
echo "Login successful!\n";
} catch (Exception $e) {
echo "Login failed: " . $e->getMessage() . "\n";
}
$jobCard = [
'authorizationID' => 'RET001',
'workOrder' => [
'retailerCode' => 'RET001',
'woNumber' => 'WO123456',
'woYear' => '2026',
'chassis' => '1HGBH41JXMN109186',
'regNo' => 'ABC123',
'woOpenDate' => '2026-01-10',
'woCloseDate' => '2026-01-13',
'custCode' => 'CUST001',
'custName' => 'John Doe',
'custPhone' => '421901234567',
'custEMail' => '[email protected] '
],
'wJobs' => [
[
'laborCode' => 'LAB001',
'laborDesc' => 'Oil change',
'technicianID' => 'TECH01',
'laborHours' => 1.5
]
],
'parts' => [
[
'spCode' => 'PART001',
'spDesc' => 'Engine oil 5W30',
'quantity' => 5,
'unitPrice' => 8.50
]
]
];
try {
$response = $client->postJobCard($jobCard);
echo "Job card posted successfully! BodID: " . $response->bodID . "\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
$salesPart = [
'authorizationID' => 'RET001',
'salesinvoice' => [
'retailerCode' => 'RET001',
'invNo' => 'INV789',
'invDate' => '2026-01-13',
'custCode' => 'CUST002',
'custName' => 'Jane Smith',
'invLineItems' => [
[
'spCode' => 'PART002',
'spDesc' => 'Brake pads',
'quantity' => 4,
'unitPrice' => 45.00,
'listPrice' => 50.00
]
]
]
];
try {
$response = $client->postSalesPart($salesPart);
echo "Sales part posted! BodID: " . $response->bodID . "\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
$retailerStock = [
'authorizationID' => 'RET001',
'stockInventory' => [
'retailerCode' => 'RET001',
'stockMonth' => '202601', // YYYYMM
'stockInventoryDet' => [
[
'spCode' => 'PART001',
'spDesc' => 'Engine oil 5W30',
'onHand' => 100,
'allocated' => 20,
'unitCost' => 7.50,
'listPrice' => 8.50,
'curCode' => 'EUR',
'volvoOriginal' => 'Y'
]
]
]
];
try {
$response = $client->postRetailerStockOnHand($retailerStock);
echo "Retailer stock posted!\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
$importerStock = [
'authorizationID' => 'IMP001',
'stockInventory' => [
'importerCode' => 'IMP001',
'stockMonth' => '202601',
'stockInventoryDet' => [
[
'spCode' => 'PART003',
'spDesc' => 'Air filter',
'onHand' => 500,
'allocated' => 50,
'unitCost' => 12.00,
'listPrice' => 15.00,
'curCode' => 'EUR',
'volvoOriginal' => 'Y'
]
]
]
];
try {
$response = $client->postImporterStockOnHand($importerStock);
echo "Importer stock posted!\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
$carSales = [
'authorizationID' => 'RET001',
'vehsales' => [
'retailerCode' => 'RET001',
'chassis' => '1HGBH41JXMN109186',
'invNo' => 'CARINV001',
'invDate' => '2026-01-13',
'custCode' => 'CUST003',
'custName' => 'Bob Johnson',
'custPhone' => '421901234567',
'custEMail' => '[email protected] ',
'listPrice' => 45000.00,
'discountTotal' => 2000.00,
'netPrice' => 43000.00,
'taxTotal' => 8600.00,
'transactionPrice' => 51600.00,
'salesAdvName' => 'Sales Advisor 1',
'deliveryDate' => '2026-01-20'
]
];
try {
$response = $client->postSalesCar($carSales);
echo "Car sale posted!\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
$lead = [
'authorizationID' => 'RET001',
'lead' => [
'leadID' => 'LEAD001',
'retailerCode' => 'RET001',
'leadDate' => '2026-01-10',
'leadSource' => '05', // Online source
'custCode' => 'CUST004',
'custName' => 'Alice Brown',
'custPhone' => '421901234567',
'custEMail' => '[email protected] ',
'body' => 'XC90',
'testDrive' => [
[
'testDriveDate' => '2026-01-12',
'testDriveResult' => 'POSITIVE'
]
],
'offer' => [
[
'offerDate' => '2026-01-13',
'offerAmount' => 52000.00,
'offerStatus' => 'PENDING'
]
]
]
];
try {
$response = $client->postLead($lead);
echo "Lead posted!\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
// Delete a job card (only key fields ID' => 'RET001',
'workOrder' => [
'retailerCode' => 'RET001',
'woNumber' => 'WO123456',
'woYear' => '2026'
]
];
try {
$response = $client->postJobCard($jobCardDelete, 'Y'); // toDelete = 'Y'
echo "Job card deleted!\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
try {
$client->logIn();
$response = $client->postJobCard($jobCard);
// Success
echo "BodID: " . $response->bodID . "\n";
echo "Message: " . $response->details[0]->message . "\n";
} catch (Exception $e) {
// Parse error message
if (strpos($e->getMessage(), 'RC:4403') !== false) {
echo "Missing mandatory field!\n";
} elseif (strpos($e->getMessage(), 'RC:164') !== false) {
echo "Token expired, retrying...\n";
// Auto-handled, retry operation
} else {
echo "Error: " . $e->getMessage() . "\n";
}
}
// OLD (v1.0):
'base_url' => 'https://www.vario-ng.com/vci/vciws/postVNG/'
// NEW (v3.0):
'environment' => 'production' // Auto-selects vibe.volvocars.biz
// OLD (v1.0):
$client->postStockOnHand($data); // REMOVED!
// NEW (v3.0):
$client->postRetailerStockOnHand($data); // For retailer inventory
// OR
$client->postImporterStockOnHand($data); // For importer inventory
// v3.0 responses $response->authorizationID
$response->details[0]->rc
$response->details[0]->message
bash
export VIBE_USERNAME="your_username"
export VIBE_PASSWORD="your_password"
php tests/test_login.php
php tests/test_all_endpoints.php