From 27d6b2bc80eca9c9cd44def8d402a0725437b049 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Thu, 13 Aug 2020 15:24:58 +0200 Subject: [PATCH 01/21] Create module sale_stock_mto_as_mts_orderpoint --- sale_stock_mto_as_mts_orderpoint/__init__.py | 1 + .../__manifest__.py | 15 ++++ .../models/__init__.py | 4 + .../models/product.py | 45 +++++++++++ .../models/sale_order.py | 78 +++++++++++++++++++ .../models/stock_move.py | 18 +++++ .../models/stock_warehouse.py | 11 +++ .../readme/CONFIGURATION.rst | 12 +++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 13 ++++ .../readme/ROADMAP.rst | 1 + .../tests/__init__.py | 1 + .../test_sale_stock_mto_as_mts_orderpoint.py | 67 ++++++++++++++++ 13 files changed, 267 insertions(+) create mode 100644 sale_stock_mto_as_mts_orderpoint/__init__.py create mode 100644 sale_stock_mto_as_mts_orderpoint/__manifest__.py create mode 100644 sale_stock_mto_as_mts_orderpoint/models/__init__.py create mode 100644 sale_stock_mto_as_mts_orderpoint/models/product.py create mode 100644 sale_stock_mto_as_mts_orderpoint/models/sale_order.py create mode 100644 sale_stock_mto_as_mts_orderpoint/models/stock_move.py create mode 100644 sale_stock_mto_as_mts_orderpoint/models/stock_warehouse.py create mode 100644 sale_stock_mto_as_mts_orderpoint/readme/CONFIGURATION.rst create mode 100644 sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst create mode 100644 sale_stock_mto_as_mts_orderpoint/readme/DESCRIPTION.rst create mode 100644 sale_stock_mto_as_mts_orderpoint/readme/ROADMAP.rst create mode 100644 sale_stock_mto_as_mts_orderpoint/tests/__init__.py create mode 100644 sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py diff --git a/sale_stock_mto_as_mts_orderpoint/__init__.py b/sale_stock_mto_as_mts_orderpoint/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_stock_mto_as_mts_orderpoint/__manifest__.py b/sale_stock_mto_as_mts_orderpoint/__manifest__.py new file mode 100644 index 00000000..75a40e97 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +{ + "name": "Sale Stock Mto As Mts Orderpoint", + "summary": "Materialize need from MTO route through orderpoint", + "version": "13.0.1.2.0", + "development_status": "Alpha", + "category": "Operations/Inventory/Delivery", + "website": "https://github.com/OCA/stock-logistics-workflow", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["sale_stock", "stock_orderpoint_manual_procurement"], +} diff --git a/sale_stock_mto_as_mts_orderpoint/models/__init__.py b/sale_stock_mto_as_mts_orderpoint/models/__init__.py new file mode 100644 index 00000000..e5bab062 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/models/__init__.py @@ -0,0 +1,4 @@ +from . import product +from . import sale_order +from . import stock_move +from . import stock_warehouse diff --git a/sale_stock_mto_as_mts_orderpoint/models/product.py b/sale_stock_mto_as_mts_orderpoint/models/product.py new file mode 100644 index 00000000..95f998d2 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/models/product.py @@ -0,0 +1,45 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import models + + +class ProductTemplate(models.Model): + + _inherit = "product.template" + + def write(self, vals): + # Archive orderpoints when MTO route is removed + if "route_ids" not in vals: + return super().write(vals) + mto_products = self._filter_mto_products() + res = super().write(vals) + not_mto_products = self._filter_mto_products(mto=False) + # products to update are the intersection of both recordsets + products_to_update = mto_products & not_mto_products + if products_to_update: + products_to_update._archive_orderpoints_on_mto_removal() + return res + + def _filter_mto_products(self, mto=True): + mto_route = self.env.ref("stock.route_warehouse0_mto", raise_if_not_found=False) + if mto: + func = lambda p: mto_route in p.route_ids # noqa + else: + func = lambda p: mto_route not in p.route_ids # noqa + return self.filtered(func) + + def _get_orderpoints_to_archive_domain(self): + warehouses = self.env["stock.warehouse"].search([]) + locations = warehouses._get_locations_for_mto_orderpoints() + return [ + ("product_id", "in", self.mapped("product_variant_ids").ids), + ("product_min_qty", "=", 0.0), + ("product_max_qty", "=", 0.0), + ("location_id", "in", locations.ids), + ] + + def _archive_orderpoints_on_mto_removal(self): + domain = self._get_orderpoints_to_archive_domain() + ops = self.env["stock.warehouse.orderpoint"].search(domain) + if ops: + ops.write({"active": False}) diff --git a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py new file mode 100644 index 00000000..0cf2ccf9 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py @@ -0,0 +1,78 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import models + + +class SaleOrderLine(models.Model): + + _inherit = "sale.order.line" + + def _action_launch_stock_rule(self, previous_product_uom_qty=False): + res = super()._action_launch_stock_rule( + previous_product_uom_qty=previous_product_uom_qty + ) + self._run_orderpoints_for_mto_products() + return res + + def _run_orderpoints_for_mto_products(self): + orderpoints_to_procure_ids = [] + mto_route = self.env.ref("stock.route_warehouse0_mto", raise_if_not_found=False) + if not mto_route: + return + for line in self: + delivery_move = line.move_ids.filtered( + lambda m: m.picking_id.picking_type_code == "outgoing" + ) + if ( + not delivery_move.is_from_mto_route + or mto_route not in line.product_id.route_ids + ): + continue + orderpoint = line._get_mto_orderpoint() + if orderpoint.procure_recommended_qty: + orderpoints_to_procure_ids.append(orderpoint.id) + wiz = ( + self.env["make.procurement.orderpoint"] + .with_context( + **{ + "active_model": "stock.warehouse.orderpoint", + "active_ids": orderpoints_to_procure_ids, + } + ) + .create({}) + ) + wiz.make_procurement() + + def _get_mto_orderpoint(self): + self.ensure_one() + warehouse = self.warehouse_id or self.order_id.warehouse_id + orderpoint = ( + self.env["stock.warehouse.orderpoint"] + .with_context(active_test=False) + .search( + [ + ("product_id", "=", self.product_id.id), + ( + "location_id", + "=", + warehouse._get_locations_for_mto_orderpoints().id, + ), + ], + limit=1, + ) + ) + if orderpoint and not orderpoint.active: + orderpoint.write( + {"active": True, "product_min_qty": 0.0, "product_max_qty": 0.0} + ) + elif not orderpoint: + orderpoint = self.env["stock.warehouse.orderpoint"].create( + { + "product_id": self.product_id.id, + "warehouse_id": warehouse.id, + "location_id": warehouse._get_locations_for_mto_orderpoints().id, + "product_min_qty": 0.0, + "product_max_qty": 0.0, + } + ) + return orderpoint diff --git a/sale_stock_mto_as_mts_orderpoint/models/stock_move.py b/sale_stock_mto_as_mts_orderpoint/models/stock_move.py new file mode 100644 index 00000000..a9039460 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/models/stock_move.py @@ -0,0 +1,18 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import fields, models + + +class StockMove(models.Model): + + _inherit = "stock.move" + + is_from_mto_route = fields.Boolean(compute="_compute_is_from_mto_route") + + def _compute_is_from_mto_route(self): + mto_route = self.env.ref("stock.route_warehouse0_mto", raise_if_not_found=False) + if not mto_route: + self.update({"is_from_mto_route": False}) + else: + for move in self: + move.is_from_mto_route = move.rule_id.route_id == mto_route diff --git a/sale_stock_mto_as_mts_orderpoint/models/stock_warehouse.py b/sale_stock_mto_as_mts_orderpoint/models/stock_warehouse.py new file mode 100644 index 00000000..2d742d1b --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/models/stock_warehouse.py @@ -0,0 +1,11 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import models + + +class StockWarehouse(models.Model): + + _inherit = "stock.warehouse" + + def _get_locations_for_mto_orderpoints(self): + return self.mapped("lot_stock_id") diff --git a/sale_stock_mto_as_mts_orderpoint/readme/CONFIGURATION.rst b/sale_stock_mto_as_mts_orderpoint/readme/CONFIGURATION.rst new file mode 100644 index 00000000..db9f46d6 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/readme/CONFIGURATION.rst @@ -0,0 +1,12 @@ +On the original MTO route, you have two options to configure the rule to pull +from Stock: + +* Keep the triggering of another rule as Supply Method on stock.rule, will + ensure that the need is materialized by the procure_recommended_qty on the + orderpoint, if the ensuing procurement (purchase order/manufacturing order) + having the MTO rule as origin is canceled. + +* Change the Supply Method on stock.rule to Take From Stock, will ensure that + the need is materialized by the procure_recommended_qty on the orderpoint, + if the ensuing procurement (purchase order/manufacturing order) having the + orderpoint as origin is canceled. diff --git a/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst b/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..e31e2f0c --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Akim Juillerat diff --git a/sale_stock_mto_as_mts_orderpoint/readme/DESCRIPTION.rst b/sale_stock_mto_as_mts_orderpoint/readme/DESCRIPTION.rst new file mode 100644 index 00000000..4a64db20 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/readme/DESCRIPTION.rst @@ -0,0 +1,13 @@ +This module aims to materialize the triggering of another stock rule through +an orderpoint in the procurement of MTO products from a sale order. + +When a sales order is confirmed, if the delivery order move is generated by +the stock rule linked to the standard MTO route, and the MTO route is marked +on the product, an orderpoint will be created on the Stock location of the +warehouse, with min/max quantities of zero. + +This allows to regenerate procurement according to the procure_recommended_qty +using module `stock_orderpoint_manual_procurement`. + +Finally, orderpoints with min/max quantities of zero will be archived if the +MTO route is removed on the product. diff --git a/sale_stock_mto_as_mts_orderpoint/readme/ROADMAP.rst b/sale_stock_mto_as_mts_orderpoint/readme/ROADMAP.rst new file mode 100644 index 00000000..cc94639c --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Do not rely on original MTO record and have something configurable instead. diff --git a/sale_stock_mto_as_mts_orderpoint/tests/__init__.py b/sale_stock_mto_as_mts_orderpoint/tests/__init__.py new file mode 100644 index 00000000..ca7ff99a --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_stock_mto_as_mts_orderpoint diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py new file mode 100644 index 00000000..80fd6530 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -0,0 +1,67 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo.tests.common import Form, SavepointCase + + +class TestSaleStockMtoAsMtsOrderpoint(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + ref = cls.env.ref + cls.partner = ref("base.res_partner_2") + cls.product = cls.env["product.product"].create( + {"name": "Test MTO", "type": "product"} + ) + cls.vendor_partner = ref("base.res_partner_12") + cls.env["product.supplierinfo"].create( + { + "name": cls.vendor_partner.id, + "product_tmpl_id": cls.product.product_tmpl_id.id, + "min_qty": 1.0, + "price": 1.0, + } + ) + + cls.warehouse = ref("stock.warehouse0") + + cls.mto_route = ref("stock.route_warehouse0_mto") + cls.buy_route = ref("purchase_stock.route_warehouse0_buy") + cls.product.write({"route_ids": [(6, 0, [cls.mto_route.id, cls.buy_route.id])]}) + + @classmethod + def _create_sale_order(cls): + sale_form = Form(cls.env["sale.order"]) + sale_form.partner_id = cls.partner + sale_form.warehouse_id = cls.warehouse + with sale_form.order_line.new() as line_form: + line_form.product_id = cls.product + line_form.product_uom_qty = 1 + return sale_form.save() + + def test_mto_as_mts_orderpoint(self): + order = self._create_sale_order() + orderpoint = self.env["stock.warehouse.orderpoint"].search( + [("product_id", "=", self.product.id)] + ) + self.assertFalse(orderpoint) + order.action_confirm() + orderpoint = self.env["stock.warehouse.orderpoint"].search( + [("product_id", "=", self.product.id)] + ) + self.assertEqual( + orderpoint.location_id, self.warehouse._get_locations_for_mto_orderpoints(), + ) + self.assertAlmostEqual(orderpoint.product_min_qty, 0.0) + self.assertAlmostEqual(orderpoint.product_max_qty, 0.0) + self.product.write({"route_ids": [(5, 0, 0)]}) + orderpoint = self.env["stock.warehouse.orderpoint"].search( + [("product_id", "=", self.product.id)] + ) + self.assertFalse(orderpoint) + orderpoint = ( + self.env["stock.warehouse.orderpoint"] + .with_context(active_test=False) + .search([("product_id", "=", self.product.id)]) + ) + self.assertTrue(orderpoint) From f1b0cb2e7c2d5901571f7ae570b18ecbe8e88fb4 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 18 Aug 2020 14:44:56 +0200 Subject: [PATCH 02/21] Check move state in selection of delivery move --- sale_stock_mto_as_mts_orderpoint/models/sale_order.py | 1 + .../tests/test_sale_stock_mto_as_mts_orderpoint.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py index 0cf2ccf9..edc76333 100644 --- a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py +++ b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py @@ -22,6 +22,7 @@ def _run_orderpoints_for_mto_products(self): for line in self: delivery_move = line.move_ids.filtered( lambda m: m.picking_id.picking_type_code == "outgoing" + and m.state not in ("done", "cancel") ) if ( not delivery_move.is_from_mto_route diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py index 80fd6530..a39a908a 100644 --- a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -65,3 +65,11 @@ def test_mto_as_mts_orderpoint(self): .search([("product_id", "=", self.product.id)]) ) self.assertTrue(orderpoint) + + def test_cancel_sale_order_orderpoint(self): + order = self._create_sale_order() + order.action_confirm() + order.action_cancel() + order.action_draft() + order.action_confirm() + self.assertEqual(order.state, "sale") From 8c9d578a6e3ac5ed7d4051cb5b73594caec4c78a Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 27 Aug 2020 08:47:11 +0000 Subject: [PATCH 03/21] [UPD] Update sale_stock_mto_as_mts_orderpoint.pot --- .../i18n/sale_stock_mto_as_mts_orderpoint.pot | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot diff --git a/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot b/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot new file mode 100644 index 00000000..c119b901 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_stock_mto_as_mts_orderpoint +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: sale_stock_mto_as_mts_orderpoint +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_move__is_from_mto_route +msgid "Is From Mto Route" +msgstr "" + +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model,name:sale_stock_mto_as_mts_orderpoint.model_product_template +msgid "Product Template" +msgstr "" + +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model,name:sale_stock_mto_as_mts_orderpoint.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model,name:sale_stock_mto_as_mts_orderpoint.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model,name:sale_stock_mto_as_mts_orderpoint.model_stock_warehouse +msgid "Warehouse" +msgstr "" From dff07a60fd4f9b92689568278894ed5de58befe9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 27 Aug 2020 08:59:22 +0000 Subject: [PATCH 04/21] [UPD] README.rst --- sale_stock_mto_as_mts_orderpoint/README.rst | 95 ++++ .../static/description/index.html | 441 ++++++++++++++++++ 2 files changed, 536 insertions(+) create mode 100644 sale_stock_mto_as_mts_orderpoint/README.rst create mode 100644 sale_stock_mto_as_mts_orderpoint/static/description/index.html diff --git a/sale_stock_mto_as_mts_orderpoint/README.rst b/sale_stock_mto_as_mts_orderpoint/README.rst new file mode 100644 index 00000000..2a153665 --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/README.rst @@ -0,0 +1,95 @@ +================================ +Sale Stock Mto As Mts Orderpoint +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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%2Fstock--logistics--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-workflow/tree/13.0/sale_stock_mto_as_mts_orderpoint + :alt: OCA/stock-logistics-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-workflow-13-0/stock-logistics-workflow-13-0-sale_stock_mto_as_mts_orderpoint + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/154/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module aims to materialize the triggering of another stock rule through +an orderpoint in the procurement of MTO products from a sale order. + +When a sales order is confirmed, if the delivery order move is generated by +the stock rule linked to the standard MTO route, and the MTO route is marked +on the product, an orderpoint will be created on the Stock location of the +warehouse, with min/max quantities of zero. + +This allows to regenerate procurement according to the procure_recommended_qty +using module `stock_orderpoint_manual_procurement`. + +Finally, orderpoints with min/max quantities of zero will be archived if the +MTO route is removed on the product. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Known issues / Roadmap +====================== + +* Do not rely on original MTO record and have something configurable instead. + +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 +~~~~~~~~~~~~ + +* Akim Juillerat + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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/stock-logistics-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_stock_mto_as_mts_orderpoint/static/description/index.html b/sale_stock_mto_as_mts_orderpoint/static/description/index.html new file mode 100644 index 00000000..e2439cac --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/static/description/index.html @@ -0,0 +1,441 @@ + + + + + + +Sale Stock Mto As Mts Orderpoint + + + +
+

