如何使用XMLRPC PHP验证Odoo交货单?

时间:2017-05-30 11:15:52

标签: php xml-rpc odoo-9

如何将交货单设置为州"已完成"用xmlrpc?

我正在使用

$client->write('stock.move', array(58), ['state' => "done"]);

它确实有效,但它没有更新现有数量,只有预测数量正在更新。

有没有办法从PHP调用exec_workflow

2 个答案:

答案 0 :(得分:1)

我最近在为Odoo 11使用PHP XMLRPC端点时遇到了相同的问题,我偶然发现了这篇文章以及其他一些甚至更老的文章,但是他们都没有足够详细地回答这个问题,可以为我提供帮助。解。就是说,这就是我最终要解决的问题(设置交货订单状态或“完成”并更新现有数量)。

我的解决方案需要两个API调用,而不仅仅是一个,因此您将需要stock.picking ID和任何相关的stock.move ID。我还创建了一个名为OdooXmlrpc的简单类,以处理对Odoo的XMLRPC调用。我假设您已经做了同样的事情,因为您的代码片段似乎正在调用$ client对象上的方法。我将在下面提供我的课堂方法以供参考。

现在输入代码段。使用PHP,我要做的第一件事是为领料中的每个产品/项目设置了stock.move的stock.move字段,因为这是用于现有数量更新的字段。您不必为stock.picking或stock.move记录设置状态字段,当我们调用第二个execute_kw函数时,Odoo会设置状态字段。

// 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会自动为没有设置quantity_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;
}

答案 1 :(得分:0)

您必须传递model namerecord idsignal name

client->exec_workflow('stock.move', array(58), signal_name);

来自odoo9 on github

@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)