mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
purchase_packaging : po from procurement
When Purchase Order are created from procurement take account of seller configuration.
This commit is contained in:
committed by
Thomas Binsfeld
parent
ca4e313d38
commit
3d6708202e
@@ -59,7 +59,8 @@ class PurchaseOrderLine(models.Model):
|
||||
'product.uom', 'Purchase Unit of Measure', required=True,
|
||||
default=_default_product_purchase_uom_id)
|
||||
product_qty = fields.Float(
|
||||
compute="_compute_product_qty", string='Quantity')
|
||||
compute="_compute_product_qty", string='Quantity',
|
||||
inverse='_inverse_product_qty',)
|
||||
|
||||
@api.one
|
||||
@api.depends('product_purchase_uom_id', 'product_purchase_qty')
|
||||
@@ -76,6 +77,28 @@ class PurchaseOrderLine(models.Model):
|
||||
self.product_purchase_qty,
|
||||
to_uom.id)
|
||||
|
||||
@api.one
|
||||
def _inverse_product_qty(self):
|
||||
""" If product_quantity is set compute the purchase_qty
|
||||
"""
|
||||
if self.product_id and self.order_id.partner_id:
|
||||
for supplier in self.product_id.seller_ids:
|
||||
if (supplier.name.id == self.order_id.partner_id.id):
|
||||
product_purchase_uom = supplier.min_qty_uom_id
|
||||
uom_obj = self.env['product.uom']
|
||||
from_uom = uom_obj.search(
|
||||
[('category_id', '=',
|
||||
product_purchase_uom.category_id.id),
|
||||
('uom_type', '=', 'reference')], limit=1)
|
||||
self.product_purchase_qty = uom_obj._compute_qty(
|
||||
from_uom.id,
|
||||
self.product_qty,
|
||||
product_purchase_uom.id,)
|
||||
self.product_purchase_uom_id = product_purchase_uom.id
|
||||
break
|
||||
else:
|
||||
self.product_purchase_qty = self.product_qty
|
||||
|
||||
@api.onchange("packaging_id")
|
||||
def _onchange_packaging_id(self):
|
||||
if self.packaging_id:
|
||||
@@ -94,6 +117,7 @@ class PurchaseOrderLine(models.Model):
|
||||
product_product = self.pool['product.product']
|
||||
product_purchase_qty = 0
|
||||
product_purchase_uom_id = False
|
||||
category_product_purchase_uom_id = False
|
||||
packaging_id = False
|
||||
new_uom_id = False
|
||||
domain = {}
|
||||
@@ -111,6 +135,8 @@ class PurchaseOrderLine(models.Model):
|
||||
if first:
|
||||
product_purchase_qty = supplier.min_qty
|
||||
product_purchase_uom_id = supplier.min_qty_uom_id.id
|
||||
category_product_purchase_uom_id = \
|
||||
supplier.min_qty_uom_id.category_id.id
|
||||
new_uom_id = supplier.product_uom.id
|
||||
if supplier.packaging_id:
|
||||
packaging_id = supplier.packaging_id.id
|
||||
@@ -129,6 +155,14 @@ class PurchaseOrderLine(models.Model):
|
||||
if not qty:
|
||||
res['value']['product_purchase_qty'] = product_purchase_qty
|
||||
res['value']['product_purchase_uom_id'] = product_purchase_uom_id
|
||||
uom_obj = self.pool['product.uom']
|
||||
to_uom_id = uom_obj.search(
|
||||
cr, uid,
|
||||
[('category_id', '=', category_product_purchase_uom_id),
|
||||
('uom_type', '=', 'reference')], limit=1, context=context)[0]
|
||||
res['value']['product_qty'] = uom_obj._compute_qty(
|
||||
cr, uid, product_purchase_uom_id,
|
||||
product_purchase_qty, to_uom_id)
|
||||
res['value']['packaging_id'] = packaging_id
|
||||
if domain:
|
||||
if res.get('domain'):
|
||||
@@ -155,3 +189,32 @@ class PurchaseOrderLine(models.Model):
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
return super(PurchaseOrderLine, self).write(self.update_vals(vals))
|
||||
|
||||
|
||||
class ProcurementOrder(models.Model):
|
||||
_inherit = 'procurement.order'
|
||||
|
||||
@api.model
|
||||
def _get_po_line_values_from_proc(self, procurement, partner, company,
|
||||
schedule_date):
|
||||
""" add packaging and update product_uom/quantity if necessary
|
||||
"""
|
||||
res = super(ProcurementOrder, self)._get_po_line_values_from_proc(
|
||||
procurement, partner, company, schedule_date)
|
||||
|
||||
uom_obj = self.env['product.uom']
|
||||
|
||||
for supplier in procurement.product_id.seller_ids:
|
||||
if (supplier.name.id == partner.id):
|
||||
if supplier.packaging_id:
|
||||
res['packaging_id'] = supplier.packaging_id.id
|
||||
new_uom_id = supplier.product_uom.id
|
||||
if new_uom_id != res['product_uom']:
|
||||
res['product_uom'] = new_uom_id
|
||||
qty = uom_obj._compute_qty(procurement.product_uom.id,
|
||||
procurement.product_qty,
|
||||
new_uom_id)
|
||||
res['product_qty'] = max(qty, supplier.qty)
|
||||
break
|
||||
|
||||
return res
|
||||
|
||||
@@ -34,6 +34,13 @@ class TestPackaging(common.TransactionCase):
|
||||
).product_tmpl_id.id,
|
||||
'uom_id': self.env.ref('product.product_uom_dozen').id})
|
||||
self.sp_30 = self.env.ref('product.product_supplierinfo_30')
|
||||
self.product_uom_8 = self.env['product.uom'].create(
|
||||
{'category_id': self.env.ref('product.product_uom_categ_unit').id,
|
||||
'name': 'COL8',
|
||||
'factor_inv': 8,
|
||||
'uom_type': 'bigger',
|
||||
'rounding': 1.0,
|
||||
})
|
||||
|
||||
def test_supplierinfo_product_uom(self):
|
||||
""" Check product_uom of product_supplierinfo_30 is product_uom_unit
|
||||
@@ -61,13 +68,7 @@ class TestPackaging(common.TransactionCase):
|
||||
Check stock move product_uom is product_uom_dozen
|
||||
Check stock move product_qty is 16
|
||||
"""
|
||||
product_uom_8 = self.env['product.uom'].create(
|
||||
{'category_id': self.env.ref('product.product_uom_categ_unit').id,
|
||||
'name': 'COL8',
|
||||
'factor_inv': 8,
|
||||
'uom_type': 'bigger'
|
||||
})
|
||||
self.sp_30.min_qty_uom_id = product_uom_8
|
||||
self.sp_30.min_qty_uom_id = self.product_uom_8
|
||||
self.sp_30.min_qty = 2
|
||||
self.sp_30.packaging_id = self.product_packaging_34
|
||||
|
||||
@@ -89,7 +90,8 @@ class TestPackaging(common.TransactionCase):
|
||||
po_line = self.env['purchase.order.line'].create(vals['value'])
|
||||
self.assertEqual(po_line.packaging_id.id,
|
||||
self.product_packaging_34.id)
|
||||
self.assertEqual(po_line.product_purchase_uom_id.id, product_uom_8.id)
|
||||
self.assertEqual(po_line.product_purchase_uom_id.id,
|
||||
self.product_uom_8.id)
|
||||
self.assertAlmostEqual(po_line.product_purchase_qty, 2)
|
||||
self.assertAlmostEqual(po_line.product_qty, 16)
|
||||
self.assertAlmostEqual(po_line.price_unit, 456)
|
||||
@@ -102,3 +104,218 @@ class TestPackaging(common.TransactionCase):
|
||||
self.assertEqual(sm.product_uom.id,
|
||||
self.env.ref('product.product_uom_dozen').id)
|
||||
self.assertAlmostEqual(sm.product_uom_qty, 16)
|
||||
|
||||
def test_procurement(self):
|
||||
""" On supplierinfo set min_qty as 0
|
||||
Create procurement line with rule buy and quantity 17
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_unit
|
||||
Check product_purchase_qty is 17
|
||||
Check product_qty is 17
|
||||
Check packaging_id is False
|
||||
Check product_uom is product_uom_unit
|
||||
Confirm Purchase Order to avoid group
|
||||
Create procurement line with rule buy and quantity 1 dozen
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_unit
|
||||
Check product_purchase_qty is 12
|
||||
Check product_qty is 12
|
||||
Check packaging_id is False
|
||||
Check product_uom is product_uom_unit
|
||||
Confirm Purchase Order to avoid group
|
||||
On supplierinfo set product_uom_8 as min_qty_uom_id
|
||||
Create procurement line with rule buy and quantity 17
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_8
|
||||
Check product_purchase_qty is 3
|
||||
Check product_qty is 8*3 = 24
|
||||
Check packaging_id is False
|
||||
Check product_uom is product_uom_unit
|
||||
Confirm Purchase Order to avoid group
|
||||
Create procurement line with rule buy and quantity 1 dozen
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_8
|
||||
Check product_purchase_qty is 2
|
||||
Check product_qty is 8*2 = 16
|
||||
Check packaging_id is False
|
||||
Check product_uom is product_uom_unit
|
||||
Confirm Purchase Order to avoid group
|
||||
On supplierinfo set packaging product_packaging_34 (dozen)
|
||||
Create procurement line with rule buy and quantity 17
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_8
|
||||
Check product_purchase_qty is 1
|
||||
Check product_qty is 8*1 = 8
|
||||
Check packaging_id is product_packaging_34
|
||||
Check product_uom is product_uom_dozen
|
||||
Confirm Purchase Order to avoid group
|
||||
Create procurement line with rule buy and quantity 1 dozen
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_8
|
||||
Check product_purchase_qty is 1
|
||||
Check product_qty is 8*1 = 8
|
||||
Check packaging_id is product_packaging_34
|
||||
Check product_uom is product_uom_dozen
|
||||
Confirm Purchase Order to avoid group
|
||||
On supplierinfo set product_uom_unit as min_qty_uom_id
|
||||
Create procurement line with rule buy and quantity 17
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_unit
|
||||
Check product_purchase_qty is 2
|
||||
Check product_qty is 2
|
||||
Check packaging_id is product_packaging_34
|
||||
Check product_uom is product_uom_dozen
|
||||
Confirm Purchase Order to avoid group
|
||||
Create procurement line with rule buy and quantity 1 dozen
|
||||
run procurement
|
||||
Check product_purchase_uom_id is product_uom_unit
|
||||
Check product_purchase_qty is 1
|
||||
Check product_qty is 1
|
||||
Check packaging_id is product_packaging_34
|
||||
Check product_uom is product_uom_dozen
|
||||
Confirm Purchase Order to avoid group
|
||||
"""
|
||||
self.env.ref('product.product_product_34').route_ids = [(
|
||||
4, self.env.ref("purchase.route_warehouse0_buy").id)]
|
||||
self.env.ref('product.product_uom_unit').rounding = 1
|
||||
procurement_obj = self.env['procurement.order']
|
||||
|
||||
self.sp_30.min_qty = 0
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 17,
|
||||
'product_uom': self.env.ref('product.product_uom_unit').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(17, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(17, proc1.purchase_line_id.product_qty)
|
||||
self.assertFalse(proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 1,
|
||||
'product_uom': self.env.ref('product.product_uom_dozen').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(12, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(12, proc1.purchase_line_id.product_qty)
|
||||
self.assertFalse(proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
self.sp_30.min_qty_uom_id = self.product_uom_8
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 17,
|
||||
'product_uom': self.env.ref('product.product_uom_unit').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.product_uom_8,
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(3, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(24, proc1.purchase_line_id.product_qty)
|
||||
self.assertFalse(proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 1,
|
||||
'product_uom': self.env.ref('product.product_uom_dozen').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.product_uom_8,
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(2, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(16, proc1.purchase_line_id.product_qty)
|
||||
self.assertFalse(proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
self.sp_30.packaging_id = self.product_packaging_34
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 17,
|
||||
'product_uom': self.env.ref('product.product_uom_unit').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.product_uom_8,
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(1, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(8, proc1.purchase_line_id.product_qty)
|
||||
self.assertEqual(self.product_packaging_34,
|
||||
proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_dozen'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 1,
|
||||
'product_uom': self.env.ref('product.product_uom_dozen').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.product_uom_8,
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(1, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(8, proc1.purchase_line_id.product_qty)
|
||||
self.assertEqual(self.product_packaging_34,
|
||||
proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_dozen'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
self.sp_30.min_qty_uom_id = self.env.ref('product.product_uom_unit')
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 17,
|
||||
'product_uom': self.env.ref('product.product_uom_unit').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(2, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(2, proc1.purchase_line_id.product_qty)
|
||||
self.assertEqual(self.product_packaging_34,
|
||||
proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_dozen'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
proc1 = procurement_obj.create(
|
||||
{'name': 'test_procurement',
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.env.ref('product.product_product_34').id,
|
||||
'product_qty': 1,
|
||||
'product_uom': self.env.ref('product.product_uom_dozen').id})
|
||||
procurement_obj.run_scheduler()
|
||||
self.assertEqual(self.env.ref('product.product_uom_unit'),
|
||||
proc1.purchase_line_id.product_purchase_uom_id)
|
||||
self.assertEqual(1, proc1.purchase_line_id.product_purchase_qty)
|
||||
self.assertEqual(1, proc1.purchase_line_id.product_qty)
|
||||
self.assertEqual(self.product_packaging_34,
|
||||
proc1.purchase_line_id.packaging_id)
|
||||
self.assertEqual(self.env.ref('product.product_uom_dozen'),
|
||||
proc1.purchase_line_id.product_uom)
|
||||
proc1.purchase_id.signal_workflow('purchase_confirm')
|
||||
|
||||
Reference in New Issue
Block a user