Sale Stock Mto As Mts Orderpoint

+ + +

Alpha License: AGPL-3 OCA/stock-logistics-workflow Translate me on Weblate Try me on Runbot

+

This module aims to materialize the triggering of another stock rule through +an orderpoint in the procurement of MTO products from a sale order.

+

When a sales order is confirmed, if the delivery order move is generated by +the stock rule linked to the standard MTO route, and the MTO route is marked +on the product, an orderpoint will be created on the Stock location of the +warehouse, with min/max quantities of zero.

+

This allows to regenerate procurement according to the procure_recommended_qty +using module stock_orderpoint_manual_procurement.

+

Finally, orderpoints with min/max quantities of zero will be archived if the +MTO route is removed on the product.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Known issues / Roadmap

+
    +
  • Do not rely on original MTO record and have something configurable instead.
  • +
+
+
+

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
  • +
+
+ +
+

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/stock-logistics-workflow project on GitHub.

+

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

+
+
+
+ + From 290d152706dc91f02804ca757e88ca4e70e2e2ae Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 27 Aug 2020 08:59:22 +0000 Subject: [PATCH 05/21] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sale_stock_mto_as_mts_orderpoint/static/description/icon.png diff --git a/sale_stock_mto_as_mts_orderpoint/static/description/icon.png b/sale_stock_mto_as_mts_orderpoint/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 3a5305b7d0c1272a3d11641b4d78afe73e346055 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 27 Aug 2020 08:59:22 +0000 Subject: [PATCH 06/21] sale_stock_mto_as_mts_orderpoint 13.0.1.2.1 --- sale_stock_mto_as_mts_orderpoint/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_stock_mto_as_mts_orderpoint/__manifest__.py b/sale_stock_mto_as_mts_orderpoint/__manifest__.py index 75a40e97..817ea733 100644 --- a/sale_stock_mto_as_mts_orderpoint/__manifest__.py +++ b/sale_stock_mto_as_mts_orderpoint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Stock Mto As Mts Orderpoint", "summary": "Materialize need from MTO route through orderpoint", - "version": "13.0.1.2.0", + "version": "13.0.1.2.1", "development_status": "Alpha", "category": "Operations/Inventory/Delivery", "website": "https://github.com/OCA/stock-logistics-workflow", From 6fd88427da145c218b29439460dabe0c976880c2 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Wed, 9 Dec 2020 14:26:25 +0100 Subject: [PATCH 07/21] [13.0][FIX] sale_stock_mto_as_mts_orderpoint For user without proper rights the confirmation of a sale.order can lead to an access error on the orderpoint creation. The sudo fixes that. --- .../models/sale_order.py | 22 ++++++++++++------- .../test_sale_stock_mto_as_mts_orderpoint.py | 13 +++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py index edc76333..db0d8140 100644 --- a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py +++ b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py @@ -67,13 +67,19 @@ def _get_mto_orderpoint(self): {"active": True, "product_min_qty": 0.0, "product_max_qty": 0.0} ) elif not orderpoint: - orderpoint = self.env["stock.warehouse.orderpoint"].create( - { - "product_id": self.product_id.id, - "warehouse_id": warehouse.id, - "location_id": warehouse._get_locations_for_mto_orderpoints().id, - "product_min_qty": 0.0, - "product_max_qty": 0.0, - } + orderpoint = ( + self.env["stock.warehouse.orderpoint"] + .sudo() + .create( + { + "product_id": self.product_id.id, + "warehouse_id": warehouse.id, + "location_id": ( + warehouse._get_locations_for_mto_orderpoints().id + ), + "product_min_qty": 0.0, + "product_max_qty": 0.0, + } + ) ) return orderpoint diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py index a39a908a..fb3aa071 100644 --- a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -73,3 +73,16 @@ def test_cancel_sale_order_orderpoint(self): order.action_draft() order.action_confirm() self.assertEqual(order.state, "sale") + + def test_confirm_mto_as_mts_sudo_needed(self): + """Check access right needed to confirm sale. + + A sale manager user with no right on inventory will raise an access + right error on confirmation. + This is the why of the sudo in `sale_stock_mto_as_mts_orderpoint` + """ + user = self.env.ref("base.user_demo") + sale_group = self.env.ref("sales_team.group_sale_manager") + sale_group.users = [(4, user.id)] + order = self._create_sale_order() + order.with_user(user).action_confirm() From cd7682f01b3e193b3c1fb29bc4cbe9c6a24fa149 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 22 Dec 2020 07:28:43 +0000 Subject: [PATCH 08/21] sale_stock_mto_as_mts_orderpoint 13.0.1.2.2 --- sale_stock_mto_as_mts_orderpoint/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_stock_mto_as_mts_orderpoint/__manifest__.py b/sale_stock_mto_as_mts_orderpoint/__manifest__.py index 817ea733..0f09afe6 100644 --- a/sale_stock_mto_as_mts_orderpoint/__manifest__.py +++ b/sale_stock_mto_as_mts_orderpoint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Stock Mto As Mts Orderpoint", "summary": "Materialize need from MTO route through orderpoint", - "version": "13.0.1.2.1", + "version": "13.0.1.2.2", "development_status": "Alpha", "category": "Operations/Inventory/Delivery", "website": "https://github.com/OCA/stock-logistics-workflow", From a4b8aa09e425ab0647f3b30be7efd80dce1d10c7 Mon Sep 17 00:00:00 2001 From: "dung.tran" Date: Tue, 12 Jan 2021 00:23:23 +0700 Subject: [PATCH 09/21] [IMP] sale_stock_mto_as_mts_orderpoint: black, isort, prettier --- .../tests/test_sale_stock_mto_as_mts_orderpoint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py index fb3aa071..c1904cc9 100644 --- a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -50,7 +50,8 @@ def test_mto_as_mts_orderpoint(self): [("product_id", "=", self.product.id)] ) self.assertEqual( - orderpoint.location_id, self.warehouse._get_locations_for_mto_orderpoints(), + orderpoint.location_id, + self.warehouse._get_locations_for_mto_orderpoints(), ) self.assertAlmostEqual(orderpoint.product_min_qty, 0.0) self.assertAlmostEqual(orderpoint.product_max_qty, 0.0) From 210247808bce2cb7f0dfc048d696182b566c649c Mon Sep 17 00:00:00 2001 From: "dung.tran" Date: Tue, 12 Jan 2021 00:23:40 +0700 Subject: [PATCH 10/21] [MIG] sale_stock_mto_as_mts_orderpoint: Migration to 14.0 --- sale_stock_mto_as_mts_orderpoint/README.rst | 21 +++++++++++++----- .../__manifest__.py | 5 ++++- .../data/stock_data.xml | 10 +++++++++ .../readme/CONTRIBUTORS.rst | 4 ++++ .../readme/CREDITS.rst | 3 +++ .../static/description/index.html | 22 ++++++++++++++----- .../test_sale_stock_mto_as_mts_orderpoint.py | 1 + 7 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 sale_stock_mto_as_mts_orderpoint/data/stock_data.xml create mode 100644 sale_stock_mto_as_mts_orderpoint/readme/CREDITS.rst diff --git a/sale_stock_mto_as_mts_orderpoint/README.rst b/sale_stock_mto_as_mts_orderpoint/README.rst index 2a153665..c026cf4f 100644 --- a/sale_stock_mto_as_mts_orderpoint/README.rst +++ b/sale_stock_mto_as_mts_orderpoint/README.rst @@ -14,13 +14,13 @@ Sale Stock Mto As Mts Orderpoint :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-workflow/tree/13.0/sale_stock_mto_as_mts_orderpoint + :target: https://github.com/OCA/stock-logistics-workflow/tree/14.0/sale_stock_mto_as_mts_orderpoint :alt: OCA/stock-logistics-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-workflow-13-0/stock-logistics-workflow-13-0-sale_stock_mto_as_mts_orderpoint + :target: https://translation.odoo-community.org/projects/stock-logistics-workflow-14-0/stock-logistics-workflow-14-0-sale_stock_mto_as_mts_orderpoint :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/154/13.0 + :target: https://runbot.odoo-community.org/runbot/154/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -60,7 +60,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -77,6 +77,17 @@ Contributors * Akim Juillerat +Trobz: + +* Dung Tran + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Camptocamp + Maintainers ~~~~~~~~~~~ @@ -90,6 +101,6 @@ 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/stock-logistics-workflow `_ project on GitHub. +This module is part of the `OCA/stock-logistics-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_stock_mto_as_mts_orderpoint/__manifest__.py b/sale_stock_mto_as_mts_orderpoint/__manifest__.py index 0f09afe6..7cf5e7bb 100644 --- a/sale_stock_mto_as_mts_orderpoint/__manifest__.py +++ b/sale_stock_mto_as_mts_orderpoint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Stock Mto As Mts Orderpoint", "summary": "Materialize need from MTO route through orderpoint", - "version": "13.0.1.2.2", + "version": "14.0.1.0.0", "development_status": "Alpha", "category": "Operations/Inventory/Delivery", "website": "https://github.com/OCA/stock-logistics-workflow", @@ -12,4 +12,7 @@ "application": False, "installable": True, "depends": ["sale_stock", "stock_orderpoint_manual_procurement"], + "data": [ + "data/stock_data.xml", + ], } diff --git a/sale_stock_mto_as_mts_orderpoint/data/stock_data.xml b/sale_stock_mto_as_mts_orderpoint/data/stock_data.xml new file mode 100644 index 00000000..eb14e36a --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/data/stock_data.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst b/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst index e31e2f0c..6c8e1741 100644 --- a/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst +++ b/sale_stock_mto_as_mts_orderpoint/readme/CONTRIBUTORS.rst @@ -1 +1,5 @@ * Akim Juillerat + +Trobz: + +* Dung Tran diff --git a/sale_stock_mto_as_mts_orderpoint/readme/CREDITS.rst b/sale_stock_mto_as_mts_orderpoint/readme/CREDITS.rst new file mode 100644 index 00000000..f5cc070c --- /dev/null +++ b/sale_stock_mto_as_mts_orderpoint/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Camptocamp diff --git a/sale_stock_mto_as_mts_orderpoint/static/description/index.html b/sale_stock_mto_as_mts_orderpoint/static/description/index.html index e2439cac..f9d4d3f4 100644 --- a/sale_stock_mto_as_mts_orderpoint/static/description/index.html +++ b/sale_stock_mto_as_mts_orderpoint/static/description/index.html @@ -367,7 +367,7 @@

