# -*- encoding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models class PurchaseOrder(models.Model): _inherit = 'purchase.order' requisition_id = fields.Many2one('purchase.requisition', string='Purchase Agreement', copy=False) is_quantity_copy = fields.Selection(related='requisition_id.is_quantity_copy', readonly=False) @api.onchange('requisition_id') def _onchange_requisition_id(self): if not self.requisition_id: return self = self.with_company(self.company_id) requisition = self.requisition_id if self.partner_id: partner = self.partner_id else: partner = requisition.vendor_id payment_term = partner.property_supplier_payment_term_id FiscalPosition = self.env['account.fiscal.position'] fpos = FiscalPosition.with_company(self.company_id).get_fiscal_position(partner.id) self.partner_id = partner.id self.fiscal_position_id = fpos.id self.payment_term_id = payment_term.id, self.company_id = requisition.company_id.id self.currency_id = requisition.currency_id.id if not self.origin or requisition.name not in self.origin.split(', '): if self.origin: if requisition.name: self.origin = self.origin + ', ' + requisition.name else: self.origin = requisition.name self.notes = requisition.description self.date_order = fields.Datetime.now() if requisition.type_id.line_copy != 'copy': return # Create PO lines if necessary order_lines = [] for line in requisition.line_ids: # Compute name product_lang = line.product_id.with_context( lang=partner.lang or self.env.user.lang, partner_id=partner.id ) name = product_lang.display_name if product_lang.description_purchase: name += '\n' + product_lang.description_purchase # Compute taxes taxes_ids = fpos.map_tax(line.product_id.supplier_taxes_id.filtered(lambda tax: tax.company_id == requisition.company_id)).ids # Compute quantity and price_unit if line.product_uom_id != line.product_id.uom_po_id: product_qty = line.product_uom_id._compute_quantity(line.product_qty, line.product_id.uom_po_id) price_unit = line.product_uom_id._compute_price(line.price_unit, line.product_id.uom_po_id) else: product_qty = line.product_qty price_unit = line.price_unit if requisition.type_id.quantity_copy != 'copy': product_qty = 0 # Create PO line order_line_values = line._prepare_purchase_order_line( name=name, product_qty=product_qty, price_unit=price_unit, taxes_ids=taxes_ids) order_lines.append((0, 0, order_line_values)) self.order_line = order_lines def button_confirm(self): res = super(PurchaseOrder, self).button_confirm() for po in self: if not po.requisition_id: continue if po.requisition_id.type_id.exclusive == 'exclusive': others_po = po.requisition_id.mapped('purchase_ids').filtered(lambda r: r.id != po.id) others_po.button_cancel() if po.state not in ['draft', 'sent', 'to approve']: po.requisition_id.action_done() return res @api.model def create(self, vals): purchase = super(PurchaseOrder, self).create(vals) if purchase.requisition_id: purchase.message_post_with_view('mail.message_origin_link', values={'self': purchase, 'origin': purchase.requisition_id}, subtype_id=self.env['ir.model.data'].xmlid_to_res_id('mail.mt_note')) return purchase def write(self, vals): result = super(PurchaseOrder, self).write(vals) if vals.get('requisition_id'): self.message_post_with_view('mail.message_origin_link', values={'self': self, 'origin': self.requisition_id, 'edit': True}, subtype_id=self.env['ir.model.data'].xmlid_to_res_id('mail.mt_note')) return result class PurchaseOrderLine(models.Model): _inherit = 'purchase.order.line' @api.onchange('product_qty', 'product_uom') def _onchange_quantity(self): res = super(PurchaseOrderLine, self)._onchange_quantity() if self.order_id.requisition_id: for line in self.order_id.requisition_id.line_ids.filtered(lambda l: l.product_id == self.product_id): if line.product_uom_id != self.product_uom: self.price_unit = line.product_uom_id._compute_price( line.price_unit, self.product_uom) else: self.price_unit = line.price_unit break return res