PHP code example of bannerstop / odoo-connect

1. Go to this page and download the library: Download bannerstop/odoo-connect 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/ */

    

bannerstop / odoo-connect example snippets


use Bannerstop\OdooConnect\Client\OdooConnection;
use Bannerstop\OdooConnect\Client\OdooClient;
use Bannerstop\OdooConnect\Builder\RequestBuilder;
use Bannerstop\OdooConnect\Config\Config;

// Connection
$connection = new OdooConnection(
    baseUrl: 'https://your-odoo-relay.com',
    apiKey: 'your-api-key',
    db: 'your-database'
);

// Client with default settings
$client = new OdooClient($connection);

// Client with custom settings
$client = new OdooClient(
    connection: $connection,
    config: new Config(returnDataTimezone: 'Europe/Berlin', odooTimezone: 'UTC'),
    requestsPerSecond: 5,  // Rate limiting (default: 3, 0 = disabled)
    maxRetries: 3,         // Retry on failure with exponential backoff (default: 3)
    timeout: 15.0,         // HTTP timeout in seconds (default: 10.0)
);

// RequestBuilder + Services
$requestBuilder = new RequestBuilder($client);

$orderService = new OrderService($requestBuilder);
$customerService = new CustomerService($requestBuilder);
$invoiceService = new InvoiceService($requestBuilder);
$purchaseOrderService = new PurchaseOrderService($requestBuilder);
$trackingCodeService = new TrackingCodeService($requestBuilder);

use Bannerstop\OdooConnect\Config\Config;

$config = new Config(
    returnDataTimezone: 'Europe/Berlin',  // Timezone for returned data (default: PHP default)
    odooTimezone: 'UTC'                   // Timezone Odoo uses (default: UTC)
);

$client = new OdooClient($connection, config: $config);

$order = $orderService->getOrderByOrderId('S3136366');

echo $order->orderId;        // "S3136366"
echo $order->state->value;   // "sale"
echo $order->amountTotal;    // 129.99
echo $order->spark;          // "some-value" or null

use Bannerstop\OdooConnect\Enum\Field\OrderField;

$order = $orderService->getOrderByOrderId('S3136366', [
    OrderField::ID,
    OrderField::ORDER_ID,
    OrderField::STATE,
    OrderField::AMOUNT_TOTAL,
]);

echo $order['id'];           // 12345
echo $order['name'];         // "S3136366"
echo $order['state'];        // "sale"
echo $order['amount_total']; // 129.99

use Bannerstop\OdooConnect\Enum\Model;

$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->where('state', '=', 'sale')
    ->where('date_order', '>=', '2025-01-01')
    ->where('date_order', '<=', '2025-12-31')
    ->get();

// Orders without spark
$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->where('spark', '=', false)
    ->get();

// Orders that have a spark
$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->where('spark', '!=', false)
    ->get();

use Bannerstop\OdooConnect\Enum\State;

$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->state(State::SALES_ORDER)
    ->get();

// First 10 orders sorted by id descending
$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->where('state', '=', 'sale')
    ->limit(10)
    ->offset(0)
    ->order('id DESC')
    ->getRaw();

// Page 2
$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->where('state', '=', 'sale')
    ->limit(10)
    ->offset(10)
    ->order('id DESC')
    ->getRaw();

// Multi-field sorting
$orders = $requestBuilder
    ->model(Model::SALE_ORDER)
    ->order('date_order DESC, name ASC')
    ->getRaw();

$orders = $orderService->getOrdersByDate('2025-01-01', '2025-12-31', limit: 20, order: 'date_order DESC');
$items = $orderService->getOrderItemsByOrderId('S12345', limit: 5, offset: 10);
$invoices = $invoiceService->getInvoicesByShopOrderId('SHOP-123', limit: 10);
$codes = $trackingCodeService->searchTrackingCodes(orderId: 'S12345', limit: 10, order: 'id DESC');

// Fetch single order
$order = $orderService->getOrderByOrderId('S3136366');
$order = $orderService->getOrderByShopOrderId('SHOP-123');
$order = $orderService->getOrderByShopOrderId('SHOP-123', type: State::SALES_ORDER);

