summaryrefslogtreecommitdiff
path: root/addons/purchase_requisition/models/purchase.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase_requisition/models/purchase.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/purchase_requisition/models/purchase.py')
-rw-r--r--addons/purchase_requisition/models/purchase.py123
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