You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo 15.2中通过XML-RPC为租赁订单创建发票

Odoo 15.2 租赁订单XML-RPC创建发票方案

我在Odoo 15.2中有一个租赁对象,尝试通过XML-RPC以编程方式为租赁订单创建发票。我看到顶部有一个“Create Invoice”按钮,hover时显示以下信息:
Object: sale.order, Modifiers: {"invisible":[["invoice_status","=","to invoice"]]}, Button type: action, Action ID: 296

是否可以像以下通过execute_kw方法验证采购订单那样,用XML-RPC创建发票?

# 验证采购订单
execute_kw('purchase.order', 'button_confirm', [purchase_order_id])

# 如何通过Odoo XML-RPC为销售订单创建发票?
execute_kw('account.invoice', '???????', [purchase_order_id])

我需要了解如何在Odoo 15.2中通过XML-RPC为租赁订单创建发票,以及应调用的具体方法或操作,恳请帮助!


补充解决方案(适用于Odoo 17 SaaS)

给搜索的用户参考:已通过以下代码实现需求,希望能帮助社区。

@app.route('/createInvoice', methods=['POST'])
def createInvoice():
    try:
        models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))
        data = request.get_json()
        if not data:
            return jsonify({'message': '未接收到数据。'}), 400
        
        sale_order_id = int(data.get('sale_order_id'))
        product_id = int(data.get('product_variant_id'))
        
        if not sale_order_id or not product_id:
            return jsonify({'message': '输入数据无效。'}), 400
        
        # 获取销售订单相关数据
        sale_order_data = models.execute_kw(db, uid, password, 'sale.order', 'read', 
                                            [sale_order_id], 
                                            {'fields': ['partner_id', 'invoice_status', 'name', 'order_line', 'picking_ids']})
        
        if not sale_order_data:
            return jsonify({'message': '未找到销售订单。'}), 404
        
        invoice_id = None
        
        # 遍历销售订单关联的所有拣货单
        for picking_line in sale_order_data[0].get('picking_ids', []):
            picking_line_data = models.execute_kw(db, uid, password, 'stock.picking', 'search_read', 
                                                [[['id', '=', int(picking_line)],['product_id','=', int(product_id)]]], {})
            # 如果找到拣货数据则完成验证
            if picking_line_data:
                stock_picking_validate = models.execute_kw(db, uid, password, 'stock.picking', 'button_validate', [[picking_line]])
        
        # 遍历销售订单的所有行
        for lineId in sale_order_data[0].get('order_line', []):
            sale_order_line = models.execute_kw(db, uid, password, 'sale.order.line', 'search_read', 
                                                [[["id", "=", lineId],['product_id','=', product_id]]], {})
            if sale_order_line:
                # 为销售订单行生成发票
                current_date = datetime.now().strftime('%Y-%m-%d')
                invoice_context = {
                    'move_type': 'out_invoice',
                    'partner_id': sale_order_data[0]['partner_id'][0],
                    'invoice_origin': sale_order_data[0]['name'],
                    'invoice_date': current_date,
                    'partner_bank_id': 164, # 替换为你的银行ID
                    'l10n_in_gst_treatment': 'consumer', # 替换为你的GST处理类型(消费者/供应商)
                    'ref': '',
                    'l10n_in_type_id': 1, # 电子运单文档类型ID
                    'l10n_in_mode': '1', # 运输方式ID
                    'l10n_in_distance': 11, # 车辆行驶距离
                    'l10n_in_vehicle_type': 'R', # 车辆类型
                    'l10n_in_vehicle_no': 'AP00AA0000' # 车辆号码
                }
                # 在系统中创建发票
                invoice_id = models.execute_kw(db, uid, password, 'account.move', 'create', [invoice_context])
                invoice_lines = []
                # 填充发票行数据
                for lineId in sale_order_data[0].get('order_line', []):
                    sale_order_line = models.execute_kw(db, uid, password, 'sale.order.line', 'read', [lineId], {})
                    invoice_lines.append((0, 0, {
                        'move_id': int(invoice_id),
                        'product_id': int(sale_order_line[0]['product_id'][0]),
                        'quantity': float(sale_order_line[0]['product_uom_qty']),
                        'price_unit': float(sale_order_line[0]['price_unit']),
                        'name': sale_order_line[0]['name']
                    }))
                # 将发票行写入发票
                models.execute_kw(db, uid, password, 'account.move', 'write', [invoice_id, {'invoice_line_ids': invoice_lines}])
                # 过账发票
                models.execute_kw(db, uid, password, 'account.move', 'action_post', [invoice_id])
                # 查找对应发票行ID
                inv_line_id = models.execute_kw(db, uid, password, 'account.move.line', 'search', 
                                                 [[['product_id', '=', sale_order_line[0]['product_id'][0]], 
                                                   ['move_id', '=', invoice_id], 
                                                   ['quantity', '=', sale_order_line[0]['product_uom_qty']]]])
                # 更新销售订单行的发票关联和状态
                models.execute_kw(db, uid, password, 'sale.order.line', 'write', 
                                  [lineId, {'invoice_lines': [(4, inv_line_id[0])], 'invoice_status': 'invoiced'}])
                # 更新销售订单的发票关联和状态
                models.execute_kw(db, uid, password, 'sale.order', 'write', 
                                  [[sale_order_id], {'invoice_ids': [(4, invoice_id)], 'invoice_status': 'invoiced'}])
                # 返回创建成功响应
                if invoice_id:
                    return jsonify({'invoice_id': invoice_id, 'message':'发票创建成功。'}), 200
                else:
                    return jsonify({'message': '未满足创建条件,未生成发票。'}), 200
        
        # 未找到可创建发票的行
        return jsonify({'message': '未创建发票。'}), 404
        
    except Exception as e:
        print(f"发生错误: {e}")
        return jsonify({'message': '处理请求时发生错误。'}), 500

内容的提问来源于stack exchange,提问作者Aditya Irri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:53:21