// Fetch multiple orders
$orders = $orderService->getOrdersByDate('2025-01-01', '2025-03-01');
$orders = $orderService->getOrdersByDate('2025-01-01', '2025-03-01', type: State::QUOTE);

// Fetch order line items
$items = $orderService->getOrderItemsByOrderId('S3136366');

// Update fields
$orderService->updateOrderFields($odooId, [OrderField::ORIGIN->value => 'web']);
$orderService->updateOrderLastJiraSync($odooId);
$orderService->updateOrderDateProofAcceptance($odooId);
$orderService->updateOrderDateProofAcceptance($odooId, new DateTime('2025-06-15'));

// Spark
$orderService->updateOrderSpark($odooId, 'spark-value');
$orderService->updateOrderSpark($odooId, false); // clear
$orderService->updateOrderItemSpark($lineId, 'spark-value');

// Add tracking code
$trackingId = $orderService->addTrackingCode(
    orderId: 'S3136366',
    carrier: 'DHL',
    trackingCode: 'ABC123456',
);
// Or with known internal ID (skips lookup)
$trackingId = $orderService->addTrackingCode('S3136366', 'DHL', 'ABC123456', id: 12345);

$customer = $customerService->getCustomerById('42');

echo $customer->name;
echo $customer->email;
echo $customer->city;
echo $customer->countryName;

$customerService->updateSpark($odooId, 'spark-value');
$customerService->updateSpark($odooId, false); // clear

// Fetch invoices by shop order reference
$invoices = $invoiceService->getInvoicesByShopOrderId('SHOP-123');

// Fetch single invoice
$invoice = $invoiceService->getInvoiceByInvoiceId('INV/2025/0001');

echo $invoice->amountTotal;
echo $invoice->amountResidual;

$invoiceService->updateSpark($odooId, 'spark-value');

use Bannerstop\OdooConnect\Enum\PurchaseState;

$pos = $purchaseOrderService->getPurchaseOrdersByName('PO-123');
$pos = $purchaseOrderService->getPurchaseOrdersByDate(
    '2025-01-01', '2025-06-01',
    state: PurchaseState::PURCHASE,
    limit: 50,
);

// Search by order ID, code, or both
$codes = $trackingCodeService->searchTrackingCodes(orderId: 'S3136366');
$codes = $trackingCodeService->searchTrackingCodes(code: 'ABC123456');
$codes = $trackingCodeService->searchTrackingCodes(orderId: 'S3136366', code: 'ABC123456');

$trackingCodeService->updateSpark($odooId, 'spark-value');

$trackingId = $orderService->addTrackingCode('S3136366', 'DHL', 'ABC123456');

$newId = $requestBuilder
    ->model(Model::BS_TRACKING_CODE)
    ->create([
        'name' => 'TC-001',
        'carrier' => 'UPS',
        'code' => 'UPS123456',
        'sale_order_id' => 12345,
    ]);

$orderService->updateOrderFields($odooId, [
    OrderField::ORIGIN->value => 'website',
]);

$orderService->updateOrderSpark($odooId, 'new-spark');
$customerService->updateSpark($odooId, 'new-spark');
$invoiceService->updateSpark($odooId, 'new-spark');
$trackingCodeService->updateSpark($odooId, 'new-spark');

// Pass false to clear spark
$orderService->updateOrderSpark($odooId, false);

$requestBuilder
    ->model(Model::SALE_ORDER)
    ->recordId($odooId)
    ->updateFields([
        'origin' => 'website',
        'spark' => 'new-value',
    ])
    ->update();

use Bannerstop\OdooConnect\Exception\OdooClientException;
use Bannerstop\OdooConnect\Exception\OdooApiException;
use Bannerstop\OdooConnect\Exception\OdooRecordNotFoundException;

try {
    $order = $orderService->getOrderByOrderId('S9999999');
} catch (OdooRecordNotFoundException $e) {
    // Record not found in Odoo
    echo $e->getMessage();
} catch (OdooApiException $e) {
    // Odoo API returned an error
    echo $e->getMessage();
    echo $e->getOdooMessage(); // Original Odoo error message
} catch (OdooClientException $e) {
    // HTTP/network error (timeout, connection refused, max retries exceeded)
    echo $e->getMessage();
}