50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
# -*- 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,
|
|
}
|