purchase_packaging : po from procurement

When Purchase Order are created from procurement take account of seller configuration.
This commit is contained in:
Laetitia Gangloff
2015-08-03 13:02:48 +02:00
committed by Thomas Binsfeld
parent ca4e313d38
commit 3d6708202e
2 changed files with 289 additions and 9 deletions

View File

@@ -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

View File

@@ -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')