diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 2985406e5c2..b7e4e240fe2 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -553,26 +553,40 @@ class PurchaseOrderLine(models.Model): :rtype: dict :return: name, seller quantity, seller price, date planned """ - # Switch quantity in uom_id - quantity_uom_id = quantity - if quantity_uom_id and product_id.uom_id != product_uom: - quantity_uom_id = product_uom._compute_qty_obj(product_uom, quantity_uom_id, product_id.uom_id) + # This is useful in case partner is not registered supplier + if not product_id or not partner_id or not product_uom or not currency_id: + return { + 'name': False, + 'quantity': 0.0, + 'price_unit': 0.0, + 'date_planned': False, + } + + # The first browse is used to know the uom_id and the currency_id for the given vendor + product = product_id.with_context({'partner_id': partner_id.id}) + seller_currency_id = product.selected_seller_id.currency_id if product.selected_seller_id else partner_id.currency_id + seller_product_uom = product.selected_seller_id.product_uom if product.selected_seller_id else product_id.uom_id + + # Switch quantity to uom_id + quantity_seller_uom_id = quantity + if quantity_seller_uom_id and seller_product_uom != product_uom: + quantity_seller_uom_id = product_uom._compute_qty_obj(product_uom, quantity_seller_uom_id, seller_product_uom) product = product_id.with_context({ 'lang': partner_id.lang, 'partner_id': partner_id.id, 'date': date, - 'quantity': quantity_uom_id, + 'quantity': quantity_seller_uom_id, }) # Switch quantity back in product_uom - quantity = max(quantity_uom_id, product.seller_qty) - if quantity and product_id.uom_id != product_uom: - quantity = product_id.uom_id._compute_qty_obj(product_id.uom_id, quantity, product_uom) + quantity = max(quantity_seller_uom_id, product.seller_qty) + if quantity and seller_product_uom != product_uom: + quantity = seller_product_uom._compute_qty_obj(seller_product_uom, quantity, product_uom) price_unit = product.seller_price - if price_unit and partner_id.currency_id != currency_id: - price_unit = partner_id.currency_id.compute(price_unit, currency_id) + if price_unit and seller_currency_id != currency_id: + price_unit = seller_currency_id.compute(price_unit, currency_id) date_planned = self._get_date_planned(product, po=order_id).strftime(DEFAULT_SERVER_DATETIME_FORMAT) diff --git a/addons/purchase/test/average_price.yml b/addons/purchase/test/average_price.yml index 3d34e17aeff..32e2cb9760b 100644 --- a/addons/purchase/test/average_price.yml +++ b/addons/purchase/test/average_price.yml @@ -24,6 +24,7 @@ product_uom: product.product_uom_kgm price_unit: 60.0 name: 'Average Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order - @@ -58,6 +59,7 @@ product_uom: product.product_uom_kgm price_unit: 80.0 name: 'Average Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the second purchase order - @@ -112,6 +114,7 @@ product_uom: product.product_uom_gram price_unit: 0.2 name: 'Average Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order - diff --git a/addons/purchase/test/fifo_price.yml b/addons/purchase/test/fifo_price.yml index 2458a805862..a435ac65ab0 100644 --- a/addons/purchase/test/fifo_price.yml +++ b/addons/purchase/test/fifo_price.yml @@ -32,6 +32,7 @@ product_uom: product.product_uom_kgm price_unit: 50.0 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order - @@ -64,6 +65,7 @@ product_uom: product.product_uom_kgm price_unit: 80.0 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the second purchase order - @@ -166,10 +168,13 @@ product_uom: product.product_uom_gram price_unit: 0.150 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - product_id: product_fifo_icecream product_qty: 10.0 product_uom: product.product_uom_kgm price_unit: 150.0 + name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the purchase order in USD - @@ -326,6 +331,7 @@ product_uom: product.product_uom_kgm price_unit: 50.0 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order - @@ -354,6 +360,7 @@ product_uom: product.product_uom_kgm price_unit: 80 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the second negative purchase order - diff --git a/addons/purchase/test/fifo_returns.yml b/addons/purchase/test/fifo_returns.yml index 11289188f53..e5fa0ce9de2 100644 --- a/addons/purchase/test/fifo_returns.yml +++ b/addons/purchase/test/fifo_returns.yml @@ -25,6 +25,7 @@ product_uom: product.product_uom_kgm price_unit: 50.0 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I create a draft Purchase Order for second shipment for 30 kg at 80 euro - @@ -36,6 +37,7 @@ product_uom: product.product_uom_kgm price_unit: 80.0 name: 'FIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order - diff --git a/addons/stock_dropshipping/test/lifo_price.yml b/addons/stock_dropshipping/test/lifo_price.yml index ffcf2979bef..b3945d77d79 100644 --- a/addons/stock_dropshipping/test/lifo_price.yml +++ b/addons/stock_dropshipping/test/lifo_price.yml @@ -38,6 +38,7 @@ product_uom: product.product_uom_kgm price_unit: 60.0 name: 'LIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I create a draft Purchase Order for second shipment for 30 pieces at 80 euro - @@ -49,6 +50,7 @@ product_uom: product.product_uom_kgm price_unit: 80.0 name: 'LIFO Ice Cream' + date_planned: !eval time.strftime('%Y-%m-%d') - I confirm the first purchase order -