# -*- coding: utf-8 -*- from odoo import models, fields, api, _ class PurchaseOrder(models.Model): _inherit = 'purchase.order' auto_generated_so_id = fields.Many2one('sale.order', string='Generated Sale Order', readonly=True, copy=False) def button_confirm(self): res = super(PurchaseOrder, self).button_confirm() for po in self: # Check if vendor is linked to one of our internal companies partner_company = self.env['res.company'].sudo().search([('partner_id', '=', po.partner_id.id)], limit=1) if partner_company and partner_company.intercompany_auto_so: # Need to run as superuser in the context of the partner company so_vals = po._prepare_intercompany_so_vals(partner_company) so = self.env['sale.order'].sudo().with_company(partner_company.id).create(so_vals) po.write({'auto_generated_so_id': so.id}) # Optionally auto confirm SO so.action_confirm() # Link the source PO reference on the SO so.order_line._link_to_po_lines(po) return res def _prepare_intercompany_so_vals(self, dest_company): """Prepare values to create the linked sale order in the destination company.""" self.ensure_one() # Find this company's partner record to use as customer on the SO customer = self.company_id.partner_id # Prepare order lines order_lines = [] for line in self.order_line: line_vals = { 'product_id': line.product_id.id, 'name': line.name, 'product_uom_qty': line.product_qty, 'price_unit': line.price_unit, # Using PO price; can be overridden by priceless if needed 'product_uom': line.product_uom.id, } order_lines.append((0, 0, line_vals)) return { 'company_id': dest_company.id, 'partner_id': customer.id, 'client_order_ref': self.name, 'order_line': order_lines, }