diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase_requisition/models/purchase.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/purchase_requisition/models/purchase.py')
| -rw-r--r-- | addons/purchase_requisition/models/purchase.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/addons/purchase_requisition/models/purchase.py b/addons/purchase_requisition/models/purchase.py new file mode 100644 index 00000000..a3665665 --- /dev/null +++ b/addons/purchase_requisition/models/purchase.py @@ -0,0 +1,123 @@ +# -*- 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 |
