Как я могу установить порядок доставки в состояние «сделано» с xmlrpc?
я использую
$client->write('stock.move', array(58), ['state' => "done"]);
Он работает, но не обновляет количество рук, обновляется только прогнозируемое количество.
Есть ли способ позвонить exec_workflow
из PHP?
Недавно я столкнулся с той же проблемой при работе с конечной точкой PHP XMLRPC для Odoo 11, и я наткнулся на этот пост и несколько других, даже более старых постов, но ни один из них не ответил на вопрос с достаточной детализацией, которая могла бы дать мне работающее решение. Тем не менее, вот что я в итоге сделал, чтобы решить возникшую проблему (установить состояние заказа на доставку или «выполнено» и обновить имеющееся количество).
Мое решение требует двух вызовов API вместо одного, и вам понадобится идентификатор stock.picking и любые связанные идентификаторы stock.move. Я также создал простой класс с именем OdooXmlrpc для обработки вызовов XMLRPC для Odoo. Я предполагаю, что вы сделали то же самое, так как ваш фрагмент кода вызывает методы для вашего объекта $ client. Я включу мои методы класса ниже для справки.
Теперь для фрагментов кода. Используя PHP, первое, что я сделал, — это установил поле «кол-во» в stock.move для каждого продукта / элемента в комплектации, потому что это поле используется для обновления количества в наличии. Вам не нужно устанавливать поле состояния для записей stock.picking или stock.move, Odoo установит их, когда мы вызовем вторую функцию execute_kw.
// first we update the stock.move qty done
$update_move_data = array(array($move['id']), array('quantity_done' => $move['product_qty']));
$update_move = $xmlrpc_client->write('stock.move', $update_move_data);
Или используя ваш синтаксис с некоторыми фиктивными данными
$xmlrpc_client->write('stock.move', array(58), ['quantity_done' => 50]);
Затем я вызываю универсальный метод, который я создал в своем классе, называемый call_function, для обработки передачи заказа на доставку. Этот метод класса будет принимать модель и метод Odoo. Теоретически, я мог бы использовать этот метод класса для любых операций CRUD, но я оставляю за собой использование для всех операций, не основанных на CRUD, так как параметры будут различаться — все еще в стадии разработки, но кажется полезным и работает на данный момент.
// next we process the picking so its gets marked as done and qty on hand gets adjusted
$picking_do_transfer = $xmlrpc_client->call_function('stock.picking', 'do_transfer', array($picking['id']));
Это оно! состояние заказа на поставку теперь «выполнено», и имеющееся количество должно корректно обновляться в системе.
Обратите внимание, что используя этот метод «do_transfer», Odoo автоматически создаст задержку заказа для любого элемента / перемещения, для которого не было установлено значение amount_done, что я считаю очень полезным. Надеюсь, что этот ответ поможет вам и другим пользователям, которые сталкиваются с ним.
Мои методы класса OdooXmlrpc для справки:
/**
* Write the records respective to the IDs and field value pairs provided
*
* @param (string) $model, the odoo model to be used in the call
* @param (array) $domain, a multi-dim array of record ids and a mapping of updated fields to values
*
* @return (int) $ret, 1 when operation was successful
*/
function write($model, $domain) {
if (!isset($model) || !isset($domain)) {
print "Missing params...";
return;
}
// our odoo method
$method = 'write';
$ret = $this->client->execute_kw($this->database, $this->id, $this->password, $model, $method, $domain);
return $ret;
}
/** !NOTE! EXPERIMENTAL :: NOT SURE WORKS WITH ALL ODOO MODELS
* Call the model function with IDs and/or field values to run/update with
*
* @param (string) $model, the odoo model to be used in the call
* @param (array) $method, the name of the model method to call
* @param (array) $args, an array of id(s) or records to modify
*
* @return (int) $ret, 1 when operation was successful
*/
function call_function($model, $method, $args) {
if (!isset($model) || !isset($method) || !isset($args)) {
print "Missing params...";
return;
}
$ret = $this->client->execute_kw($this->database, $this->id, $this->password, $model, $method, $args);
return $ret;
}
Вы должны пройти model name
, record id
и signal name
,
client->exec_workflow('stock.move', array(58), signal_name);
@http.route('/web/dataset/exec_workflow', type='json', auth="user")
def exec_workflow(self, model, id, signal):
return request.session.exec_workflow(model, id, signal)