Sale Stock Mto As Mts Orderpoint

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Alpha License: AGPL-3 OCA/stock-logistics-workflow Translate me on Weblate Try me on Runbot

+

Alpha License: AGPL-3 OCA/stock-logistics-workflow Translate me on Weblate Try me on Runbot

This module aims to materialize the triggering of another stock rule through an orderpoint in the procurement of MTO products from a sale order.

When a sales order is confirmed, if the delivery order move is generated by @@ -392,7 +392,8 @@

Sale Stock Mto As Mts Orderpoint

  • Credits
  • @@ -408,7 +409,7 @@

    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.

    +feedback.

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

    @@ -424,15 +425,26 @@

    Contributors

    +

    Trobz:

    + +
    +
    +

    Other credits

    +

    The development of this module has been financially supported by:

    +
      +
    • Camptocamp
    • +
    -

    Maintainers

    +

    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/stock-logistics-workflow project on GitHub.

    +

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

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

    diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py index c1904cc9..ad7d268d 100644 --- a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -49,6 +49,7 @@ def test_mto_as_mts_orderpoint(self): orderpoint = self.env["stock.warehouse.orderpoint"].search( [("product_id", "=", self.product.id)] ) + self.assertEqual( orderpoint.location_id, self.warehouse._get_locations_for_mto_orderpoints(), From bc4c41380f03351acfe7b93ed1d62350e93922f3 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 7 Oct 2021 07:52:34 +0000 Subject: [PATCH 11/21] [UPD] Update sale_stock_mto_as_mts_orderpoint.pot --- .../i18n/sale_stock_mto_as_mts_orderpoint.pot | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot b/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot index c119b901..0c9b99a9 100644 --- a/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot +++ b/sale_stock_mto_as_mts_orderpoint/i18n/sale_stock_mto_as_mts_orderpoint.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,11 +13,35 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_product_template__display_name +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_sale_order_line__display_name +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_move__display_name +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_warehouse__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_product_template__id +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_sale_order_line__id +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_move__id +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_warehouse__id +msgid "ID" +msgstr "" + #. module: sale_stock_mto_as_mts_orderpoint #: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_move__is_from_mto_route msgid "Is From Mto Route" msgstr "" +#. module: sale_stock_mto_as_mts_orderpoint +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_product_template____last_update +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_sale_order_line____last_update +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_move____last_update +#: model:ir.model.fields,field_description:sale_stock_mto_as_mts_orderpoint.field_stock_warehouse____last_update +msgid "Last Modified on" +msgstr "" + #. module: sale_stock_mto_as_mts_orderpoint #: model:ir.model,name:sale_stock_mto_as_mts_orderpoint.model_product_template msgid "Product Template" From 2eb4faa2a25e779649a8df40543766b044c052d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Wed, 30 Sep 2020 17:05:05 +0200 Subject: [PATCH 12/21] [FIX] sale_stock_mto_as_mts_orderpoint: support product set --- .../models/sale_order.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py index db0d8140..6846c143 100644 --- a/sale_stock_mto_as_mts_orderpoint/models/sale_order.py +++ b/sale_stock_mto_as_mts_orderpoint/models/sale_order.py @@ -20,18 +20,19 @@ def _run_orderpoints_for_mto_products(self): if not mto_route: return for line in self: - delivery_move = line.move_ids.filtered( + delivery_moves = line.move_ids.filtered( lambda m: m.picking_id.picking_type_code == "outgoing" and m.state not in ("done", "cancel") ) - if ( - not delivery_move.is_from_mto_route - or mto_route not in line.product_id.route_ids - ): - continue - orderpoint = line._get_mto_orderpoint() - if orderpoint.procure_recommended_qty: - orderpoints_to_procure_ids.append(orderpoint.id) + for delivery_move in delivery_moves: + if ( + not delivery_move.is_from_mto_route + or mto_route not in line.product_id.route_ids + ): + continue + orderpoint = line._get_mto_orderpoint(delivery_move.product_id) + if orderpoint.procure_recommended_qty: + orderpoints_to_procure_ids.append(orderpoint.id) wiz = ( self.env["make.procurement.orderpoint"] .with_context( @@ -44,7 +45,7 @@ def _run_orderpoints_for_mto_products(self): ) wiz.make_procurement() - def _get_mto_orderpoint(self): + def _get_mto_orderpoint(self, product_id): self.ensure_one() warehouse = self.warehouse_id or self.order_id.warehouse_id orderpoint = ( @@ -52,7 +53,7 @@ def _get_mto_orderpoint(self): .with_context(active_test=False) .search( [ - ("product_id", "=", self.product_id.id), + ("product_id", "=", product_id.id), ( "location_id", "=", From 23d713768849c816f9c25d2182e426b3791ae41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 18 Jan 2021 10:09:38 +0100 Subject: [PATCH 13/21] [IMP] sale_stock_mto_as_mts_orderpoint: test coverage --- .../tests/test_sale_stock_mto_as_mts_orderpoint.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py index ad7d268d..6ee51541 100644 --- a/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py +++ b/sale_stock_mto_as_mts_orderpoint/tests/test_sale_stock_mto_as_mts_orderpoint.py @@ -68,6 +68,19 @@ def test_mto_as_mts_orderpoint(self): ) self.assertTrue(orderpoint) + def test_mtp_as_mts_orderpoint_product_no_mto(self): + self.product.route_ids = False + order = self._create_sale_order() + orderpoint = self.env["stock.warehouse.orderpoint"].search( + [("product_id", "=", self.product.id)] + ) + self.assertFalse(orderpoint) + order.action_confirm() + orderpoint = self.env["stock.warehouse.orderpoint"].search( + [("product_id", "=", self.product.id)] + ) + self.assertFalse(orderpoint) + def test_cancel_sale_order_orderpoint(self): order = self._create_sale_order() order.action_confirm() From 32ce056359fc65f45c4de5960c04c87ac2f3e51e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 30 Nov 2021 14:49:24 +0000 Subject: [PATCH 14/21] sale_stock_mto_as_mts_orderpoint 14.0.1.0.1 --- sale_stock_mto_as_mts_orderpoint/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_stock_mto_as_mts_orderpoint/__manifest__.py b/sale_stock_mto_as_mts_orderpoint/__manifest__.py index 7cf5e7bb..aa34a5bf 100644 --- a/sale_stock_mto_as_mts_orderpoint/__manifest__.py +++ b/sale_stock_mto_as_mts_orderpoint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Stock Mto As Mts Orderpoint", "summary": "Materialize need from MTO route through orderpoint", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "development_status": "Alpha", "category": "Operations/Inventory/Delivery", "website": "https://github.com/OCA/stock-logistics-workflow", From 3476f17b1e5e698673916691690702bad73be4e9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 17:28:19 +0000 Subject: [PATCH 15/21] [UPD] README.rst --- sale_stock_mto_as_mts_orderpoint/README.rst | 15 ++++--- .../static/description/index.html | 42 ++++++++++--------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/sale_stock_mto_as_mts_orderpoint/README.rst b/sale_stock_mto_as_mts_orderpoint/README.rst index c026cf4f..dab23477 100644 --- a/sale_stock_mto_as_mts_orderpoint/README.rst +++ b/sale_stock_mto_as_mts_orderpoint/README.rst @@ -2,10 +2,13 @@ Sale Stock Mto As Mts Orderpoint ================================ -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:0c7bd734e1967dc390d782e8c78e632b7bdd45b26457c72285bdab650cf19ed4 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Sale Stock Mto As Mts Orderpoint .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/stock-logistics-workflow-14-0/stock-logistics-workflow-14-0-sale_stock_mto_as_mts_orderpoint :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/154/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-workflow&target_branch=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module aims to materialize the triggering of another stock rule through an orderpoint in the procurement of MTO products from a sale order. @@ -59,7 +62,7 @@ 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 +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/sale_stock_mto_as_mts_orderpoint/static/description/index.html b/sale_stock_mto_as_mts_orderpoint/static/description/index.html index f9d4d3f4..a42b2ca2 100644 --- a/sale_stock_mto_as_mts_orderpoint/static/description/index.html +++ b/sale_stock_mto_as_mts_orderpoint/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sale Stock Mto As Mts Orderpoint