From 3a6629783a4fd14e87f45da4400180372b121485 Mon Sep 17 00:00:00 2001 From: trisdoan Date: Thu, 6 Jun 2024 17:08:49 +0700 Subject: [PATCH 01/68] [IMP] purchase_vendor_promotion: auto assign supplier with promotion --- purchase_vendor_promotion/README.rst | 16 ++++-- purchase_vendor_promotion/__manifest__.py | 2 + .../data/stock_route.xml | 5 ++ purchase_vendor_promotion/models/__init__.py | 1 + .../models/product_supplierinfo.py | 11 ++++ .../models/stock_route.py | 10 ++++ .../models/stock_warehouse_orderpoint.py | 16 ++++++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 5 +- .../static/description/index.html | 48 +++++++++-------- .../tests/test_vendor_promotion.py | 52 ++++++++++++++----- .../views/stock_route.xml | 11 ++++ 12 files changed, 138 insertions(+), 41 deletions(-) create mode 100644 purchase_vendor_promotion/data/stock_route.xml create mode 100644 purchase_vendor_promotion/models/stock_route.py create mode 100644 purchase_vendor_promotion/views/stock_route.xml diff --git a/purchase_vendor_promotion/README.rst b/purchase_vendor_promotion/README.rst index 8daec701322..cae5922b035 100644 --- a/purchase_vendor_promotion/README.rst +++ b/purchase_vendor_promotion/README.rst @@ -2,10 +2,13 @@ Purchase Vendor Promotion ========================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d9b1b88cbcd184f9d7419231e529d3ca7b29ad1e59a9a0cdb3842a60ddc46126 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -20,13 +23,14 @@ Purchase Vendor Promotion :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_vendor_promotion :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/purchase-workflow&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=16.0 :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| -This module allows you to visualise the start and end date of a vendor promotion during replenishment. +This module allows you to visualise the start and end date of a vendor promotion during replenishment, in `Inventory > Operations > Replenishment` or `Inventory > Configuration > Products > Reordering Rules`. A vendor price is considered as a promotion if product supplier info is flagged as a `promotion`. +If "Buy" is chosen as the Preferred Route, the vendor having the best active or upcoming promotion for the product will be automatically chosen. If no promotion is available, then first vendor will be chosen. **Table of contents** @@ -38,7 +42,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. @@ -55,6 +59,8 @@ Contributors ~~~~~~~~~~~~ * Telmo Santos +* Tris Doan + Maintainers ~~~~~~~~~~~ diff --git a/purchase_vendor_promotion/__manifest__.py b/purchase_vendor_promotion/__manifest__.py index b4023a5bcb8..b613d74109a 100644 --- a/purchase_vendor_promotion/__manifest__.py +++ b/purchase_vendor_promotion/__manifest__.py @@ -12,9 +12,11 @@ "license": "AGPL-3", "depends": ["purchase_stock"], "data": [ + "data/stock_route.xml", "views/product_views.xml", "views/stock_orderpoint_views.xml", "views/purchase_order_views.xml", + "views/stock_route.xml", ], "installable": True, "auto_install": False, diff --git a/purchase_vendor_promotion/data/stock_route.xml b/purchase_vendor_promotion/data/stock_route.xml new file mode 100644 index 00000000000..645aa84f4ba --- /dev/null +++ b/purchase_vendor_promotion/data/stock_route.xml @@ -0,0 +1,5 @@ + + + True + + diff --git a/purchase_vendor_promotion/models/__init__.py b/purchase_vendor_promotion/models/__init__.py index 7d3cc1b5201..098323eec63 100644 --- a/purchase_vendor_promotion/models/__init__.py +++ b/purchase_vendor_promotion/models/__init__.py @@ -1,3 +1,4 @@ +from . import stock_route from . import purchase_order_line from . import product_supplierinfo from . import stock_warehouse_orderpoint diff --git a/purchase_vendor_promotion/models/product_supplierinfo.py b/purchase_vendor_promotion/models/product_supplierinfo.py index b3b4b9ccea0..922df0721a1 100644 --- a/purchase_vendor_promotion/models/product_supplierinfo.py +++ b/purchase_vendor_promotion/models/product_supplierinfo.py @@ -22,3 +22,14 @@ def _check_promotion_dates(self): raise ValidationError( _("Promotion start date must be before end date.") ) + + def _is_promotion_active_or_upcoming(self, date=None): + """ + Consider Promotion is active if it's within start and end date or it's in the future + """ + self.ensure_one() + if not self.is_promotion: + return False + if not date: + date = fields.Date.today() + return date <= self.date_start or (self.date_start <= date <= self.date_end) diff --git a/purchase_vendor_promotion/models/stock_route.py b/purchase_vendor_promotion/models/stock_route.py new file mode 100644 index 00000000000..466b2636f4c --- /dev/null +++ b/purchase_vendor_promotion/models/stock_route.py @@ -0,0 +1,10 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class StockRoute(models.Model): + _inherit = "stock.route" + + force_vendor_with_best_promotion = fields.Boolean(default=False) diff --git a/purchase_vendor_promotion/models/stock_warehouse_orderpoint.py b/purchase_vendor_promotion/models/stock_warehouse_orderpoint.py index 2fd217adeba..0dd24b19d72 100644 --- a/purchase_vendor_promotion/models/stock_warehouse_orderpoint.py +++ b/purchase_vendor_promotion/models/stock_warehouse_orderpoint.py @@ -12,6 +12,22 @@ class StockWarehouseOrderpoint(models.Model): ) promotion_date_start = fields.Date(compute="_compute_promotion", store=True) promotion_date_end = fields.Date(compute="_compute_promotion", store=True) + supplier_id = fields.Many2one( + compute="_compute_supplier_id", readonly=False, store=True + ) + + @api.depends("route_id", "route_id.force_vendor_with_best_promotion") + def _compute_supplier_id(self): + for rec in self: + if rec.route_id and rec.route_id.force_vendor_with_best_promotion: + suppliers = rec.product_id._prepare_sellers(False) + promotion_suppliers = suppliers.filtered( + lambda x: x._is_promotion_active_or_upcoming() + ) + if promotion_suppliers: + rec.supplier_id = promotion_suppliers[0].id + elif suppliers: + rec.supplier_id = suppliers[0].id @api.depends("supplier_id") def _compute_promotion(self): diff --git a/purchase_vendor_promotion/readme/CONTRIBUTORS.rst b/purchase_vendor_promotion/readme/CONTRIBUTORS.rst index 8ed3aebaca0..bff50efc42b 100644 --- a/purchase_vendor_promotion/readme/CONTRIBUTORS.rst +++ b/purchase_vendor_promotion/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ * Telmo Santos +* Tris Doan + diff --git a/purchase_vendor_promotion/readme/DESCRIPTION.rst b/purchase_vendor_promotion/readme/DESCRIPTION.rst index 251d9c9c07d..aac1b9c22be 100644 --- a/purchase_vendor_promotion/readme/DESCRIPTION.rst +++ b/purchase_vendor_promotion/readme/DESCRIPTION.rst @@ -1,2 +1,3 @@ -This module allows you to visualise the start and end date of a vendor promotion during replenishment. -A vendor price is considered as a promotion if product supplier info is flagged as a `promotion`. \ No newline at end of file +This module allows you to visualise the start and end date of a vendor promotion during replenishment, in `Inventory > Operations > Replenishment` or `Inventory > Configuration > Products > Reordering Rules`. +A vendor price is considered as a promotion if product supplier info is flagged as a `promotion`. +If "Buy" is chosen as the Preferred Route, the vendor having the best active or upcoming promotion for the product will be automatically chosen. If no promotion is available, then first vendor will be chosen. diff --git a/purchase_vendor_promotion/static/description/index.html b/purchase_vendor_promotion/static/description/index.html index 8707a3e9d17..6c50fe75213 100644 --- a/purchase_vendor_promotion/static/description/index.html +++ b/purchase_vendor_promotion/static/description/index.html @@ -1,20 +1,20 @@ - - + Purchase Vendor Promotion + + +
+

