123 lines
4.9 KiB
Python
123 lines
4.9 KiB
Python
# -*- 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,
|
|
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()
|
|
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
|