[FIX] sale,account,purchase_requisition: multi-company

Use correct company to get fiscal positions and properties

Ensure company used to fetch fiscal positions is always the correct one
when coming from a company restricted model (company_id required, or
related.required).

purchase: get_fiscal_position doesn't consider company_id ctxt key

others: properties were accessed with potentially the wrong company.
This commit is contained in:
Victor Feyens
2019-10-24 17:12:16 +00:00
parent f0d5c0b32d
commit 9639283a81
6 changed files with 18 additions and 9 deletions
+1 -1
View File
@@ -316,7 +316,7 @@ class AccountMove(models.Model):
# Find the new fiscal position.
delivery_partner_id = self._get_invoice_delivery_partner_id()
new_fiscal_position_id = self.env['account.fiscal.position'].get_fiscal_position(
new_fiscal_position_id = self.env['account.fiscal.position'].with_context(force_company=self.company_id.id).get_fiscal_position(
self.partner_id.id, delivery_id=delivery_partner_id)
self.fiscal_position_id = self.env['account.fiscal.position'].browse(new_fiscal_position_id)
self._recompute_dynamic_lines()
+6 -2
View File
@@ -198,12 +198,16 @@ class PurchaseOrder(models.Model):
@api.onchange('partner_id', 'company_id')
def onchange_partner_id(self):
# Ensures all properties and fiscal positions
# are taken with the company of the order
# if not defined, force_company doesn't change anything.
self = self.with_context(force_company=self.company_id.id)
if not self.partner_id:
self.fiscal_position_id = False
self.payment_term_id = False
self.currency_id = self.env.company.currency_id.id
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.fiscal_position_id = self.env['account.fiscal.position'].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.company.currency_id.id
return {}
@@ -514,7 +518,7 @@ class PurchaseOrderLine(models.Model):
def _compute_tax_id(self):
for line in self:
fpos = line.order_id.fiscal_position_id or line.order_id.partner_id.property_account_position_id
fpos = line.order_id.fiscal_position_id or line.order_id.partner_id.with_context(force_company=line.company_id.id).property_account_position_id
# If company_id is set, always filter taxes by the company
taxes = line.product_id.supplier_taxes_id.filtered(lambda r: not line.company_id or r.company_id == line.company_id)
line.taxes_id = fpos.map_tax(taxes, line.product_id, line.order_id.partner_id) if fpos else taxes
@@ -23,7 +23,7 @@ class PurchaseOrder(models.Model):
payment_term = partner.property_supplier_payment_term_id
FiscalPosition = self.env['account.fiscal.position']
fpos = FiscalPosition.get_fiscal_position(partner.id)
fpos = FiscalPosition.with_context(force_company=self.company_id.id).get_fiscal_position(partner.id)
fpos = FiscalPosition.browse(fpos)
self.partner_id = partner.id
+1 -1
View File
@@ -29,7 +29,7 @@ class AccountMove(models.Model):
Trigger the change of fiscal position when the shipping address is modified.
"""
delivery_partner_id = self._get_invoice_delivery_partner_id()
fiscal_position = self.env['account.fiscal.position'].get_fiscal_position(
fiscal_position = self.env['account.fiscal.position'].with_context(force_company=self.company_id.id).get_fiscal_position(
self.partner_id.id, delivery_id=delivery_partner_id)
if fiscal_position:
+4 -1
View File
@@ -318,7 +318,10 @@ class SaleOrder(models.Model):
"""
Trigger the change of fiscal position when the shipping address is modified.
"""
self.fiscal_position_id = self.env['account.fiscal.position'].get_fiscal_position(self.partner_id.id, self.partner_shipping_id.id)
self.fiscal_position_id = self.env['account.fiscal.position'].with_context(
force_company=self.company_id.id).get_fiscal_position(
self.partner_id.id,
self.partner_shipping_id.id)
return {}
@api.onchange('partner_id')
+5 -3
View File
@@ -176,7 +176,7 @@ class SaleOrderLine(models.Model):
"""
self.ensure_one()
partner_supplier = supplierinfo.name
fiscal_position_id = self.env['account.fiscal.position'].sudo().with_context(company_id=self.company_id.id).get_fiscal_position(partner_supplier.id)
fiscal_position_id = self.env['account.fiscal.position'].sudo().get_fiscal_position(partner_supplier.id)
date_order = self._purchase_get_date_order(supplierinfo)
return {
'partner_id': partner_supplier.id,
@@ -255,7 +255,9 @@ class SaleOrderLine(models.Model):
supplier_po_map = {}
sale_line_purchase_map = {}
for line in self:
line = line.with_context(force_company=line.company_id.id)
# determine vendor of the order (take the first matching company and product)
# VFE fixme why isn't the _select_seller function used ???
suppliers = line.product_id.seller_ids.filtered(lambda vendor: (not vendor.company_id or vendor.company_id == line.company_id) and (not vendor.product_id or vendor.product_id == line.product_id))
if not suppliers:
raise UserError(_("There is no vendor associated to the product %s. Please define a vendor for this product.") % (line.product_id.display_name,))
@@ -287,10 +289,10 @@ class SaleOrderLine(models.Model):
# add a PO line to the PO
values = line._purchase_service_prepare_line_values(purchase_order, quantity=quantity)
purchase_line = self.env['purchase.order.line'].create(values)
purchase_line = line.env['purchase.order.line'].create(values)
# link the generated purchase to the SO line
sale_line_purchase_map.setdefault(line, self.env['purchase.order.line'])
sale_line_purchase_map.setdefault(line, line.env['purchase.order.line'])
sale_line_purchase_map[line] |= purchase_line
return sale_line_purchase_map