Product Supplier Purchase Contact

+ + +

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

+

This module adds Purchase contact field on supplier rates (product.supplierinfo) +and allows you to use this contact when creating the purchase order from supplies (replacement or to order).

+

Table of contents

+ +
+

Usage

+
    +
  • Go to Purchase > Configuration > Vendor pricelist and create new Vendor pricelist and complete Purchase contact.
  • +
  • Go to Inventory > Operations > Replenishment and create a new replenishment for product with Vendor pricelist created before.
  • +
  • Press button “Order once” and will create a new purchase order for Purchase contact instead of Vendor from Vendor Pricelist.
  • +
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:

    +
    +
      +
    • Carolina Fernandez
    • +
    • Pedro M. Baeza
    • +
    +
    +
  • +
+
+
+

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/product_supplierinfo_purchase_contact/tests/__init__.py b/product_supplierinfo_purchase_contact/tests/__init__.py new file mode 100644 index 00000000000..892a4c70ec7 --- /dev/null +++ b/product_supplierinfo_purchase_contact/tests/__init__.py @@ -0,0 +1 @@ +from . import test_stock_rule diff --git a/product_supplierinfo_purchase_contact/tests/test_stock_rule.py b/product_supplierinfo_purchase_contact/tests/test_stock_rule.py new file mode 100644 index 00000000000..72d8d55a508 --- /dev/null +++ b/product_supplierinfo_purchase_contact/tests/test_stock_rule.py @@ -0,0 +1,94 @@ +# Copyright 2024 Tecnativa - Carolina Fernandez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import common + + +class TestStockRule(common.TransactionCase): + @classmethod + def setUpClass(cls): + super(TestStockRule, cls).setUpClass() + cls.supplierinfo_obj = cls.env["product.supplierinfo"] + cls.partner = cls.env["res.partner"].create( + { + "name": "Mr. Odoo", + } + ) + cls.partner2 = cls.env["res.partner"].create( + { + "name": "Mrs. Odoo 2", + } + ) + cls.product1 = cls.env["product.product"].create( + { + "name": "Test Product 1", + "purchase_method": "purchase", + } + ) + cls.product2 = cls.env["product.product"].create( + { + "name": "Test Product 2", + "purchase_method": "purchase", + } + ) + cls.supplierinfo = cls.supplierinfo_obj.create( + { + "partner_id": cls.partner2.id, + "purchase_partner_id": cls.partner.id, + "product_tmpl_id": cls.product1.product_tmpl_id.id, + "price": 100, + } + ) + cls.supplierinfo2 = cls.supplierinfo_obj.create( + { + "partner_id": cls.partner2.id, + "product_tmpl_id": cls.product2.product_tmpl_id.id, + "price": 50, + } + ) + cls.warehouse = cls.env["stock.warehouse"].search( + [("company_id", "=", cls.env.company.id)], limit=1 + ) + cls.stock_location_id = cls.warehouse.lot_stock_id.id + + def test_replenishment_with_vendor_purchase(self): + op = self.env["stock.warehouse.orderpoint"].create( + { + "name": self.product1.name, + "location_id": self.stock_location_id, + "product_id": self.product1.id, + "product_min_qty": 1, + "product_max_qty": 8, + "trigger": "manual", + } + ) + op.action_replenish() + purchase = self.env["purchase.order"].search( + [("partner_id", "=", self.partner.id)], order="id desc", limit=1 + ) + self.assertEqual(purchase.partner_id, self.supplierinfo.purchase_partner_id) + self.assertEqual(purchase.order_line.product_id, self.product1) + self.assertEqual(purchase.order_line.price_unit, self.supplierinfo.price) + self.assertEqual(purchase.order_line.product_qty, 8) + self.assertEqual(purchase.currency_id, self.supplierinfo.currency_id) + + def test_replenishment_without_vendor_purchase(self): + op = self.env["stock.warehouse.orderpoint"].create( + { + "name": self.product2.name, + "location_id": self.stock_location_id, + "product_id": self.product2.id, + "product_min_qty": 1, + "product_max_qty": 10, + "trigger": "manual", + } + ) + op.action_replenish() + purchase = self.env["purchase.order"].search( + [("partner_id", "=", self.partner2.id)], order="id desc", limit=1 + ) + self.assertEqual(purchase.partner_id, self.supplierinfo2.partner_id) + self.assertEqual(purchase.order_line.product_id, self.product2) + self.assertEqual(purchase.order_line.price_unit, self.supplierinfo2.price) + self.assertEqual(purchase.order_line.product_qty, 10) + self.assertEqual(purchase.currency_id, self.supplierinfo2.currency_id) diff --git a/product_supplierinfo_purchase_contact/views/product_supplierinfo_view.xml b/product_supplierinfo_purchase_contact/views/product_supplierinfo_view.xml new file mode 100644 index 00000000000..45e8301570a --- /dev/null +++ b/product_supplierinfo_purchase_contact/views/product_supplierinfo_view.xml @@ -0,0 +1,27 @@ + + + product.supplierinfo + + + + + + + + + product.supplierinfo + + + + + + + + + diff --git a/setup/product_supplierinfo_purchase_contact/odoo/addons/product_supplierinfo_purchase_contact b/setup/product_supplierinfo_purchase_contact/odoo/addons/product_supplierinfo_purchase_contact new file mode 120000 index 00000000000..f0c8651e0df --- /dev/null +++ b/setup/product_supplierinfo_purchase_contact/odoo/addons/product_supplierinfo_purchase_contact @@ -0,0 +1 @@ +../../../../product_supplierinfo_purchase_contact \ No newline at end of file diff --git a/setup/product_supplierinfo_purchase_contact/setup.py b/setup/product_supplierinfo_purchase_contact/setup.py new file mode 100644 index 00000000000..28c57bb6403 --- /dev/null +++ b/setup/product_supplierinfo_purchase_contact/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 07d42ebd0c429eb32e767f2c0e9878de98d79833 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 3 Jun 2024 14:49:21 +0000 Subject: [PATCH 22/68] [UPD] Update product_supplierinfo_purchase_contact.pot --- .../i18n/product_supplierinfo_purchase_contact.pot | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/product_supplierinfo_purchase_contact/i18n/product_supplierinfo_purchase_contact.pot b/product_supplierinfo_purchase_contact/i18n/product_supplierinfo_purchase_contact.pot index 039e961ea79..4fbd6859f76 100644 --- a/product_supplierinfo_purchase_contact/i18n/product_supplierinfo_purchase_contact.pot +++ b/product_supplierinfo_purchase_contact/i18n/product_supplierinfo_purchase_contact.pot @@ -6,8 +6,6 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-21 14:30+0000\n" -"PO-Revision-Date: 2024-05-21 14:30+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +13,11 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: product_supplierinfo_purchase_contact +#: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id +msgid "Purchase contact" +msgstr "" + #. module: product_supplierinfo_purchase_contact #: model:ir.model,name:product_supplierinfo_purchase_contact.model_stock_rule msgid "Stock Rule" @@ -24,8 +27,3 @@ msgstr "" #: model:ir.model,name:product_supplierinfo_purchase_contact.model_product_supplierinfo msgid "Supplier Pricelist" msgstr "" - -#. module: product_supplierinfo_purchase_contact -#: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id -msgid "Purchase contact" -msgstr "" From ed1720e5e0c13c4606ab9e36398d93819c3dd7e5 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 3 Jun 2024 14:54:43 +0000 Subject: [PATCH 23/68] [BOT] post-merge updates --- README.md | 1 + product_supplierinfo_purchase_contact/README.rst | 2 +- .../static/description/index.html | 2 +- setup/_metapackage/VERSION.txt | 2 +- setup/_metapackage/setup.py | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 55b53798a5f..083b31e1f69 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [procurement_purchase_no_grouping](procurement_purchase_no_grouping/) | 16.0.1.0.0 | | Procurement Purchase No Grouping [product_supplier_code_purchase](product_supplier_code_purchase/) | 16.0.1.0.0 | | This module adds to the purchase order line the supplier code defined in the product. +[product_supplierinfo_purchase_contact](product_supplierinfo_purchase_contact/) | 16.0.1.0.0 | | Add Purchase Contact in product supplier info [product_supplierinfo_qty_multiplier](product_supplierinfo_qty_multiplier/) | 16.0.1.0.0 | [![victoralmau](https://github.com/victoralmau.png?size=30px)](https://github.com/victoralmau) [![legalsylvain](https://github.com/legalsylvain.png?size=30px)](https://github.com/legalsylvain) | Product supplierinfo qty multiplier [purchase_advance_payment](purchase_advance_payment/) | 16.0.1.0.1 | | Allow to add advance payments on purchase orders [purchase_all_shipments](purchase_all_shipments/) | 16.0.1.0.0 | | Purchase All Shipments diff --git a/product_supplierinfo_purchase_contact/README.rst b/product_supplierinfo_purchase_contact/README.rst index fd580fbfc72..820b509dbcd 100644 --- a/product_supplierinfo_purchase_contact/README.rst +++ b/product_supplierinfo_purchase_contact/README.rst @@ -7,7 +7,7 @@ Product Supplier Purchase Contact !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2b2335f8ea79127403360883b46713395304079e663d64d45141ca493c4d4ed3 + !! source digest: sha256:d1598d26a4766084ce5484761197815fadc9fbd2f45764a9dfdc3ef360c3df6b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/product_supplierinfo_purchase_contact/static/description/index.html b/product_supplierinfo_purchase_contact/static/description/index.html index 6ce808d2884..6a281c8a7d3 100644 --- a/product_supplierinfo_purchase_contact/static/description/index.html +++ b/product_supplierinfo_purchase_contact/static/description/index.html @@ -366,7 +366,7 @@

