如何调整Odoo stock.picking服务器动作代码实现合并开票并调用自定义动作
调整Odoo服务器动作实现同客户销售订单合并开票
原代码会为每个出库单对应的销售订单单独生成发票,要实现像销售订单列表视图那样合并同一客户的订单开票,需按以下思路调整代码:
- 先收集所有符合条件的销售订单并去重,避免重复处理同一订单
- 将销售订单按客户分组,确保同一客户的订单批量处理
- 对每组客户的订单批量生成发票,Odoo会自动合并符合条件的订单为一张发票
- 生成发票后打开发票,调用指定ID的自定义服务器动作,并更新对应出库单的状态字段
调整后的完整代码
# 收集所有符合条件的销售订单并去重 sale_orders = set() for record in records: if record.picking_type_code == 'outgoing' and record.sale_id: sale_orders.add(record.sale_id) # 按客户分组销售订单 partner_sales = {} for so in sale_orders: partner_id = so.partner_id.id if partner_id not in partner_sales: partner_sales[partner_id] = env['sale.order'].browse() partner_sales[partner_id] += so # 遍历每个客户组处理开票逻辑 for partner_id, sales in partner_sales.items(): # 批量创建发票,同一客户的订单会自动合并 invoice_ids = sales.action_invoice_create() invoices = env['account.invoice'].browse(invoice_ids) if invoices: for invoice in invoices: # 打开发票 invoice.action_invoice_open() # 调用ID为1183的自定义服务器动作 env['ir.actions.server'].browse(1183).run(invoice) # 更新对应出库单的错误信息字段 for picking in records: if picking.sale_id in sales: picking.write({'x_error': f'FACTUUR OKE: ({invoice.number})'}) else: # 该客户组未生成发票,更新对应出库单信息 for picking in records: if picking.sale_id in sales: picking.write({'x_error': 'No invoices found for the sale orders'}) # 处理无销售订单关联的出库单 for record in records: if record.picking_type_code == 'outgoing' and not record.sale_id: record.write({'x_error': 'No sale order associated with the record'})
关键调整说明
- 去重处理:用集合存储销售订单,避免多个出库单关联同一订单时重复操作
- 按客户分组:将同一客户的订单归为一组,匹配销售订单列表视图合并开票的逻辑,确保同客户订单批量生成一张发票
- 批量开票:调用
sales.action_invoice_create()时传入同一客户的订单集合,Odoo会自动根据客户、币种等合并规则生成单张发票 - 调用自定义动作:通过
env['ir.actions.server'].browse(1183).run(invoice)触发指定ID的服务器动作,把生成的发票作为操作对象传入 - 状态更新:根据开票结果批量更新对应出库单的
x_error字段,每个出库单都能得到明确的操作反馈
内容的提问来源于stack exchange,提问作者Pelingier
相关产品推荐
相关产品推荐

