From 8b5401864dd267437f520ece428970da3cc87227 Mon Sep 17 00:00:00 2001 From: William Henrotin Date: Thu, 2 Nov 2017 16:54:00 +0100 Subject: [PATCH] [REF] purchase_requisition: multi-currency support If the parameter multi currency is enabled, the field currency is added in the purchase requisition form. The currency chosen will be the one by default in the PO attached to the BO --- addons/purchase/models/purchase.py | 3 ++- .../models/purchase_requisition.py | 13 ++++++------- .../tests/test_purchase_requisition.py | 2 ++ .../views/purchase_requisition_views.xml | 1 + 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 6325863fd26..e327798329d 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -236,7 +236,8 @@ class PurchaseOrder(models.Model): else: self.fiscal_position_id = self.env['account.fiscal.position'].with_context(company_id=self.company_id.id).get_fiscal_position(self.partner_id.id) self.payment_term_id = self.partner_id.property_supplier_payment_term_id.id - self.currency_id = self.partner_id.property_purchase_currency_id.id or self.env.user.company_id.currency_id.id + if not self.currency_id: + self.currency_id = self.partner_id.property_purchase_currency_id.id or self.env.user.company_id.currency_id.id return {} @api.onchange('fiscal_position_id') diff --git a/addons/purchase_requisition/models/purchase_requisition.py b/addons/purchase_requisition/models/purchase_requisition.py index 6072ee11411..03571f67dd5 100644 --- a/addons/purchase_requisition/models/purchase_requisition.py +++ b/addons/purchase_requisition/models/purchase_requisition.py @@ -76,6 +76,8 @@ class PurchaseRequisition(models.Model): account_analytic_id = fields.Many2one('account.analytic.account', 'Analytic Account') picking_type_id = fields.Many2one('stock.picking.type', 'Operation Type', required=True, default=_get_picking_in) is_quantity_copy = fields.Selection(related='type_id.quantity_copy', readonly=True) + currency_id = fields.Many2one('res.currency', 'Currency', required=True, + default=lambda self: self.env.user.company_id.currency_id.id) @api.depends('state') def _set_state(self): @@ -184,7 +186,7 @@ class PurchaseRequisition(models.Model): class SupplierInfo(models.Model): _inherit = "product.supplierinfo" _order = 'sequence, purchase_requisition_id desc, min_qty desc, price' - + purchase_requisition_id = fields.Many2one('purchase.requisition', related='purchase_requisition_line_id.requisition_id', string='Blanket order') purchase_requisition_line_id = fields.Many2one('purchase.requisition.line') @@ -300,7 +302,6 @@ class PurchaseOrder(models.Model): else: partner = requisition.vendor_id payment_term = partner.property_supplier_payment_term_id - currency = partner.property_purchase_currency_id or requisition.company_id.currency_id FiscalPosition = self.env['account.fiscal.position'] fpos = FiscalPosition.get_fiscal_position(partner.id) @@ -310,7 +311,7 @@ class PurchaseOrder(models.Model): self.fiscal_position_id = fpos.id self.payment_term_id = payment_term.id, self.company_id = requisition.company_id.id - self.currency_id = currency.id + self.currency_id = requisition.currency_id.id self.origin = requisition.name self.partner_ref = requisition.name # to control vendor bill based on agreement reference self.notes = requisition.description @@ -349,10 +350,6 @@ class PurchaseOrder(models.Model): if requisition.type_id.quantity_copy != 'copy': product_qty = 0 - # Compute price_unit in appropriate currency - if requisition.company_id.currency_id != currency: - price_unit = requisition.company_id.currency_id.compute(price_unit, currency) - # Create PO line order_line_values = line._prepare_purchase_order_line( name=name, product_qty=product_qty, price_unit=price_unit, @@ -434,4 +431,6 @@ class ProcurementRule(models.Model): res = super(ProcurementRule, self)._prepare_purchase_order(product_id, product_qty, product_uom, origin, values, partner) res['partner_ref'] = values['supplier'].purchase_requisition_id.name res['requisition_id'] = values['supplier'].purchase_requisition_id.id + if values['supplier'].purchase_requisition_id.currency_id: + res['currency_id'] = values['supplier'].purchase_requisition_id.currency_id.id return res diff --git a/addons/purchase_requisition/tests/test_purchase_requisition.py b/addons/purchase_requisition/tests/test_purchase_requisition.py index 54530a96fc0..dfa381b5caa 100644 --- a/addons/purchase_requisition/tests/test_purchase_requisition.py +++ b/addons/purchase_requisition/tests/test_purchase_requisition.py @@ -15,6 +15,7 @@ class TestPurchaseRequisition(common.TransactionCase): self.product_13_id = self.ref('product.product_product_13') self.res_partner_1_id = self.ref('base.res_partner_1') self.res_company_id = self.ref('base.main_company') + self.env.user.company_id.currency_id = self.env.ref("base.USD").id self.ResUser = self.env['res.users'] # Create a user as 'Purchase Requisition Manager' @@ -174,6 +175,7 @@ class TestPurchaseRequisition(common.TransactionCase): 'line_ids': [line1], 'type_id': requisition_type.id, 'vendor_id': vendor1.id, + 'currency_id': self.env.ref("base.USD").id, }) requisition_blanket.action_in_progress() diff --git a/addons/purchase_requisition/views/purchase_requisition_views.xml b/addons/purchase_requisition/views/purchase_requisition_views.xml index a591dd9f1ce..907dca3fe04 100644 --- a/addons/purchase_requisition/views/purchase_requisition_views.xml +++ b/addons/purchase_requisition/views/purchase_requisition_views.xml @@ -172,6 +172,7 @@ +