From e6b79cd9ffb07f3d686ab78085c66815506fd60f Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 18 May 2018 10:33:22 +0200 Subject: [PATCH 01/30] [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 9b7e5e2571814074648487637376d1179166346a Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 22 May 2018 14:54:33 +0200 Subject: [PATCH 02/30] 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 23dc4b44f7afb01caf751581ac68ff7e8df84791 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 22 May 2018 15:15:00 +0200 Subject: [PATCH 03/30] 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 396d550e8358d3442c8517799e770e42b3b065fa Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 16:55:14 +0200 Subject: [PATCH 04/30] 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 f9ac94bd786e4720e4b7ef910d4996f1ab820f7c Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 16:55:23 +0200 Subject: [PATCH 05/30] 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 31b10725da844afa1658daba5f7fc6848100cb1e Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 23 May 2018 17:05:29 +0200 Subject: [PATCH 06/30] 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 aa034350af91a5a5b8418ca201334fba4a72d3b9 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:05:21 +0200 Subject: [PATCH 07/30] [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 3d8ae4a206b59388af59e1357aadadb205c48bbe Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:05:43 +0200 Subject: [PATCH 08/30] [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 9c4e34b78297454680133bec073baeac5b20239a Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 14:42:31 +0200 Subject: [PATCH 09/30] 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 7509246885d0f133058cd1be68e2d1a68a7a9a8a Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Wed, 18 Jul 2018 18:34:46 +0200 Subject: [PATCH 10/30] 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 fec4fba0984b6ce68a4aeca5a0583522c75d9c64 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 23 Jul 2018 14:11:41 +0000 Subject: [PATCH 11/30] [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 b3389e63ac0595afa69198b9bc6eda620329b1ed Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:16:11 +0000 Subject: [PATCH 12/30] [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 710c98b4d1c4805c713c4463960cd45fdf0928de Mon Sep 17 00:00:00 2001 From: Kitti U Date: Tue, 9 Apr 2019 16:06:04 +0700 Subject: [PATCH 13/30] [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 cceeaf05ce017f879d2d7c56bd5e3e793c9266b8 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 28 May 2019 18:17:02 +0000 Subject: [PATCH 14/30] [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 32036aac2d45990919b80e7a34d11a60a8a77085 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:31:14 +0000 Subject: [PATCH 15/30] [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