From 063a7a8396d08e4795ecc55b28a6cd3c39f14274 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 18 May 2018 10:33:22 +0200 Subject: [PATCH 01/40] [11.0] Add purchase_line_procurement_group --- purchase_line_procurement_group/README.rst | 57 +++++++++++++ purchase_line_procurement_group/__init__.py | 1 + .../__manifest__.py | 17 ++++ .../models/__init__.py | 2 + .../models/procurement.py | 19 +++++ .../models/purchase.py | 18 ++++ .../tests/__init__.py | 1 + .../tests/test_po_line_proc_group.py | 85 +++++++++++++++++++ .../views/purchase.xml | 16 ++++ 9 files changed, 216 insertions(+) create mode 100644 purchase_line_procurement_group/README.rst create mode 100644 purchase_line_procurement_group/__init__.py create mode 100644 purchase_line_procurement_group/__manifest__.py create mode 100644 purchase_line_procurement_group/models/__init__.py create mode 100644 purchase_line_procurement_group/models/procurement.py create mode 100644 purchase_line_procurement_group/models/purchase.py create mode 100644 purchase_line_procurement_group/tests/__init__.py create mode 100644 purchase_line_procurement_group/tests/test_po_line_proc_group.py create mode 100644 purchase_line_procurement_group/views/purchase.xml diff --git a/purchase_line_procurement_group/README.rst b/purchase_line_procurement_group/README.rst new file mode 100644 index 00000000000..563c278c359 --- /dev/null +++ b/purchase_line_procurement_group/README.rst @@ -0,0 +1,57 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +=============================== +Purchase Line Procurement Group +=============================== + +This module changes the way procurements generate purchase order lines. +If some procurements are run for the same products and locations, but have +different procurement groups, these won't be merged in the same purchase order +line and will instead generate a purchase order line per procurement group. + +Usage +===== + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/167/11.0 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Akim Juillerat + +Do not contact contributors directly about support or help with technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/purchase_line_procurement_group/__init__.py b/purchase_line_procurement_group/__init__.py new file mode 100644 index 00000000000..9a7e03eded3 --- /dev/null +++ b/purchase_line_procurement_group/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/purchase_line_procurement_group/__manifest__.py b/purchase_line_procurement_group/__manifest__.py new file mode 100644 index 00000000000..1d4102a94bc --- /dev/null +++ b/purchase_line_procurement_group/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2018 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Purchase Line Procurement Group", + "summary": "Group purchase order line according to procurement group", + "version": "11.0.1.0.0", + "category": "Purchase", + "website": "https://github.com/OCA/purchase-workflow", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": [ + "purchase", + ], + "data": [ + "views/purchase.xml", + ], +} diff --git a/purchase_line_procurement_group/models/__init__.py b/purchase_line_procurement_group/models/__init__.py new file mode 100644 index 00000000000..c7c42158341 --- /dev/null +++ b/purchase_line_procurement_group/models/__init__.py @@ -0,0 +1,2 @@ +from . import procurement +from . import purchase diff --git a/purchase_line_procurement_group/models/procurement.py b/purchase_line_procurement_group/models/procurement.py new file mode 100644 index 00000000000..c8f49de76e4 --- /dev/null +++ b/purchase_line_procurement_group/models/procurement.py @@ -0,0 +1,19 @@ +# Copyright 2018 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, api + + +class ProcurementRule(models.Model): + + _inherit = 'procurement.rule' + + @api.multi + def _prepare_purchase_order_line(self, product_id, product_qty, + product_uom, values, po, supplier): + """Add procurement group to values""" + res = super()._prepare_purchase_order_line( + product_id, product_qty, product_uom, values, po, supplier) + procurement_group = values.get('group_id') + if procurement_group: + res['procurement_group_id'] = procurement_group.id + return res diff --git a/purchase_line_procurement_group/models/purchase.py b/purchase_line_procurement_group/models/purchase.py new file mode 100644 index 00000000000..ef3c9577a00 --- /dev/null +++ b/purchase_line_procurement_group/models/purchase.py @@ -0,0 +1,18 @@ +# Copyright 2018 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, fields + + +class PurchaseOrderLine(models.Model): + + _inherit = 'purchase.order.line' + + procurement_group_id = fields.Many2one('procurement.group') + + def _merge_in_existing_line(self, product_id, product_qty, product_uom, + location_id, name, origin, values): + """Do no merge PO lines if procurement group is different.""" + if values.get('group_id') != self.procurement_group_id: + return False + super()._merge_in_existing_line(product_id, product_qty, product_uom, + location_id, name, origin, values) diff --git a/purchase_line_procurement_group/tests/__init__.py b/purchase_line_procurement_group/tests/__init__.py new file mode 100644 index 00000000000..268993b79ea --- /dev/null +++ b/purchase_line_procurement_group/tests/__init__.py @@ -0,0 +1 @@ +from . import test_po_line_proc_group diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py new file mode 100644 index 00000000000..7f7917a8316 --- /dev/null +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -0,0 +1,85 @@ +# Copyright 2018 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests import SavepointCase + + +class TestPOLineProcurementGroup(SavepointCase): + + @classmethod + def setUpClass(cls): + + super().setUpClass() + + def _create_orderpoint(product, qty_min, qty_max, location): + orderpoint_model = cls.env['stock.warehouse.orderpoint'] + return orderpoint_model.create({ + 'name': 'OP/%s' % product.name, + 'product_id': product.id, + 'product_min_qty': qty_min, + 'product_max_qty': qty_max, + 'location_id': location.id + }) + + # Create supplier + cls.pyromaniacs = cls.env['res.partner'].with_context( + tracking_disable=True).create({ + 'name': 'Pyromaniacs Inc', + 'company_type': 'company' + }) + cls.lighter = cls.env['product.template'].with_context( + tracking_disable=True).create({ + 'name': 'Lighter', + 'type': 'product', + 'purchase_ok': True, + 'seller_ids': [(0, 0, { + 'name': cls.pyromaniacs.id, + 'min_qty': 1, + 'price': 1.0, + })], + }).product_variant_ids + + warehouse = cls.env.ref('stock.warehouse0') + warehouse.write({'reception_steps': 'three_steps'}) + wh2 = cls.env['stock.warehouse'].create({ + 'name': 'WH2', + 'code': 'WH2', + 'partner_id': False + }) + # Create WH > WH2 PG and route + cls.wh_wh2_pg = cls.env['procurement.group'].create({ + 'name': 'WH > WH2', + 'move_type': 'direct' + }) + wh_wh2_route = cls.env['stock.location.route'].create({ + 'name': 'WH > WH2', + 'product_selectable': True, + 'pull_ids': [(0, 0, { + 'name': 'WH>WH2', + 'action': 'move', + 'location_id': wh2.lot_stock_id.id, + 'location_src_id': warehouse.lot_stock_id.id, + 'procure_method': 'make_to_order', + 'picking_type_id': cls.env.ref( + 'stock.picking_type_internal').id, + 'group_propagation_option': 'fixed', + 'group_id': cls.wh_wh2_pg.id, + 'propagate': True + })] + }) + cls.lighter.write({ + 'route_ids': [(4, wh_wh2_route.id)] + }) + _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) + _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) + + def test_po_line_proc_group(self): + self.env['procurement.group'].run_scheduler() + po = self.env['purchase.order'].search([ + ('partner_id', '=', self.pyromaniacs.id)]) + self.assertEqual(len(po.order_line), 2) + for line in po.order_line: + self.assertEqual(line.product_id, self.lighter) + if line.procurement_group_id == self.wh_wh2_pg: + self.assertAlmostEqual(line.product_qty, 20) + else: + self.assertAlmostEqual(line.product_qty, 30) diff --git a/purchase_line_procurement_group/views/purchase.xml b/purchase_line_procurement_group/views/purchase.xml new file mode 100644 index 00000000000..cca3286b89a --- /dev/null +++ b/purchase_line_procurement_group/views/purchase.xml @@ -0,0 +1,16 @@ + + + + purchase.order.form.inherit + purchase.order + + + + + + + + + + + From 4533a01014daf7b03bb487a174a1e4fbd88da12d Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 22 May 2018 14:54:33 +0200 Subject: [PATCH 02/40] Switch orderpoints creation --- .../tests/test_po_line_proc_group.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 7f7917a8316..9ee140358ea 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -69,8 +69,8 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.lighter.write({ 'route_ids': [(4, wh_wh2_route.id)] }) - _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) + _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) def test_po_line_proc_group(self): self.env['procurement.group'].run_scheduler() From 4e8e39651b7b742da49d6e55ff2a27f582a60236 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 22 May 2018 15:15:00 +0200 Subject: [PATCH 03/40] Use bigger orderpoints --- .../tests/test_po_line_proc_group.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 9ee140358ea..f5cb310a549 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -69,8 +69,8 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.lighter.write({ 'route_ids': [(4, wh_wh2_route.id)] }) + _create_orderpoint(cls.lighter, 40, 80, warehouse.lot_stock_id) _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) - _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) def test_po_line_proc_group(self): self.env['procurement.group'].run_scheduler() @@ -82,4 +82,4 @@ def test_po_line_proc_group(self): if line.procurement_group_id == self.wh_wh2_pg: self.assertAlmostEqual(line.product_qty, 20) else: - self.assertAlmostEqual(line.product_qty, 30) + self.assertAlmostEqual(line.product_qty, 80) From aa49b9ddb4f5246083c2e07ed8bf92f37857ec5c Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 16:55:14 +0200 Subject: [PATCH 04/40] Revert "Use bigger orderpoints" This reverts commit aa4bd6c277fc004621c5fd34c6ffb12548afbcd8. --- .../tests/test_po_line_proc_group.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index f5cb310a549..9ee140358ea 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -69,8 +69,8 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.lighter.write({ 'route_ids': [(4, wh_wh2_route.id)] }) - _create_orderpoint(cls.lighter, 40, 80, warehouse.lot_stock_id) _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) + _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) def test_po_line_proc_group(self): self.env['procurement.group'].run_scheduler() @@ -82,4 +82,4 @@ def test_po_line_proc_group(self): if line.procurement_group_id == self.wh_wh2_pg: self.assertAlmostEqual(line.product_qty, 20) else: - self.assertAlmostEqual(line.product_qty, 80) + self.assertAlmostEqual(line.product_qty, 30) From 2730467b17a71f922b0fcc7306b6c3368b576ac0 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 16:55:23 +0200 Subject: [PATCH 05/40] Revert "Switch orderpoints creation" This reverts commit bd751954367b6ec72b9865da2cb4e3280646ff84. --- .../tests/test_po_line_proc_group.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 9ee140358ea..7f7917a8316 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -69,8 +69,8 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.lighter.write({ 'route_ids': [(4, wh_wh2_route.id)] }) - _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) + _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) def test_po_line_proc_group(self): self.env['procurement.group'].run_scheduler() From 4fe74ef5f8a212b99b1fdb4ab7d9744e3b29976d Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 17:05:29 +0200 Subject: [PATCH 06/40] Force parent computation on stock.location to fix the tests --- .../tests/test_po_line_proc_group.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 7f7917a8316..231b387eff9 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -72,6 +72,10 @@ def _create_orderpoint(product, qty_min, qty_max, location): _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) + # Force parent store computation after creation of WH2 because location + # quantities are computed using parent_left _right in domain + cls.env['stock.location']._parent_store_compute() + def test_po_line_proc_group(self): self.env['procurement.group'].run_scheduler() po = self.env['purchase.order'].search([ From 189bdaf8d748caab8b587f4612fbaff52168eb19 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:05:21 +0200 Subject: [PATCH 07/40] [Fix] Use PO line procurement group on generated stock moves --- purchase_line_procurement_group/models/purchase.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/purchase_line_procurement_group/models/purchase.py b/purchase_line_procurement_group/models/purchase.py index ef3c9577a00..00ab84910bc 100644 --- a/purchase_line_procurement_group/models/purchase.py +++ b/purchase_line_procurement_group/models/purchase.py @@ -1,6 +1,6 @@ # Copyright 2018 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import models, fields, api class PurchaseOrderLine(models.Model): @@ -16,3 +16,10 @@ def _merge_in_existing_line(self, product_id, product_qty, product_uom, return False super()._merge_in_existing_line(product_id, product_qty, product_uom, location_id, name, origin, values) + + @api.multi + def _prepare_stock_moves(self, picking): + res = super()._prepare_stock_moves(picking) + res[0]['group_id'] = ( + self.procurement_group_id.id or self.order_id.group_id.id) + return res From dab8f08834a5647cf01be65e9ee07ba155e2573d Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:05:43 +0200 Subject: [PATCH 08/40] [Fix] Do not merge destination moves with different procurement groups --- purchase_line_procurement_group/models/__init__.py | 1 + .../models/stock_move.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 purchase_line_procurement_group/models/stock_move.py diff --git a/purchase_line_procurement_group/models/__init__.py b/purchase_line_procurement_group/models/__init__.py index c7c42158341..378e4c605cd 100644 --- a/purchase_line_procurement_group/models/__init__.py +++ b/purchase_line_procurement_group/models/__init__.py @@ -1,2 +1,3 @@ from . import procurement from . import purchase +from . import stock_move diff --git a/purchase_line_procurement_group/models/stock_move.py b/purchase_line_procurement_group/models/stock_move.py new file mode 100644 index 00000000000..5641d23c3db --- /dev/null +++ b/purchase_line_procurement_group/models/stock_move.py @@ -0,0 +1,14 @@ +# Copyright 2018 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, api + + +class StockMove(models.Model): + + _inherit = 'stock.move' + + @api.model + def _prepare_merge_moves_distinct_fields(self): + res = super()._prepare_merge_moves_distinct_fields() + res.append('group_id') + return res From 421a4ccb9e8cff0f49cbe6c8922945df50c861dd Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:42:31 +0200 Subject: [PATCH 09/40] Fix missing return --- purchase_line_procurement_group/models/purchase.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/purchase_line_procurement_group/models/purchase.py b/purchase_line_procurement_group/models/purchase.py index 00ab84910bc..f06f0eb6902 100644 --- a/purchase_line_procurement_group/models/purchase.py +++ b/purchase_line_procurement_group/models/purchase.py @@ -14,8 +14,9 @@ def _merge_in_existing_line(self, product_id, product_qty, product_uom, """Do no merge PO lines if procurement group is different.""" if values.get('group_id') != self.procurement_group_id: return False - super()._merge_in_existing_line(product_id, product_qty, product_uom, - location_id, name, origin, values) + return super()._merge_in_existing_line( + product_id, product_qty, product_uom, location_id, name, origin, + values) @api.multi def _prepare_stock_moves(self, picking): From fc8a6a91262ae8200ab1a5668303a2a82e2bb429 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 18:34:46 +0200 Subject: [PATCH 10/40] Add test, bump version, update readme --- purchase_line_procurement_group/README.rst | 3 +++ .../__manifest__.py | 2 +- .../tests/test_po_line_proc_group.py | 22 +++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/purchase_line_procurement_group/README.rst b/purchase_line_procurement_group/README.rst index 563c278c359..7a6d809e2b1 100644 --- a/purchase_line_procurement_group/README.rst +++ b/purchase_line_procurement_group/README.rst @@ -11,6 +11,9 @@ If some procurements are run for the same products and locations, but have different procurement groups, these won't be merged in the same purchase order line and will instead generate a purchase order line per procurement group. +Moreover this module ensures that generated stock move won't be merged together +if they come from purchase order lines with different procurement groups. + Usage ===== diff --git a/purchase_line_procurement_group/__manifest__.py b/purchase_line_procurement_group/__manifest__.py index 1d4102a94bc..f2e42962670 100644 --- a/purchase_line_procurement_group/__manifest__.py +++ b/purchase_line_procurement_group/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Line Procurement Group", "summary": "Group purchase order line according to procurement group", - "version": "11.0.1.0.0", + "version": "11.0.1.1.0", "category": "Purchase", "website": "https://github.com/OCA/purchase-workflow", "author": "Camptocamp, Odoo Community Association (OCA)", diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 231b387eff9..26e5edb61e1 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -38,8 +38,8 @@ def _create_orderpoint(product, qty_min, qty_max, location): })], }).product_variant_ids - warehouse = cls.env.ref('stock.warehouse0') - warehouse.write({'reception_steps': 'three_steps'}) + cls.warehouse = cls.env.ref('stock.warehouse0') + cls.warehouse.write({'reception_steps': 'three_steps'}) wh2 = cls.env['stock.warehouse'].create({ 'name': 'WH2', 'code': 'WH2', @@ -57,7 +57,7 @@ def _create_orderpoint(product, qty_min, qty_max, location): 'name': 'WH>WH2', 'action': 'move', 'location_id': wh2.lot_stock_id.id, - 'location_src_id': warehouse.lot_stock_id.id, + 'location_src_id': cls.warehouse.lot_stock_id.id, 'procure_method': 'make_to_order', 'picking_type_id': cls.env.ref( 'stock.picking_type_internal').id, @@ -69,7 +69,7 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.lighter.write({ 'route_ids': [(4, wh_wh2_route.id)] }) - _create_orderpoint(cls.lighter, 15, 30, warehouse.lot_stock_id) + _create_orderpoint(cls.lighter, 15, 30, cls.warehouse.lot_stock_id) _create_orderpoint(cls.lighter, 10, 20, wh2.lot_stock_id) # Force parent store computation after creation of WH2 because location @@ -77,6 +77,7 @@ def _create_orderpoint(product, qty_min, qty_max, location): cls.env['stock.location']._parent_store_compute() def test_po_line_proc_group(self): + # Ensure PO lines generated by the scheduler have proper PG self.env['procurement.group'].run_scheduler() po = self.env['purchase.order'].search([ ('partner_id', '=', self.pyromaniacs.id)]) @@ -87,3 +88,16 @@ def test_po_line_proc_group(self): self.assertAlmostEqual(line.product_qty, 20) else: self.assertAlmostEqual(line.product_qty, 30) + # Ensure stock moves generated by PO confirmation have proper PG + po.button_confirm() + input_moves = self.env['stock.move'].search([ + ('product_id', '=', self.lighter.id), + ('location_dest_id', '=', self.warehouse.wh_input_stock_loc_id.id) + ]) + self.assertEqual(len(input_moves), 2) + for move in input_moves: + self.assertEqual(move.product_id, self.lighter) + if move.group_id == self.wh_wh2_pg: + self.assertAlmostEqual(move.product_uom_qty, 20.0) + else: + self.assertAlmostEqual(move.product_uom_qty, 30.0) From 4f33acacad3f2a06ae0b3df7aedce743a930f83e Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 23 Jul 2018 14:11:41 +0000 Subject: [PATCH 11/40] [UPD] Update purchase_line_procurement_group.pot --- .../i18n/purchase_line_procurement_group.pot | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot diff --git a/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot b/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot new file mode 100644 index 00000000000..cd246f5a1d7 --- /dev/null +++ b/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_line_procurement_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: purchase_line_procurement_group +#: model:ir.model.fields,field_description:purchase_line_procurement_group.field_purchase_order_line_procurement_group_id +msgid "Procurement Group" +msgstr "" + +#. module: purchase_line_procurement_group +#: model:ir.model,name:purchase_line_procurement_group.model_procurement_rule +msgid "Procurement Rule" +msgstr "" + +#. module: purchase_line_procurement_group +#: model:ir.model,name:purchase_line_procurement_group.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_line_procurement_group +#: model:ir.model,name:purchase_line_procurement_group.model_stock_move +msgid "Stock Move" +msgstr "" + From 2d5d3c2a9feb862947bbc785ba823e340a5d5b77 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:16:11 +0000 Subject: [PATCH 12/40] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 purchase_line_procurement_group/static/description/icon.png diff --git a/purchase_line_procurement_group/static/description/icon.png b/purchase_line_procurement_group/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 02e4c0796d84ce5d1e957b0c77c1a3d0a30f5546 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Tue, 9 Apr 2019 16:06:04 +0700 Subject: [PATCH 13/40] [12.0][MIG] purchase_line_procurement_group --- purchase_line_procurement_group/README.rst | 66 ++- .../__manifest__.py | 4 +- .../models/__init__.py | 2 +- .../models/purchase.py | 2 +- .../models/{procurement.py => stock_rule.py} | 4 +- .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 7 + .../static/description/index.html | 425 ++++++++++++++++++ .../tests/test_po_line_proc_group.py | 4 +- .../views/purchase.xml | 4 +- 10 files changed, 487 insertions(+), 33 deletions(-) rename purchase_line_procurement_group/models/{procurement.py => stock_rule.py} (89%) create mode 100644 purchase_line_procurement_group/readme/CONTRIBUTORS.rst create mode 100644 purchase_line_procurement_group/readme/DESCRIPTION.rst create mode 100644 purchase_line_procurement_group/static/description/index.html diff --git a/purchase_line_procurement_group/README.rst b/purchase_line_procurement_group/README.rst index 7a6d809e2b1..2bf5f1f41a2 100644 --- a/purchase_line_procurement_group/README.rst +++ b/purchase_line_procurement_group/README.rst @@ -1,11 +1,30 @@ -.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png - :target: https://www.gnu.org/licenses/agpl - :alt: License: AGPL-3 - =============================== Purchase Line Procurement Group =============================== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/12.0/purchase_line_procurement_group + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-12-0/purchase-workflow-12-0-purchase_line_procurement_group + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/142/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module changes the way procurements generate purchase order lines. If some procurements are run for the same products and locations, but have different procurement groups, these won't be merged in the same purchase order @@ -14,47 +33,48 @@ line and will instead generate a purchase order line per procurement group. Moreover this module ensures that generated stock move won't be merged together if they come from purchase order lines with different procurement groups. -Usage -===== +**Table of contents** -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/167/11.0 +.. contents:: + :local: Bug Tracker =========== -Bugs are tracked on `GitHub Issues -`_. In case of trouble, please -check there if your issue has already been reported. If you spotted it first, -help us smash it by providing detailed and welcomed feedback. +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* Camptocamp Contributors ------------- +~~~~~~~~~~~~ * Akim Juillerat +* Kitti Upariphutthiphong -Do not contact contributors directly about support or help with technical issues. +Maintainers +~~~~~~~~~~~ -Maintainer ----------- +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_line_procurement_group/__manifest__.py b/purchase_line_procurement_group/__manifest__.py index f2e42962670..21c1bd0a88d 100644 --- a/purchase_line_procurement_group/__manifest__.py +++ b/purchase_line_procurement_group/__manifest__.py @@ -3,13 +3,13 @@ { "name": "Purchase Line Procurement Group", "summary": "Group purchase order line according to procurement group", - "version": "11.0.1.1.0", + "version": "12.0.1.0.0", "category": "Purchase", "website": "https://github.com/OCA/purchase-workflow", "author": "Camptocamp, Odoo Community Association (OCA)", "license": "AGPL-3", "depends": [ - "purchase", + "purchase_stock", ], "data": [ "views/purchase.xml", diff --git a/purchase_line_procurement_group/models/__init__.py b/purchase_line_procurement_group/models/__init__.py index 378e4c605cd..cd358f14d89 100644 --- a/purchase_line_procurement_group/models/__init__.py +++ b/purchase_line_procurement_group/models/__init__.py @@ -1,3 +1,3 @@ -from . import procurement +from . import stock_rule from . import purchase from . import stock_move diff --git a/purchase_line_procurement_group/models/purchase.py b/purchase_line_procurement_group/models/purchase.py index f06f0eb6902..d652ce43278 100644 --- a/purchase_line_procurement_group/models/purchase.py +++ b/purchase_line_procurement_group/models/purchase.py @@ -12,7 +12,7 @@ class PurchaseOrderLine(models.Model): def _merge_in_existing_line(self, product_id, product_qty, product_uom, location_id, name, origin, values): """Do no merge PO lines if procurement group is different.""" - if values.get('group_id') != self.procurement_group_id: + if values.get('group_id') != (self.procurement_group_id or False): return False return super()._merge_in_existing_line( product_id, product_qty, product_uom, location_id, name, origin, diff --git a/purchase_line_procurement_group/models/procurement.py b/purchase_line_procurement_group/models/stock_rule.py similarity index 89% rename from purchase_line_procurement_group/models/procurement.py rename to purchase_line_procurement_group/models/stock_rule.py index c8f49de76e4..26d05597e31 100644 --- a/purchase_line_procurement_group/models/procurement.py +++ b/purchase_line_procurement_group/models/stock_rule.py @@ -3,9 +3,9 @@ from odoo import models, api -class ProcurementRule(models.Model): +class StockRule(models.Model): - _inherit = 'procurement.rule' + _inherit = 'stock.rule' @api.multi def _prepare_purchase_order_line(self, product_id, product_qty, diff --git a/purchase_line_procurement_group/readme/CONTRIBUTORS.rst b/purchase_line_procurement_group/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..026f9c40a3a --- /dev/null +++ b/purchase_line_procurement_group/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Akim Juillerat +* Kitti Upariphutthiphong diff --git a/purchase_line_procurement_group/readme/DESCRIPTION.rst b/purchase_line_procurement_group/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..41769ef8509 --- /dev/null +++ b/purchase_line_procurement_group/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +This module changes the way procurements generate purchase order lines. +If some procurements are run for the same products and locations, but have +different procurement groups, these won't be merged in the same purchase order +line and will instead generate a purchase order line per procurement group. + +Moreover this module ensures that generated stock move won't be merged together +if they come from purchase order lines with different procurement groups. diff --git a/purchase_line_procurement_group/static/description/index.html b/purchase_line_procurement_group/static/description/index.html new file mode 100644 index 00000000000..c5fe4286e6e --- /dev/null +++ b/purchase_line_procurement_group/static/description/index.html @@ -0,0 +1,425 @@ + + + + + + +Purchase Line Procurement Group + + + +
+