Product Supplier Purchase Contact

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:2b2335f8ea79127403360883b46713395304079e663d64d45141ca493c4d4ed3 +!! source digest: sha256:d1598d26a4766084ce5484761197815fadc9fbd2f45764a9dfdc3ef360c3df6b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds Purchase contact field on supplier rates (product.supplierinfo) diff --git a/setup/_metapackage/VERSION.txt b/setup/_metapackage/VERSION.txt index 75db654efc5..01595fc9f21 100644 --- a/setup/_metapackage/VERSION.txt +++ b/setup/_metapackage/VERSION.txt @@ -1 +1 @@ -16.0.20240511.0 \ No newline at end of file +16.0.20240603.0 \ No newline at end of file diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py index ee0d724aa36..05ba755b236 100644 --- a/setup/_metapackage/setup.py +++ b/setup/_metapackage/setup.py @@ -10,6 +10,7 @@ install_requires=[ 'odoo-addon-procurement_purchase_no_grouping>=16.0dev,<16.1dev', 'odoo-addon-product_supplier_code_purchase>=16.0dev,<16.1dev', + 'odoo-addon-product_supplierinfo_purchase_contact>=16.0dev,<16.1dev', 'odoo-addon-product_supplierinfo_qty_multiplier>=16.0dev,<16.1dev', 'odoo-addon-purchase_advance_payment>=16.0dev,<16.1dev', 'odoo-addon-purchase_all_shipments>=16.0dev,<16.1dev', From f9ebf37da610e6bce78b2b8b2c6110913fa3a8c9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 3 Jun 2024 15:09:02 +0000 Subject: [PATCH 24/68] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: purchase-workflow-16.0/purchase-workflow-16.0-product_supplierinfo_purchase_contact Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-product_supplierinfo_purchase_contact/ --- product_supplierinfo_purchase_contact/i18n/es.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/product_supplierinfo_purchase_contact/i18n/es.po b/product_supplierinfo_purchase_contact/i18n/es.po index 490f5b93e1b..bf2e068882c 100644 --- a/product_supplierinfo_purchase_contact/i18n/es.po +++ b/product_supplierinfo_purchase_contact/i18n/es.po @@ -10,11 +10,17 @@ msgstr "" "PO-Revision-Date: 2024-05-21 14:32+0000\n" "Last-Translator: \n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: product_supplierinfo_purchase_contact +#: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id +msgid "Purchase contact" +msgstr "Contacto de compra" + #. module: product_supplierinfo_purchase_contact #: model:ir.model,name:product_supplierinfo_purchase_contact.model_stock_rule msgid "Stock Rule" @@ -24,8 +30,3 @@ msgstr "Regla de Inventario" #: model:ir.model,name:product_supplierinfo_purchase_contact.model_product_supplierinfo msgid "Supplier Pricelist" msgstr "Tarifa de proveedor" - -#. module: product_supplierinfo_purchase_contact -#: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id -msgid "Purchase contact" -msgstr "Contacto de compra" From 0f26a7755bf037d1fa6d8093d3d9657e0ee17e0f Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 4 Jun 2024 12:41:11 +0000 Subject: [PATCH 25/68] Added translation using Weblate (Italian) --- .../i18n/it.po | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 product_supplierinfo_purchase_contact/i18n/it.po diff --git a/product_supplierinfo_purchase_contact/i18n/it.po b/product_supplierinfo_purchase_contact/i18n/it.po new file mode 100644 index 00000000000..bbbb6c1f8d7 --- /dev/null +++ b/product_supplierinfo_purchase_contact/i18n/it.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_supplierinfo_purchase_contact +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: product_supplierinfo_purchase_contact +#: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id +msgid "Purchase contact" +msgstr "" + +#. module: product_supplierinfo_purchase_contact +#: model:ir.model,name:product_supplierinfo_purchase_contact.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: product_supplierinfo_purchase_contact +#: model:ir.model,name:product_supplierinfo_purchase_contact.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" From e09002d4312caf541d405613430e08f727dc620a Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 4 Jun 2024 12:46:58 +0000 Subject: [PATCH 26/68] Translated using Weblate (Italian) Currently translated at 100.0% (3 of 3 strings) Translation: purchase-workflow-16.0/purchase-workflow-16.0-product_supplierinfo_purchase_contact Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-product_supplierinfo_purchase_contact/it/ --- product_supplierinfo_purchase_contact/i18n/it.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/product_supplierinfo_purchase_contact/i18n/it.po b/product_supplierinfo_purchase_contact/i18n/it.po index bbbb6c1f8d7..d8b8a01aaba 100644 --- a/product_supplierinfo_purchase_contact/i18n/it.po +++ b/product_supplierinfo_purchase_contact/i18n/it.po @@ -6,25 +6,27 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-06-04 15:38+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: product_supplierinfo_purchase_contact #: model:ir.model.fields,field_description:product_supplierinfo_purchase_contact.field_product_supplierinfo__purchase_partner_id msgid "Purchase contact" -msgstr "" +msgstr "Contratto di acquisto" #. module: product_supplierinfo_purchase_contact #: model:ir.model,name:product_supplierinfo_purchase_contact.model_stock_rule msgid "Stock Rule" -msgstr "" +msgstr "Regola di giacenza" #. module: product_supplierinfo_purchase_contact #: model:ir.model,name:product_supplierinfo_purchase_contact.model_product_supplierinfo msgid "Supplier Pricelist" -msgstr "" +msgstr "Listino prezzi fornitore" From 49a8852e2e2143e27ed8236b53da3d85278bf4be Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 5 Jun 2024 23:39:05 +0200 Subject: [PATCH 27/68] [FIX] purchase_discount : transmits correctly discount value to account.move.line, if account_invoice_triple_discount is installed. (See refactoring https://github.com/OCA/account-invoicing/pull/1638) --- purchase_discount/models/purchase_order.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/purchase_discount/models/purchase_order.py b/purchase_discount/models/purchase_order.py index e502da8d6c0..036fd01a7ce 100644 --- a/purchase_discount/models/purchase_order.py +++ b/purchase_discount/models/purchase_order.py @@ -110,8 +110,12 @@ def _apply_value_from_seller(self, seller): self.discount = seller.discount def _prepare_account_move_line(self, move=False): - vals = super(PurchaseOrderLine, self)._prepare_account_move_line(move) - vals["discount"] = self.discount + vals = super()._prepare_account_move_line(move) + if self.env["account.move.line"]._fields.get("discount1", False): + # OCA/account_invoice_triple_discount is installed + vals["discount1"] = self.discount + else: + vals["discount"] = self.discount return vals @api.model From e5e16337515fb873b07ca836e29fbdbcbda3f751 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 10 Jun 2024 08:16:25 +0000 Subject: [PATCH 28/68] [BOT] post-merge updates --- README.md | 2 +- purchase_discount/README.rst | 2 +- purchase_discount/__manifest__.py | 2 +- purchase_discount/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 083b31e1f69..4e712e517e3 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ addon | version | maintainers | summary [purchase_default_terms_conditions](purchase_default_terms_conditions/) | 16.0.1.0.3 | | This module allows purchase default terms & conditions [purchase_delivery_split_date](purchase_delivery_split_date/) | 16.0.1.0.2 | | Allows Purchase Order you confirm to generate one Incoming Shipment for each expected date indicated in the Purchase Order Lines [purchase_deposit](purchase_deposit/) | 16.0.1.0.1 | | Option to create deposit from purchase order -[purchase_discount](purchase_discount/) | 16.0.1.2.1 | | Purchase order lines with discounts +[purchase_discount](purchase_discount/) | 16.0.1.2.2 | | Purchase order lines with discounts [purchase_exception](purchase_exception/) | 16.0.1.0.1 | | Custom exceptions on purchase order [purchase_fop_shipping](purchase_fop_shipping/) | 16.0.1.0.1 | | Purchase Free-Of-Payment shipping [purchase_force_invoiced](purchase_force_invoiced/) | 16.0.1.0.1 | | Allows to force the billing status of the purchase order to "Invoiced" diff --git a/purchase_discount/README.rst b/purchase_discount/README.rst index bfbd9302686..26fb3372786 100644 --- a/purchase_discount/README.rst +++ b/purchase_discount/README.rst @@ -7,7 +7,7 @@ Purchase order lines with discounts !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a482b22beb2421553280eb1c2b4d7251146b80e1bc766a5481597b3009fcb51b + !! source digest: sha256:e79e477241682ae20e88945fdf996d1ac075fc50309f70ecf6169888c146550f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_discount/__manifest__.py b/purchase_discount/__manifest__.py index 3ee69441d3a..c9df94eb26e 100644 --- a/purchase_discount/__manifest__.py +++ b/purchase_discount/__manifest__.py @@ -10,7 +10,7 @@ "ACSONE SA/NV," "GRAP," "Odoo Community Association (OCA)", - "version": "16.0.1.2.1", + "version": "16.0.1.2.2", "category": "Purchase Management", "website": "https://github.com/OCA/purchase-workflow", "depends": ["purchase_stock"], diff --git a/purchase_discount/static/description/index.html b/purchase_discount/static/description/index.html index 57b2ce385e3..b4c6cab837d 100644 --- a/purchase_discount/static/description/index.html +++ b/purchase_discount/static/description/index.html @@ -366,7 +366,7 @@

Purchase order lines with discounts

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:a482b22beb2421553280eb1c2b4d7251146b80e1bc766a5481597b3009fcb51b +!! source digest: sha256:e79e477241682ae20e88945fdf996d1ac075fc50309f70ecf6169888c146550f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module allows to define a discount per line in the purchase orders. This From bd93941eeb99069c753420f2111aea7c9bb2bb91 Mon Sep 17 00:00:00 2001 From: lreficent Date: Mon, 3 Apr 2017 13:01:51 +0200 Subject: [PATCH 29/68] purchase_date_planned_manual --- purchase_date_planned_manual/README.rst | 73 ++++++++++++++++++ purchase_date_planned_manual/__init__.py | 6 ++ purchase_date_planned_manual/__openerp__.py | 22 ++++++ .../models/__init__.py | 7 ++ .../models/procurement_order.py | 19 +++++ .../models/purchase_order.py | 68 ++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../views/purchase_order_view.xml | 27 +++++++ 8 files changed, 222 insertions(+) create mode 100644 purchase_date_planned_manual/README.rst create mode 100644 purchase_date_planned_manual/__init__.py create mode 100644 purchase_date_planned_manual/__openerp__.py create mode 100644 purchase_date_planned_manual/models/__init__.py create mode 100644 purchase_date_planned_manual/models/procurement_order.py create mode 100644 purchase_date_planned_manual/models/purchase_order.py create mode 100644 purchase_date_planned_manual/static/description/icon.png create mode 100644 purchase_date_planned_manual/views/purchase_order_view.xml diff --git a/purchase_date_planned_manual/README.rst b/purchase_date_planned_manual/README.rst new file mode 100644 index 00000000000..ed7c07c320c --- /dev/null +++ b/purchase_date_planned_manual/README.rst @@ -0,0 +1,73 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============================ +Purchase Date Planned Manual +============================ + +This module makes the system to always respect the planned (or scheduled) +date set by the user when creating a Purchase order or the day set in the +procurement order if the line is created from there. + +Additionally, this module modifies the PO views and sets in red the lines +that are predicted to arrive late compared to the scheduled date and vendor +lead time. + +Usage +===== + +To use this module you could follow any of the two options below: + +#. Go to 'Purchase' and create a purchase order. +#. Manually set the scheduled date in the PO lines. +#. This date will never be modified by the system and the lines that are + expected to be late are highlighted in red. + +Or: + +#. Create a procurement order for a product that can be bought and have the + route 'buy' activated. +#. Run the procurement. +#. Now the scheduled date in the procurement is respected even if the line is + added to a previously existing PO. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/142/9.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 +------------ + +* Lois Rilo + +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_date_planned_manual/__init__.py b/purchase_date_planned_manual/__init__.py new file mode 100644 index 00000000000..e50f9b65687 --- /dev/null +++ b/purchase_date_planned_manual/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/purchase_date_planned_manual/__openerp__.py b/purchase_date_planned_manual/__openerp__.py new file mode 100644 index 00000000000..6a1a7ed6d4d --- /dev/null +++ b/purchase_date_planned_manual/__openerp__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Date Planned Manual", + "summary": "This module makes the system to always respect the planned " + "(or scheduled) date in PO lines.", + "version": "9.0.1.0.0", + "author": "Eficent, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "category": "Purchases", + "depends": ["purchase"], + "data": [ + 'views/purchase_order_view.xml', + ], + "license": "AGPL-3", + "installable": True, + "application": False, +} diff --git a/purchase_date_planned_manual/models/__init__.py b/purchase_date_planned_manual/models/__init__.py new file mode 100644 index 00000000000..27cc4d8962e --- /dev/null +++ b/purchase_date_planned_manual/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import purchase_order +from . import procurement_order diff --git a/purchase_date_planned_manual/models/procurement_order.py b/purchase_date_planned_manual/models/procurement_order.py new file mode 100644 index 00000000000..e9acfd3aaf7 --- /dev/null +++ b/purchase_date_planned_manual/models/procurement_order.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from openerp import api, models + + +class ProcurementOrder(models.Model): + _inherit = 'procurement.order' + + @api.multi + def _prepare_purchase_order_line(self, po, supplier): + """When creating PO lines mantain as scheduled date the one specified + in the procurement.""" + res = super(ProcurementOrder, self)._prepare_purchase_order_line( + po, supplier) + res['date_planned'] = self.date_planned + return res diff --git a/purchase_date_planned_manual/models/purchase_order.py b/purchase_date_planned_manual/models/purchase_order.py new file mode 100644 index 00000000000..2a0c2cb3b1a --- /dev/null +++ b/purchase_date_planned_manual/models/purchase_order.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from openerp import api, fields, models, _ +from datetime import datetime +from dateutil.relativedelta import relativedelta +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT +from openerp.exceptions import UserError + + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + @api.multi + def _compute_predicted_arrival_late(self): + """Colour the lines in red if the products are predicted to arrive + late.""" + for line in self: + seller = line.product_id._select_seller( + line.product_id, + partner_id=line.partner_id, + quantity=line.product_qty, + date=line.order_id.date_order and + line.order_id.date_order[:10], + uom_id=line.product_uom) + order_date = datetime.strptime(line.order_id.date_order, + DEFAULT_SERVER_DATETIME_FORMAT) + po_lead = line.order_id.company_id.po_lead + delta = po_lead + seller.delay if seller else po_lead + date_expected = (order_date + relativedelta(days=delta)).strftime( + DEFAULT_SERVER_DATETIME_FORMAT) + line.predicted_arrival_late = ( + date_expected > line.date_planned and line.order_id.state == + 'draft') + + predicted_arrival_late = fields.Boolean( + string='Planned to be late', + compute=_compute_predicted_arrival_late, + help='True if the arrival at scheduled date is planned to be late. ' + 'Takes into account the vendor lead time and the company margin ' + 'for lead times.') + + @api.model + def _get_date_planned(self, seller, po=False): + """Do not change the scheduled date if we already have one.""" + if self.date_planned: + return datetime.strptime( + self.date_planned, DEFAULT_SERVER_DATETIME_FORMAT) + else: + return super(PurchaseOrderLine, self)._get_date_planned(seller, po) + + @api.multi + def action_delayed_line(self): + raise UserError(_('This line is scheduled for: %s. \n However it is ' + 'now planned to arrive late.') % self.date_planned) + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + @api.multi + def _inverse_date_planned(self): + """WARNING: This overwrites a standard method. + This is done because we don't want to change the scheduled date for + the PO lines in any scenario.""" + pass diff --git a/purchase_date_planned_manual/static/description/icon.png b/purchase_date_planned_manual/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 diff --git a/purchase_date_planned_manual/views/purchase_order_view.xml b/purchase_date_planned_manual/views/purchase_order_view.xml new file mode 100644 index 00000000000..3ca699a4e81 --- /dev/null +++ b/purchase_date_planned_manual/views/purchase_order_view.xml @@ -0,0 +1,27 @@ + + + + + + purchase.order.form - purchase_date_planned_manual + extension + purchase.order + + + + +