obuchmann / odoo-jsonrpc
PHP Odoo Json-RPC connector, prepared for laravel integration
Installs: 12 083
Dependents: 0
Suggesters: 0
Security: 0
Stars: 35
Watchers: 5
Forks: 12
Open Issues: 6
Requires
- php: ^8.0
- guzzlehttp/guzzle: ^7.2
Requires (Dev)
- phpunit/phpunit: ^9.5
README
Connect to odoo via the json-rpc api. If you are in a laravel project, this package registers a provider. But laravel is not required for this package.
Installation
You can install the package via composer:
composer require obuchmann/odoo-jsonrpc
The service provider will automatically register itself if you are in a laravel project.
You can publish the config file with:
php artisan vendor:publish --provider="Obuchmann\OdooJsonRpc\OdooServiceProvider" --tag="config"
Usage
Basic Usage
use Obuchmann\OdooJsonRpc\Odoo; use Obuchmann\OdooJsonRpc\Odoo\Request\Arguments\Domain; $this->host = 'http://localhost:8069'; $this->username = 'admin'; $this->password = 'password'; $this->database = 'odoo'; // Connect to Odoo $odoo = new Odoo(new Odoo\Config($database, $host, $username, $password)); $odoo->connect(); // Check Access rights (bool) $check = $odoo->checkAccessRights('res.partner', 'read'); // Check Access rights in model syntax $check = $odoo->model('res.partner') ->can('read'); // Use Domain for Search $isCompanyDomain = (new Domain())->where('is_company', '=', true); $companyIds = $odoo->search('res.partner', $isCompanyDomain); // read ids $companies = $odoo->read('res.partner', $companyIds); // search_read with model Syntax $companies = $odoo->model('res.partner') ->where('is_company', '=', true) ->get(); // search_read with single item $company = $odoo->model('res.partner') ->where('is_company', '=', true) ->where('name', '=', 'My Company') ->first(); // create with model syntax $partner = $odoo->model('res.partner') ->create([ 'name' => 'My Company', 'is_company' => true ]); // update with model syntax $partner = $odoo->model('res.partner') ->where('name', '=', 'My Company') ->update([ 'name' => 'My New Company' ]); // direct update by id $myCompanyId = 1; $partner = $odoo->updateById('res.partner', $myCompanyId, [ 'name' => 'My New Company' ]); // delete by id $odoo->deleteById('res.partner', $myCompanyId);
Laravel Usage
class Controller{ public function index(\Obuchmann\OdooJsonRpc\Odoo $odoo){ // Find Model by Id $product = $odoo->find('product.template', 1); // Update Model by ID $this->odoo->updateById('product.product', $product->id, [ 'name' => $name, ]); // Create returning ID $id = $this->odoo ->create('res.partner', [ 'name' => 'Bobby Brown' ]); // Search for Models with or $partners = $this->odoo->model('res.partner') ->where('name', '=', 'Bobby Brown') ->orWhere('name', '=', 'Gregor Green') ->limit(5) ->orderBy('id', 'desc') ->get(); // Update by Query $updateResponse = $this->odoo ->model('res.partner') ->where('name', '=', 'Bobby Brown') ->update([ 'name' => 'Dagobert Duck' ]); } }
Laravel Models
Laravel Models are implemented with Attributes
#[Model('res.partner')] class Partner extends OdooModel { #[Field] public string $name; #[Field('email')] public ?string $email; } class Controller{ public function index(){ // Find Model by Id $partner = Partner::find(1); // Search Model $partner = Partner::query() ->where('name', '=', 'Azure Interior') ->first(); // Update Model $partner->name = "Dagobert Duck"; $partner->save(); // Create returning ID $partner = new Partner(); $partner->name = 'Tester'; $partner->save(); } }
Casts
You can define a cast for your models. This is useful if you want to convert odoo fields to a specific type. There are some predefined casts for date and datetime fields.
Casts are global and can be registered in the Odoo class.
// The basic datetime cast \Obuchmann\OdooJsonRpc\Odoo::registerCast(new Odoo\Casts\DateTimeCast()); // a datetime cast that respects the timezone \Obuchmann\OdooJsonRpc\Odoo::registerCast(new Odoo\Casts\DateTimeCast('Europe/Berlin')); // you can write custom casts by extending the Obuchmann\OdooJsonRpc\Odoo\Casts\Cast class // example DateTimeCast class DateTimeCast extends Cast { public function getType(): string { return \DateTime::class; } public function cast($raw) { if($raw){ try { return new \DateTime($raw); } catch (\Exception) {} // If no valid Date return null } return null; } public function uncast($value) { if($value instanceof \DateTime){ return $value->format('Y-m-d H:i:s'); } } }
For more examples take a look at the tests directory.
Tests
composer test