Purchase Line Procurement Group

+ + +

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

+

This module changes the way procurements generate purchase order lines. +If some procurements are run for the same products and locations, but have +different procurement groups, these won’t be merged in the same purchase order +line and will instead generate a purchase order line per procurement group.

+

Moreover this module ensures that generated stock move won’t be merged together +if they come from purchase order lines with different procurement groups.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/purchase-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/purchase_line_procurement_group/tests/test_po_line_proc_group.py b/purchase_line_procurement_group/tests/test_po_line_proc_group.py index 26e5edb61e1..ca52a8a277d 100644 --- a/purchase_line_procurement_group/tests/test_po_line_proc_group.py +++ b/purchase_line_procurement_group/tests/test_po_line_proc_group.py @@ -53,9 +53,9 @@ def _create_orderpoint(product, qty_min, qty_max, location): wh_wh2_route = cls.env['stock.location.route'].create({ 'name': 'WH > WH2', 'product_selectable': True, - 'pull_ids': [(0, 0, { + 'rule_ids': [(0, 0, { 'name': 'WH>WH2', - 'action': 'move', + 'action': 'pull', 'location_id': wh2.lot_stock_id.id, 'location_src_id': cls.warehouse.lot_stock_id.id, 'procure_method': 'make_to_order', diff --git a/purchase_line_procurement_group/views/purchase.xml b/purchase_line_procurement_group/views/purchase.xml index cca3286b89a..5e46ecd194e 100644 --- a/purchase_line_procurement_group/views/purchase.xml +++ b/purchase_line_procurement_group/views/purchase.xml @@ -1,11 +1,11 @@ - + purchase.order.form.inherit purchase.order - + From 31c5e5469ae797f9761b68f2a9e6dfe79a5814b4 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 28 May 2019 18:17:02 +0000 Subject: [PATCH 14/40] [UPD] Update purchase_line_procurement_group.pot --- .../i18n/purchase_line_procurement_group.pot | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot b/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot index cd246f5a1d7..923ab7c69ae 100644 --- a/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot +++ b/purchase_line_procurement_group/i18n/purchase_line_procurement_group.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -14,15 +14,10 @@ msgstr "" "Plural-Forms: \n" #. module: purchase_line_procurement_group -#: model:ir.model.fields,field_description:purchase_line_procurement_group.field_purchase_order_line_procurement_group_id +#: model:ir.model.fields,field_description:purchase_line_procurement_group.field_purchase_order_line__procurement_group_id msgid "Procurement Group" msgstr "" -#. module: purchase_line_procurement_group -#: model:ir.model,name:purchase_line_procurement_group.model_procurement_rule -msgid "Procurement Rule" -msgstr "" - #. module: purchase_line_procurement_group #: model:ir.model,name:purchase_line_procurement_group.model_purchase_order_line msgid "Purchase Order Line" @@ -33,3 +28,8 @@ msgstr "" msgid "Stock Move" msgstr "" +#. module: purchase_line_procurement_group +#: model:ir.model,name:purchase_line_procurement_group.model_stock_rule +msgid "Stock Rule" +msgstr "" + From dd66e4014072f3107a21cacc32384adb26237819 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:31:14 +0000 Subject: [PATCH 15/40] [UPD] README.rst --- purchase_line_procurement_group/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/purchase_line_procurement_group/static/description/index.html b/purchase_line_procurement_group/static/description/index.html index c5fe4286e6e..0c7b7a3b185 100644 --- a/purchase_line_procurement_group/static/description/index.html +++ b/purchase_line_procurement_group/static/description/index.html @@ -3,7 +3,7 @@ - + Purchase Line Procurement Group