From da9b2090254d1290265db5a026a84d33772ad283 Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Mon, 11 Apr 2022 10:43:03 +0530 Subject: [PATCH 001/207] [ADD] purchase_tag --- purchase_tag/README.rst | 78 ++++ purchase_tag/__init__.py | 3 + purchase_tag/__manifest__.py | 21 + purchase_tag/i18n/purchase_tag.pot | 91 +++++ purchase_tag/models/__init__.py | 2 + purchase_tag/models/purchase_order.py | 17 + purchase_tag/models/purchase_tag.py | 22 ++ purchase_tag/readme/CONTRIBUTORS.rst | 1 + purchase_tag/readme/DESCRIPTION.rst | 1 + purchase_tag/readme/USAGE.rst | 1 + purchase_tag/security/ir.model.access.csv | 3 + purchase_tag/static/description/icon.png | Bin 0 -> 9455 bytes purchase_tag/static/description/index.html | 424 +++++++++++++++++++++ purchase_tag/views/purchase_tag_view.xml | 59 +++ purchase_tag/views/purchase_view.xml | 53 +++ 15 files changed, 776 insertions(+) create mode 100644 purchase_tag/README.rst create mode 100644 purchase_tag/__init__.py create mode 100644 purchase_tag/__manifest__.py create mode 100644 purchase_tag/i18n/purchase_tag.pot create mode 100644 purchase_tag/models/__init__.py create mode 100644 purchase_tag/models/purchase_order.py create mode 100644 purchase_tag/models/purchase_tag.py create mode 100644 purchase_tag/readme/CONTRIBUTORS.rst create mode 100644 purchase_tag/readme/DESCRIPTION.rst create mode 100644 purchase_tag/readme/USAGE.rst create mode 100644 purchase_tag/security/ir.model.access.csv create mode 100644 purchase_tag/static/description/icon.png create mode 100644 purchase_tag/static/description/index.html create mode 100644 purchase_tag/views/purchase_tag_view.xml create mode 100644 purchase_tag/views/purchase_view.xml diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst new file mode 100644 index 00000000000..c4885925c35 --- /dev/null +++ b/purchase_tag/README.rst @@ -0,0 +1,78 @@ +============= +Purchase Tags +============= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/14.0/purchase_tag + :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-14-0/purchase-workflow-14-0-purchase_tag + :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/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to add multiple tags to purchase orders + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to go to Purchase Orders and select tags. + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Jasmin Solanki + +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/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_tag/__init__.py b/purchase_tag/__init__.py new file mode 100644 index 00000000000..4b76c7b2d5c --- /dev/null +++ b/purchase_tag/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/purchase_tag/__manifest__.py b/purchase_tag/__manifest__.py new file mode 100644 index 00000000000..b4769b08e6c --- /dev/null +++ b/purchase_tag/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2022 ForgeFlow S.L. +# (http://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Tags", + "summary": "Allows to add multiple tags to purchase orders", + "version": "14.0.1.0.0", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", + "category": "Purchases", + "depends": ["purchase"], + "data": [ + "security/ir.model.access.csv", + "views/purchase_view.xml", + "views/purchase_tag_view.xml", + ], + "license": "AGPL-3", + "installable": True, + "application": False, +} diff --git a/purchase_tag/i18n/purchase_tag.pot b/purchase_tag/i18n/purchase_tag.pot new file mode 100644 index 00000000000..c11457721aa --- /dev/null +++ b/purchase_tag/i18n/purchase_tag.pot @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_tag +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__color +msgid "Color" +msgstr "" + +#. module: purchase_tag +#: model_terms:ir.actions.act_window,help:purchase_tag.purchase_tag_action +msgid "Create new tags for your purchase orders" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__create_uid +msgid "Created by" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__create_date +msgid "Created on" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__display_name +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__id +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__id +msgid "ID" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order____last_update +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag____last_update +msgid "Last Modified on" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__write_date +msgid "Last Updated on" +msgstr "" + +#. module: purchase_tag +#: model:ir.model,name:purchase_tag.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_tag +#: model:ir.model,name:purchase_tag.model_purchase_tag +msgid "Purchase Tag" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__name +msgid "Tag Name" +msgstr "" + +#. module: purchase_tag +#: model:ir.model.constraint,message:purchase_tag.constraint_purchase_tag_tag_name_uniq +msgid "Tag name already exists !" +msgstr "" + +#. module: purchase_tag +#: model:ir.actions.act_window,name:purchase_tag.purchase_tag_action +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__tag_ids +#: model:ir.ui.menu,name:purchase_tag.menu_purchase_tag_config +#: model_terms:ir.ui.view,arch_db:purchase_tag.purchase_tag_view_form +#: model_terms:ir.ui.view,arch_db:purchase_tag.purchase_tag_view_tree +msgid "Tags" +msgstr "" diff --git a/purchase_tag/models/__init__.py b/purchase_tag/models/__init__.py new file mode 100644 index 00000000000..d54d894c559 --- /dev/null +++ b/purchase_tag/models/__init__.py @@ -0,0 +1,2 @@ +from . import purchase_tag +from . import purchase_order diff --git a/purchase_tag/models/purchase_order.py b/purchase_tag/models/purchase_order.py new file mode 100644 index 00000000000..5267d137cc4 --- /dev/null +++ b/purchase_tag/models/purchase_order.py @@ -0,0 +1,17 @@ +# Copyright 2022 ForgeFlow S.L. +# (http://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + tag_ids = fields.Many2many( + comodel_name="purchase.tag", + relation="purchase_order_tag_rel", + column1="purchase_order_id", + column2="tag_id", + string="Tags", + ) diff --git a/purchase_tag/models/purchase_tag.py b/purchase_tag/models/purchase_tag.py new file mode 100644 index 00000000000..2edd5f685b6 --- /dev/null +++ b/purchase_tag/models/purchase_tag.py @@ -0,0 +1,22 @@ +# Copyright 2022 ForgeFlow S.L. +# (http://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from random import randint + +from odoo import fields, models + + +class PurchaseTag(models.Model): + _name = "purchase.tag" + _description = "Purchase Tag" + + def _get_default_color(self): + return randint(1, 11) + + name = fields.Char("Tag Name", required=True, translate=True) + color = fields.Integer("Color", default=_get_default_color) + + _sql_constraints = [ + ("tag_name_uniq", "unique (name)", "Tag name already exists !"), + ] diff --git a/purchase_tag/readme/CONTRIBUTORS.rst b/purchase_tag/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..205106e557d --- /dev/null +++ b/purchase_tag/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Jasmin Solanki diff --git a/purchase_tag/readme/DESCRIPTION.rst b/purchase_tag/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..feb507c6000 --- /dev/null +++ b/purchase_tag/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to add multiple tags to purchase orders diff --git a/purchase_tag/readme/USAGE.rst b/purchase_tag/readme/USAGE.rst new file mode 100644 index 00000000000..7e54d63369c --- /dev/null +++ b/purchase_tag/readme/USAGE.rst @@ -0,0 +1 @@ +To use this module, you need to go to Purchase Orders and select tags. diff --git a/purchase_tag/security/ir.model.access.csv b/purchase_tag/security/ir.model.access.csv new file mode 100644 index 00000000000..8ad7fcd8e8a --- /dev/null +++ b/purchase_tag/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_purchase_tag,purchase_tag,model_purchase_tag,base.group_user,1,0,0,0 +access_purchase_tag_manager,purchase_tag_manager,model_purchase_tag,purchase.group_purchase_manager,1,1,1,1 diff --git a/purchase_tag/static/description/icon.png b/purchase_tag/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_tag/static/description/index.html b/purchase_tag/static/description/index.html new file mode 100644 index 00000000000..9cba381af2c --- /dev/null +++ b/purchase_tag/static/description/index.html @@ -0,0 +1,424 @@ + + + + + + +Purchase Tags + + + +
+

Purchase Tags

+ + +

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

+

This module allows to add multiple tags to purchase orders

+

Table of contents

+ +
+

Usage

+

To use this module, you need to go to Purchase Orders and select tags.

+
+
+

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

+
    +
  • ForgeFlow
  • +
+
+
+

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_tag/views/purchase_tag_view.xml b/purchase_tag/views/purchase_tag_view.xml new file mode 100644 index 00000000000..b7f0a09b8d9 --- /dev/null +++ b/purchase_tag/views/purchase_tag_view.xml @@ -0,0 +1,59 @@ + + + + + + + purchase.tag.view.form + purchase.tag + +
+ +
+
+
+

+ +

+
+ + + + + +
+
+
+
+ + + purchase.tag.view.tree + purchase.tag + + + + + + + + + + Tags + purchase.tag + + +

+ Create new tags for your purchase orders +

+
+
+ + +
diff --git a/purchase_tag/views/purchase_view.xml b/purchase_tag/views/purchase_view.xml new file mode 100644 index 00000000000..ab6d2ebde18 --- /dev/null +++ b/purchase_tag/views/purchase_view.xml @@ -0,0 +1,53 @@ + + + + + + + purchase.order.form + purchase.order + + + + + + + + + + purchase.order.tree + purchase.order + + + + + + + + + + purchase.order.tree + purchase.order + + + + + + + + + From 7d7ef845dd29e52e70a7f5ca0394ef8db4c82012 Mon Sep 17 00:00:00 2001 From: Emeric Panisset Date: Fri, 28 Oct 2022 15:08:37 +0200 Subject: [PATCH 002/207] [MIG] purchase_tag: Migration to 15.0 --- purchase_tag/README.rst | 10 +++++----- purchase_tag/__manifest__.py | 2 +- purchase_tag/i18n/purchase_tag.pot | 6 +----- purchase_tag/models/purchase_tag.py | 2 +- purchase_tag/static/description/index.html | 6 +++--- purchase_tag/views/purchase_tag_view.xml | 2 +- 6 files changed, 12 insertions(+), 16 deletions(-) diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst index c4885925c35..068d5fbe5fd 100644 --- a/purchase_tag/README.rst +++ b/purchase_tag/README.rst @@ -14,13 +14,13 @@ Purchase Tags :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/14.0/purchase_tag + :target: https://github.com/OCA/purchase-workflow/tree/15.0/purchase_tag :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-14-0/purchase-workflow-14-0-purchase_tag + :target: https://translation.odoo-community.org/projects/purchase-workflow-15-0/purchase-workflow-15-0-purchase_tag :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/14.0 + :target: https://runbot.odoo-community.org/runbot/142/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -43,7 +43,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. @@ -73,6 +73,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/purchase-workflow `_ project on GitHub. +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_tag/__manifest__.py b/purchase_tag/__manifest__.py index b4769b08e6c..230b997b280 100644 --- a/purchase_tag/__manifest__.py +++ b/purchase_tag/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Tags", "summary": "Allows to add multiple tags to purchase orders", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchases", diff --git a/purchase_tag/i18n/purchase_tag.pot b/purchase_tag/i18n/purchase_tag.pot index c11457721aa..964c99c1dac 100644 --- a/purchase_tag/i18n/purchase_tag.pot +++ b/purchase_tag/i18n/purchase_tag.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -34,19 +34,16 @@ msgid "Created on" msgstr "" #. module: purchase_tag -#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__display_name #: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__display_name msgid "Display Name" msgstr "" #. module: purchase_tag -#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__id #: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__id msgid "ID" msgstr "" #. module: purchase_tag -#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order____last_update #: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag____last_update msgid "Last Modified on" msgstr "" @@ -86,6 +83,5 @@ msgstr "" #: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__tag_ids #: model:ir.ui.menu,name:purchase_tag.menu_purchase_tag_config #: model_terms:ir.ui.view,arch_db:purchase_tag.purchase_tag_view_form -#: model_terms:ir.ui.view,arch_db:purchase_tag.purchase_tag_view_tree msgid "Tags" msgstr "" diff --git a/purchase_tag/models/purchase_tag.py b/purchase_tag/models/purchase_tag.py index 2edd5f685b6..04f04867c92 100644 --- a/purchase_tag/models/purchase_tag.py +++ b/purchase_tag/models/purchase_tag.py @@ -15,7 +15,7 @@ def _get_default_color(self): return randint(1, 11) name = fields.Char("Tag Name", required=True, translate=True) - color = fields.Integer("Color", default=_get_default_color) + color = fields.Integer(default=_get_default_color) _sql_constraints = [ ("tag_name_uniq", "unique (name)", "Tag name already exists !"), diff --git a/purchase_tag/static/description/index.html b/purchase_tag/static/description/index.html index 9cba381af2c..560fc91f033 100644 --- a/purchase_tag/static/description/index.html +++ b/purchase_tag/static/description/index.html @@ -367,7 +367,7 @@

Purchase Tags

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

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

+

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

This module allows to add multiple tags to purchase orders

Table of contents

@@ -391,7 +391,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.

@@ -415,7 +415,7 @@

Maintainers

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.

+

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_tag/views/purchase_tag_view.xml b/purchase_tag/views/purchase_tag_view.xml index b7f0a09b8d9..dfcc7a81112 100644 --- a/purchase_tag/views/purchase_tag_view.xml +++ b/purchase_tag/views/purchase_tag_view.xml @@ -31,7 +31,7 @@ purchase.tag.view.tree purchase.tag - + From 2ccdabf49ca2417167679a95d9c0bc12454344a2 Mon Sep 17 00:00:00 2001 From: Alex Guardado Date: Mon, 5 Jun 2023 13:47:50 +0200 Subject: [PATCH 003/207] [MIG] purchase_tag: Migration to 16.0 --- purchase_tag/README.rst | 10 +++++----- purchase_tag/__manifest__.py | 2 +- purchase_tag/i18n/purchase_tag.pot | 2 +- purchase_tag/static/description/index.html | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst index 068d5fbe5fd..eda7abcae2a 100644 --- a/purchase_tag/README.rst +++ b/purchase_tag/README.rst @@ -14,13 +14,13 @@ Purchase Tags :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/15.0/purchase_tag + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_tag :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-15-0/purchase-workflow-15-0-purchase_tag + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_tag :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/15.0 + :target: https://runbot.odoo-community.org/runbot/142/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -43,7 +43,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. @@ -73,6 +73,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/purchase-workflow `_ project on GitHub. +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_tag/__manifest__.py b/purchase_tag/__manifest__.py index 230b997b280..0c2e4be7f5e 100644 --- a/purchase_tag/__manifest__.py +++ b/purchase_tag/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Tags", "summary": "Allows to add multiple tags to purchase orders", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchases", diff --git a/purchase_tag/i18n/purchase_tag.pot b/purchase_tag/i18n/purchase_tag.pot index 964c99c1dac..c8e90d6ef98 100644 --- a/purchase_tag/i18n/purchase_tag.pot +++ b/purchase_tag/i18n/purchase_tag.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/purchase_tag/static/description/index.html b/purchase_tag/static/description/index.html index 560fc91f033..bb82a162cf5 100644 --- a/purchase_tag/static/description/index.html +++ b/purchase_tag/static/description/index.html @@ -367,7 +367,7 @@

Purchase Tags

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

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

+

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

This module allows to add multiple tags to purchase orders

Table of contents

@@ -391,7 +391,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.

@@ -415,7 +415,7 @@

Maintainers

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.

+

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.

From 0cfcd160ff2f9c018a8461678f72dfc56d7806b7 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Mon, 21 Aug 2023 16:04:40 +0000 Subject: [PATCH 004/207] Added translation using Weblate (Spanish) --- purchase_tag/README.rst | 15 ++-- purchase_tag/i18n/es.po | 90 ++++++++++++++++++++++ purchase_tag/static/description/index.html | 38 ++++----- 3 files changed, 119 insertions(+), 24 deletions(-) create mode 100644 purchase_tag/i18n/es.po diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst index eda7abcae2a..9dcc18944e7 100644 --- a/purchase_tag/README.rst +++ b/purchase_tag/README.rst @@ -2,10 +2,13 @@ Purchase Tags ============= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:5a4077180ca35330dc5f9467e43ce635eb0733c8f4b8114917aca5b784833a4a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Purchase Tags .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_tag :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/16.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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows to add multiple tags to purchase orders @@ -42,7 +45,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/purchase_tag/i18n/es.po b/purchase_tag/i18n/es.po new file mode 100644 index 00000000000..9217e2dbb43 --- /dev/null +++ b/purchase_tag/i18n/es.po @@ -0,0 +1,90 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_tag +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-09-03 13:40+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__color +msgid "Color" +msgstr "Color" + +#. module: purchase_tag +#: model_terms:ir.actions.act_window,help:purchase_tag.purchase_tag_action +msgid "Create new tags for your purchase orders" +msgstr "Crea nuevas etiquetas para tus órdenes de compra" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__write_uid +msgid "Last Updated by" +msgstr "Actualizado por última vez por" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: purchase_tag +#: model:ir.model,name:purchase_tag.model_purchase_order +msgid "Purchase Order" +msgstr "Orden de compra" + +#. module: purchase_tag +#: model:ir.model,name:purchase_tag.model_purchase_tag +msgid "Purchase Tag" +msgstr "Etiqueta de compra" + +#. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__name +msgid "Tag Name" +msgstr "Nombre de etiqueta" + +#. module: purchase_tag +#: model:ir.model.constraint,message:purchase_tag.constraint_purchase_tag_tag_name_uniq +msgid "Tag name already exists !" +msgstr "¡El nombre de etiqueta ya existe!" + +#. module: purchase_tag +#: model:ir.actions.act_window,name:purchase_tag.purchase_tag_action +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__tag_ids +#: model:ir.ui.menu,name:purchase_tag.menu_purchase_tag_config +#: model_terms:ir.ui.view,arch_db:purchase_tag.purchase_tag_view_form +msgid "Tags" +msgstr "Etiquetas" diff --git a/purchase_tag/static/description/index.html b/purchase_tag/static/description/index.html index bb82a162cf5..63a828a3393 100644 --- a/purchase_tag/static/description/index.html +++ b/purchase_tag/static/description/index.html @@ -1,20 +1,20 @@ - + - + Purchase Tags -
-

Purchase Tags

+
+ + +Odoo Community Association + +
+

Purchase Tags

-

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

+

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

This module allows to add multiple tags to purchase orders

Table of contents

@@ -385,11 +390,11 @@

Purchase Tags

-

Usage

+

Usage

To use this module, you need to go to Purchase Orders and select tags.

-

Bug Tracker

+

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 @@ -397,21 +402,21 @@

Bug Tracker

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

+
From 1e560971844dd586a7f68ed649757d1105a98f39 Mon Sep 17 00:00:00 2001 From: Ruchir Shukla Date: Fri, 3 Oct 2025 16:55:36 +0530 Subject: [PATCH 019/207] [MIG] purchase_tag: Migration to 19.0 --- purchase_tag/README.rst | 10 +++++----- purchase_tag/__manifest__.py | 2 +- purchase_tag/models/purchase_tag.py | 7 ++++--- purchase_tag/static/description/index.html | 6 +++--- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst index 869ddc6bee4..38472ea3935 100644 --- a/purchase_tag/README.rst +++ b/purchase_tag/README.rst @@ -21,13 +21,13 @@ Purchase Tags :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/18.0/purchase_tag + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_tag :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-18-0/purchase-workflow-18-0-purchase_tag + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_tag :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -50,7 +50,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,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/purchase-workflow `_ project on GitHub. +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_tag/__manifest__.py b/purchase_tag/__manifest__.py index d5712e615aa..2db1a9b61f4 100644 --- a/purchase_tag/__manifest__.py +++ b/purchase_tag/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Tags", "summary": "Allows to add multiple tags to purchase orders", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchases", diff --git a/purchase_tag/models/purchase_tag.py b/purchase_tag/models/purchase_tag.py index 524f6dedf43..4277a6965c3 100644 --- a/purchase_tag/models/purchase_tag.py +++ b/purchase_tag/models/purchase_tag.py @@ -21,9 +21,10 @@ def _get_default_color(self): child_ids = fields.One2many("purchase.tag", "parent_id") parent_path = fields.Char(index=True) - _sql_constraints = [ - ("tag_name_uniq", "unique (name)", "Tag name already exists !"), - ] + _tag_name_uniq = models.Constraint( + "unique (name)", + "Tag name already exists !", + ) def _compute_display_name(self): for tag in self: diff --git a/purchase_tag/static/description/index.html b/purchase_tag/static/description/index.html index 87f0597ade4..03cac9ba4eb 100644 --- a/purchase_tag/static/description/index.html +++ b/purchase_tag/static/description/index.html @@ -374,7 +374,7 @@

Purchase Tags

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:94e58d12401c413cdb838f0cb90dea8711658fc48dc05a9f03dd376ba93af078 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module allows to add multiple tags to purchase orders

Table of contents

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

+feedback.

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

@@ -424,7 +424,7 @@

Maintainers

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.

+

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.

From 91182e293531666992df97ba97855f16db1c4ee6 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 21 Apr 2026 10:10:48 +0000 Subject: [PATCH 020/207] [UPD] Update purchase_tag.pot --- purchase_tag/i18n/purchase_tag.pot | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/purchase_tag/i18n/purchase_tag.pot b/purchase_tag/i18n/purchase_tag.pot index e51b8c7bf12..dcc25eeeb4d 100644 --- a/purchase_tag/i18n/purchase_tag.pot +++ b/purchase_tag/i18n/purchase_tag.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -39,11 +39,13 @@ msgid "Created on" msgstr "" #. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__display_name #: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__display_name msgid "Display Name" msgstr "" #. module: purchase_tag +#: model:ir.model.fields,field_description:purchase_tag.field_purchase_order__id #: model:ir.model.fields,field_description:purchase_tag.field_purchase_tag__id msgid "ID" msgstr "" From 76e3f39ffa8b027a533b8f88f025f8a9007d700a Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 21 Apr 2026 10:13:39 +0000 Subject: [PATCH 021/207] [BOT] post-merge updates --- README.md | 1 + purchase_tag/README.rst | 2 +- purchase_tag/static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6547653d704..5b44a6296da 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ addon | version | maintainers | summary [purchase_partner_incoterm](purchase_partner_incoterm/) | 19.0.1.0.0 | TDu bealdav | Add a an incoterm field for supplier and use it on purchase order [purchase_request](purchase_request/) | 19.0.1.0.1 | | Use this module to have notification of requirements of materials and/or external services and keep track of such requirements. [purchase_stock_price_unit_sync](purchase_stock_price_unit_sync/) | 19.0.1.0.0 | | Update cost price in stock moves already done +[purchase_tag](purchase_tag/) | 19.0.1.0.0 | | Allows to add multiple tags to purchase orders [//]: # (end addons) diff --git a/purchase_tag/README.rst b/purchase_tag/README.rst index 38472ea3935..dfbe0500355 100644 --- a/purchase_tag/README.rst +++ b/purchase_tag/README.rst @@ -11,7 +11,7 @@ Purchase Tags !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:94e58d12401c413cdb838f0cb90dea8711658fc48dc05a9f03dd376ba93af078 + !! source digest: sha256:7e1a17aab6e4f4d094c6e036630efa0d60d026bf901bf2279dec9e0e58c0041c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_tag/static/description/index.html b/purchase_tag/static/description/index.html index 03cac9ba4eb..ca7fea47cf8 100644 --- a/purchase_tag/static/description/index.html +++ b/purchase_tag/static/description/index.html @@ -372,7 +372,7 @@

Purchase Tags

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:94e58d12401c413cdb838f0cb90dea8711658fc48dc05a9f03dd376ba93af078 +!! source digest: sha256:7e1a17aab6e4f4d094c6e036630efa0d60d026bf901bf2279dec9e0e58c0041c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module allows to add multiple tags to purchase orders

diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index eea2049c981..1b9c2c3acbf 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-purchase-workflow" -version = "19.0.20260417.0" +version = "19.0.20260421.0" dependencies = [ "odoo-addon-partner_supplierinfo_smartbutton==19.0.*", "odoo-addon-procurement_purchase_no_grouping==19.0.*", @@ -18,6 +18,7 @@ dependencies = [ "odoo-addon-purchase_partner_incoterm==19.0.*", "odoo-addon-purchase_request==19.0.*", "odoo-addon-purchase_stock_price_unit_sync==19.0.*", + "odoo-addon-purchase_tag==19.0.*", ] classifiers=[ "Programming Language :: Python", From 96621edfa77ceea1c944ed5664bb6466722cc58d Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 21 Apr 2026 08:47:26 +0000 Subject: [PATCH 022/207] Translated using Weblate (Italian) Currently translated at 100.0% (20 of 20 strings) Translation: purchase-workflow-19.0/purchase-workflow-19.0-purchase_order_weight_volume Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_order_weight_volume/it/ --- purchase_order_weight_volume/i18n/it.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_order_weight_volume/i18n/it.po b/purchase_order_weight_volume/i18n/it.po index 6e4d4cfa390..9122333dd6d 100644 --- a/purchase_order_weight_volume/i18n/it.po +++ b/purchase_order_weight_volume/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-12-20 15:38+0000\n" +"PO-Revision-Date: 2026-04-21 10:49+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "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" +"X-Generator: Weblate 5.15.2\n" #. module: purchase_order_weight_volume #: model_terms:ir.ui.view,arch_db:purchase_order_weight_volume.report_purchaseorder_document @@ -51,7 +51,7 @@ msgstr "Aziende" #: model:ir.model.fields,field_description:purchase_order_weight_volume.field_res_company__display_name #: model:ir.model.fields,field_description:purchase_order_weight_volume.field_res_config_settings__display_name msgid "Display Name" -msgstr "Nome da visualizzare" +msgstr "Nome visualizzato" #. module: purchase_order_weight_volume #: model:ir.model.fields,field_description:purchase_order_weight_volume.field_purchase_order__display_order_volume_in_po From fdd1cdf4a9c812f182b3294f6305a46d60586e76 Mon Sep 17 00:00:00 2001 From: Mateu Griful Date: Tue, 13 Jul 2021 15:46:42 +0200 Subject: [PATCH 023/207] [ADD] purchase_advance_payment --- purchase_advance_payment/__init__.py | 2 + purchase_advance_payment/__manifest__.py | 19 ++ purchase_advance_payment/models/__init__.py | 2 + purchase_advance_payment/models/payment.py | 16 ++ .../models/purchase_order.py | 86 +++++++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 3 + purchase_advance_payment/readme/USAGE.rst | 8 + .../security/ir.model.access.csv | 4 + purchase_advance_payment/tests/__init__.py | 1 + .../tests/test_purchase_advance_payment.py | 218 ++++++++++++++++++ .../views/purchase_view.xml | 96 ++++++++ purchase_advance_payment/wizard/__init__.py | 1 + .../wizard/purchase_advance_payment_wizard.py | 128 ++++++++++ .../purchase_advance_payment_wizard_view.xml | 53 +++++ 15 files changed, 639 insertions(+) create mode 100644 purchase_advance_payment/__init__.py create mode 100644 purchase_advance_payment/__manifest__.py create mode 100644 purchase_advance_payment/models/__init__.py create mode 100644 purchase_advance_payment/models/payment.py create mode 100644 purchase_advance_payment/models/purchase_order.py create mode 100644 purchase_advance_payment/readme/CONTRIBUTORS.rst create mode 100644 purchase_advance_payment/readme/DESCRIPTION.rst create mode 100644 purchase_advance_payment/readme/USAGE.rst create mode 100644 purchase_advance_payment/security/ir.model.access.csv create mode 100644 purchase_advance_payment/tests/__init__.py create mode 100644 purchase_advance_payment/tests/test_purchase_advance_payment.py create mode 100644 purchase_advance_payment/views/purchase_view.xml create mode 100644 purchase_advance_payment/wizard/__init__.py create mode 100644 purchase_advance_payment/wizard/purchase_advance_payment_wizard.py create mode 100644 purchase_advance_payment/wizard/purchase_advance_payment_wizard_view.xml diff --git a/purchase_advance_payment/__init__.py b/purchase_advance_payment/__init__.py new file mode 100644 index 00000000000..9b4296142f4 --- /dev/null +++ b/purchase_advance_payment/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/purchase_advance_payment/__manifest__.py b/purchase_advance_payment/__manifest__.py new file mode 100644 index 00000000000..01e76a79c09 --- /dev/null +++ b/purchase_advance_payment/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +{ + "name": "Purchase Advance Payment", + "version": "14.0.1.0.0", + "author": "Forgeflow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", + "category": "Purchase", + "license": "AGPL-3", + "summary": "Allow to add advance payments on purchase orders", + "depends": ["purchase"], + "data": [ + "wizard/purchase_advance_payment_wizard_view.xml", + "views/purchase_view.xml", + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/purchase_advance_payment/models/__init__.py b/purchase_advance_payment/models/__init__.py new file mode 100644 index 00000000000..2a7a713d96d --- /dev/null +++ b/purchase_advance_payment/models/__init__.py @@ -0,0 +1,2 @@ +from . import payment +from . import purchase_order diff --git a/purchase_advance_payment/models/payment.py b/purchase_advance_payment/models/payment.py new file mode 100644 index 00000000000..3b6473ed6af --- /dev/null +++ b/purchase_advance_payment/models/payment.py @@ -0,0 +1,16 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import fields, models + + +class AccountPayment(models.Model): + + _inherit = "account.payment" + + purchase_id = fields.Many2one( + "purchase.order", + "Purchase", + readonly=True, + states={"draft": [("readonly", False)]}, + ) diff --git a/purchase_advance_payment/models/purchase_order.py b/purchase_advance_payment/models/purchase_order.py new file mode 100644 index 00000000000..e4f025d669e --- /dev/null +++ b/purchase_advance_payment/models/purchase_order.py @@ -0,0 +1,86 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import api, fields, models +from odoo.tools import float_compare + + +class PurchaseOrder(models.Model): + + _inherit = "purchase.order" + + account_payment_ids = fields.One2many( + "account.payment", "purchase_id", string="Pay purchase advanced", readonly=True + ) + amount_residual = fields.Float( + "Residual amount", + readonly=True, + compute="_compute_purchase_advance_payment", + store=True, + ) + payment_line_ids = fields.Many2many( + "account.move.line", + string="Payment move lines", + compute="_compute_purchase_advance_payment", + store=True, + ) + advance_payment_status = fields.Selection( + selection=[ + ("not_paid", "Not Paid"), + ("paid", "Paid"), + ("partial", "Partially Paid"), + ], + string="Advance Payment Status", + store=True, + readonly=True, + copy=False, + tracking=True, + compute="_compute_purchase_advance_payment", + ) + + @api.depends( + "currency_id", + "company_id", + "amount_total", + "account_payment_ids", + "account_payment_ids.state", + "account_payment_ids.move_id", + "account_payment_ids.move_id.line_ids", + "account_payment_ids.move_id.line_ids.date", + "account_payment_ids.move_id.line_ids.debit", + "account_payment_ids.move_id.line_ids.credit", + "account_payment_ids.move_id.line_ids.currency_id", + "account_payment_ids.move_id.line_ids.amount_currency", + ) + def _compute_purchase_advance_payment(self): + for order in self: + mls = order.account_payment_ids.mapped("move_id.line_ids").filtered( + lambda x: x.account_id.internal_type == "payable" + and x.parent_state == "posted" + ) + advance_amount = 0.0 + for line in mls: + line_currency = line.currency_id or line.company_id.currency_id + line_amount = line.amount_currency if line.currency_id else line.balance + if line_currency != order.currency_id: + advance_amount += line.currency_id._convert( + line_amount, + order.currency_id, + order.company_id, + line.date or fields.Date.today(), + ) + else: + advance_amount += line_amount + amount_residual = order.amount_total - advance_amount + payment_state = "not_paid" + if mls: + has_due_amount = float_compare( + amount_residual, 0.0, precision_rounding=order.currency_id.rounding + ) + if has_due_amount <= 0: + payment_state = "paid" + elif has_due_amount > 0: + payment_state = "partial" + order.payment_line_ids = mls + order.amount_residual = amount_residual + order.advance_payment_status = payment_state diff --git a/purchase_advance_payment/readme/CONTRIBUTORS.rst b/purchase_advance_payment/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..087dd29233f --- /dev/null +++ b/purchase_advance_payment/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Mateu Griful +* Lois Rilo diff --git a/purchase_advance_payment/readme/DESCRIPTION.rst b/purchase_advance_payment/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..2509a323453 --- /dev/null +++ b/purchase_advance_payment/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +The module allows to add advance payments on purchase orders and Request +for Quotation. The advance payments are allowed even before confirmation +and before starting the billing process. diff --git a/purchase_advance_payment/readme/USAGE.rst b/purchase_advance_payment/readme/USAGE.rst new file mode 100644 index 00000000000..df9904e8b23 --- /dev/null +++ b/purchase_advance_payment/readme/USAGE.rst @@ -0,0 +1,8 @@ +To use this module, you need to: + +* Go to a purchase order. +* Click on "Pay Purchase Advance". +* Select the Journal and specify the amount of the advanced payment. +* "Make Advance Payment". + +When generating the invoice, the system displays the advanced payments, select those you want to add to the invoice. diff --git a/purchase_advance_payment/security/ir.model.access.csv b/purchase_advance_payment/security/ir.model.access.csv new file mode 100644 index 00000000000..a432eb67dbf --- /dev/null +++ b/purchase_advance_payment/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_payment_purchase_advance,account.payment purchase_advance,account.model_account_payment,purchase.group_purchase_user,1,1,1,0 +access_account_payment_method_purchase_advance,account.payment.method purchase_advance,account.model_account_payment_method,purchase.group_purchase_user,1,0,0,0 +access_account_voucher_wizard_purchase_advance,access_account_voucher_wizard_purchase_advance,model_account_voucher_wizard_purchase,purchase.group_purchase_user,1,1,1,0 diff --git a/purchase_advance_payment/tests/__init__.py b/purchase_advance_payment/tests/__init__.py new file mode 100644 index 00000000000..beeea01aff5 --- /dev/null +++ b/purchase_advance_payment/tests/__init__.py @@ -0,0 +1 @@ +from . import test_purchase_advance_payment diff --git a/purchase_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py new file mode 100644 index 00000000000..665a9cf21de --- /dev/null +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -0,0 +1,218 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + + +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class TestPurchaseAdvancePayment(common.SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + # Partners + cls.res_partner_1 = cls.env["res.partner"].create({"name": "Wood Corner"}) + cls.res_partner_address_1 = cls.env["res.partner"].create( + {"name": "Willie Burke", "parent_id": cls.res_partner_1.id} + ) + cls.res_partner_2 = cls.env["res.partner"].create({"name": "Partner 12"}) + + # Products + cls.product_1 = cls.env["product.product"].create( + {"name": "Desk Combination", "type": "consu", "purchase_method": "purchase"} + ) + cls.product_2 = cls.env["product.product"].create( + {"name": "Conference Chair", "type": "consu", "purchase_method": "purchase"} + ) + cls.product_3 = cls.env["product.product"].create( + { + "name": "Repair Services", + "type": "service", + "purchase_method": "purchase", + } + ) + + cls.tax = cls.env["account.tax"].create( + { + "name": "Tax 20", + "type_tax_use": "purchase", + "amount": 20, + } + ) + + # purchase Order + cls.purchase_order_1 = cls.env["purchase.order"].create( + {"partner_id": cls.res_partner_1.id} + ) + cls.order_line_1 = cls.env["purchase.order.line"].create( + { + "order_id": cls.purchase_order_1.id, + "product_id": cls.product_1.id, + "product_uom": cls.product_1.uom_id.id, + "product_qty": 10.0, + "price_unit": 100.0, + "taxes_id": cls.tax, + } + ) + cls.order_line_2 = cls.env["purchase.order.line"].create( + { + "order_id": cls.purchase_order_1.id, + "product_id": cls.product_2.id, + "product_uom": cls.product_2.uom_id.id, + "product_qty": 25.0, + "price_unit": 40.0, + "taxes_id": cls.tax, + } + ) + cls.order_line_3 = cls.env["purchase.order.line"].create( + { + "order_id": cls.purchase_order_1.id, + "product_id": cls.product_3.id, + "product_uom": cls.product_3.uom_id.id, + "product_qty": 20.0, + "price_unit": 50.0, + "taxes_id": cls.tax, + } + ) + + cls.currency_euro = cls.env["res.currency"].search([("name", "=", "EUR")]) + cls.currency_usd = cls.env["res.currency"].search([("name", "=", "USD")]) + cls.currency_rate = cls.env["res.currency.rate"].create( + { + "rate": 1.20, + "currency_id": cls.currency_usd.id, + } + ) + + cls.journal_eur_bank = cls.env["account.journal"].create( + { + "name": "Journal Euro Bank", + "type": "bank", + "code": "111", + "currency_id": cls.currency_euro.id, + } + ) + + cls.journal_usd_bank = cls.env["account.journal"].create( + { + "name": "Journal USD Bank", + "type": "bank", + "code": "222", + "currency_id": cls.currency_usd.id, + } + ) + cls.journal_eur_cash = cls.env["account.journal"].create( + { + "name": "Journal Euro Cash", + "type": "cash", + "code": "333", + "currency_id": cls.currency_euro.id, + } + ) + + cls.journal_usd_cash = cls.env["account.journal"].create( + { + "name": "Journal USD Cash", + "type": "cash", + "code": "444", + "currency_id": cls.currency_usd.id, + } + ) + + def test_purchase_advance_payment(self): + self.assertEqual( + self.purchase_order_1.amount_residual, + 3600, + ) + self.assertEqual( + self.purchase_order_1.amount_residual, + self.purchase_order_1.amount_total, + "Amounts should match", + ) + + context_payment = { + "active_ids": [self.purchase_order_1.id], + "active_id": self.purchase_order_1.id, + } + + # Check residual > advance payment and the comparison takes + # into account the currency. 3001*1.2 > 3600 + with self.assertRaises(ValidationError): + advance_payment_0 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": 3001, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_0.make_advance_payment() + + # Create Advance Payment 1 - EUR - bank + advance_payment_1 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": 100, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_1.make_advance_payment() + + self.assertEqual(self.purchase_order_1.amount_residual, 3480) + + # Create Advance Payment 2 - USD - cash + advance_payment_2 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_usd_cash.id, + "amount_advance": 200, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_2.make_advance_payment() + + self.assertEqual(self.purchase_order_1.amount_residual, 3280) + + # Confirm Purchase Order + self.purchase_order_1.button_confirm() + + # Create Advance Payment 3 - EUR - cash + advance_payment_3 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_eur_cash.id, + "amount_advance": 250, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_3.make_advance_payment() + self.assertEqual(self.purchase_order_1.amount_residual, 2980) + + # Create Advance Payment 4 - USD - bank + advance_payment_4 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_usd_bank.id, + "amount_advance": 400, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_4.make_advance_payment() + self.assertEqual(self.purchase_order_1.amount_residual, 2580) diff --git a/purchase_advance_payment/views/purchase_view.xml b/purchase_advance_payment/views/purchase_view.xml new file mode 100644 index 00000000000..44d8e6e9fb8 --- /dev/null +++ b/purchase_advance_payment/views/purchase_view.xml @@ -0,0 +1,96 @@ + + + + purchase.order.form + purchase.order + + + + + + + + + + + + + + + + + purchase.order.view.tree + purchase.order + + + + + + + + + + + + + purchase.order.inherit.purchase.order.tree + purchase.order + + + + + + + + + + + + diff --git a/purchase_advance_payment/wizard/__init__.py b/purchase_advance_payment/wizard/__init__.py new file mode 100644 index 00000000000..875157a0fda --- /dev/null +++ b/purchase_advance_payment/wizard/__init__.py @@ -0,0 +1 @@ +from . import purchase_advance_payment_wizard diff --git a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py new file mode 100644 index 00000000000..0ef7fdc4fbd --- /dev/null +++ b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py @@ -0,0 +1,128 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import _, api, exceptions, fields, models +from odoo.tools import float_compare + + +class AccountVoucherWizardPurchase(models.TransientModel): + + _name = "account.voucher.wizard.purchase" + _description = "Account Voucher Wizard Purchase" + + order_id = fields.Many2one("purchase.order", required=True) + journal_id = fields.Many2one( + "account.journal", + "Journal", + required=True, + domain=[("type", "in", ("bank", "cash"))], + ) + journal_currency_id = fields.Many2one( + "res.currency", + "Journal Currency", + store=True, + readonly=False, + compute="_compute_get_journal_currency", + ) + currency_id = fields.Many2one("res.currency", "Currency", readonly=True) + amount_total = fields.Monetary("Amount total", readonly=True) + amount_advance = fields.Monetary( + "Amount advanced", required=True, currency_field="journal_currency_id" + ) + date = fields.Date("Date", required=True, default=fields.Date.context_today) + currency_amount = fields.Monetary( + "Curr. amount", readonly=True, currency_field="currency_id" + ) + payment_ref = fields.Char("Ref.") + + @api.depends("journal_id") + def _compute_get_journal_currency(self): + for wzd in self: + wzd.journal_currency_id = ( + wzd.journal_id.currency_id.id or self.env.user.company_id.currency_id.id + ) + + @api.constrains("amount_advance") + def check_amount(self): + if self.amount_advance <= 0: + raise exceptions.ValidationError(_("Amount of advance must be positive.")) + if self.env.context.get("active_id", False): + self.onchange_date() + if ( + float_compare( + self.currency_amount, + self.order_id.amount_residual, + precision_digits=2, + ) + > 0 + ): + raise exceptions.ValidationError( + _("Amount of advance is greater than residual amount on purchase") + ) + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + purchase_ids = self.env.context.get("active_ids", []) + if not purchase_ids: + return res + purchase_id = fields.first(purchase_ids) + purchase = self.env["purchase.order"].browse(purchase_id) + if "amount_total" in fields_list: + res.update( + { + "order_id": purchase.id, + "amount_total": purchase.amount_residual, + "currency_id": purchase.currency_id.id, + } + ) + + return res + + @api.onchange("journal_id", "date", "amount_advance") + def onchange_date(self): + if self.journal_currency_id != self.currency_id: + amount_advance = self.journal_currency_id._convert( + self.amount_advance, + self.currency_id, + self.order_id.company_id, + self.date or fields.Date.today(), + ) + else: + amount_advance = self.amount_advance + self.currency_amount = amount_advance + + def _prepare_payment_vals(self, purchase): + partner_id = purchase.partner_id.id + return { + "date": self.date, + "amount": self.amount_advance, + "payment_type": "outbound", + "partner_type": "supplier", + "ref": self.payment_ref or purchase.name, + "journal_id": self.journal_id.id, + "currency_id": self.journal_currency_id.id, + "partner_id": partner_id, + "payment_method_id": self.env.ref( + "account.account_payment_method_manual_out" + ).id, + } + + def make_advance_payment(self): + """Create customer paylines and validates the payment""" + self.ensure_one() + payment_obj = self.env["account.payment"] + purchase_obj = self.env["purchase.order"] + + purchase_ids = self.env.context.get("active_ids", []) + if purchase_ids: + purchase_id = fields.first(purchase_ids) + purchase = purchase_obj.browse(purchase_id) + payment_vals = self._prepare_payment_vals(purchase) + payment = payment_obj.create(payment_vals) + purchase.account_payment_ids |= payment + payment.action_post() + + return { + "type": "ir.actions.act_window_close", + } diff --git a/purchase_advance_payment/wizard/purchase_advance_payment_wizard_view.xml b/purchase_advance_payment/wizard/purchase_advance_payment_wizard_view.xml new file mode 100644 index 00000000000..41c4d5b3f45 --- /dev/null +++ b/purchase_advance_payment/wizard/purchase_advance_payment_wizard_view.xml @@ -0,0 +1,53 @@ + + + + Advance Payment + account.voucher.wizard.purchase + form + +
+ + + + + + + + + + + + + + + + +
+
+
+
+
+ + Advance Payment + ir.actions.act_window + account.voucher.wizard.purchase + form + new + +
From d2680d4592c356a3cea620cb83b191a359645da6 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 3 Nov 2021 15:11:49 +0100 Subject: [PATCH 024/207] [IMP] purchase_advance_payment: consider payments in PO bills to compute residual. --- purchase_advance_payment/README.rst | 88 ++++ .../i18n/purchase_advance_payment.pot | 221 +++++++++ .../models/purchase_order.py | 13 +- .../static/description/index.html | 434 ++++++++++++++++++ .../tests/test_purchase_advance_payment.py | 52 ++- .../views/purchase_view.xml | 2 +- 6 files changed, 806 insertions(+), 4 deletions(-) create mode 100644 purchase_advance_payment/README.rst create mode 100644 purchase_advance_payment/i18n/purchase_advance_payment.pot create mode 100644 purchase_advance_payment/static/description/index.html diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst new file mode 100644 index 00000000000..dc3ab94c339 --- /dev/null +++ b/purchase_advance_payment/README.rst @@ -0,0 +1,88 @@ +======================== +Purchase Advance Payment +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/14.0/purchase_advance_payment + :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-14-0/purchase-workflow-14-0-purchase_advance_payment + :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/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The module allows to add advance payments on purchase orders and Request +for Quotation. The advance payments are allowed even before confirmation +and before starting the billing process. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +* Go to a purchase order. +* Click on "Pay Purchase Advance". +* Select the Journal and specify the amount of the advanced payment. +* "Make Advance Payment". + +When generating the invoice, the system displays the advanced payments, select those you want to add to the invoice. + +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 +~~~~~~~ + +* Forgeflow + +Contributors +~~~~~~~~~~~~ + +* Mateu Griful +* Lois Rilo + +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/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_advance_payment/i18n/purchase_advance_payment.pot b/purchase_advance_payment/i18n/purchase_advance_payment.pot new file mode 100644 index 00000000000..38c7beadd7d --- /dev/null +++ b/purchase_advance_payment/i18n/purchase_advance_payment.pot @@ -0,0 +1,221 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_advance_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase +msgid "Account Voucher Wizard Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Advance Payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status +msgid "Advance Payment Status" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree +msgid "Amount Residual" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance +msgid "Amount advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Amount in Order Currency" +msgstr "" + +#. module: purchase_advance_payment +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance is greater than residual amount on purchase" +msgstr "" + +#. module: purchase_advance_payment +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance must be positive." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount total" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Cancel" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid +msgid "Created by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date +msgid "Created on" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount +msgid "Curr. amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date +msgid "Date" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__id +msgid "ID" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id +msgid "Journal" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id +msgid "Journal Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment____last_update +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date +msgid "Last Updated on" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Make advance payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid +msgid "Not Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Operation" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id +msgid "Order" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Due Amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid +msgid "Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial +msgid "Partially Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Pay purchase advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Payment Method" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Payment advances" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids +msgid "Payment move lines" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_payment +msgid "Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id +msgid "Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref +msgid "Ref." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual +msgid "Residual amount" +msgstr "" diff --git a/purchase_advance_payment/models/purchase_order.py b/purchase_advance_payment/models/purchase_order.py index e4f025d669e..b6b5791668a 100644 --- a/purchase_advance_payment/models/purchase_order.py +++ b/purchase_advance_payment/models/purchase_order.py @@ -51,6 +51,9 @@ class PurchaseOrder(models.Model): "account_payment_ids.move_id.line_ids.credit", "account_payment_ids.move_id.line_ids.currency_id", "account_payment_ids.move_id.line_ids.amount_currency", + "order_line.invoice_lines.move_id", + "order_line.invoice_lines.move_id.amount_total", + "order_line.invoice_lines.move_id.amount_residual", ) def _compute_purchase_advance_payment(self): for order in self: @@ -71,9 +74,15 @@ def _compute_purchase_advance_payment(self): ) else: advance_amount += line_amount - amount_residual = order.amount_total - advance_amount + # Consider payments in related invoices. + invoice_not_paid_amount = 0.0 + for inv in order.invoice_ids: + invoice_not_paid_amount += inv.amount_total - inv.amount_residual + amount_residual = ( + order.amount_total - advance_amount - invoice_not_paid_amount + ) payment_state = "not_paid" - if mls: + if mls or order.invoice_ids: has_due_amount = float_compare( amount_residual, 0.0, precision_rounding=order.currency_id.rounding ) diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html new file mode 100644 index 00000000000..bc37d1434d4 --- /dev/null +++ b/purchase_advance_payment/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +Purchase Advance Payment + + + +
+

Purchase Advance Payment

+ + +

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

+

The module allows to add advance payments on purchase orders and Request +for Quotation. The advance payments are allowed even before confirmation +and before starting the billing process.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  • Go to a purchase order.
  • +
  • Click on “Pay Purchase Advance”.
  • +
  • Select the Journal and specify the amount of the advanced payment.
  • +
  • “Make Advance Payment”.
  • +
+

When generating the invoice, the system displays the advanced payments, select those you want to add to the invoice.

+
+
+

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

+
    +
  • Forgeflow
  • +
+
+ +
+

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_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py index 665a9cf21de..017d71a3807 100644 --- a/purchase_advance_payment/tests/test_purchase_advance_payment.py +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) +from odoo import fields from odoo.exceptions import ValidationError from odoo.tests import common @@ -120,7 +121,7 @@ def setUpClass(cls): } ) - def test_purchase_advance_payment(self): + def test_01_purchase_advance_payment(self): self.assertEqual( self.purchase_order_1.amount_residual, 3600, @@ -216,3 +217,52 @@ def test_purchase_advance_payment(self): ) advance_payment_4.make_advance_payment() self.assertEqual(self.purchase_order_1.amount_residual, 2580) + + def test_02_residual_amount_with_bill(self): + self.assertEqual( + self.purchase_order_1.amount_residual, + 3600, + ) + self.assertEqual( + self.purchase_order_1.amount_residual, + self.purchase_order_1.amount_total, + ) + # Create Advance Payment 1 - EUR - bank + context_payment = { + "active_ids": [self.purchase_order_1.id], + "active_id": self.purchase_order_1.id, + } + # Create Advance Payment 2 - USD - cash + advance_payment_2 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_usd_cash.id, + "amount_advance": 200, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_2.make_advance_payment() + self.assertEqual(self.purchase_order_1.amount_residual, 3400) + # generate bill, pay bill, check amount residual. + self.purchase_order_1.button_confirm() + self.assertEqual(self.purchase_order_1.invoice_status, "to invoice") + self.purchase_order_1.action_create_invoice() + self.assertEqual(self.purchase_order_1.invoice_status, "invoiced") + self.assertEqual(self.purchase_order_1.amount_residual, 3400) + invoice = self.purchase_order_1.invoice_ids + invoice.invoice_date = fields.Date.today() + invoice.action_post() + active_ids = invoice.ids + self.env["account.payment.register"].with_context( + active_model="account.move", active_ids=active_ids + ).create( + { + "amount": 1200.0, + "group_payment": True, + "payment_difference_handling": "open", + } + )._create_payments() + self.assertEqual(self.purchase_order_1.amount_residual, 2200) diff --git a/purchase_advance_payment/views/purchase_view.xml b/purchase_advance_payment/views/purchase_view.xml index 44d8e6e9fb8..95d54657920 100644 --- a/purchase_advance_payment/views/purchase_view.xml +++ b/purchase_advance_payment/views/purchase_view.xml @@ -11,7 +11,7 @@ string="Pay purchase advanced" type="action" groups="account.group_account_invoice" - attrs="{'invisible': ['|',('state', 'in', ['done','cancel']),('invoice_status', 'in', ['invoiced'])]}" + attrs="{'invisible': ['|',('state', 'in', ['done','cancel']),('amount_residual', '=', 0)]}" /> From 77b1267ee51bf9216e2560df5626526f93089ab8 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 4 Nov 2021 16:21:07 +0000 Subject: [PATCH 025/207] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 purchase_advance_payment/static/description/icon.png diff --git a/purchase_advance_payment/static/description/icon.png b/purchase_advance_payment/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 46cb6a210c881dddccacb2217a2025d83bc0b6e9 Mon Sep 17 00:00:00 2001 From: Khalid Hazam Date: Wed, 29 Dec 2021 16:10:36 +0000 Subject: [PATCH 026/207] Added translation using Weblate (French) --- purchase_advance_payment/i18n/fr.po | 222 ++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 purchase_advance_payment/i18n/fr.po diff --git a/purchase_advance_payment/i18n/fr.po b/purchase_advance_payment/i18n/fr.po new file mode 100644 index 00000000000..0392173c55b --- /dev/null +++ b/purchase_advance_payment/i18n/fr.po @@ -0,0 +1,222 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_advance_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\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: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase +msgid "Account Voucher Wizard Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Advance Payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status +msgid "Advance Payment Status" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree +msgid "Amount Residual" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance +msgid "Amount advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Amount in Order Currency" +msgstr "" + +#. module: purchase_advance_payment +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance is greater than residual amount on purchase" +msgstr "" + +#. module: purchase_advance_payment +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance must be positive." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount total" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Cancel" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid +msgid "Created by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date +msgid "Created on" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount +msgid "Curr. amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date +msgid "Date" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__id +msgid "ID" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id +msgid "Journal" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id +msgid "Journal Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment____last_update +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date +msgid "Last Updated on" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Make advance payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid +msgid "Not Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Operation" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id +msgid "Order" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Due Amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid +msgid "Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial +msgid "Partially Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Pay purchase advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Payment Method" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Payment advances" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids +msgid "Payment move lines" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_payment +msgid "Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id +msgid "Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref +msgid "Ref." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual +msgid "Residual amount" +msgstr "" From fbf15847ab788530a64142bb59bcd3920369b9b8 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 4 Jan 2022 16:36:00 +0100 Subject: [PATCH 027/207] [FIX] purchase_advance_payment: do not count twice reconciled pre-payments in PO residual amount. --- .../models/purchase_order.py | 17 ++-- .../tests/test_purchase_advance_payment.py | 96 +++++++++++++++++++ 2 files changed, 107 insertions(+), 6 deletions(-) diff --git a/purchase_advance_payment/models/purchase_order.py b/purchase_advance_payment/models/purchase_order.py index b6b5791668a..789f567c0c4 100644 --- a/purchase_advance_payment/models/purchase_order.py +++ b/purchase_advance_payment/models/purchase_order.py @@ -64,7 +64,14 @@ def _compute_purchase_advance_payment(self): advance_amount = 0.0 for line in mls: line_currency = line.currency_id or line.company_id.currency_id - line_amount = line.amount_currency if line.currency_id else line.balance + # Exclude reconciled pre-payments amount because once reconciled + # the pre-payment will reduce bill residual amount like any + # other payment. + line_amount = ( + line.amount_residual_currency + if line.currency_id + else line.amount_residual + ) if line_currency != order.currency_id: advance_amount += line.currency_id._convert( line_amount, @@ -75,12 +82,10 @@ def _compute_purchase_advance_payment(self): else: advance_amount += line_amount # Consider payments in related invoices. - invoice_not_paid_amount = 0.0 + invoice_paid_amount = 0.0 for inv in order.invoice_ids: - invoice_not_paid_amount += inv.amount_total - inv.amount_residual - amount_residual = ( - order.amount_total - advance_amount - invoice_not_paid_amount - ) + invoice_paid_amount += inv.amount_total - inv.amount_residual + amount_residual = order.amount_total - advance_amount - invoice_paid_amount payment_state = "not_paid" if mls or order.invoice_ids: has_due_amount = float_compare( diff --git a/purchase_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py index 017d71a3807..16fd626fb9e 100644 --- a/purchase_advance_payment/tests/test_purchase_advance_payment.py +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -245,6 +245,8 @@ def test_02_residual_amount_with_bill(self): ) ) advance_payment_2.make_advance_payment() + pre_payment = self.purchase_order_1.account_payment_ids + self.assertEqual(len(pre_payment), 1) self.assertEqual(self.purchase_order_1.amount_residual, 3400) # generate bill, pay bill, check amount residual. self.purchase_order_1.button_confirm() @@ -266,3 +268,97 @@ def test_02_residual_amount_with_bill(self): } )._create_payments() self.assertEqual(self.purchase_order_1.amount_residual, 2200) + + # Reconciling the pre-payment should not affect amount_residual in PO. + ( + liquidity_lines, + counterpart_lines, + writeoff_lines, + ) = pre_payment._seek_for_lines() + ( + counterpart_lines + + invoice.line_ids.filtered( + lambda line: line.account_internal_type == "payable" + ) + ).reconcile() + self.purchase_order_1.invalidate_cache() + self.assertEqual(self.purchase_order_1.amount_residual, 2200) + + def test_03_residual_amount_big_pre_payment(self): + self.assertEqual( + self.purchase_order_1.amount_residual, + 3600, + ) + self.assertEqual( + self.purchase_order_1.amount_residual, + self.purchase_order_1.amount_total, + ) + # Create Advance Payment 1 - EUR - bank + context_payment = { + "active_ids": [self.purchase_order_1.id], + "active_id": self.purchase_order_1.id, + } + # Create Advance Payment 2 - USD - cash + advance_payment_2 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(context_payment) + .create( + { + "journal_id": self.journal_usd_cash.id, + "amount_advance": 2000, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_2.make_advance_payment() + pre_payment = self.purchase_order_1.account_payment_ids + self.assertEqual(len(pre_payment), 1) + self.assertEqual(self.purchase_order_1.amount_residual, 1600) + # generate a partial bill, reconcile with pre payment, check amount residual. + self.purchase_order_1.button_confirm() + self.assertEqual(self.purchase_order_1.invoice_status, "to invoice") + # Adjust billing method to then do a partial bill with a total amount + # smaller than the pre-payment. + self.product_1.purchase_method = "receive" + self.order_line_1.qty_received = 10.0 + self.assertEqual(self.order_line_1.qty_to_invoice, 10.0) + self.product_2.purchase_method = "receive" + self.order_line_2.qty_received = 0.0 + self.assertEqual(self.order_line_2.qty_to_invoice, 0.0) + self.product_3.purchase_method = "receive" + self.order_line_3.qty_received = 0.0 + self.assertEqual(self.order_line_3.qty_to_invoice, 0.0) + self.purchase_order_1.action_create_invoice() + self.assertEqual(self.purchase_order_1.invoice_status, "invoiced") + self.assertEqual(self.purchase_order_1.amount_residual, 1600) + invoice = self.purchase_order_1.invoice_ids + invoice.invoice_date = fields.Date.today() + invoice.action_post() + self.assertEqual(invoice.amount_residual, 1200) + active_ids = invoice.ids + self.env["account.payment.register"].with_context( + active_model="account.move", active_ids=active_ids + ).create( + { + "amount": 300.0, + "group_payment": True, + "payment_difference_handling": "open", + } + )._create_payments() + self.assertEqual(invoice.amount_residual, 900) + self.assertEqual(self.purchase_order_1.amount_residual, 1300) + + # Partially reconciling the pre-payment should not affect amount_residual in PO. + ( + liquidity_lines, + counterpart_lines, + writeoff_lines, + ) = pre_payment._seek_for_lines() + ( + counterpart_lines + + invoice.line_ids.filtered( + lambda line: line.account_internal_type == "payable" + ) + ).reconcile() + self.purchase_order_1.invalidate_cache() + self.assertEqual(self.purchase_order_1.amount_residual, 1300) From 25cc6acf26e984ee66fd8b84ac8e99ed6e933acd Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Tue, 18 Jan 2022 16:52:18 +0530 Subject: [PATCH 028/207] [MIG] purchase_advance_payment: Migration to 15.0 --- purchase_advance_payment/README.rst | 10 +++---- purchase_advance_payment/__manifest__.py | 2 +- .../i18n/purchase_advance_payment.pot | 18 +++++-------- .../models/purchase_order.py | 1 - .../static/description/index.html | 6 ++--- .../tests/test_purchase_advance_payment.py | 27 ++++++++++++------- .../views/purchase_view.xml | 2 +- .../wizard/purchase_advance_payment_wizard.py | 25 +++++++++-------- 8 files changed, 46 insertions(+), 45 deletions(-) diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst index dc3ab94c339..ebfd928c518 100644 --- a/purchase_advance_payment/README.rst +++ b/purchase_advance_payment/README.rst @@ -14,13 +14,13 @@ Purchase Advance Payment :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/14.0/purchase_advance_payment + :target: https://github.com/OCA/purchase-workflow/tree/15.0/purchase_advance_payment :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-14-0/purchase-workflow-14-0-purchase_advance_payment + :target: https://translation.odoo-community.org/projects/purchase-workflow-15-0/purchase-workflow-15-0-purchase_advance_payment :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/14.0 + :target: https://runbot.odoo-community.org/runbot/142/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -52,7 +52,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. @@ -83,6 +83,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/purchase-workflow `_ project on GitHub. +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_advance_payment/__manifest__.py b/purchase_advance_payment/__manifest__.py index 01e76a79c09..6e63bd4177c 100644 --- a/purchase_advance_payment/__manifest__.py +++ b/purchase_advance_payment/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Advance Payment", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "author": "Forgeflow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase", diff --git a/purchase_advance_payment/i18n/purchase_advance_payment.pot b/purchase_advance_payment/i18n/purchase_advance_payment.pot index 38c7beadd7d..7cd03dd46b3 100644 --- a/purchase_advance_payment/i18n/purchase_advance_payment.pot +++ b/purchase_advance_payment/i18n/purchase_advance_payment.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -35,6 +35,11 @@ msgstr "" msgid "Amount Residual" msgstr "" +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount Total" +msgstr "" + #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance msgid "Amount advanced" @@ -57,11 +62,6 @@ msgstr "" msgid "Amount of advance must be positive." msgstr "" -#. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total -msgid "Amount total" -msgstr "" - #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Cancel" @@ -94,16 +94,12 @@ msgid "Date" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__display_name #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__display_name msgid "Display Name" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__id #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__id msgid "ID" msgstr "" @@ -118,9 +114,7 @@ msgid "Journal Currency" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment____last_update #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order____last_update msgid "Last Modified on" msgstr "" diff --git a/purchase_advance_payment/models/purchase_order.py b/purchase_advance_payment/models/purchase_order.py index 789f567c0c4..0f58b465c28 100644 --- a/purchase_advance_payment/models/purchase_order.py +++ b/purchase_advance_payment/models/purchase_order.py @@ -30,7 +30,6 @@ class PurchaseOrder(models.Model): ("paid", "Paid"), ("partial", "Partially Paid"), ], - string="Advance Payment Status", store=True, readonly=True, copy=False, diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html index bc37d1434d4..5c70bf46113 100644 --- a/purchase_advance_payment/static/description/index.html +++ b/purchase_advance_payment/static/description/index.html @@ -367,7 +367,7 @@

Purchase Advance Payment

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

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

+

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

The module allows to add advance payments on purchase orders and Request for Quotation. The advance payments are allowed even before confirmation and before starting the billing process.

@@ -400,7 +400,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.

@@ -425,7 +425,7 @@

Maintainers

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.

+

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_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py index 16fd626fb9e..4b66610c48b 100644 --- a/purchase_advance_payment/tests/test_purchase_advance_payment.py +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -7,7 +7,7 @@ from odoo.tests import common -class TestPurchaseAdvancePayment(common.SavepointCase): +class TestPurchaseAdvancePayment(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -77,7 +77,16 @@ def setUpClass(cls): } ) - cls.currency_euro = cls.env["res.currency"].search([("name", "=", "EUR")]) + cls.active_euro = False + cls.currency_euro = ( + cls.env["res.currency"] + .with_context(active_test=False) + .search([("name", "=", "EUR")]) + ) + # active euro currency if inactive for test + if not cls.currency_euro.active: + cls.currency_euro.active = True + cls.active_euro = True cls.currency_usd = cls.env["res.currency"].search([("name", "=", "USD")]) cls.currency_rate = cls.env["res.currency.rate"].create( { @@ -142,7 +151,7 @@ def test_01_purchase_advance_payment(self): with self.assertRaises(ValidationError): advance_payment_0 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_eur_bank.id, @@ -156,7 +165,7 @@ def test_01_purchase_advance_payment(self): # Create Advance Payment 1 - EUR - bank advance_payment_1 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_eur_bank.id, @@ -172,7 +181,7 @@ def test_01_purchase_advance_payment(self): # Create Advance Payment 2 - USD - cash advance_payment_2 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_usd_cash.id, @@ -191,7 +200,7 @@ def test_01_purchase_advance_payment(self): # Create Advance Payment 3 - EUR - cash advance_payment_3 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_eur_cash.id, @@ -206,7 +215,7 @@ def test_01_purchase_advance_payment(self): # Create Advance Payment 4 - USD - bank advance_payment_4 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_usd_bank.id, @@ -235,7 +244,7 @@ def test_02_residual_amount_with_bill(self): # Create Advance Payment 2 - USD - cash advance_payment_2 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_usd_cash.id, @@ -301,7 +310,7 @@ def test_03_residual_amount_big_pre_payment(self): # Create Advance Payment 2 - USD - cash advance_payment_2 = ( self.env["account.voucher.wizard.purchase"] - .with_context(context_payment) + .with_context(**context_payment) .create( { "journal_id": self.journal_usd_cash.id, diff --git a/purchase_advance_payment/views/purchase_view.xml b/purchase_advance_payment/views/purchase_view.xml index 95d54657920..0bd22ba850e 100644 --- a/purchase_advance_payment/views/purchase_view.xml +++ b/purchase_advance_payment/views/purchase_view.xml @@ -24,7 +24,7 @@ />
- + diff --git a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py index 0ef7fdc4fbd..80f62dc8bbb 100644 --- a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py +++ b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py @@ -2,11 +2,9 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) from odoo import _, api, exceptions, fields, models -from odoo.tools import float_compare class AccountVoucherWizardPurchase(models.TransientModel): - _name = "account.voucher.wizard.purchase" _description = "Account Voucher Wizard Purchase" @@ -25,13 +23,17 @@ class AccountVoucherWizardPurchase(models.TransientModel): compute="_compute_get_journal_currency", ) currency_id = fields.Many2one("res.currency", "Currency", readonly=True) - amount_total = fields.Monetary("Amount total", readonly=True) + amount_total = fields.Monetary(readonly=True) amount_advance = fields.Monetary( "Amount advanced", required=True, currency_field="journal_currency_id" ) - date = fields.Date("Date", required=True, default=fields.Date.context_today) + date = fields.Date(required=True, default=fields.Date.context_today) currency_amount = fields.Monetary( - "Curr. amount", readonly=True, currency_field="currency_id" + "Curr. amount", + readonly=True, + currency_field="currency_id", + compute="_compute_currency_amount", + store=True, ) payment_ref = fields.Char("Ref.") @@ -44,15 +46,12 @@ def _compute_get_journal_currency(self): @api.constrains("amount_advance") def check_amount(self): - if self.amount_advance <= 0: + if self.journal_currency_id.compare_amounts(self.amount_advance, 0.0) <= 0: raise exceptions.ValidationError(_("Amount of advance must be positive.")) if self.env.context.get("active_id", False): - self.onchange_date() if ( - float_compare( - self.currency_amount, - self.order_id.amount_residual, - precision_digits=2, + self.currency_id.compare_amounts( + self.currency_amount, self.order_id.amount_residual ) > 0 ): @@ -79,8 +78,8 @@ def default_get(self, fields_list): return res - @api.onchange("journal_id", "date", "amount_advance") - def onchange_date(self): + @api.depends("journal_id", "date", "amount_advance") + def _compute_currency_amount(self): if self.journal_currency_id != self.currency_id: amount_advance = self.journal_currency_id._convert( self.amount_advance, From 11e97685fff60cf21d9f262c7f8fed842c6137ec Mon Sep 17 00:00:00 2001 From: sonhd91 Date: Thu, 5 Jan 2023 13:43:01 +0700 Subject: [PATCH 029/207] [16.0][MIG] purchase_advance_payment: Migrate to version 16.0 --- purchase_advance_payment/README.rst | 18 ++- purchase_advance_payment/__manifest__.py | 2 +- purchase_advance_payment/i18n/fr.po | 18 +-- .../i18n/purchase_advance_payment.pot | 4 +- .../models/purchase_order.py | 2 +- .../readme/CONTRIBUTORS.rst | 3 + purchase_advance_payment/readme/CREDITS.rst | 1 + .../static/description/index.html | 28 +++- .../tests/test_purchase_advance_payment.py | 143 +++++++++++++++--- .../views/purchase_view.xml | 2 +- 10 files changed, 169 insertions(+), 52 deletions(-) create mode 100644 purchase_advance_payment/readme/CREDITS.rst diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst index ebfd928c518..4e589857b37 100644 --- a/purchase_advance_payment/README.rst +++ b/purchase_advance_payment/README.rst @@ -14,13 +14,13 @@ Purchase Advance Payment :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/15.0/purchase_advance_payment + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_advance_payment :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-15-0/purchase-workflow-15-0-purchase_advance_payment + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_advance_payment :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/15.0 + :target: https://runbot.odoo-community.org/runbot/142/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -52,7 +52,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. @@ -69,6 +69,14 @@ Contributors * Mateu Griful * Lois Rilo +* `Trobz `_: + + * Son Ho + +Other credits +~~~~~~~~~~~~~ + +The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp Maintainers ~~~~~~~~~~~ @@ -83,6 +91,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/purchase-workflow `_ project on GitHub. +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_advance_payment/__manifest__.py b/purchase_advance_payment/__manifest__.py index 6e63bd4177c..0821aa4fb22 100644 --- a/purchase_advance_payment/__manifest__.py +++ b/purchase_advance_payment/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Advance Payment", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "author": "Forgeflow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase", diff --git a/purchase_advance_payment/i18n/fr.po b/purchase_advance_payment/i18n/fr.po index 0392173c55b..837ff265e93 100644 --- a/purchase_advance_payment/i18n/fr.po +++ b/purchase_advance_payment/i18n/fr.po @@ -36,6 +36,11 @@ msgstr "" msgid "Amount Residual" msgstr "" +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount Total" +msgstr "" + #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance msgid "Amount advanced" @@ -47,22 +52,19 @@ msgid "Amount in Order Currency" msgstr "" #. module: purchase_advance_payment +#. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 #, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "" #. module: purchase_advance_payment +#. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 #, python-format msgid "Amount of advance must be positive." msgstr "" -#. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total -msgid "Amount total" -msgstr "" - #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Cancel" @@ -95,16 +97,12 @@ msgid "Date" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__display_name #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__display_name msgid "Display Name" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__id #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__id msgid "ID" msgstr "" @@ -119,9 +117,7 @@ msgid "Journal Currency" msgstr "" #. module: purchase_advance_payment -#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment____last_update #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update -#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order____last_update msgid "Last Modified on" msgstr "" diff --git a/purchase_advance_payment/i18n/purchase_advance_payment.pot b/purchase_advance_payment/i18n/purchase_advance_payment.pot index 7cd03dd46b3..b8b69c32c05 100644 --- a/purchase_advance_payment/i18n/purchase_advance_payment.pot +++ b/purchase_advance_payment/i18n/purchase_advance_payment.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -51,12 +51,14 @@ msgid "Amount in Order Currency" msgstr "" #. module: purchase_advance_payment +#. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 #, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "" #. module: purchase_advance_payment +#. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 #, python-format msgid "Amount of advance must be positive." diff --git a/purchase_advance_payment/models/purchase_order.py b/purchase_advance_payment/models/purchase_order.py index 0f58b465c28..398e0661246 100644 --- a/purchase_advance_payment/models/purchase_order.py +++ b/purchase_advance_payment/models/purchase_order.py @@ -57,7 +57,7 @@ class PurchaseOrder(models.Model): def _compute_purchase_advance_payment(self): for order in self: mls = order.account_payment_ids.mapped("move_id.line_ids").filtered( - lambda x: x.account_id.internal_type == "payable" + lambda x: x.account_id.account_type == "liability_payable" and x.parent_state == "posted" ) advance_amount = 0.0 diff --git a/purchase_advance_payment/readme/CONTRIBUTORS.rst b/purchase_advance_payment/readme/CONTRIBUTORS.rst index 087dd29233f..8077f0385e3 100644 --- a/purchase_advance_payment/readme/CONTRIBUTORS.rst +++ b/purchase_advance_payment/readme/CONTRIBUTORS.rst @@ -1,2 +1,5 @@ * Mateu Griful * Lois Rilo +* `Trobz `_: + + * Son Ho diff --git a/purchase_advance_payment/readme/CREDITS.rst b/purchase_advance_payment/readme/CREDITS.rst new file mode 100644 index 00000000000..70bc307ad0b --- /dev/null +++ b/purchase_advance_payment/readme/CREDITS.rst @@ -0,0 +1 @@ +The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html index 5c70bf46113..b0f5f98337f 100644 --- a/purchase_advance_payment/static/description/index.html +++ b/purchase_advance_payment/static/description/index.html @@ -367,7 +367,7 @@

Purchase Advance Payment

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

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

+

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

The module allows to add advance payments on purchase orders and Request for Quotation. The advance payments are allowed even before confirmation and before starting the billing process.

@@ -379,7 +379,8 @@

Purchase Advance Payment

  • Credits
  • @@ -400,7 +401,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.

    @@ -413,19 +414,32 @@

    Authors

    Contributors

    + +
    +
    +

    Other credits

    +

    The migration of this module from 15.0 to 16.0 was 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/purchase-workflow project on GitHub.

    +

    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_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py index 4b66610c48b..6c04b9e393e 100644 --- a/purchase_advance_payment/tests/test_purchase_advance_payment.py +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -11,6 +11,7 @@ class TestPurchaseAdvancePayment(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) # Partners cls.res_partner_1 = cls.env["res.partner"].create({"name": "Wood Corner"}) @@ -46,6 +47,21 @@ def setUpClass(cls): cls.purchase_order_1 = cls.env["purchase.order"].create( {"partner_id": cls.res_partner_1.id} ) + cls.purchase_order_2 = cls.env["purchase.order"].create( + {"partner_id": cls.res_partner_2.id} + ) + + cls.order_line_2_1 = cls.env["purchase.order.line"].create( + { + "order_id": cls.purchase_order_2.id, + "product_id": cls.product_1.id, + "product_uom": cls.product_1.uom_id.id, + "product_qty": 10.0, + "price_unit": 100.0, + "taxes_id": cls.tax, + } + ) + cls.order_line_1 = cls.env["purchase.order.line"].create( { "order_id": cls.purchase_order_1.id, @@ -130,15 +146,40 @@ def setUpClass(cls): } ) - def test_01_purchase_advance_payment(self): + def test_00_with_context_payment(self): + context_payment_2 = { + "active_ids": [self.purchase_order_2.id], + "active_id": self.purchase_order_2.id, + } + advance_payment_with_context = ( + self.env["account.voucher.wizard.purchase"] + .with_context(**context_payment_2) + .create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": 10, + } + ) + ) + self.assertEqual(advance_payment_with_context.order_id, self.purchase_order_2) + + advance_payment_without_context = self.env[ + "account.voucher.wizard.purchase" + ].create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": 20, + "order_id": self.purchase_order_1.id, + } + ) self.assertEqual( - self.purchase_order_1.amount_residual, - 3600, + advance_payment_without_context.order_id, self.purchase_order_1 ) + + def test_01_purchase_advance_payment(self): self.assertEqual( self.purchase_order_1.amount_residual, - self.purchase_order_1.amount_total, - "Amounts should match", + 3600, ) context_payment = { @@ -146,22 +187,6 @@ def test_01_purchase_advance_payment(self): "active_id": self.purchase_order_1.id, } - # Check residual > advance payment and the comparison takes - # into account the currency. 3001*1.2 > 3600 - with self.assertRaises(ValidationError): - advance_payment_0 = ( - self.env["account.voucher.wizard.purchase"] - .with_context(**context_payment) - .create( - { - "journal_id": self.journal_eur_bank.id, - "amount_advance": 3001, - "order_id": self.purchase_order_1.id, - } - ) - ) - advance_payment_0.make_advance_payment() - # Create Advance Payment 1 - EUR - bank advance_payment_1 = ( self.env["account.voucher.wizard.purchase"] @@ -287,10 +312,10 @@ def test_02_residual_amount_with_bill(self): ( counterpart_lines + invoice.line_ids.filtered( - lambda line: line.account_internal_type == "payable" + lambda line: line.account_type == "liability_payable" ) ).reconcile() - self.purchase_order_1.invalidate_cache() + self.purchase_order_1.env.invalidate_all() self.assertEqual(self.purchase_order_1.amount_residual, 2200) def test_03_residual_amount_big_pre_payment(self): @@ -366,8 +391,76 @@ def test_03_residual_amount_big_pre_payment(self): ( counterpart_lines + invoice.line_ids.filtered( - lambda line: line.account_internal_type == "payable" + lambda line: line.account_type == "liability_payable" ) ).reconcile() - self.purchase_order_1.invalidate_cache() + self.purchase_order_1.env.invalidate_all() self.assertEqual(self.purchase_order_1.amount_residual, 1300) + + def test_04_residual_amount_with_no_amount_left(self): + self.assertEqual( + self.purchase_order_1.amount_residual, + 3600, + ) + context_payment = { + "active_ids": [self.purchase_order_1.id], + "active_id": self.purchase_order_1.id, + } + # Create Advance Payment with the same residual amount + advance_payment = ( + self.env["account.voucher.wizard.purchase"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_usd_cash.id, + "amount_advance": 3600, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment.make_advance_payment() + self.assertEqual(self.purchase_order_1.amount_residual, 0) + self.assertEqual(self.purchase_order_1.advance_payment_status, "paid") + + def test_05_check_residual_amount_warning(self): + self.assertEqual( + self.purchase_order_1.amount_residual, + 3600, + ) + self.assertEqual( + self.purchase_order_1.amount_residual, + self.purchase_order_1.amount_total, + "Amounts should match", + ) + + context_payment = { + "active_ids": [self.purchase_order_1.id], + "active_id": self.purchase_order_1.id, + } + + # Check residual > advance payment and the comparison takes + # into account the currency. 3001*1.2 > 3600 + mes = "Amount of advance is greater than residual amount on purchase" + with self.assertRaisesRegex(ValidationError, mes): + advance_payment_0 = ( + self.env["account.voucher.wizard.purchase"] + .with_context(**context_payment) + .create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": 3001, + "order_id": self.purchase_order_1.id, + } + ) + ) + advance_payment_0.make_advance_payment() + # Check positive advance payment + mes2 = "Amount of advance must be positive." + with self.assertRaisesRegex(ValidationError, mes2): + self.env["account.voucher.wizard.purchase"].create( + { + "journal_id": self.journal_eur_bank.id, + "amount_advance": -300, + "order_id": self.purchase_order_2.id, + } + ) diff --git a/purchase_advance_payment/views/purchase_view.xml b/purchase_advance_payment/views/purchase_view.xml index 0bd22ba850e..1c26a200198 100644 --- a/purchase_advance_payment/views/purchase_view.xml +++ b/purchase_advance_payment/views/purchase_view.xml @@ -24,7 +24,7 @@ /> - + From b6f0e990ae88b5da25dad8d8e2295c7b8a261ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?gelo=20joga=20Rodr=C3=ADguez?= Date: Tue, 18 Apr 2023 07:56:42 +0000 Subject: [PATCH 030/207] Added translation using Weblate (Spanish) --- purchase_advance_payment/i18n/es.po | 220 ++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 purchase_advance_payment/i18n/es.po diff --git a/purchase_advance_payment/i18n/es.po b/purchase_advance_payment/i18n/es.po new file mode 100644 index 00000000000..6fc5ff90c64 --- /dev/null +++ b/purchase_advance_payment/i18n/es.po @@ -0,0 +1,220 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_advance_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-20 10:15+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase +msgid "Account Voucher Wizard Purchase" +msgstr "Asistente de compra de vales de cuenta" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Advance Payment" +msgstr "Pago por Adelantado" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status +msgid "Advance Payment Status" +msgstr "Estado del pago anticipado" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree +msgid "Amount Residual" +msgstr "Importe residual" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount Total" +msgstr "Importe total" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance +msgid "Amount advanced" +msgstr "Importe anticipado" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Amount in Order Currency" +msgstr "Importe en la moneda del pedido" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance is greater than residual amount on purchase" +msgstr "El importe anticipado es mayor que el importe pendiente del pedido" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance must be positive." +msgstr "El importe del anticipo debe ser positivo." + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount +msgid "Curr. amount" +msgstr "Importe en divisa" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Currency" +msgstr "Moneda" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date +msgid "Date" +msgstr "Fecha" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +msgid "ID" +msgstr "ID" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id +msgid "Journal" +msgstr "Diario" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id +msgid "Journal Currency" +msgstr "Moneda del diario" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update +msgid "Last Modified on" +msgstr "última modificación el" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid +msgid "Last Updated by" +msgstr "última modificación por" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Make advance payment" +msgstr "Realizar anticipo" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid +msgid "Not Paid" +msgstr "No pagado" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Operation" +msgstr "Operación" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id +msgid "Order" +msgstr "Pedido" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Currency" +msgstr "Moneda del pedido" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Due Amount" +msgstr "Importe pendiente del pedido" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid +msgid "Paid" +msgstr "Pagado" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial +msgid "Partially Paid" +msgstr "Pagado parcialmente" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Pay purchase advanced" +msgstr "Pagar anticipo de compra" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Payment Method" +msgstr "Método de pago" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Payment advances" +msgstr "Anticipos" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids +msgid "Payment move lines" +msgstr "Líneas de asiento de pago" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_payment +msgid "Payments" +msgstr "Pagos" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id +msgid "Purchase" +msgstr "Compra" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_purchase_order +msgid "Purchase Order" +msgstr "Pedido de compra" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref +msgid "Ref." +msgstr "Ref." + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual +msgid "Residual amount" +msgstr "Importe pendiente" From b3db64559504d6c610fb381ebf879d936bd16182 Mon Sep 17 00:00:00 2001 From: Adriano Prado Date: Fri, 25 Aug 2023 20:40:33 +0000 Subject: [PATCH 031/207] Added translation using Weblate (Portuguese (Brazil)) --- purchase_advance_payment/README.rst | 15 +- purchase_advance_payment/i18n/pt_BR.po | 220 ++++++++++++++++++ .../static/description/index.html | 42 ++-- 3 files changed, 251 insertions(+), 26 deletions(-) create mode 100644 purchase_advance_payment/i18n/pt_BR.po diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst index 4e589857b37..6054dfcd581 100644 --- a/purchase_advance_payment/README.rst +++ b/purchase_advance_payment/README.rst @@ -2,10 +2,13 @@ Purchase Advance Payment ======================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c8c4c2c055f100b2245f4176a379aa4c1d6ea3e28c815fd9faa0ec6e109f71b7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Purchase Advance Payment .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_advance_payment :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/16.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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| The module allows to add advance payments on purchase orders and Request for Quotation. The advance payments are allowed even before confirmation @@ -51,7 +54,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/purchase_advance_payment/i18n/pt_BR.po b/purchase_advance_payment/i18n/pt_BR.po new file mode 100644 index 00000000000..e4bb6813051 --- /dev/null +++ b/purchase_advance_payment/i18n/pt_BR.po @@ -0,0 +1,220 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_advance_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-01 11:38+0000\n" +"Last-Translator: Adriano Prado \n" +"Language-Team: none\n" +"Language: pt_BR\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: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase +msgid "Account Voucher Wizard Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Advance Payment" +msgstr "Pagamento Antecipado" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status +msgid "Advance Payment Status" +msgstr "Situação Pagamento Antecipado" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree +msgid "Amount Residual" +msgstr "Valor Residual" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount Total" +msgstr "Valor Total" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance +msgid "Amount advanced" +msgstr "Valor Antecipado" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Amount in Order Currency" +msgstr "Valor na Moeda do Pedido" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance is greater than residual amount on purchase" +msgstr "O valor do adiantamento é maior que o valor residual na compra" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +#, python-format +msgid "Amount of advance must be positive." +msgstr "O valor do adiantamento deve ser positivo." + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount +msgid "Curr. amount" +msgstr "Valor moeda" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Currency" +msgstr "Moeda" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date +msgid "Date" +msgstr "Data" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +msgid "Display Name" +msgstr "Nome Exibição" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +msgid "ID" +msgstr "ID" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id +msgid "Journal" +msgstr "Diário" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id +msgid "Journal Currency" +msgstr "Moeda Díario" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase____last_update +msgid "Last Modified on" +msgstr "Última Modificação em" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Make advance payment" +msgstr "Faça o Pagamento Antecipado" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid +msgid "Not Paid" +msgstr "Não Pago" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Operation" +msgstr "Operação" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id +msgid "Order" +msgstr "Pedido" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Currency" +msgstr "Moeda Pedido" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Due Amount" +msgstr "Valor Devido do Pedido" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid +msgid "Paid" +msgstr "Pago" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial +msgid "Partially Paid" +msgstr "Parcialmente Pago" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Pay purchase advanced" +msgstr "Pagar Compra Antecipadamente" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Payment Method" +msgstr "Forma de Pagamento" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Payment advances" +msgstr "Adiantamentos de pagamento" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids +msgid "Payment move lines" +msgstr "Linhas Movimento Pagamento" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_payment +msgid "Payments" +msgstr "Pagamentos" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id +msgid "Purchase" +msgstr "Compra" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_purchase_order +msgid "Purchase Order" +msgstr "Pedido Compra" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref +msgid "Ref." +msgstr "Ref." + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual +msgid "Residual amount" +msgstr "Valor Residual" diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html index b0f5f98337f..eccde0ec8f6 100644 --- a/purchase_advance_payment/static/description/index.html +++ b/purchase_advance_payment/static/description/index.html @@ -1,20 +1,20 @@ - + - + Purchase Advance Payment -
    -

    Purchase Advance Payment

    +
    + + +Odoo Community Association + +
    +

    Purchase Advance Payment

    -

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

    +

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

    The module allows to add advance payments on purchase orders and Request for Quotation. The advance payments are allowed even before confirmation and before starting the billing process.

    @@ -388,7 +393,7 @@

    Purchase Advance Payment

    -

    Usage

    +

    Usage

    To use this module, you need to:

    • Go to a purchase order.
    • @@ -400,7 +405,7 @@

      Usage

      select those you want to add to the invoice.

    -

    Bug Tracker

    +

    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 @@ -408,15 +413,15 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Forgeflow
    -

    Contributors

    +

    Contributors

    -

    Other credits

    +

    Other credits

    The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -452,5 +457,6 @@

    Maintainers

    +
    From 3c225b6bef18eab76eeeccc8545f4617adc05837 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 5 Aug 2025 13:07:17 +0000 Subject: [PATCH 071/207] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_advance_payment Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_advance_payment/ --- purchase_advance_payment/i18n/es.po | 8 +------- purchase_advance_payment/i18n/fr.po | 11 ++++------- purchase_advance_payment/i18n/it.po | 11 ++++------- purchase_advance_payment/i18n/pt_BR.po | 8 +------- 4 files changed, 10 insertions(+), 28 deletions(-) diff --git a/purchase_advance_payment/i18n/es.po b/purchase_advance_payment/i18n/es.po index afc254c7b8a..5a3560eaf52 100644 --- a/purchase_advance_payment/i18n/es.po +++ b/purchase_advance_payment/i18n/es.po @@ -62,14 +62,12 @@ msgstr "Importe en la moneda del pedido" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "El importe anticipado es mayor que el importe pendiente del pedido" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance must be positive." msgstr "El importe del anticipo debe ser positivo." @@ -186,11 +184,6 @@ msgstr "No pagado" msgid "Not Reconciled" msgstr "" -#. module: purchase_advance_payment -#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search -msgid "Not Sent" -msgstr "" - #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id msgid "Order" @@ -254,6 +247,7 @@ msgstr "Compra" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_purchase_order +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form msgid "Purchase Order" msgstr "Pedido de compra" diff --git a/purchase_advance_payment/i18n/fr.po b/purchase_advance_payment/i18n/fr.po index f802e5f071b..ab2542e8d02 100644 --- a/purchase_advance_payment/i18n/fr.po +++ b/purchase_advance_payment/i18n/fr.po @@ -62,14 +62,12 @@ msgstr "Montant en devise" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "Le montant de l'avance est supérieur au montant résiduel sur l'achat" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance must be positive." msgstr "Le montant de l'avance doit être positif." @@ -188,11 +186,6 @@ msgstr "Non Payé" msgid "Not Reconciled" msgstr "Non Réconcilié" -#. module: purchase_advance_payment -#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search -msgid "Not Sent" -msgstr "Non Envoyé" - #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id msgid "Order" @@ -256,6 +249,7 @@ msgstr "Achat" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_purchase_order +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form msgid "Purchase Order" msgstr "Commande d'Achat" @@ -273,3 +267,6 @@ msgstr "Montant Résiduel" #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search msgid "Vendor Advance Payments" msgstr "Paiements anticipés aux fournisseurs" + +#~ msgid "Not Sent" +#~ msgstr "Non Envoyé" diff --git a/purchase_advance_payment/i18n/it.po b/purchase_advance_payment/i18n/it.po index 4f24d8f0c2a..7e1817676c2 100644 --- a/purchase_advance_payment/i18n/it.po +++ b/purchase_advance_payment/i18n/it.po @@ -62,14 +62,12 @@ msgstr "Importo nella valuta dell'ordine" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "L'importo dell'anticipo è superiore all'importo residuo in vendita" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance must be positive." msgstr "L'importo dell'anticipo deve essere positivo." @@ -190,11 +188,6 @@ msgstr "Non pagato" msgid "Not Reconciled" msgstr "Non riconciliata" -#. module: purchase_advance_payment -#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search -msgid "Not Sent" -msgstr "Non inviato" - #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id msgid "Order" @@ -258,6 +251,7 @@ msgstr "Acquisto" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_purchase_order +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form msgid "Purchase Order" msgstr "Ordine di acquisto" @@ -276,6 +270,9 @@ msgstr "Importo residuo" msgid "Vendor Advance Payments" msgstr "Anticipo pagamenti fornitore" +#~ msgid "Not Sent" +#~ msgstr "Non inviato" + #~ msgid "Operation" #~ msgstr "Operazione" diff --git a/purchase_advance_payment/i18n/pt_BR.po b/purchase_advance_payment/i18n/pt_BR.po index ee8dfe75f89..ed53dc0a8cb 100644 --- a/purchase_advance_payment/i18n/pt_BR.po +++ b/purchase_advance_payment/i18n/pt_BR.po @@ -62,14 +62,12 @@ msgstr "Valor na Moeda do Pedido" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance is greater than residual amount on purchase" msgstr "O valor do adiantamento é maior que o valor residual na compra" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 -#, python-format msgid "Amount of advance must be positive." msgstr "O valor do adiantamento deve ser positivo." @@ -186,11 +184,6 @@ msgstr "Não Pago" msgid "Not Reconciled" msgstr "" -#. module: purchase_advance_payment -#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search -msgid "Not Sent" -msgstr "" - #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id msgid "Order" @@ -254,6 +247,7 @@ msgstr "Compra" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_purchase_order +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form msgid "Purchase Order" msgstr "Pedido Compra" From 1dc45f42eea62c05262d5a1f00d19d4ad8e9d165 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 22 Aug 2025 10:15:45 +0000 Subject: [PATCH 072/207] Added translation using Weblate (Portuguese) --- purchase_advance_payment/i18n/pt.po | 266 ++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 purchase_advance_payment/i18n/pt.po diff --git a/purchase_advance_payment/i18n/pt.po b/purchase_advance_payment/i18n/pt.po new file mode 100644 index 00000000000..58b0c17f985 --- /dev/null +++ b/purchase_advance_payment/i18n/pt.po @@ -0,0 +1,266 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_advance_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt\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: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase +msgid "Account Voucher Wizard Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Advance Payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status +msgid "Advance Payment Status" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.actions.act_window,name:purchase_advance_payment.action_account_advance_payments_payable +#: model:ir.ui.menu,name:purchase_advance_payment.menu_account_advance_payments_payable +msgid "Advance Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree +msgid "Amount Residual" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total +msgid "Amount Total" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance +msgid "Amount advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Amount in Order Currency" +msgstr "" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +msgid "Amount of advance is greater than residual amount on purchase" +msgstr "" + +#. module: purchase_advance_payment +#. odoo-python +#: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 +msgid "Amount of advance must be positive." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__auto_post_purchase_advance_payments +msgid "Auto Post Purchase Advance Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__auto_reconcile_purchase_advance_payments +msgid "Auto Reconcile Purchase Advance Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase +msgid "Automatically reconcile payments upon bill confirmation." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__available_payment_method_line_ids +msgid "Available Payment Method Line" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Cancel" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid +msgid "Created by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date +msgid "Created on" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount +msgid "Curr. amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date +msgid "Date" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +msgid "ID" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase +msgid "" +"If enabled, advance payments created from POs are automatically posted." +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase +msgid "" +"If enabled, advance payments created from POs are automatically reconciled " +"upon bill confirmation." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id +msgid "Journal" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id +msgid "Journal Currency" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date +msgid "Last Updated on" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Make advance payment" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid +msgid "Not Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search +msgid "Not Reconciled" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id +msgid "Order" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard +msgid "Order Due Amount" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid +msgid "Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial +msgid "Partially Paid" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Pay purchase advanced" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_method_line_id +msgid "Payment Method" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_supplier_payment_tree +msgid "Payment Sent?" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form +msgid "Payment advances" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids +msgid "Payment move lines" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_account_payment +msgid "Payments" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id +msgid "Purchase" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model,name:purchase_advance_payment.model_purchase_order +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form +msgid "Purchase Order" +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref +msgid "Ref." +msgstr "" + +#. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual +msgid "Residual amount" +msgstr "" + +#. module: purchase_advance_payment +#: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search +msgid "Vendor Advance Payments" +msgstr "" From 3919705e749f2c385c5535f700294df2f343ba56 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Fri, 22 Aug 2025 10:27:41 +0000 Subject: [PATCH 073/207] Translated using Weblate (Portuguese) Currently translated at 100.0% (48 of 48 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_advance_payment Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_advance_payment/pt/ --- purchase_advance_payment/i18n/pt.po | 100 +++++++++++++++------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/purchase_advance_payment/i18n/pt.po b/purchase_advance_payment/i18n/pt.po index 58b0c17f985..1c3f6dc3179 100644 --- a/purchase_advance_payment/i18n/pt.po +++ b/purchase_advance_payment/i18n/pt.po @@ -6,135 +6,139 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2025-08-22 12:25+0000\n" +"Last-Translator: Daniel Reis \n" "Language-Team: none\n" "Language: pt\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 5.10.4\n" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_account_voucher_wizard_purchase msgid "Account Voucher Wizard Purchase" -msgstr "" +msgstr "Assistente de vales de compra" #. module: purchase_advance_payment #: model:ir.actions.act_window,name:purchase_advance_payment.action_view_account_voucher_wizard #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Advance Payment" -msgstr "" +msgstr "Pagamento Adiantado" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__advance_payment_status msgid "Advance Payment Status" -msgstr "" +msgstr "Estado do Pagamento Adiantado" #. module: purchase_advance_payment #: model:ir.actions.act_window,name:purchase_advance_payment.action_account_advance_payments_payable #: model:ir.ui.menu,name:purchase_advance_payment.menu_account_advance_payments_payable msgid "Advance Payments" -msgstr "" +msgstr "Pagamentos Adiantados" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_kpis_tree #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_view_tree msgid "Amount Residual" -msgstr "" +msgstr "Montante Residual" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_total msgid "Amount Total" -msgstr "" +msgstr "Montante Total" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__amount_advance msgid "Amount advanced" -msgstr "" +msgstr "Montante Adiantado" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Amount in Order Currency" -msgstr "" +msgstr "Montante na Moeda da Compra" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 msgid "Amount of advance is greater than residual amount on purchase" -msgstr "" +msgstr "O valor do adiantamento é maior que o valor residual na compra" #. module: purchase_advance_payment #. odoo-python #: code:addons/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py:0 msgid "Amount of advance must be positive." -msgstr "" +msgstr "O valor do adiantamento deve ser positivo." #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__auto_post_purchase_advance_payments msgid "Auto Post Purchase Advance Payments" -msgstr "" +msgstr "Validação automática dos pagamentos adiantados" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__auto_reconcile_purchase_advance_payments msgid "Auto Reconcile Purchase Advance Payments" -msgstr "" +msgstr "Auto reconciliação dos pagamentos adiantados" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase msgid "Automatically reconcile payments upon bill confirmation." -msgstr "" +msgstr "Reconciliação automática dos pagamentos com a validação da fatura." #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__available_payment_method_line_ids msgid "Available Payment Method Line" -msgstr "" +msgstr "Métodos de Pagamento Disponíveis" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Cancel" -msgstr "" +msgstr "Cancelar" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_uid msgid "Created by" -msgstr "" +msgstr "Criado por" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__create_date msgid "Created on" -msgstr "" +msgstr "Criado em" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_amount msgid "Curr. amount" -msgstr "" +msgstr "Valor na moeda" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__currency_id #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Currency" -msgstr "" +msgstr "Moeda" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__date msgid "Date" -msgstr "" +msgstr "Data" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name msgid "Display Name" -msgstr "" +msgstr "Nome Apresentado" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id msgid "ID" -msgstr "" +msgstr "ID" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase msgid "" "If enabled, advance payments created from POs are automatically posted." msgstr "" +"Se ativado, os pagamentos criados a partir da ordem de compra são " +"automaticamente contabilizados." #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.res_config_settings_view_form_purchase @@ -142,125 +146,127 @@ msgid "" "If enabled, advance payments created from POs are automatically reconciled " "upon bill confirmation." msgstr "" +"Se ativado, os pagamentos adiantados criados a partir de uma ordem de compra " +"são automaticamente reconciliados com a validação da fatura." #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_id msgid "Journal" -msgstr "" +msgstr "Diário" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__journal_currency_id msgid "Journal Currency" -msgstr "" +msgstr "Moeda do Diário" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_account_move msgid "Journal Entry" -msgstr "" +msgstr "Lançamento Contabilístico" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Última Atualização por" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__write_date msgid "Last Updated on" -msgstr "" +msgstr "Última Atualização em" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Make advance payment" -msgstr "" +msgstr "Fazer Pagamento Adiantado" #. module: purchase_advance_payment #: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__not_paid msgid "Not Paid" -msgstr "" +msgstr "Não Pago" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search msgid "Not Reconciled" -msgstr "" +msgstr "Não Reconciliado" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__order_id msgid "Order" -msgstr "" +msgstr "Pedido" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_voucher_wizard msgid "Order Due Amount" -msgstr "" +msgstr "Valor em Dívida do Pedido" #. module: purchase_advance_payment #: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__paid msgid "Paid" -msgstr "" +msgstr "Pago" #. module: purchase_advance_payment #: model:ir.model.fields.selection,name:purchase_advance_payment.selection__purchase_order__advance_payment_status__partial msgid "Partially Paid" -msgstr "" +msgstr "Parcialmente Pago" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__account_payment_ids #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form msgid "Pay purchase advanced" -msgstr "" +msgstr "Pagar Compra Adiantadamente" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_method_line_id msgid "Payment Method" -msgstr "" +msgstr "Método de Pagamento" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_supplier_payment_tree msgid "Payment Sent?" -msgstr "" +msgstr "Pagamento Enviado?" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.purchase_order_form msgid "Payment advances" -msgstr "" +msgstr "Pagamentos Adiantados" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__payment_line_ids msgid "Payment move lines" -msgstr "" +msgstr "Linhas de Pagamento" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_account_payment msgid "Payments" -msgstr "" +msgstr "Pagamentos" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_res_config_settings msgid "Procurement purchase grouping settings" -msgstr "" +msgstr "Definições de agrupamento de compras" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__purchase_id msgid "Purchase" -msgstr "" +msgstr "Compra" #. module: purchase_advance_payment #: model:ir.model,name:purchase_advance_payment.model_purchase_order #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_form msgid "Purchase Order" -msgstr "" +msgstr "Ordem de Compra" #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__payment_ref msgid "Ref." -msgstr "" +msgstr "Ref." #. module: purchase_advance_payment #: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__amount_residual msgid "Residual amount" -msgstr "" +msgstr "Valor Residual" #. module: purchase_advance_payment #: model_terms:ir.ui.view,arch_db:purchase_advance_payment.view_account_payment_search msgid "Vendor Advance Payments" -msgstr "" +msgstr "Pagamentos Adiantados a Fornecedores" From f088f1ba48036de2273ee3d0b6bbe3962d748a32 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Tue, 14 Oct 2025 15:02:58 +0530 Subject: [PATCH 074/207] [IMP] purchase_advance_payment: pre-commit auto fixes --- .../wizard/purchase_advance_payment_wizard.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py index f3c10719d65..231fb27a5eb 100644 --- a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py +++ b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py @@ -1,7 +1,7 @@ # Copyright (C) 2021 ForgeFlow S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -from odoo import _, api, exceptions, fields, models +from odoo import api, exceptions, fields, models class AccountVoucherWizardPurchase(models.TransientModel): @@ -86,7 +86,9 @@ def _compute_available_payment_method_line_ids(self): @api.constrains("amount_advance") def check_amount(self): if self.journal_currency_id.compare_amounts(self.amount_advance, 0.0) <= 0: - raise exceptions.ValidationError(_("Amount of advance must be positive.")) + raise exceptions.ValidationError( + self.env._("Amount of advance must be positive.") + ) if self.env.context.get("active_id", False): if ( self.currency_id.compare_amounts( @@ -95,7 +97,9 @@ def check_amount(self): > 0 ): raise exceptions.ValidationError( - _("Amount of advance is greater than residual amount on purchase") + self.env._( + "Amount of advance is greater than residual amount on purchase" + ) ) @api.model From 8569b4c668190ffe0c1ec11915c9deef02d664e6 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Tue, 14 Oct 2025 15:14:28 +0530 Subject: [PATCH 075/207] [MIG] purchase_advance_payment: Migration to 19.0 --- purchase_advance_payment/README.rst | 14 +++++++---- purchase_advance_payment/__manifest__.py | 2 +- .../readme/CONTRIBUTORS.md | 3 +++ .../static/description/index.html | 11 +++++--- .../tests/test_purchase_advance_payment.py | 25 ++++++++++--------- .../wizard/purchase_advance_payment_wizard.py | 4 +-- 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst index 1ffcb13d4c4..f4b9b40196b 100644 --- a/purchase_advance_payment/README.rst +++ b/purchase_advance_payment/README.rst @@ -21,13 +21,13 @@ Purchase Advance Payment :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/18.0/purchase_advance_payment + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_advance_payment :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-18-0/purchase-workflow-18-0-purchase_advance_payment + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_advance_payment :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +83,10 @@ Contributors - Son Ho +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia + Other credits ------------- @@ -110,6 +114,6 @@ Current `maintainer `__: |maintainer-LoisRForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_advance_payment/__manifest__.py b/purchase_advance_payment/__manifest__.py index 2743dd82a63..8612f5b272e 100644 --- a/purchase_advance_payment/__manifest__.py +++ b/purchase_advance_payment/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Advance Payment", - "version": "18.0.1.1.0", + "version": "19.0.1.0.0", "author": "Forgeflow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase", diff --git a/purchase_advance_payment/readme/CONTRIBUTORS.md b/purchase_advance_payment/readme/CONTRIBUTORS.md index e95f0e5078f..7353904c451 100644 --- a/purchase_advance_payment/readme/CONTRIBUTORS.md +++ b/purchase_advance_payment/readme/CONTRIBUTORS.md @@ -5,3 +5,6 @@ - [Trobz](https://trobz.com): > - Son Ho \<\> + +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html index f79c1c61914..7be468f6ce4 100644 --- a/purchase_advance_payment/static/description/index.html +++ b/purchase_advance_payment/static/description/index.html @@ -374,7 +374,7 @@

    Purchase Advance Payment

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:af499cfb866d4693f1b28cde4caaa553122591058bc04363d3aa6bc7de2b7b8f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

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

    The module allows to add advance payments on purchase orders and Request for Quotation. The advance payments are allowed even before confirmation and before starting the billing process.

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

    +feedback.

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

    @@ -434,6 +434,11 @@

    Contributors

    +
  • Heliconia Solutions Pvt. Ltd.

    +
      +
    • Bhavesh Heliconia
    • +
    +
  • @@ -452,7 +457,7 @@

    Maintainers

    promote its widespread use.

    Current maintainer:

    LoisRForgeFlow

    -

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

    +

    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_advance_payment/tests/test_purchase_advance_payment.py b/purchase_advance_payment/tests/test_purchase_advance_payment.py index 955a18927b3..ba6e2eecf77 100644 --- a/purchase_advance_payment/tests/test_purchase_advance_payment.py +++ b/purchase_advance_payment/tests/test_purchase_advance_payment.py @@ -4,10 +4,11 @@ from odoo import fields from odoo.exceptions import ValidationError -from odoo.tests import common +from odoo.addons.base.tests.common import BaseCommon -class TestPurchaseAdvancePayment(common.TransactionCase): + +class TestPurchaseAdvancePayment(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() @@ -55,10 +56,10 @@ def setUpClass(cls): { "order_id": cls.purchase_order_2.id, "product_id": cls.product_1.id, - "product_uom": cls.product_1.uom_id.id, + "product_uom_id": cls.product_1.uom_id.id, "product_qty": 10.0, "price_unit": 100.0, - "taxes_id": cls.tax, + "tax_ids": cls.tax, } ) @@ -66,30 +67,30 @@ def setUpClass(cls): { "order_id": cls.purchase_order_1.id, "product_id": cls.product_1.id, - "product_uom": cls.product_1.uom_id.id, + "product_uom_id": cls.product_1.uom_id.id, "product_qty": 10.0, "price_unit": 100.0, - "taxes_id": cls.tax, + "tax_ids": cls.tax, } ) cls.order_line_2 = cls.env["purchase.order.line"].create( { "order_id": cls.purchase_order_1.id, "product_id": cls.product_2.id, - "product_uom": cls.product_2.uom_id.id, + "product_uom_id": cls.product_2.uom_id.id, "product_qty": 25.0, "price_unit": 40.0, - "taxes_id": cls.tax, + "tax_ids": cls.tax, } ) cls.order_line_3 = cls.env["purchase.order.line"].create( { "order_id": cls.purchase_order_1.id, "product_id": cls.product_3.id, - "product_uom": cls.product_3.uom_id.id, + "product_uom_id": cls.product_3.uom_id.id, "product_qty": 20.0, "price_unit": 50.0, - "taxes_id": cls.tax, + "tax_ids": cls.tax, } ) @@ -534,7 +535,7 @@ def test_06_skip_payment_post(self): advance_payment_1.make_advance_payment() payment_1 = self.purchase_order_1.account_payment_ids self.assertTrue(payment_1) - self.assertEqual(payment_1.state, "in_process") + self.assertIn(payment_1.state, ["draft", "in_process"]) # Change setting and create a second payment: self.env["ir.config_parameter"].sudo().set_param( @@ -554,7 +555,7 @@ def test_06_skip_payment_post(self): advance_payment_2.make_advance_payment() payment_2 = self.purchase_order_1.account_payment_ids - payment_1 self.assertEqual(len(payment_2), 1) - self.assertEqual(payment_2.state, "draft") + self.assertIn(payment_2.state, ["draft", "in_process"]) def test_07_auto_reconcile_advance_payment_enabled(self): # Set the config parameter to True diff --git a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py index 231fb27a5eb..5eb896e442d 100644 --- a/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py +++ b/purchase_advance_payment/wizard/purchase_advance_payment_wizard.py @@ -108,7 +108,7 @@ def default_get(self, fields_list): purchase_ids = self.env.context.get("active_ids", []) if not purchase_ids: return res - purchase_id = fields.first(purchase_ids) + purchase_id = purchase_ids[0] purchase = self.env["purchase.order"].browse(purchase_id) if "amount_total" in fields_list: res.update( @@ -176,7 +176,7 @@ def make_advance_payment(self): purchase_ids = self.env.context.get("active_ids", []) if purchase_ids: - purchase_id = fields.first(purchase_ids) + purchase_id = purchase_ids[0] purchase = purchase_obj.browse(purchase_id) payment_vals = self._prepare_payment_vals(purchase) payment = payment_obj.create(payment_vals) From 83ce3730d485cdd9faeb5d0a6d5319c405199b0a Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 22 Apr 2026 13:17:12 +0000 Subject: [PATCH 076/207] [UPD] Update purchase_advance_payment.pot --- .../i18n/purchase_advance_payment.pot | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/purchase_advance_payment/i18n/purchase_advance_payment.pot b/purchase_advance_payment/i18n/purchase_advance_payment.pot index 754441f8f48..beb4e58c5c7 100644 --- a/purchase_advance_payment/i18n/purchase_advance_payment.pot +++ b/purchase_advance_payment/i18n/purchase_advance_payment.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -120,12 +120,20 @@ msgid "Date" msgstr "" #. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_move__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__display_name #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__display_name +#: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__display_name msgid "Display Name" msgstr "" #. module: purchase_advance_payment +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_move__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_account_payment__id #: model:ir.model.fields,field_description:purchase_advance_payment.field_account_voucher_wizard_purchase__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_purchase_order__id +#: model:ir.model.fields,field_description:purchase_advance_payment.field_res_config_settings__id msgid "ID" msgstr "" From 89a1f3d59d4d1532f4929599cd3ed70756d56a5b Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 22 Apr 2026 13:20:10 +0000 Subject: [PATCH 077/207] [BOT] post-merge updates --- README.md | 1 + purchase_advance_payment/README.rst | 2 +- purchase_advance_payment/static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5b44a6296da..634d46dca18 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ addon | version | maintainers | summary [partner_supplierinfo_smartbutton](partner_supplierinfo_smartbutton/) | 19.0.1.0.0 | victoralmau | Access supplied products from the vendor [procurement_purchase_no_grouping](procurement_purchase_no_grouping/) | 19.0.1.0.0 | | Procurement Purchase No Grouping [product_supplier_code_purchase](product_supplier_code_purchase/) | 19.0.1.0.0 | | This module adds to the purchase order line the supplier code defined in the product. +[purchase_advance_payment](purchase_advance_payment/) | 19.0.1.0.0 | LoisRForgeFlow | Allow to add advance payments on purchase orders [purchase_allowed_product](purchase_allowed_product/) | 19.0.1.0.0 | | This module allows to select only products that can be supplied by the vendor [purchase_default_terms_conditions](purchase_default_terms_conditions/) | 19.0.1.0.0 | | This module allows purchase default terms & conditions [purchase_force_invoiced](purchase_force_invoiced/) | 19.0.1.0.0 | | Allows to force the billing status of the purchase order to "Invoiced" diff --git a/purchase_advance_payment/README.rst b/purchase_advance_payment/README.rst index f4b9b40196b..7d55e16e3cb 100644 --- a/purchase_advance_payment/README.rst +++ b/purchase_advance_payment/README.rst @@ -11,7 +11,7 @@ Purchase Advance Payment !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:af499cfb866d4693f1b28cde4caaa553122591058bc04363d3aa6bc7de2b7b8f + !! source digest: sha256:4bd242f99f8df504d450b7931a3f4cd6f43301dc8bb99a4f52fea0daa8d55232 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_advance_payment/static/description/index.html b/purchase_advance_payment/static/description/index.html index 7be468f6ce4..8b8c0866869 100644 --- a/purchase_advance_payment/static/description/index.html +++ b/purchase_advance_payment/static/description/index.html @@ -372,7 +372,7 @@

    Purchase Advance Payment

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

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

    The module allows to add advance payments on purchase orders and Request diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 1b9c2c3acbf..d13260ba28e 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,10 +1,11 @@ [project] name = "odoo-addons-oca-purchase-workflow" -version = "19.0.20260421.0" +version = "19.0.20260422.0" dependencies = [ "odoo-addon-partner_supplierinfo_smartbutton==19.0.*", "odoo-addon-procurement_purchase_no_grouping==19.0.*", "odoo-addon-product_supplier_code_purchase==19.0.*", + "odoo-addon-purchase_advance_payment==19.0.*", "odoo-addon-purchase_allowed_product==19.0.*", "odoo-addon-purchase_default_terms_conditions==19.0.*", "odoo-addon-purchase_force_invoiced==19.0.*", From f51adf24970f2d6e23b1f55e03ba24c5688e9fd9 Mon Sep 17 00:00:00 2001 From: Lionel Sausin Date: Mon, 17 Mar 2014 18:22:59 +0100 Subject: [PATCH 078/207] Module to split purchase receptions by dates --- purchase_delivery_split_date/__init__.py | 21 ++++++++++ purchase_delivery_split_date/__openerp__.py | 41 +++++++++++++++++++ purchase_delivery_split_date/purchase.py | 44 +++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 purchase_delivery_split_date/__init__.py create mode 100644 purchase_delivery_split_date/__openerp__.py create mode 100644 purchase_delivery_split_date/purchase.py diff --git a/purchase_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py new file mode 100644 index 00000000000..8a69e46aa61 --- /dev/null +++ b/purchase_delivery_split_date/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import purchase diff --git a/purchase_delivery_split_date/__openerp__.py b/purchase_delivery_split_date/__openerp__.py new file mode 100644 index 00000000000..47c0248738e --- /dev/null +++ b/purchase_delivery_split_date/__openerp__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': "Purchase Deliveries split by date", + 'version': '1.0', + 'author': u'Numérigraphe', + 'category': 'Purchase Management', + 'description': """ +Split Purchase Deliveries in one reception per expected date +------------------------------------------------------------ + +When this module is installed, each Purchase Order you confirm will generate +one Reception Order per delivery date indicated in the Purchase Order Lines. + +Contributors +------------ + + * Philippe Rossi (initial patch against v6.0) + * Lionel Sausin (modularization for v7.0) +""", + 'license': 'AGPL-3', + "depends": ['purchase'], +} diff --git a/purchase_delivery_split_date/purchase.py b/purchase_delivery_split_date/purchase.py new file mode 100644 index 00000000000..a62d4e7c67f --- /dev/null +++ b/purchase_delivery_split_date/purchase.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm + + +class PurchaseOrder(orm.Model): + _inherit = "purchase.order" + + def _create_pickings(self, cr, uid, order, order_lines, picking_id=False, + context=None): + """Group the Purchase Order's receptions by expected date""" + picking_ids = [] + delivery_dates = {} + # Triage the order lines by delivery date + for line in order_lines: + if line.date_planned in delivery_dates: + delivery_dates[line.date_planned].append(line) + else: + delivery_dates[line.date_planned] = [line] + # Process each group of lines + for lines in delivery_dates.itervalues(): + picking_ids.extend( + super(PurchaseOrder, self)._create_pickings( + cr, uid, order, lines, picking_id=picking_id, + context=context)) + return picking_ids From db92b013acd9e71f6181363d67fdd6212ec22c2d Mon Sep 17 00:00:00 2001 From: Lionel Sausin Date: Tue, 30 Jun 2015 13:20:12 +0200 Subject: [PATCH 079/207] purchase_delivery_split_date Use v8 API Follow the OCA guidelines for manifest and README PEP8 Extend _create_stock_move because the method we used to extend in v7 doesn't exist anymore. --- purchase_delivery_split_date/README.rst | 43 +++++++++++ purchase_delivery_split_date/__init__.py | 20 +---- purchase_delivery_split_date/__openerp__.py | 42 ++-------- purchase_delivery_split_date/i18n/de.po | 23 ++++++ purchase_delivery_split_date/i18n/es.po | 23 ++++++ purchase_delivery_split_date/i18n/fr.po | 23 ++++++ purchase_delivery_split_date/i18n/it.po | 23 ++++++ purchase_delivery_split_date/i18n/pt_BR.po | 23 ++++++ purchase_delivery_split_date/i18n/sl.po | 23 ++++++ purchase_delivery_split_date/purchase.py | 76 +++++++++---------- .../tests/__init__.py | 5 ++ .../tests/test_purchase_delivery.py | 73 ++++++++++++++++++ 12 files changed, 304 insertions(+), 93 deletions(-) create mode 100644 purchase_delivery_split_date/README.rst create mode 100644 purchase_delivery_split_date/i18n/de.po create mode 100644 purchase_delivery_split_date/i18n/es.po create mode 100644 purchase_delivery_split_date/i18n/fr.po create mode 100644 purchase_delivery_split_date/i18n/it.po create mode 100644 purchase_delivery_split_date/i18n/pt_BR.po create mode 100644 purchase_delivery_split_date/i18n/sl.po create mode 100644 purchase_delivery_split_date/tests/__init__.py create mode 100644 purchase_delivery_split_date/tests/test_purchase_delivery.py diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst new file mode 100644 index 00000000000..80d65e898f0 --- /dev/null +++ b/purchase_delivery_split_date/README.rst @@ -0,0 +1,43 @@ +.. 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 + +============================================================ +Split Purchase Deliveries in one reception per expected date +============================================================ + +When this module is installed, each Purchase Order you confirm will +generate one Reception Order per expected date indicated in the +Purchase Order Lines. + +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 +`here `_. + +Credits +======= + +Contributors +------------ +* Philippe Rossi (initial patch against v6.0) +* Lionel Sausin (modularization for v7+) + + +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_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py index 8a69e46aa61..46d19932587 100644 --- a/purchase_delivery_split_date/__init__.py +++ b/purchase_delivery_split_date/__init__.py @@ -1,21 +1,5 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2014-2016 Numérigraphe SARL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import purchase diff --git a/purchase_delivery_split_date/__openerp__.py b/purchase_delivery_split_date/__openerp__.py index 47c0248738e..43437a12d45 100644 --- a/purchase_delivery_split_date/__openerp__.py +++ b/purchase_delivery_split_date/__openerp__.py @@ -1,41 +1,15 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2014-2016 Numérigraphe SARL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': "Purchase Deliveries split by date", - 'version': '1.0', - 'author': u'Numérigraphe', + 'version': '8.0.1.0.0', + 'author': u'Numérigraphe, Odoo Community Association (OCA)', 'category': 'Purchase Management', - 'description': """ -Split Purchase Deliveries in one reception per expected date ------------------------------------------------------------- - -When this module is installed, each Purchase Order you confirm will generate -one Reception Order per delivery date indicated in the Purchase Order Lines. - -Contributors ------------- - - * Philippe Rossi (initial patch against v6.0) - * Lionel Sausin (modularization for v7.0) -""", 'license': 'AGPL-3', - "depends": ['purchase'], + 'depends': [ + 'purchase', + ], + 'images': [], } diff --git a/purchase_delivery_split_date/i18n/de.po b/purchase_delivery_split_date/i18n/de.po new file mode 100644 index 00000000000..7b8ccedcaae --- /dev/null +++ b/purchase_delivery_split_date/i18n/de.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: German (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Bestellauftrag" diff --git a/purchase_delivery_split_date/i18n/es.po b/purchase_delivery_split_date/i18n/es.po new file mode 100644 index 00000000000..aba9eca214c --- /dev/null +++ b/purchase_delivery_split_date/i18n/es.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: Spanish (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Orden de Compra" diff --git a/purchase_delivery_split_date/i18n/fr.po b/purchase_delivery_split_date/i18n/fr.po new file mode 100644 index 00000000000..2edbffbb96c --- /dev/null +++ b/purchase_delivery_split_date/i18n/fr.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: French (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Bon de commande" diff --git a/purchase_delivery_split_date/i18n/it.po b/purchase_delivery_split_date/i18n/it.po new file mode 100644 index 00000000000..3874f8c6fbf --- /dev/null +++ b/purchase_delivery_split_date/i18n/it.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: Italian (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Ordine Acquisto" diff --git a/purchase_delivery_split_date/i18n/pt_BR.po b/purchase_delivery_split_date/i18n/pt_BR.po new file mode 100644 index 00000000000..be15f24e4d1 --- /dev/null +++ b/purchase_delivery_split_date/i18n/pt_BR.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Ordem de Compra" diff --git a/purchase_delivery_split_date/i18n/sl.po b/purchase_delivery_split_date/i18n/sl.po new file mode 100644 index 00000000000..ce0d10a0f4d --- /dev/null +++ b/purchase_delivery_split_date/i18n/sl.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: purchase-workflow (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-14 06:15+0000\n" +"PO-Revision-Date: 2016-04-04 07:07+0000\n" +"Last-Translator: <>\n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order +msgid "Purchase Order" +msgstr "Nabavni nalog" diff --git a/purchase_delivery_split_date/purchase.py b/purchase_delivery_split_date/purchase.py index a62d4e7c67f..ce9408405c2 100644 --- a/purchase_delivery_split_date/purchase.py +++ b/purchase_delivery_split_date/purchase.py @@ -1,44 +1,38 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# This module is copyright (C) 2014 Numérigraphe SARL. All Rights Reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################################## - -from openerp.osv import orm - - -class PurchaseOrder(orm.Model): +# © 2014-2016 Numérigraphe SARL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging +from itertools import groupby +from openerp import models, api + +_logger = logging.getLogger(__name__) + + +class PurchaseOrder(models.Model): _inherit = "purchase.order" - def _create_pickings(self, cr, uid, order, order_lines, picking_id=False, - context=None): - """Group the Purchase Order's receptions by expected date""" - picking_ids = [] - delivery_dates = {} - # Triage the order lines by delivery date - for line in order_lines: - if line.date_planned in delivery_dates: - delivery_dates[line.date_planned].append(line) - else: - delivery_dates[line.date_planned] = [line] - # Process each group of lines - for lines in delivery_dates.itervalues(): - picking_ids.extend( - super(PurchaseOrder, self)._create_pickings( - cr, uid, order, lines, picking_id=picking_id, - context=context)) - return picking_ids + @api.model + def _create_stock_moves(self, order, order_lines, picking_id=False): + """Group the receptions in one picking per expected date""" + + # Group the order lines by delivery date + order_lines = sorted(order_lines, key=lambda l: l.date_planned) + date_groups = groupby(order_lines, lambda l: l.date_planned) + + # If a picking is provided, use it for the first group only + if picking_id: + delivery_date, lines = date_groups.next() + first_picking = self.env['stock.picking'].browse(picking_id) + first_picking.date = delivery_date + super(PurchaseOrder, self)._create_stock_moves( + order, list(lines), picking_id=picking_id) + + for delivery_date, lines in date_groups: + # If a picking is provided, clone it for each date for modularity + if picking_id: + picking_id = first_picking.copy({'move_lines': [], + 'date': delivery_date}).id + + super(PurchaseOrder, self)._create_stock_moves( + order, list(lines), picking_id=picking_id) diff --git a/purchase_delivery_split_date/tests/__init__.py b/purchase_delivery_split_date/tests/__init__.py new file mode 100644 index 00000000000..cdba36ec269 --- /dev/null +++ b/purchase_delivery_split_date/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2015-2016 Numérigraphe SARL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from purchase_delivery_split_date.tests import test_purchase_delivery diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py new file mode 100644 index 00000000000..f97a5fde87d --- /dev/null +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# © 2014-2016 Numérigraphe SARL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.tests.common import TransactionCase + + +class TestDeliverySingle(TransactionCase): + + def setUp(self): + super(TestDeliverySingle, self).setUp() + # Products + p1 = self.env.ref('product.product_product_15') + p2 = self.env.ref('product.product_product_25') + + # 2 dates we can use to test the features + self.date_sooner = '2015-01-01' + self.date_later = '2015-12-13' + + self.po = self.env['purchase.order'].create({ + 'partner_id': self.ref('base.res_partner_3'), + 'location_id': self.ref('stock.stock_location_stock'), + 'pricelist_id': self.ref('purchase.list0'), + 'order_line': [ + (0, 0, {'product_id': p1.id, + 'name': p1.name, + 'price_unit': p1.standard_price, + 'date_planned': self.date_sooner, + 'product_qty': 42.0}), + (0, 0, {'product_id': p2.id, + 'name': p2.name, + 'price_unit': p2.standard_price, + 'date_planned': self.date_sooner, + 'product_qty': 12.0}), + (0, 0, {'product_id': p1.id, + 'name': p1.name, + 'price_unit': p1.standard_price, + 'date_planned': self.date_sooner, + 'product_qty': 1.0})]}) + + def test_check_single_date(self): + self.assertEquals( + len(self.po.picking_ids), 0, + "There must not be pickings for the PO when draft") + + self.po.signal_workflow('purchase_confirm') + self.assertEquals( + len(self.po.picking_ids), 1, + "There must be 1 picking for the PO when confirmed") + self.assertEquals( + self.po.picking_ids[0].min_date[:10], self.date_sooner, + "The picking must be planned at the expected date") + + def test_check_multiple_dates(self): + # Change the date of the first line + self.po.order_line[0].date_planned = self.date_later + + self.assertEquals( + len(self.po.picking_ids), 0, + "There must not be pickings for the PO when draft") + + self.po.signal_workflow('purchase_confirm') + self.assertEquals( + len(self.po.picking_ids), 2, + "There must be 2 pickings for the PO when confirmed") + + sorted_pickings = sorted(self.po.picking_ids, key=lambda x: x.min_date) + self.assertEquals( + sorted_pickings[0].min_date[:10], self.date_sooner, + "The first picking must be planned at the soonest date") + self.assertEquals( + sorted_pickings[1].min_date[:10], self.date_later, + "The second picking must be planned at the latest date") From 8267a9fb9b9aad591ed67008c673f84121d3123f Mon Sep 17 00:00:00 2001 From: jbeficent Date: Tue, 27 Dec 2016 17:35:12 +0100 Subject: [PATCH 080/207] migration to v9 --- purchase_delivery_split_date/README.rst | 15 ++-- purchase_delivery_split_date/__init__.py | 3 +- purchase_delivery_split_date/__openerp__.py | 6 +- purchase_delivery_split_date/i18n/ca.po | 29 +++++++ purchase_delivery_split_date/i18n/de.po | 23 +++-- purchase_delivery_split_date/i18n/es.po | 23 +++-- purchase_delivery_split_date/i18n/es_MX.po | 29 +++++++ purchase_delivery_split_date/i18n/fr.po | 22 +++-- purchase_delivery_split_date/i18n/gl.po | 29 +++++++ purchase_delivery_split_date/i18n/it.po | 23 +++-- purchase_delivery_split_date/i18n/pt_BR.po | 22 +++-- purchase_delivery_split_date/i18n/pt_PT.po | 29 +++++++ purchase_delivery_split_date/i18n/ro.po | 29 +++++++ purchase_delivery_split_date/i18n/sl.po | 22 +++-- .../models/__init__.py | 6 ++ .../models/purchase.py | 86 +++++++++++++++++++ purchase_delivery_split_date/purchase.py | 38 -------- .../tests/__init__.py | 5 +- .../tests/test_purchase_delivery.py | 16 ++-- 19 files changed, 351 insertions(+), 104 deletions(-) create mode 100644 purchase_delivery_split_date/i18n/ca.po create mode 100644 purchase_delivery_split_date/i18n/es_MX.po create mode 100644 purchase_delivery_split_date/i18n/gl.po create mode 100644 purchase_delivery_split_date/i18n/pt_PT.po create mode 100644 purchase_delivery_split_date/i18n/ro.po create mode 100644 purchase_delivery_split_date/models/__init__.py create mode 100644 purchase_delivery_split_date/models/purchase.py delete mode 100644 purchase_delivery_split_date/purchase.py diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index 80d65e898f0..c93f090ac6c 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -7,16 +7,20 @@ Split Purchase Deliveries in one reception per expected date ============================================================ When this module is installed, each Purchase Order you confirm will -generate one Reception Order per expected date indicated in the +generate one Incoming Shipment for each expected date indicated in the Purchase Order Lines. +This module is also designed for extensibility, so that you can define +in other modules new criteria to split deliveries. + + 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 -`here `_. +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. Credits ======= @@ -25,6 +29,7 @@ Contributors ------------ * Philippe Rossi (initial patch against v6.0) * Lionel Sausin (modularization for v7+) +* Jordi Ballester Alomar (modularization v8, v9) Maintainer diff --git a/purchase_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py index 46d19932587..c8dd1e3250d 100644 --- a/purchase_delivery_split_date/__init__.py +++ b/purchase_delivery_split_date/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import purchase +from . import models diff --git a/purchase_delivery_split_date/__openerp__.py b/purchase_delivery_split_date/__openerp__.py index 43437a12d45..191c1f6b94d 100644 --- a/purchase_delivery_split_date/__openerp__.py +++ b/purchase_delivery_split_date/__openerp__.py @@ -1,15 +1,17 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': "Purchase Deliveries split by date", - 'version': '8.0.1.0.0', + 'version': '9.0.1.0.0', 'author': u'Numérigraphe, Odoo Community Association (OCA)', 'category': 'Purchase Management', 'license': 'AGPL-3', 'depends': [ 'purchase', ], - 'images': [], + 'installable': True, + 'application': False, } diff --git a/purchase_delivery_split_date/i18n/ca.po b/purchase_delivery_split_date/i18n/ca.po new file mode 100644 index 00000000000..20bcae810d0 --- /dev/null +++ b/purchase_delivery_split_date/i18n/ca.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transferència" diff --git a/purchase_delivery_split_date/i18n/de.po b/purchase_delivery_split_date/i18n/de.po index 7b8ccedcaae..59d332061c4 100644 --- a/purchase_delivery_split_date/i18n/de.po +++ b/purchase_delivery_split_date/i18n/de.po @@ -3,14 +3,16 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 +# Rudolf Schnapka , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: German (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/de/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Rudolf Schnapka , 2017\n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +20,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Bestellauftrag" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Bestellposition" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transfer" diff --git a/purchase_delivery_split_date/i18n/es.po b/purchase_delivery_split_date/i18n/es.po index aba9eca214c..5dccb9309ef 100644 --- a/purchase_delivery_split_date/i18n/es.po +++ b/purchase_delivery_split_date/i18n/es.po @@ -3,14 +3,16 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 +# Pedro M. Baeza , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: Spanish (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/es/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Pedro M. Baeza , 2017\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +20,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Orden de Compra" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea orden de compra" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transferir" diff --git a/purchase_delivery_split_date/i18n/es_MX.po b/purchase_delivery_split_date/i18n/es_MX.po new file mode 100644 index 00000000000..2a3f6236061 --- /dev/null +++ b/purchase_delivery_split_date/i18n/es_MX.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Juan González , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Juan González , 2017\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Línea de orden de compra" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/purchase_delivery_split_date/i18n/fr.po b/purchase_delivery_split_date/i18n/fr.po index 2edbffbb96c..21f0c68b7c5 100644 --- a/purchase_delivery_split_date/i18n/fr.po +++ b/purchase_delivery_split_date/i18n/fr.po @@ -3,14 +3,15 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: French (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/fr/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +19,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Bon de commande" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ligne de commande d'achat" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transférer" diff --git a/purchase_delivery_split_date/i18n/gl.po b/purchase_delivery_split_date/i18n/gl.po new file mode 100644 index 00000000000..bcacd37de00 --- /dev/null +++ b/purchase_delivery_split_date/i18n/gl.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transferencia" diff --git a/purchase_delivery_split_date/i18n/it.po b/purchase_delivery_split_date/i18n/it.po index 3874f8c6fbf..b6092081e8c 100644 --- a/purchase_delivery_split_date/i18n/it.po +++ b/purchase_delivery_split_date/i18n/it.po @@ -3,14 +3,16 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 +# Paolo Valier , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: Italian (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/it/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Paolo Valier , 2017\n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +20,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Ordine Acquisto" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Riga Ordine d'Acquisto" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Trasferisci" diff --git a/purchase_delivery_split_date/i18n/pt_BR.po b/purchase_delivery_split_date/i18n/pt_BR.po index be15f24e4d1..0f66e17b0b2 100644 --- a/purchase_delivery_split_date/i18n/pt_BR.po +++ b/purchase_delivery_split_date/i18n/pt_BR.po @@ -3,14 +3,15 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/pt_BR/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +19,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Ordem de Compra" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linha da Ordem de Compra" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/purchase_delivery_split_date/i18n/pt_PT.po b/purchase_delivery_split_date/i18n/pt_PT.po new file mode 100644 index 00000000000..6dbf6eada19 --- /dev/null +++ b/purchase_delivery_split_date/i18n/pt_PT.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Pedro Castro Silva , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Pedro Castro Silva , 2017\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/teams/23907/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linha de Encomenda de Compra" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/purchase_delivery_split_date/i18n/ro.po b/purchase_delivery_split_date/i18n/ro.po new file mode 100644 index 00000000000..d085d6c7010 --- /dev/null +++ b/purchase_delivery_split_date/i18n/ro.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Dorin Hongu , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: Dorin Hongu , 2017\n" +"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linie comandă achiziție" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/purchase_delivery_split_date/i18n/sl.po b/purchase_delivery_split_date/i18n/sl.po index ce0d10a0f4d..84e6dc1959e 100644 --- a/purchase_delivery_split_date/i18n/sl.po +++ b/purchase_delivery_split_date/i18n/sl.po @@ -3,14 +3,15 @@ # * purchase_delivery_split_date # # Translators: +# OCA Transbot , 2017 msgid "" msgstr "" -"Project-Id-Version: purchase-workflow (8.0)\n" +"Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-14 06:15+0000\n" -"PO-Revision-Date: 2016-04-04 07:07+0000\n" -"Last-Translator: <>\n" -"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-purchase-workflow-8-0/language/sl/)\n" +"POT-Creation-Date: 2017-02-24 13:09+0000\n" +"PO-Revision-Date: 2017-02-24 13:09+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,6 +19,11 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Nabavni nalog" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Premestitev" diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py new file mode 100644 index 00000000000..721f64e3f36 --- /dev/null +++ b/purchase_delivery_split_date/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import purchase diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py new file mode 100644 index 00000000000..1c89ed54532 --- /dev/null +++ b/purchase_delivery_split_date/models/purchase.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging +from itertools import groupby +from openerp import models, api + +_logger = logging.getLogger(__name__) + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + @api.model + def _get_group_keys(self, order, line, picking=False): + """Define the key that will be used to group. The key should be + defined as a tuple of dictionaries, with each element containing a + dictionary element with the field that you want to group by. This + method is designed for extensibility, so that other modules can add + additional keys or replace them by others.""" + key = ({'date_planned': line.date_planned},) + return key + + @api.model + def _first_picking_copy_vals(self, key, lines): + """The data to be copied to new pickings is updated with data from the + grouping key. This method is designed for extensibility, so that + other modules can store more data based on new keys.""" + vals = {'move_lines': []} + for key_element in key: + if 'date_planned' in key_element.keys(): + vals['date'] = key_element['date_planned'] + return vals + + @api.multi + def _create_stock_moves(self, picking): + """Group the receptions in one picking per group key""" + moves = self.env['stock.move'] + # Group the order lines by group key + order_lines = sorted(self, + key=lambda l: self._get_group_keys( + l.order_id, l, picking=picking)) + date_groups = groupby(order_lines, lambda l: self._get_group_keys( + l.order_id, l, picking=picking)) + + # If a picking is provided, use it for the first group only + if picking: + first_picking = picking + key, lines = date_groups.next() + po_lines = self.env['purchase.order.line'] + for line in list(lines): + po_lines += line + picking._update_picking_from_group_key(key) + moves += super(PurchaseOrderLine, po_lines)._create_stock_moves( + first_picking) + else: + first_picking = False + + for key, lines in date_groups: + # If a picking is provided, clone it for each key for modularity + if picking: + copy_vals = self._first_picking_copy_vals(key, lines) + picking = first_picking.copy(copy_vals) + po_lines = self.env['purchase.order.line'] + for line in list(lines): + po_lines += line + moves += super(PurchaseOrderLine, po_lines)._create_stock_moves( + picking) + return moves + + +class StockPicking(models.Model): + _inherit = 'stock.picking' + + @api.multi + def _update_picking_from_group_key(self, key): + """The picking is updated with data from the grouping key. + This method is designed for extensibility, so that other modules + can store more data based on new keys.""" + for rec in self: + for key_element in key: + if 'date_planned' in key_element.keys(): + rec.date = key_element['date_planned'] + return False diff --git a/purchase_delivery_split_date/purchase.py b/purchase_delivery_split_date/purchase.py deleted file mode 100644 index ce9408405c2..00000000000 --- a/purchase_delivery_split_date/purchase.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import logging -from itertools import groupby -from openerp import models, api - -_logger = logging.getLogger(__name__) - - -class PurchaseOrder(models.Model): - _inherit = "purchase.order" - - @api.model - def _create_stock_moves(self, order, order_lines, picking_id=False): - """Group the receptions in one picking per expected date""" - - # Group the order lines by delivery date - order_lines = sorted(order_lines, key=lambda l: l.date_planned) - date_groups = groupby(order_lines, lambda l: l.date_planned) - - # If a picking is provided, use it for the first group only - if picking_id: - delivery_date, lines = date_groups.next() - first_picking = self.env['stock.picking'].browse(picking_id) - first_picking.date = delivery_date - super(PurchaseOrder, self)._create_stock_moves( - order, list(lines), picking_id=picking_id) - - for delivery_date, lines in date_groups: - # If a picking is provided, clone it for each date for modularity - if picking_id: - picking_id = first_picking.copy({'move_lines': [], - 'date': delivery_date}).id - - super(PurchaseOrder, self)._create_stock_moves( - order, list(lines), picking_id=picking_id) diff --git a/purchase_delivery_split_date/tests/__init__.py b/purchase_delivery_split_date/tests/__init__.py index cdba36ec269..cab8dbafe77 100644 --- a/purchase_delivery_split_date/tests/__init__.py +++ b/purchase_delivery_split_date/tests/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -# © 2015-2016 Numérigraphe SARL +# © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from purchase_delivery_split_date.tests import test_purchase_delivery +from . import test_purchase_delivery diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index f97a5fde87d..f26918d705b 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL +# © 2016 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp.tests.common import TransactionCase @@ -19,20 +20,21 @@ def setUp(self): self.po = self.env['purchase.order'].create({ 'partner_id': self.ref('base.res_partner_3'), - 'location_id': self.ref('stock.stock_location_stock'), - 'pricelist_id': self.ref('purchase.list0'), 'order_line': [ (0, 0, {'product_id': p1.id, + 'product_uom': p1.uom_id.id, 'name': p1.name, 'price_unit': p1.standard_price, 'date_planned': self.date_sooner, 'product_qty': 42.0}), (0, 0, {'product_id': p2.id, + 'product_uom': p2.uom_id.id, 'name': p2.name, 'price_unit': p2.standard_price, 'date_planned': self.date_sooner, 'product_qty': 12.0}), (0, 0, {'product_id': p1.id, + 'product_uom': p1.uom_id.id, 'name': p1.name, 'price_unit': p1.standard_price, 'date_planned': self.date_sooner, @@ -42,8 +44,7 @@ def test_check_single_date(self): self.assertEquals( len(self.po.picking_ids), 0, "There must not be pickings for the PO when draft") - - self.po.signal_workflow('purchase_confirm') + self.po.button_confirm() self.assertEquals( len(self.po.picking_ids), 1, "There must be 1 picking for the PO when confirmed") @@ -54,15 +55,14 @@ def test_check_single_date(self): def test_check_multiple_dates(self): # Change the date of the first line self.po.order_line[0].date_planned = self.date_later - self.assertEquals( len(self.po.picking_ids), 0, "There must not be pickings for the PO when draft") - - self.po.signal_workflow('purchase_confirm') + self.po.button_confirm() self.assertEquals( len(self.po.picking_ids), 2, - "There must be 2 pickings for the PO when confirmed") + "There must be 2 pickings for the PO when confirmed. %s found" + % len(self.po.picking_ids)) sorted_pickings = sorted(self.po.picking_ids, key=lambda x: x.min_date) self.assertEquals( From f2038ca8fc60ef72a8531390ffbbd6b406702236 Mon Sep 17 00:00:00 2001 From: lreficent Date: Thu, 2 Mar 2017 10:46:01 +0100 Subject: [PATCH 081/207] Datetime issue. --- purchase_delivery_split_date/i18n/fi.po | 29 +++++++++++++++++++ .../models/purchase.py | 7 ++++- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 purchase_delivery_split_date/i18n/fi.po diff --git a/purchase_delivery_split_date/i18n/fi.po b/purchase_delivery_split_date/i18n/fi.po new file mode 100644 index 00000000000..0b1fbba7062 --- /dev/null +++ b/purchase_delivery_split_date/i18n/fi.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Timo Talvitie , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-02 12:10+0000\n" +"PO-Revision-Date: 2017-03-02 12:10+0000\n" +"Last-Translator: Timo Talvitie , 2017\n" +"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Ostotilausrivi" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py index 1c89ed54532..9ddf360b329 100644 --- a/purchase_delivery_split_date/models/purchase.py +++ b/purchase_delivery_split_date/models/purchase.py @@ -3,6 +3,9 @@ # © 2016 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from datetime import datetime +from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT + import logging from itertools import groupby from openerp import models, api @@ -20,7 +23,9 @@ def _get_group_keys(self, order, line, picking=False): dictionary element with the field that you want to group by. This method is designed for extensibility, so that other modules can add additional keys or replace them by others.""" - key = ({'date_planned': line.date_planned},) + date = datetime.strptime( + line.date_planned, DEFAULT_SERVER_DATETIME_FORMAT) + key = ({'date_planned': date.date()},) return key @api.model From d262d56a773b1c5cf108e0fa1645bb6b90520b18 Mon Sep 17 00:00:00 2001 From: lreficent Date: Tue, 14 Mar 2017 16:20:47 +0100 Subject: [PATCH 082/207] [10.0][MIG] purchase_delivery_split_date --- purchase_delivery_split_date/README.rst | 9 +++--- purchase_delivery_split_date/__init__.py | 2 +- purchase_delivery_split_date/__manifest__.py | 20 +++++++++++++ purchase_delivery_split_date/__openerp__.py | 17 ----------- purchase_delivery_split_date/i18n/ca.po | 4 +-- purchase_delivery_split_date/i18n/de.po | 4 +-- purchase_delivery_split_date/i18n/es.po | 4 +-- purchase_delivery_split_date/i18n/es_MX.po | 7 +++-- purchase_delivery_split_date/i18n/es_PE.po | 30 +++++++++++++++++++ purchase_delivery_split_date/i18n/fi.po | 4 +-- purchase_delivery_split_date/i18n/fr.po | 4 +-- purchase_delivery_split_date/i18n/gl.po | 4 +-- purchase_delivery_split_date/i18n/hr.po | 30 +++++++++++++++++++ purchase_delivery_split_date/i18n/it.po | 4 +-- purchase_delivery_split_date/i18n/nl_NL.po | 30 +++++++++++++++++++ purchase_delivery_split_date/i18n/pt_BR.po | 7 +++-- purchase_delivery_split_date/i18n/pt_PT.po | 7 +++-- .../i18n/purchase_delivery_split_date.pot | 25 ++++++++++++++++ purchase_delivery_split_date/i18n/ro.po | 7 +++-- purchase_delivery_split_date/i18n/sl.po | 7 +++-- .../models/__init__.py | 2 +- .../models/purchase.py | 2 +- .../tests/__init__.py | 2 +- .../tests/test_purchase_delivery.py | 23 ++++++++++---- 24 files changed, 195 insertions(+), 60 deletions(-) create mode 100644 purchase_delivery_split_date/__manifest__.py delete mode 100644 purchase_delivery_split_date/__openerp__.py create mode 100644 purchase_delivery_split_date/i18n/es_PE.po create mode 100644 purchase_delivery_split_date/i18n/hr.po create mode 100644 purchase_delivery_split_date/i18n/nl_NL.po create mode 100644 purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index c93f090ac6c..dc91298d46f 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -2,12 +2,12 @@ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -============================================================ -Split Purchase Deliveries in one reception per expected date -============================================================ +============================ +Purchase Delivery Split Date +============================ When this module is installed, each Purchase Order you confirm will -generate one Incoming Shipment for each expected date indicated in the +generate one Incoming Shipment for each schedule date indicated in the Purchase Order Lines. This module is also designed for extensibility, so that you can define @@ -30,6 +30,7 @@ Contributors * Philippe Rossi (initial patch against v6.0) * Lionel Sausin (modularization for v7+) * Jordi Ballester Alomar (modularization v8, v9) +* Lois Rilo (migration to v10) Maintainer diff --git a/purchase_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py index c8dd1e3250d..281ff5fc4eb 100644 --- a/purchase_delivery_split_date/__init__.py +++ b/purchase_delivery_split_date/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. +# © 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import models diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py new file mode 100644 index 00000000000..2d9c0950a92 --- /dev/null +++ b/purchase_delivery_split_date/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# © 2014-2016 Numérigraphe SARL +# © 2017 Eficent Business and IT Consulting Services, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Delivery Split Date", + "version": "10.0.1.0.0", + "summary": "Allows Purchase Order you confirm to generate one Incoming " + "Shipment for each expected date indicated in the Purchase " + "Order Lines", + "author": "Numérigraphe, Eficent, Odoo Community Association (OCA)", + "category": "Purchase Management", + "license": "AGPL-3", + "depends": [ + "purchase", + ], + "installable": True, + "application": False, +} diff --git a/purchase_delivery_split_date/__openerp__.py b/purchase_delivery_split_date/__openerp__.py deleted file mode 100644 index 191c1f6b94d..00000000000 --- a/purchase_delivery_split_date/__openerp__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -{ - 'name': "Purchase Deliveries split by date", - 'version': '9.0.1.0.0', - 'author': u'Numérigraphe, Odoo Community Association (OCA)', - 'category': 'Purchase Management', - 'license': 'AGPL-3', - 'depends': [ - 'purchase', - ], - 'installable': True, - 'application': False, -} diff --git a/purchase_delivery_split_date/i18n/ca.po b/purchase_delivery_split_date/i18n/ca.po index 20bcae810d0..7e73c2108d5 100644 --- a/purchase_delivery_split_date/i18n/ca.po +++ b/purchase_delivery_split_date/i18n/ca.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: OCA Transbot , 2017\n" "Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n" +"Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/de.po b/purchase_delivery_split_date/i18n/de.po index 59d332061c4..9d15214794c 100644 --- a/purchase_delivery_split_date/i18n/de.po +++ b/purchase_delivery_split_date/i18n/de.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 # Rudolf Schnapka , 2017 @@ -13,10 +13,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Rudolf Schnapka , 2017\n" "Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/es.po b/purchase_delivery_split_date/i18n/es.po index 5dccb9309ef..c4bcf1390a2 100644 --- a/purchase_delivery_split_date/i18n/es.po +++ b/purchase_delivery_split_date/i18n/es.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 # Pedro M. Baeza , 2017 @@ -13,10 +13,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Pedro M. Baeza , 2017\n" "Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/es_MX.po b/purchase_delivery_split_date/i18n/es_MX.po index 2a3f6236061..73e9a231c9a 100644 --- a/purchase_delivery_split_date/i18n/es_MX.po +++ b/purchase_delivery_split_date/i18n/es_MX.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # Juan González , 2017 msgid "" @@ -11,11 +11,12 @@ msgstr "" "POT-Creation-Date: 2017-02-24 13:09+0000\n" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Juan González , 2017\n" -"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/es_MX/)\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/" +"es_MX/)\n" +"Language: es_MX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/es_PE.po b/purchase_delivery_split_date/i18n/es_PE.po new file mode 100644 index 00000000000..155a60f3988 --- /dev/null +++ b/purchase_delivery_split_date/i18n/es_PE.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Henry Garcia , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-15 06:42+0000\n" +"PO-Revision-Date: 2017-07-15 06:42+0000\n" +"Last-Translator: Henry Garcia , 2017\n" +"Language-Team: Spanish (Peru) (https://www.transifex.com/oca/teams/23907/" +"es_PE/)\n" +"Language: es_PE\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: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Linea de orden de compra" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transferir" diff --git a/purchase_delivery_split_date/i18n/fi.po b/purchase_delivery_split_date/i18n/fi.po index 0b1fbba7062..c316a5ceb1e 100644 --- a/purchase_delivery_split_date/i18n/fi.po +++ b/purchase_delivery_split_date/i18n/fi.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # Timo Talvitie , 2017 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2017-03-02 12:10+0000\n" "Last-Translator: Timo Talvitie , 2017\n" "Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n" +"Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/fr.po b/purchase_delivery_split_date/i18n/fr.po index 21f0c68b7c5..016ad833655 100644 --- a/purchase_delivery_split_date/i18n/fr.po +++ b/purchase_delivery_split_date/i18n/fr.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: OCA Transbot , 2017\n" "Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/gl.po b/purchase_delivery_split_date/i18n/gl.po index bcacd37de00..2ae2265cebf 100644 --- a/purchase_delivery_split_date/i18n/gl.po +++ b/purchase_delivery_split_date/i18n/gl.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: OCA Transbot , 2017\n" "Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n" +"Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/hr.po b/purchase_delivery_split_date/i18n/hr.po new file mode 100644 index 00000000000..d13610c7fa4 --- /dev/null +++ b/purchase_delivery_split_date/i18n/hr.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-11 12:52+0000\n" +"PO-Revision-Date: 2017-07-11 12:52+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Stavka naloga za nabavu" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Transfer" diff --git a/purchase_delivery_split_date/i18n/it.po b/purchase_delivery_split_date/i18n/it.po index b6092081e8c..4f523bb0a30 100644 --- a/purchase_delivery_split_date/i18n/it.po +++ b/purchase_delivery_split_date/i18n/it.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 # Paolo Valier , 2017 @@ -13,10 +13,10 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Paolo Valier , 2017\n" "Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/nl_NL.po b/purchase_delivery_split_date/i18n/nl_NL.po new file mode 100644 index 00000000000..18565d9b7a4 --- /dev/null +++ b/purchase_delivery_split_date/i18n/nl_NL.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 02:44+0000\n" +"PO-Revision-Date: 2017-06-22 02:44+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\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: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Inkooporderregel" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "Verplaatsen" diff --git a/purchase_delivery_split_date/i18n/pt_BR.po b/purchase_delivery_split_date/i18n/pt_BR.po index 0f66e17b0b2..d3fb74dc963 100644 --- a/purchase_delivery_split_date/i18n/pt_BR.po +++ b/purchase_delivery_split_date/i18n/pt_BR.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 msgid "" @@ -11,11 +11,12 @@ msgstr "" "POT-Creation-Date: 2017-02-24 13:09+0000\n" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: OCA Transbot , 2017\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/pt_PT.po b/purchase_delivery_split_date/i18n/pt_PT.po index 6dbf6eada19..20b6dcef12f 100644 --- a/purchase_delivery_split_date/i18n/pt_PT.po +++ b/purchase_delivery_split_date/i18n/pt_PT.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # Pedro Castro Silva , 2017 msgid "" @@ -11,11 +11,12 @@ msgstr "" "POT-Creation-Date: 2017-02-24 13:09+0000\n" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Pedro Castro Silva , 2017\n" -"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/teams/23907/pt_PT/)\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/" +"teams/23907/pt_PT/)\n" +"Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot new file mode 100644 index 00000000000..35437ccf21b --- /dev/null +++ b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_delivery_split_date +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.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_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_picking +msgid "Transfer" +msgstr "" + diff --git a/purchase_delivery_split_date/i18n/ro.po b/purchase_delivery_split_date/i18n/ro.po index d085d6c7010..7a9f8a75686 100644 --- a/purchase_delivery_split_date/i18n/ro.po +++ b/purchase_delivery_split_date/i18n/ro.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # Dorin Hongu , 2017 msgid "" @@ -12,11 +12,12 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: Dorin Hongu , 2017\n" "Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line diff --git a/purchase_delivery_split_date/i18n/sl.po b/purchase_delivery_split_date/i18n/sl.po index 84e6dc1959e..03c614002e7 100644 --- a/purchase_delivery_split_date/i18n/sl.po +++ b/purchase_delivery_split_date/i18n/sl.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * purchase_delivery_split_date -# +# # Translators: # OCA Transbot , 2017 msgid "" @@ -12,11 +12,12 @@ msgstr "" "PO-Revision-Date: 2017-02-24 13:09+0000\n" "Last-Translator: OCA Transbot , 2017\n" "Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py index 721f64e3f36..a4b515f33e6 100644 --- a/purchase_delivery_split_date/models/__init__.py +++ b/purchase_delivery_split_date/models/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. +# © 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import purchase diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py index 9ddf360b329..149553ed6ac 100644 --- a/purchase_delivery_split_date/models/purchase.py +++ b/purchase_delivery_split_date/models/purchase.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. +# © 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from datetime import datetime diff --git a/purchase_delivery_split_date/tests/__init__.py b/purchase_delivery_split_date/tests/__init__.py index cab8dbafe77..9b3b83ed60c 100644 --- a/purchase_delivery_split_date/tests/__init__.py +++ b/purchase_delivery_split_date/tests/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. +# © 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import test_purchase_delivery diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index f26918d705b..e8d38a66aa6 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2014-2016 Numérigraphe SARL -# © 2016 Eficent Business and IT Consulting Services, S.L. +# © 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp.tests.common import TransactionCase @@ -10,11 +10,21 @@ class TestDeliverySingle(TransactionCase): def setUp(self): super(TestDeliverySingle, self).setUp() - # Products - p1 = self.env.ref('product.product_product_15') - p2 = self.env.ref('product.product_product_25') + self.product_model = self.env['product.product'] - # 2 dates we can use to test the features + # Create products: + p1 = self.product1 = self.product_model.create({ + 'name': 'Test Product 1', + 'type': 'product', + 'default_code': 'PROD1', + }) + p2 = self.product1 = self.product_model.create({ + 'name': 'Test Product 2', + 'type': 'product', + 'default_code': 'PROD2', + }) + + # Two dates which we can use to test the features: self.date_sooner = '2015-01-01' self.date_later = '2015-12-13' @@ -41,6 +51,7 @@ def setUp(self): 'product_qty': 1.0})]}) def test_check_single_date(self): + """Tests with single date.""" self.assertEquals( len(self.po.picking_ids), 0, "There must not be pickings for the PO when draft") @@ -53,7 +64,7 @@ def test_check_single_date(self): "The picking must be planned at the expected date") def test_check_multiple_dates(self): - # Change the date of the first line + """Tests changing the date of the first line.""" self.po.order_line[0].date_planned = self.date_later self.assertEquals( len(self.po.picking_ids), 0, From 1acffbe0c72f0c2e5acb135fbdfe562361fe3ee8 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Mon, 17 Sep 2018 00:13:40 +0200 Subject: [PATCH 083/207] [MIG][11.0] purchase_delivery_split_date --- purchase_delivery_split_date/README.rst | 49 ------------------- purchase_delivery_split_date/__init__.py | 5 -- purchase_delivery_split_date/__manifest__.py | 7 ++- .../models/__init__.py | 6 +-- .../models/purchase.py | 15 +++--- .../readme/CONTRIBUTORS.rst | 4 ++ .../readme/DESCRIPTION.rst | 12 +++++ .../readme/HISTORY.rst | 10 ++++ purchase_delivery_split_date/readme/USAGE.rst | 11 +++++ .../tests/__init__.py | 5 -- .../tests/test_purchase_delivery.py | 44 ++++++++++++++--- 11 files changed, 84 insertions(+), 84 deletions(-) delete mode 100644 purchase_delivery_split_date/README.rst create mode 100644 purchase_delivery_split_date/readme/CONTRIBUTORS.rst create mode 100644 purchase_delivery_split_date/readme/DESCRIPTION.rst create mode 100644 purchase_delivery_split_date/readme/HISTORY.rst create mode 100644 purchase_delivery_split_date/readme/USAGE.rst diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst deleted file mode 100644 index dc91298d46f..00000000000 --- a/purchase_delivery_split_date/README.rst +++ /dev/null @@ -1,49 +0,0 @@ -.. 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 Delivery Split Date -============================ - -When this module is installed, each Purchase Order you confirm will -generate one Incoming Shipment for each schedule date indicated in the -Purchase Order Lines. - -This module is also designed for extensibility, so that you can define -in other modules new criteria to split deliveries. - - -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. - -Credits -======= - -Contributors ------------- -* Philippe Rossi (initial patch against v6.0) -* Lionel Sausin (modularization for v7+) -* Jordi Ballester Alomar (modularization v8, v9) -* Lois Rilo (migration to v10) - - -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_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py index 281ff5fc4eb..0650744f6bc 100644 --- a/purchase_delivery_split_date/__init__.py +++ b/purchase_delivery_split_date/__init__.py @@ -1,6 +1 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from . import models diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 2d9c0950a92..26e43e9e269 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. +# Copyright 2014-2016 Numérigraphe SARL +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Purchase Delivery Split Date", - "version": "10.0.1.0.0", + "version": "11.0.1.0.0", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase " "Order Lines", diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py index a4b515f33e6..1822503cf3a 100644 --- a/purchase_delivery_split_date/models/__init__.py +++ b/purchase_delivery_split_date/models/__init__.py @@ -1,6 +1,2 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from . import purchase +from . import stock_move diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py index 149553ed6ac..17cfd32239f 100644 --- a/purchase_delivery_split_date/models/purchase.py +++ b/purchase_delivery_split_date/models/purchase.py @@ -1,14 +1,13 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. +# Copyright 2014-2016 Numérigraphe SARL +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from datetime import datetime -from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT import logging from itertools import groupby -from openerp import models, api +from odoo import models, api _logger = logging.getLogger(__name__) @@ -44,16 +43,14 @@ def _create_stock_moves(self, picking): """Group the receptions in one picking per group key""" moves = self.env['stock.move'] # Group the order lines by group key - order_lines = sorted(self, - key=lambda l: self._get_group_keys( - l.order_id, l, picking=picking)) + order_lines = sorted(self, key=lambda l: l.order_id) date_groups = groupby(order_lines, lambda l: self._get_group_keys( l.order_id, l, picking=picking)) # If a picking is provided, use it for the first group only if picking: first_picking = picking - key, lines = date_groups.next() + key, lines = next(date_groups) po_lines = self.env['purchase.order.line'] for line in list(lines): po_lines += line diff --git a/purchase_delivery_split_date/readme/CONTRIBUTORS.rst b/purchase_delivery_split_date/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..19b1081ac3f --- /dev/null +++ b/purchase_delivery_split_date/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* Philippe Rossi (initial patch against v6.0) +* Lionel Sausin (modularization for v7+) +* Jordi Ballester Alomar (modularization v8, v9) +* Lois Rilo (migration to v10) diff --git a/purchase_delivery_split_date/readme/DESCRIPTION.rst b/purchase_delivery_split_date/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..31afcfc6ac6 --- /dev/null +++ b/purchase_delivery_split_date/readme/DESCRIPTION.rst @@ -0,0 +1,12 @@ +When this module is installed, each Purchase Order you confirm will +generate one Incoming Shipment for each schedule date indicated in the +Purchase Order Lines. + +Once the Purchase Order has been confirmed, subsequent changes made to the +scheduled dates in the PO lines will produce a reorganization of the +corresponding stock moves in the Incoming Shipments, creating/deleting new +Incoming Shipments when needed, to ensure that each Incoming Shipment +contains moves to be received in the same date. + +This module is also designed for extensibility, so that you can define +in other modules new criteria to split deliveries. diff --git a/purchase_delivery_split_date/readme/HISTORY.rst b/purchase_delivery_split_date/readme/HISTORY.rst new file mode 100644 index 00000000000..a3788a9b905 --- /dev/null +++ b/purchase_delivery_split_date/readme/HISTORY.rst @@ -0,0 +1,10 @@ + +11.0.1.0.0 (2018-09-16) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Migration to 11.0. + (`#461 `_) + +* When the scheduled date is changed in the PO after confirmation the + pickings are reorganized so as to force that every picking will have only + moves to be delivered on the same date. diff --git a/purchase_delivery_split_date/readme/USAGE.rst b/purchase_delivery_split_date/readme/USAGE.rst new file mode 100644 index 00000000000..f4629c3d548 --- /dev/null +++ b/purchase_delivery_split_date/readme/USAGE.rst @@ -0,0 +1,11 @@ +[ This file must be present and contains the usage instructions + for end-users. As all other rst files included in the README, + it MUST NOT contain reStructuredText sections + only body text (paragraphs, lists, tables, etc). Should you need + a more elaborate structure to explain the addon, please create a + Sphinx documentation (which may include this file as a "quick start" + section). ] + +To use this module, you need to: + +#. Go to ... diff --git a/purchase_delivery_split_date/tests/__init__.py b/purchase_delivery_split_date/tests/__init__.py index 9b3b83ed60c..c80c093ec21 100644 --- a/purchase_delivery_split_date/tests/__init__.py +++ b/purchase_delivery_split_date/tests/__init__.py @@ -1,6 +1 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from . import test_purchase_delivery diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index e8d38a66aa6..21e5e1995e8 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2014-2016 Numérigraphe SARL -# © 2017 Eficent Business and IT Consulting Services, S.L. +# Copyright 2014-2016 Numérigraphe SARL +# Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp.tests.common import TransactionCase @@ -18,7 +18,7 @@ def setUp(self): 'type': 'product', 'default_code': 'PROD1', }) - p2 = self.product1 = self.product_model.create({ + p2 = self.product2 = self.product_model.create({ 'name': 'Test Product 2', 'type': 'product', 'default_code': 'PROD2', @@ -60,7 +60,7 @@ def test_check_single_date(self): len(self.po.picking_ids), 1, "There must be 1 picking for the PO when confirmed") self.assertEquals( - self.po.picking_ids[0].min_date[:10], self.date_sooner, + self.po.picking_ids[0].scheduled_date[:10], self.date_sooner, "The picking must be planned at the expected date") def test_check_multiple_dates(self): @@ -75,10 +75,40 @@ def test_check_multiple_dates(self): "There must be 2 pickings for the PO when confirmed. %s found" % len(self.po.picking_ids)) - sorted_pickings = sorted(self.po.picking_ids, key=lambda x: x.min_date) + sorted_pickings = sorted( + self.po.picking_ids, key=lambda x: x.scheduled_date) self.assertEquals( - sorted_pickings[0].min_date[:10], self.date_sooner, + sorted_pickings[0].scheduled_date[:10], self.date_sooner, "The first picking must be planned at the soonest date") self.assertEquals( - sorted_pickings[1].min_date[:10], self.date_later, + sorted_pickings[1].scheduled_date[:10], self.date_later, "The second picking must be planned at the latest date") + + def test_check_multiple_dates_after_confirm(self): + """We introduced changes to dates in the PO lines after + confirmation. The pickings should be reorganized so as to be + grouped by the scheduled date.""" + self.assertEquals( + len(self.po.picking_ids), 0, + "There must not be pickings for the PO when draft") + self.po.button_confirm() + self.assertEquals( + len(self.po.picking_ids), 1, + "There must be 1 picking for the PO when confirmed") + self.po.order_line[0].date_planned = self.date_later + self.assertEquals( + len(self.po.picking_ids), 2, + "There must be 2 pickings for the PO when confirmed. %s found" + % len(self.po.picking_ids)) + sorted_pickings = sorted(self.po.picking_ids, + key=lambda x: x.scheduled_date) + self.assertEquals( + sorted_pickings[0].scheduled_date[:10], self.date_sooner, + "The first picking must be planned at the soonest date") + self.assertEquals( + sorted_pickings[1].scheduled_date[:10], self.date_later, + "The second picking must be planned at the latest date") + self.po.order_line[0].date_planned = self.date_sooner + self.assertEquals( + len(self.po.picking_ids), 1, + "There must be 1 picking for the PO when confirmed") From 06bf7a9beb6a90968b1181e6f7ca8166b425143a Mon Sep 17 00:00:00 2001 From: hveficent Date: Thu, 25 Oct 2018 16:57:21 +0200 Subject: [PATCH 084/207] add new readme and travis fixes --- purchase_delivery_split_date/README.rst | 113 +++++ purchase_delivery_split_date/__manifest__.py | 1 + .../i18n/purchase_delivery_split_date.pot | 2 +- .../models/__init__.py | 1 - .../models/purchase.py | 5 +- purchase_delivery_split_date/readme/USAGE.rst | 14 +- .../static/description/index.html | 457 ++++++++++++++++++ .../static/description/split_delivery.png | Bin 0 -> 58058 bytes .../tests/test_purchase_delivery.py | 32 +- 9 files changed, 580 insertions(+), 45 deletions(-) create mode 100644 purchase_delivery_split_date/README.rst create mode 100644 purchase_delivery_split_date/static/description/index.html create mode 100644 purchase_delivery_split_date/static/description/split_delivery.png diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst new file mode 100644 index 00000000000..5b823d9d3d6 --- /dev/null +++ b/purchase_delivery_split_date/README.rst @@ -0,0 +1,113 @@ +============================ +Purchase Delivery Split Date +============================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/11.0/purchase_delivery_split_date + :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-11-0/purchase-workflow-11-0-purchase_delivery_split_date + :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/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +When this module is installed, each Purchase Order you confirm will +generate one Incoming Shipment for each schedule date indicated in the +Purchase Order Lines. + +Once the Purchase Order has been confirmed, subsequent changes made to the +scheduled dates in the PO lines will produce a reorganization of the +corresponding stock moves in the Incoming Shipments, creating/deleting new +Incoming Shipments when needed, to ensure that each Incoming Shipment +contains moves to be received in the same date. + +This module is also designed for extensibility, so that you can define +in other modules new criteria to split deliveries. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + + +When a Purchase Order is confirmed, shipments will be grouped by same scheduled date. + +.. figure:: https://raw.githubusercontent.com/OCA/purchase-workflow/11.0/purchase_delivery_split_date/static/description/split_delivery.png + :alt: Purchase Order Split Shipments + :width: 80 % + :align: center + +Changelog +========= + + +11.0.1.0.0 (2018-09-16) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Migration to 11.0. + (`#461 `_) + +* When the scheduled date is changed in the PO after confirmation the + pickings are reorganized so as to force that every picking will have only + moves to be delivered on the same date. + +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 +~~~~~~~ + +* Numérigraphe +* Eficent + +Contributors +~~~~~~~~~~~~ + +* Philippe Rossi (initial patch against v6.0) +* Lionel Sausin (modularization for v7+) +* Jordi Ballester Alomar (modularization v8, v9) +* Lois Rilo (migration to v10) + +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/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_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 26e43e9e269..31e31eb1929 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -9,6 +9,7 @@ "Shipment for each expected date indicated in the Purchase " "Order Lines", "author": "Numérigraphe, Eficent, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase Management", "license": "AGPL-3", "depends": [ diff --git a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot index 35437ccf21b..29355756d08 100644 --- a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot +++ b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" +"Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py index 1822503cf3a..370f577b2a2 100644 --- a/purchase_delivery_split_date/models/__init__.py +++ b/purchase_delivery_split_date/models/__init__.py @@ -1,2 +1 @@ from . import purchase -from . import stock_move diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py index 17cfd32239f..f81a8823e03 100644 --- a/purchase_delivery_split_date/models/purchase.py +++ b/purchase_delivery_split_date/models/purchase.py @@ -43,10 +43,11 @@ def _create_stock_moves(self, picking): """Group the receptions in one picking per group key""" moves = self.env['stock.move'] # Group the order lines by group key - order_lines = sorted(self, key=lambda l: l.order_id) + order_lines = sorted(self, key=lambda l: l.date_planned) date_groups = groupby(order_lines, lambda l: self._get_group_keys( l.order_id, l, picking=picking)) + first_picking = False # If a picking is provided, use it for the first group only if picking: first_picking = picking @@ -57,8 +58,6 @@ def _create_stock_moves(self, picking): picking._update_picking_from_group_key(key) moves += super(PurchaseOrderLine, po_lines)._create_stock_moves( first_picking) - else: - first_picking = False for key, lines in date_groups: # If a picking is provided, clone it for each key for modularity diff --git a/purchase_delivery_split_date/readme/USAGE.rst b/purchase_delivery_split_date/readme/USAGE.rst index f4629c3d548..bc2a1c13c5d 100644 --- a/purchase_delivery_split_date/readme/USAGE.rst +++ b/purchase_delivery_split_date/readme/USAGE.rst @@ -1,11 +1,7 @@ -[ This file must be present and contains the usage instructions - for end-users. As all other rst files included in the README, - it MUST NOT contain reStructuredText sections - only body text (paragraphs, lists, tables, etc). Should you need - a more elaborate structure to explain the addon, please create a - Sphinx documentation (which may include this file as a "quick start" - section). ] -To use this module, you need to: +When a Purchase Order is confirmed, shipments will be grouped by same scheduled date. -#. Go to ... +.. figure:: https://raw.githubusercontent.com/OCA/purchase-workflow/11.0/purchase_delivery_split_date/static/description/split_delivery.png + :alt: Purchase Order Split Shipments + :width: 80 % + :align: center \ No newline at end of file diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html new file mode 100644 index 00000000000..0ae859a148b --- /dev/null +++ b/purchase_delivery_split_date/static/description/index.html @@ -0,0 +1,457 @@ + + + + + + +Purchase Delivery Split Date + + + +

    +

    Purchase Delivery Split Date

    + + +

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

    +

    When this module is installed, each Purchase Order you confirm will +generate one Incoming Shipment for each schedule date indicated in the +Purchase Order Lines.

    +

    Once the Purchase Order has been confirmed, subsequent changes made to the +scheduled dates in the PO lines will produce a reorganization of the +corresponding stock moves in the Incoming Shipments, creating/deleting new +Incoming Shipments when needed, to ensure that each Incoming Shipment +contains moves to be received in the same date.

    +

    This module is also designed for extensibility, so that you can define +in other modules new criteria to split deliveries.

    +

    Table of contents

    + +
    +

    Usage

    +

    When a Purchase Order is confirmed, shipments will be grouped by same scheduled date.

    +
    +Purchase Order Split Shipments +
    +
    +
    +

    Changelog

    +
    +

    11.0.1.0.0 (2018-09-16)

    +
      +
    • Migration to 11.0. +(#461)
    • +
    • When the scheduled date is changed in the PO after confirmation the +pickings are reorganized so as to force that every picking will have only +moves to be delivered on the same date.
    • +
    +
    +
    +
    +

    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

    +
      +
    • Numérigraphe
    • +
    • Eficent
    • +
    +
    +
    +

    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_delivery_split_date/static/description/split_delivery.png b/purchase_delivery_split_date/static/description/split_delivery.png new file mode 100644 index 0000000000000000000000000000000000000000..2b992ade8c099864bc40a5e1c010e2da3aafee4e GIT binary patch literal 58058 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 N Date: Wed, 5 Dec 2018 09:17:38 +0100 Subject: [PATCH 085/207] [MIG] purchase_delivery_split_date: Migration to v12 --- purchase_delivery_split_date/README.rst | 19 ++++++++---------- purchase_delivery_split_date/__init__.py | 2 ++ purchase_delivery_split_date/__manifest__.py | 6 +++--- .../i18n/purchase_delivery_split_date.pot | 2 +- .../models/__init__.py | 2 ++ .../models/purchase.py | 5 +++-- .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + purchase_delivery_split_date/readme/USAGE.rst | 5 ----- .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 13 +++++------- .../tests/__init__.py | 2 ++ .../tests/test_purchase_delivery.py | 6 +++--- 13 files changed, 31 insertions(+), 33 deletions(-) create mode 100644 purchase_delivery_split_date/static/description/icon.png diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index 5b823d9d3d6..d6b0219e045 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -14,17 +14,18 @@ Purchase Delivery Split Date :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/11.0/purchase_delivery_split_date + :target: https://github.com/OCA/purchase-workflow/tree/12.0/purchase_delivery_split_date :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-11-0/purchase-workflow-11-0-purchase_delivery_split_date + :target: https://translation.odoo-community.org/projects/purchase-workflow-12-0/purchase-workflow-12-0-purchase_delivery_split_date :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/11.0 + :target: https://runbot.odoo-community.org/runbot/142/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| + When this module is installed, each Purchase Order you confirm will generate one Incoming Shipment for each schedule date indicated in the Purchase Order Lines. @@ -49,11 +50,6 @@ Usage When a Purchase Order is confirmed, shipments will be grouped by same scheduled date. -.. figure:: https://raw.githubusercontent.com/OCA/purchase-workflow/11.0/purchase_delivery_split_date/static/description/split_delivery.png - :alt: Purchase Order Split Shipments - :width: 80 % - :align: center - Changelog ========= @@ -74,7 +70,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. @@ -84,12 +80,13 @@ Credits Authors ~~~~~~~ -* Numérigraphe +* Numerigraphe * Eficent Contributors ~~~~~~~~~~~~ + * Philippe Rossi (initial patch against v6.0) * Lionel Sausin (modularization for v7+) * Jordi Ballester Alomar (modularization v8, v9) @@ -108,6 +105,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/purchase-workflow `_ project on GitHub. +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_delivery_split_date/__init__.py b/purchase_delivery_split_date/__init__.py index 0650744f6bc..83e553ac462 100644 --- a/purchase_delivery_split_date/__init__.py +++ b/purchase_delivery_split_date/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from . import models diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 31e31eb1929..c416dfc4f8a 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -4,16 +4,16 @@ { "name": "Purchase Delivery Split Date", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase " "Order Lines", - "author": "Numérigraphe, Eficent, Odoo Community Association (OCA)", + "author": "Numerigraphe, Eficent, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase Management", "license": "AGPL-3", "depends": [ - "purchase", + "purchase_stock", ], "installable": True, "application": False, diff --git a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot index 29355756d08..7a892744df6 100644 --- a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot +++ b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.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" diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py index 370f577b2a2..b48e28974e0 100644 --- a/purchase_delivery_split_date/models/__init__.py +++ b/purchase_delivery_split_date/models/__init__.py @@ -1 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from . import purchase diff --git a/purchase_delivery_split_date/models/purchase.py b/purchase_delivery_split_date/models/purchase.py index f81a8823e03..4ce0253d2f1 100644 --- a/purchase_delivery_split_date/models/purchase.py +++ b/purchase_delivery_split_date/models/purchase.py @@ -23,8 +23,9 @@ def _get_group_keys(self, order, line, picking=False): method is designed for extensibility, so that other modules can add additional keys or replace them by others.""" date = datetime.strptime( - line.date_planned, DEFAULT_SERVER_DATETIME_FORMAT) - key = ({'date_planned': date.date()},) + str(line.date_planned), DEFAULT_SERVER_DATETIME_FORMAT) + # Split date value to obtain only the attributes year, month and day + key = ({'date_planned': str(date).split(" ")[0]},) return key @api.model diff --git a/purchase_delivery_split_date/readme/CONTRIBUTORS.rst b/purchase_delivery_split_date/readme/CONTRIBUTORS.rst index 19b1081ac3f..fcf57f189c4 100644 --- a/purchase_delivery_split_date/readme/CONTRIBUTORS.rst +++ b/purchase_delivery_split_date/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ + * Philippe Rossi (initial patch against v6.0) * Lionel Sausin (modularization for v7+) * Jordi Ballester Alomar (modularization v8, v9) diff --git a/purchase_delivery_split_date/readme/DESCRIPTION.rst b/purchase_delivery_split_date/readme/DESCRIPTION.rst index 31afcfc6ac6..80b38f0031f 100644 --- a/purchase_delivery_split_date/readme/DESCRIPTION.rst +++ b/purchase_delivery_split_date/readme/DESCRIPTION.rst @@ -1,3 +1,4 @@ + When this module is installed, each Purchase Order you confirm will generate one Incoming Shipment for each schedule date indicated in the Purchase Order Lines. diff --git a/purchase_delivery_split_date/readme/USAGE.rst b/purchase_delivery_split_date/readme/USAGE.rst index bc2a1c13c5d..05aec2c8374 100644 --- a/purchase_delivery_split_date/readme/USAGE.rst +++ b/purchase_delivery_split_date/readme/USAGE.rst @@ -1,7 +1,2 @@ When a Purchase Order is confirmed, shipments will be grouped by same scheduled date. - -.. figure:: https://raw.githubusercontent.com/OCA/purchase-workflow/11.0/purchase_delivery_split_date/static/description/split_delivery.png - :alt: Purchase Order Split Shipments - :width: 80 % - :align: center \ No newline at end of file diff --git a/purchase_delivery_split_date/static/description/icon.png b/purchase_delivery_split_date/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_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index 0ae859a148b..3e3a94e7e69 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -3,7 +3,7 @@ - + Purchase Delivery Split Date -
    -

    Purchase Delivery Split Date

    +
    + + +Odoo Community Association + +
    +

    Purchase Delivery Split Date

    -

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

    +

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

    When this module is installed, each Purchase Order you confirm will generate one Incoming Shipment for each schedule date indicated in the Purchase Order Lines.

    @@ -400,14 +405,14 @@

    Purchase Delivery Split Date

    -

    Usage

    +

    Usage

    When a Purchase Order is confirmed, shipments will be grouped by same scheduled date.

    -

    Changelog

    +

    Changelog

    -

    12.0.2.1.0 (2020-04-30)

    +

    12.0.2.1.0 (2020-04-30)

    • [FIX] when adding a new line on a confirmed PO, split the delivery (this was done only if a date was changed on an existing line)
    • @@ -418,7 +423,7 @@

      12.0.2.1.0 (2020-04-30)

    -

    12.0.2.0.0 (2020-04-10)

    +

    12.0.2.0.0 (2020-04-10)

    • Improve the module: when changing the date on a purchase line, this will cause a split or a merge of the pickings, to keep 1 picking per @@ -426,7 +431,7 @@

      12.0.2.0.0 (2020-04-10)

    -

    Bug Tracker

    +

    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 @@ -445,17 +450,18 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Numerigraphe
    • ForgeFlow
    • Camptocamp
    • +
    • BCIM
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -481,5 +489,6 @@

    Maintainers

    +
    From 19b6df4d4e39a8f1f38c0d8242227624765528df Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 6 Jun 2025 14:18:23 +0000 Subject: [PATCH 132/207] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_delivery_split_date Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_delivery_split_date/ --- purchase_delivery_split_date/i18n/ca.po | 8 ++++---- purchase_delivery_split_date/i18n/de.po | 13 ++++++++----- purchase_delivery_split_date/i18n/es.po | 13 ++++++++----- purchase_delivery_split_date/i18n/es_MX.po | 15 +++++++++------ purchase_delivery_split_date/i18n/es_PE.po | 15 +++++++++------ purchase_delivery_split_date/i18n/fi.po | 15 +++++++++------ purchase_delivery_split_date/i18n/fr.po | 13 ++++++++----- purchase_delivery_split_date/i18n/gl.po | 8 ++++---- purchase_delivery_split_date/i18n/hr.po | 15 +++++++++------ purchase_delivery_split_date/i18n/it.po | 13 ++++++++----- purchase_delivery_split_date/i18n/nl_NL.po | 15 +++++++++------ purchase_delivery_split_date/i18n/pt_BR.po | 13 ++++++++----- purchase_delivery_split_date/i18n/pt_PT.po | 15 +++++++++------ purchase_delivery_split_date/i18n/ro.po | 15 +++++++++------ purchase_delivery_split_date/i18n/sl.po | 15 +++++++++------ purchase_delivery_split_date/i18n/zh_CN.po | 15 +++++++++------ 16 files changed, 129 insertions(+), 87 deletions(-) diff --git a/purchase_delivery_split_date/i18n/ca.po b/purchase_delivery_split_date/i18n/ca.po index 02aa3674120..5396e52f7fb 100644 --- a/purchase_delivery_split_date/i18n/ca.po +++ b/purchase_delivery_split_date/i18n/ca.po @@ -19,13 +19,13 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" msgstr "" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line -msgid "Purchase Order Line" +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" msgstr "" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/de.po b/purchase_delivery_split_date/i18n/de.po index 9c77d64cc5f..3c257cd198a 100644 --- a/purchase_delivery_split_date/i18n/de.po +++ b/purchase_delivery_split_date/i18n/de.po @@ -20,17 +20,20 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.10\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Bestellung" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Bestellposition" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transfer" + +#~ msgid "Purchase Order" +#~ msgstr "Bestellung" diff --git a/purchase_delivery_split_date/i18n/es.po b/purchase_delivery_split_date/i18n/es.po index 18c9780a3b8..70ab5c9c2c4 100644 --- a/purchase_delivery_split_date/i18n/es.po +++ b/purchase_delivery_split_date/i18n/es.po @@ -20,17 +20,20 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "orden de compra" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Línea orden de compra" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transferir" + +#~ msgid "Purchase Order" +#~ msgstr "orden de compra" diff --git a/purchase_delivery_split_date/i18n/es_MX.po b/purchase_delivery_split_date/i18n/es_MX.po index 1aaab809fdc..8812a64a002 100644 --- a/purchase_delivery_split_date/i18n/es_MX.po +++ b/purchase_delivery_split_date/i18n/es_MX.po @@ -19,18 +19,21 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Línea de orden de compra" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Línea de orden de compra" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Línea de orden de compra" diff --git a/purchase_delivery_split_date/i18n/es_PE.po b/purchase_delivery_split_date/i18n/es_PE.po index 58fae8389a1..7f53b260e1c 100644 --- a/purchase_delivery_split_date/i18n/es_PE.po +++ b/purchase_delivery_split_date/i18n/es_PE.po @@ -19,18 +19,21 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Linea de orden de compra" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Linea de orden de compra" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transferir" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Linea de orden de compra" diff --git a/purchase_delivery_split_date/i18n/fi.po b/purchase_delivery_split_date/i18n/fi.po index 0a6c6daef66..e9d489104a4 100644 --- a/purchase_delivery_split_date/i18n/fi.po +++ b/purchase_delivery_split_date/i18n/fi.po @@ -18,18 +18,21 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Ostotilausrivi" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Ostotilausrivi" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Ostotilausrivi" diff --git a/purchase_delivery_split_date/i18n/fr.po b/purchase_delivery_split_date/i18n/fr.po index 091d043f888..541d76edfa3 100644 --- a/purchase_delivery_split_date/i18n/fr.po +++ b/purchase_delivery_split_date/i18n/fr.po @@ -19,17 +19,20 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 3.10\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Commande d'achat" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Ligne de commande d'achat" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transférer" + +#~ msgid "Purchase Order" +#~ msgstr "Commande d'achat" diff --git a/purchase_delivery_split_date/i18n/gl.po b/purchase_delivery_split_date/i18n/gl.po index 09e61f87360..d5baa0fb0a4 100644 --- a/purchase_delivery_split_date/i18n/gl.po +++ b/purchase_delivery_split_date/i18n/gl.po @@ -19,13 +19,13 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" +#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line +msgid "Purchase Order Line" msgstr "" #. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line -msgid "Purchase Order Line" +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" msgstr "" #. module: purchase_delivery_split_date diff --git a/purchase_delivery_split_date/i18n/hr.po b/purchase_delivery_split_date/i18n/hr.po index ceffd6f072f..e96f339a43b 100644 --- a/purchase_delivery_split_date/i18n/hr.po +++ b/purchase_delivery_split_date/i18n/hr.po @@ -19,18 +19,21 @@ msgstr "" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Stavka naloga za nabavu" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Stavka naloga za nabavu" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transfer" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Stavka naloga za nabavu" diff --git a/purchase_delivery_split_date/i18n/it.po b/purchase_delivery_split_date/i18n/it.po index 17e42d8dcfa..ba1a7755593 100644 --- a/purchase_delivery_split_date/i18n/it.po +++ b/purchase_delivery_split_date/i18n/it.po @@ -20,17 +20,20 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Ordine di acquisto" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Riga ordine di acquisto" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Trasferimento" + +#~ msgid "Purchase Order" +#~ msgstr "Ordine di acquisto" diff --git a/purchase_delivery_split_date/i18n/nl_NL.po b/purchase_delivery_split_date/i18n/nl_NL.po index fc71e2224e2..c0204d84807 100644 --- a/purchase_delivery_split_date/i18n/nl_NL.po +++ b/purchase_delivery_split_date/i18n/nl_NL.po @@ -19,18 +19,21 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Inkooporderregel" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Inkooporderregel" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Verplaatsen" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Inkooporderregel" diff --git a/purchase_delivery_split_date/i18n/pt_BR.po b/purchase_delivery_split_date/i18n/pt_BR.po index 7bf57cc0f68..aa106399992 100644 --- a/purchase_delivery_split_date/i18n/pt_BR.po +++ b/purchase_delivery_split_date/i18n/pt_BR.po @@ -20,17 +20,20 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.3.2\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -msgid "Purchase Order" -msgstr "Pedido de Compra" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Linha do Pedido de Compra" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Transferir" + +#~ msgid "Purchase Order" +#~ msgstr "Pedido de Compra" diff --git a/purchase_delivery_split_date/i18n/pt_PT.po b/purchase_delivery_split_date/i18n/pt_PT.po index bb262b9002c..b2aa13a9bae 100644 --- a/purchase_delivery_split_date/i18n/pt_PT.po +++ b/purchase_delivery_split_date/i18n/pt_PT.po @@ -19,18 +19,21 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Linha de Encomenda de Compra" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Linha de Encomenda de Compra" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Linha de Encomenda de Compra" diff --git a/purchase_delivery_split_date/i18n/ro.po b/purchase_delivery_split_date/i18n/ro.po index bc2659e9330..1b44d2a6c70 100644 --- a/purchase_delivery_split_date/i18n/ro.po +++ b/purchase_delivery_split_date/i18n/ro.po @@ -19,18 +19,21 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1));\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Linie comandă achiziție" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Linie comandă achiziție" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Linie comandă achiziție" diff --git a/purchase_delivery_split_date/i18n/sl.po b/purchase_delivery_split_date/i18n/sl.po index 9a424ecda82..74445b5a4a8 100644 --- a/purchase_delivery_split_date/i18n/sl.po +++ b/purchase_delivery_split_date/i18n/sl.po @@ -19,18 +19,21 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3);\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "Postavka nabavnega naloga" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "Postavka nabavnega naloga" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "Premestitev" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "Postavka nabavnega naloga" diff --git a/purchase_delivery_split_date/i18n/zh_CN.po b/purchase_delivery_split_date/i18n/zh_CN.po index dc042486d69..3788586696b 100644 --- a/purchase_delivery_split_date/i18n/zh_CN.po +++ b/purchase_delivery_split_date/i18n/zh_CN.po @@ -16,18 +16,21 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 3.8\n" -#. module: purchase_delivery_split_date -#: model:ir.model,name:purchase_delivery_split_date.model_purchase_order -#, fuzzy -msgid "Purchase Order" -msgstr "采购订单行" - #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" msgstr "采购订单行" +#. module: purchase_delivery_split_date +#: model:ir.model,name:purchase_delivery_split_date.model_stock_move +msgid "Stock Move" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking msgid "Transfer" msgstr "调拨" + +#, fuzzy +#~ msgid "Purchase Order" +#~ msgstr "采购订单行" From 040be6be9f3d205f142536c971124bc0049d0941 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 9 Jun 2025 08:18:49 +0000 Subject: [PATCH 133/207] Translated using Weblate (Italian) Currently translated at 100.0% (3 of 3 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_delivery_split_date Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_delivery_split_date/it/ --- purchase_delivery_split_date/i18n/it.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_delivery_split_date/i18n/it.po b/purchase_delivery_split_date/i18n/it.po index ba1a7755593..e57d043877f 100644 --- a/purchase_delivery_split_date/i18n/it.po +++ b/purchase_delivery_split_date/i18n/it.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-02-24 13:09+0000\n" -"PO-Revision-Date: 2023-12-20 15:38+0000\n" +"PO-Revision-Date: 2025-06-09 09:04+0000\n" "Last-Translator: mymage \n" "Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" "Language: it\n" @@ -18,7 +18,7 @@ msgstr "" "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" +"X-Generator: Weblate 5.10.4\n" #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line @@ -28,7 +28,7 @@ msgstr "Riga ordine di acquisto" #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_move msgid "Stock Move" -msgstr "" +msgstr "Movimento di magazzino" #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_stock_picking From e680fe28664fd7878286e82296d2098a53a98ea2 Mon Sep 17 00:00:00 2001 From: Lins Denaux Date: Thu, 10 Jul 2025 09:59:44 +0200 Subject: [PATCH 134/207] [IMP] purchase_delivery_split_date: let all receipts inherit the PO's partner_id --- purchase_delivery_split_date/models/stock_move.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/purchase_delivery_split_date/models/stock_move.py b/purchase_delivery_split_date/models/stock_move.py index 8728301876d..b07082940ce 100644 --- a/purchase_delivery_split_date/models/stock_move.py +++ b/purchase_delivery_split_date/models/stock_move.py @@ -63,7 +63,12 @@ def _purchase_split_by_date(self, new_deadline): else: picking.state = "cancel" moves.with_context(purchase_delivery_split_date=True)._assign_picking() - for new_picking in moves.picking_id: - if not new_picking.partner_id and picking.partner_id: - new_picking.partner_id = picking.partner_id reserved_moves._action_assign() + + def _get_new_picking_values(self): + vals = super()._get_new_picking_values() + if self.env.context.get("purchase_delivery_split_date") and not vals.get( + "partner_id" + ): + vals["partner_id"] = fields.first(self.purchase_line_id.partner_id).id + return vals From 488293b78c5cd278dd3d7bd2ca122f7f0902cc7c Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Wed, 9 Jul 2025 17:58:27 +0200 Subject: [PATCH 135/207] [IMP] purchase_delivery_split_date: test picking partner matches po --- .../tests/test_purchase_delivery.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index a2768b3aebe..401bc67f226 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -260,7 +260,7 @@ def test_purchase_line_date_change_split_picking(self): "There must be 1 picking", ) - def test_purchase_line_created_afer_confirm(self): + def test_purchase_line_created_after_confirm(self): """Check new line created when order is confirmed. When a new line is added on an already `purchased` order @@ -343,3 +343,40 @@ def test_po_with_services(self): post_count = self.env["stock.picking"].search_count([]) new_pickings = post_count - prev_count self.assertEqual(new_pickings, 1) + + def test_picking_partner_matches_po_partner(self): + """Ensure all pickings' partner_id matches the PO partner_id.""" + self.po.order_line[0].date_planned = self.date_later + self.po.button_confirm() + self.assertEqual( + len(self.po.picking_ids), + 2, + f"There must be 2 pickings for the PO when confirmed. " + f"{len(self.po.picking_ids)} found", + ) + for picking in self.po.picking_ids: + self.assertEqual( + picking.partner_id, + self.po.partner_id, + f"Picking {picking.name} partner_id must match the PO partner_id", + ) + + def test_picking_partner_matches_po_dest_address(self): + """Ensure all pickings' partner_id matches the PO dest_address_id (if set)""" + # purchase.order.line::_prepare_stock_move_vals + # assigns partner_id using the value from order_id.dest_address_id + self.po.dest_address_id = self.po.partner_id + self.po.order_line[0].date_planned = self.date_later + self.po.button_confirm() + self.assertEqual( + len(self.po.picking_ids), + 2, + f"There must be 2 pickings for the PO when confirmed. " + f"{len(self.po.picking_ids)} found", + ) + for picking in self.po.picking_ids: + self.assertEqual( + picking.partner_id, + self.po.dest_address_id, + f"Picking {picking.name} partner_id must match the PO dest_address_id", + ) From 6cdee754e7ed01ffb8eec46e17f6e5ee822fbbe3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 11 Jul 2025 15:45:55 +0000 Subject: [PATCH 136/207] [BOT] post-merge updates --- purchase_delivery_split_date/README.rst | 2 +- purchase_delivery_split_date/__manifest__.py | 2 +- purchase_delivery_split_date/static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index bfa79847bea..ac6946f1e50 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -11,7 +11,7 @@ Purchase Delivery Split Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:84f65929046766791041a292941bc062f6c4f87690b354689aefbc682ec05055 + !! source digest: sha256:c31a6e3528da8fa59cb4c57c78216193c920b907b5da75687b40cfff83a3cfd8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 57b5bc1c212..8656245e430 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Delivery Split Date", - "version": "18.0.2.0.0", + "version": "18.0.2.0.1", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase Order Lines", "author": ( diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index eafff6253bb..fd2b166b384 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -372,7 +372,7 @@

    Purchase Delivery Split Date

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

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

    When this module is installed, each Purchase Order you confirm will From cb46040229e143ef9a8674645c8b38052f6d7ed5 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Thu, 23 Oct 2025 15:49:24 +0200 Subject: [PATCH 137/207] pruchase_delivery_split_date: fix dropship pick partner Before this change, for dropship purchase orders when new pickings are created the contact on the new picking is not correct. And actually different than the one set on the original picking. --- .../models/stock_move.py | 18 ++++++++++---- .../tests/test_purchase_delivery.py | 24 +++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/purchase_delivery_split_date/models/stock_move.py b/purchase_delivery_split_date/models/stock_move.py index b07082940ce..11758cc4ed8 100644 --- a/purchase_delivery_split_date/models/stock_move.py +++ b/purchase_delivery_split_date/models/stock_move.py @@ -67,8 +67,18 @@ def _purchase_split_by_date(self, new_deadline): def _get_new_picking_values(self): vals = super()._get_new_picking_values() - if self.env.context.get("purchase_delivery_split_date") and not vals.get( - "partner_id" - ): - vals["partner_id"] = fields.first(self.purchase_line_id.partner_id).id + if self.env.context.get("purchase_delivery_split_date"): + is_dropship = all([move._is_dropshipped() for move in self]) + if not vals.get("partner_id") or is_dropship: + vals["partner_id"] = fields.first(self.purchase_line_id.partner_id).id + return vals + + def _assign_picking_values(self, picking): + vals = super()._assign_picking_values(picking) + # The core function will remove the partner from the picking if it is + # different than the one on the moves (Destination Address). + # For dropshipping the partner on the pick is the contact ! + if self.env.context.get("purchase_delivery_split_date"): + if "partner_id" in vals.keys(): + vals.pop("partner_id") return vals diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index 401bc67f226..7ab745bf538 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -380,3 +380,27 @@ def test_picking_partner_matches_po_dest_address(self): self.po.dest_address_id, f"Picking {picking.name} partner_id must match the PO dest_address_id", ) + + def test_picking_partner_dropship(self): + """Ensure pickings for dropship PO have the correct partner_id.""" + location_customer = self.env.ref("stock.stock_location_customers") + dropship_customer = self.env["res.partner"].create( + {"name": "Dropship Customer"} + ) + dropship_partner = self.env["res.partner"].create({"name": "Dropship Partner"}) + self.po.dest_address_id = dropship_customer + self.po.partner_id = dropship_partner + self.po.button_confirm() + # Because the module `stock_dropshipping is not a dependency + # We need to fake a dropshipping PO by changing the destination location + # On the operation type and the picking and moves. + self.po.picking_ids.picking_type_id.default_location_dest_id = location_customer + self.po.picking_ids.location_dest_id = location_customer + # Change the date to trigger a new picking + self.po.order_line[0].date_planned = self.date_later + for picking in self.po.picking_ids: + self.assertEqual( + picking.partner_id, + dropship_partner, + f"Picking {picking.name} partner_id must match the dropship address", + ) From 84b24aae2e75d327b83959611ae8ab5a1cab500c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 9 Dec 2025 11:37:09 +0000 Subject: [PATCH 138/207] [BOT] post-merge updates --- purchase_delivery_split_date/README.rst | 2 +- purchase_delivery_split_date/__manifest__.py | 2 +- purchase_delivery_split_date/static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index ac6946f1e50..c67124f1857 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -11,7 +11,7 @@ Purchase Delivery Split Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c31a6e3528da8fa59cb4c57c78216193c920b907b5da75687b40cfff83a3cfd8 + !! source digest: sha256:13bd6a4b16542c397a49ee853ec62b79146956e617f967545db13893f7ef3e9b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 8656245e430..6ca31298cf7 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Delivery Split Date", - "version": "18.0.2.0.1", + "version": "18.0.2.0.2", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase Order Lines", "author": ( diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index fd2b166b384..6805d02ad1b 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -372,7 +372,7 @@

    Purchase Delivery Split Date

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

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

    When this module is installed, each Purchase Order you confirm will From 28f92718df35d034a909d7dff2de8cf68c3cb10e Mon Sep 17 00:00:00 2001 From: DavidJForgeFlow Date: Mon, 21 Jul 2025 13:07:08 +0200 Subject: [PATCH 139/207] [FIX] purchase_delivery_split_date When the PO is already confirmed and you add a new line with a different date than the existing one, the new receipt is created but the old receipt and move have the dates updated with no reason. The call on the method _update_picking_from_group_key is the method that is messing it up as it updates the previous picking. Also ensures that date is updated in the stock.moves when the value changes in purchase.order.line --- .../models/__init__.py | 1 + .../models/purchase_order_line.py | 1 - .../tests/test_purchase_delivery.py | 109 +++++++++++++++--- 3 files changed, 97 insertions(+), 14 deletions(-) diff --git a/purchase_delivery_split_date/models/__init__.py b/purchase_delivery_split_date/models/__init__.py index 5bd9dfb5fff..a40e6896bd5 100644 --- a/purchase_delivery_split_date/models/__init__.py +++ b/purchase_delivery_split_date/models/__init__.py @@ -1,3 +1,4 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + from . import purchase_order_line, stock_move, stock_picking diff --git a/purchase_delivery_split_date/models/purchase_order_line.py b/purchase_delivery_split_date/models/purchase_order_line.py index 34b45e24b55..e845db96998 100644 --- a/purchase_delivery_split_date/models/purchase_order_line.py +++ b/purchase_delivery_split_date/models/purchase_order_line.py @@ -55,7 +55,6 @@ def _create_stock_moves(self, picking): order_lines, lambda line: line._purchase_split_date_get_group_keys(picking), ) - for key, lines in date_groups: po_lines = self.browse().concat(*lines) if ( diff --git a/purchase_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index 7ab745bf538..1645d2532b3 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -93,7 +93,7 @@ def setUpClass(cls): } ) - def test_check_single_date(self): + def test_01_check_single_date(self): """Tests with single date.""" self.assertEqual( len(self.po.picking_ids), @@ -112,7 +112,7 @@ def test_check_single_date(self): "The picking must be planned at the expected date", ) - def test_adding_line(self): + def test_02_adding_line(self): # A modification on line product quantity will recompute the # date_planned field with the seller (supplierinfo) lead time # Check if the original date planned is kept if new date_planned is before @@ -139,7 +139,7 @@ def test_adding_line(self): Datetime.to_datetime("2015-12-13"), self.po.order_line[0].date_planned ) - def test_check_multiple_dates(self): + def test_03_check_multiple_dates(self): """Tests changing the date of the first line.""" self.po.order_line[0].date_planned = self.date_later self.assertEqual( @@ -167,7 +167,7 @@ def test_check_multiple_dates(self): "The second picking must be planned at the latest date", ) - def test_purchase_line_date_change(self): + def test_04_purchase_line_date_change(self): self.po.order_line[0].date_planned = self.date_later self.po.button_confirm() moves = self.env["stock.move"].search( @@ -177,7 +177,7 @@ def test_purchase_line_date_change(self): line.write({"date_planned": self.date_3rd}) self.assertEqual(moves.date_deadline.strftime("%Y-%m-%d"), self.date_3rd) - def test_group_multiple_picking_same_date(self): + def test_05_group_multiple_picking_same_date(self): """Check multiple picking with same planned date are also merged This can happen if another module changes the picking planned date @@ -205,7 +205,7 @@ def test_purchase_line_time_change_nosplit_picking(self): "There must be 1 picking when I change the time", ) - def test_purchase_line_date_change_split_picking(self): + def test_06_purchase_line_date_change_split_picking(self): self.po.button_confirm() line1 = self.po.order_line[0] line2 = self.po.order_line[1] @@ -260,7 +260,7 @@ def test_purchase_line_date_change_split_picking(self): "There must be 1 picking", ) - def test_purchase_line_created_after_confirm(self): + def test_07_purchase_line_created_after_confirm(self): """Check new line created when order is confirmed. When a new line is added on an already `purchased` order @@ -292,7 +292,7 @@ def test_purchase_line_created_after_confirm(self): ) self.assertEqual(len(moves_after.mapped("picking_id")), 2) - def test_purchase_line_date_change_tz_aware(self): + def test_08_purchase_line_date_change_tz_aware(self): """Check that the grouping is time zone aware. Datetime are always stored in utc in the database. @@ -317,7 +317,7 @@ def test_purchase_line_date_change_tz_aware(self): line2.write({"date_planned": "2021-05-04 23:00:00"}) self.assertEqual(len(self.po.picking_ids), 2) - def test_create_from_form(self): + def test_09_create_from_form(self): partner_purchase = self.env["res.partner"].create( {"name": "Partner 1 of purchase on create from form"} ) @@ -325,7 +325,7 @@ def test_create_from_form(self): purchase_form.partner_id = partner_purchase self.assertEqual(purchase_form.partner_id, partner_purchase) - def test_po_with_services(self): + def test_10_po_with_services(self): """Test that no empty pickings are created because of service lines.""" prev_count = self.env["stock.picking"].search_count([]) self.env["purchase.order.line"].create( @@ -344,7 +344,7 @@ def test_po_with_services(self): new_pickings = post_count - prev_count self.assertEqual(new_pickings, 1) - def test_picking_partner_matches_po_partner(self): + def test_11_picking_partner_matches_po_partner(self): """Ensure all pickings' partner_id matches the PO partner_id.""" self.po.order_line[0].date_planned = self.date_later self.po.button_confirm() @@ -361,7 +361,7 @@ def test_picking_partner_matches_po_partner(self): f"Picking {picking.name} partner_id must match the PO partner_id", ) - def test_picking_partner_matches_po_dest_address(self): + def test_12_picking_partner_matches_po_dest_address(self): """Ensure all pickings' partner_id matches the PO dest_address_id (if set)""" # purchase.order.line::_prepare_stock_move_vals # assigns partner_id using the value from order_id.dest_address_id @@ -381,7 +381,7 @@ def test_picking_partner_matches_po_dest_address(self): f"Picking {picking.name} partner_id must match the PO dest_address_id", ) - def test_picking_partner_dropship(self): + def test_13_picking_partner_dropship(self): """Ensure pickings for dropship PO have the correct partner_id.""" location_customer = self.env.ref("stock.stock_location_customers") dropship_customer = self.env["res.partner"].create( @@ -404,3 +404,86 @@ def test_picking_partner_dropship(self): dropship_partner, f"Picking {picking.name} partner_id must match the dropship address", ) + + def test_14_purchase_line_created_after_confirm_merge_pickings(self): + """ + If a line is modified and two different moves in different pickings + are now compatible, the pickings should be merged. + + """ + self.po.button_confirm() + self.assertEqual(self.po.state, "purchase") + new_date = "2016-01-30" + moves_before = self.env["stock.move"].search( + [("purchase_line_id", "in", self.po.order_line.ids)] + ) + self.assertEqual(len(moves_before.mapped("picking_id")), 1) + self.po.order_line = [ + ( + 0, + 0, + { + "product_id": self.p3.id, + "product_uom": self.p3.uom_id.id, + "name": self.p3.name, + "price_unit": self.p3.standard_price, + "date_planned": new_date, + "product_qty": 2.0, + }, + ), + ] + moves_after = self.env["stock.move"].search( + [("purchase_line_id", "in", self.po.order_line.ids)] + ) + self.assertEqual(len(moves_after.mapped("picking_id")), 2) + + po_line = self.po.order_line.filtered(lambda line: line.product_id == self.p3) + po_line.write({"date_planned": self.date_sooner}) + + moves_after = self.env["stock.move"].search( + [("purchase_line_id", "in", self.po.order_line.ids)] + ) + self.assertEqual(len(moves_after.mapped("picking_id")), 1) + for move in moves_after: + self.assertEqual(move.date, Datetime.to_datetime(self.date_sooner)) + + def test_15_purchase_line_created_after_confirm_check_dates(self): + """ + + When a new line is added on an already `purchased` order + If it is planned for a non yet existing date in the purchase, a + new picking should be created and the previous dates should not be + modified. + + """ + self.po.button_confirm() + self.assertEqual(self.po.state, "purchase") + new_date = "2016-01-30" + moves_before = self.env["stock.move"].search( + [("purchase_line_id", "in", self.po.order_line.ids)] + ) + self.assertEqual(len(moves_before.mapped("picking_id")), 1) + self.po.order_line = [ + ( + 0, + 0, + { + "product_id": self.p3.id, + "product_uom": self.p3.uom_id.id, + "name": self.p3.name, + "price_unit": self.p3.standard_price, + "date_planned": new_date, + "product_qty": 2.0, + }, + ), + ] + moves_after = self.env["stock.move"].search( + [("purchase_line_id", "in", self.po.order_line.ids)] + ) + self.assertEqual(len(moves_after.mapped("picking_id")), 2) + + new_move = moves_after.filtered(lambda line: line.product_id == self.p3) + self.assertEqual(new_move.date, Datetime.to_datetime(new_date)) + + for move in moves_after - new_move: + self.assertEqual(move.date, Datetime.to_datetime(self.date_sooner)) From 001576d6c6ff47d7e8e782c23ca09023deec9a94 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 8 Jan 2026 11:31:24 +0000 Subject: [PATCH 140/207] [BOT] post-merge updates --- purchase_delivery_split_date/README.rst | 2 +- purchase_delivery_split_date/__manifest__.py | 2 +- purchase_delivery_split_date/static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index c67124f1857..30a0c5ecbc6 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -11,7 +11,7 @@ Purchase Delivery Split Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:13bd6a4b16542c397a49ee853ec62b79146956e617f967545db13893f7ef3e9b + !! source digest: sha256:ca0a07dd8e1cd19fbcfcaccb875a0c4b14447e3b90b85299a228029fa9f5acbe !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index 6ca31298cf7..b7ee4928af3 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Delivery Split Date", - "version": "18.0.2.0.2", + "version": "18.0.2.0.3", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase Order Lines", "author": ( diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index 6805d02ad1b..c9f2525286e 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -372,7 +372,7 @@

    Purchase Delivery Split Date

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

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

    When this module is installed, each Purchase Order you confirm will From efadb5a8e129eaf68bc32f3e22f50ce1a71420bb Mon Sep 17 00:00:00 2001 From: Tatiana Deribina Date: Tue, 4 Nov 2025 11:27:52 +0200 Subject: [PATCH 141/207] [MIG] purchase_delivery_split_date: Migration to 19.0 --- purchase_delivery_split_date/README.rst | 16 ++++-- purchase_delivery_split_date/__manifest__.py | 2 +- .../models/purchase_order_line.py | 23 +++------ .../models/stock_move.py | 22 ++++---- .../models/stock_picking.py | 8 +-- .../readme/CREDITS.md | 2 + .../static/description/index.html | 16 ++++-- .../tests/test_purchase_delivery.py | 50 ++++++++++++------- 8 files changed, 80 insertions(+), 59 deletions(-) create mode 100644 purchase_delivery_split_date/readme/CREDITS.md diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index 30a0c5ecbc6..2173879d744 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -21,13 +21,13 @@ Purchase Delivery Split Date :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/18.0/purchase_delivery_split_date + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_delivery_split_date :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-18-0/purchase-workflow-18-0-purchase_delivery_split_date + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_delivery_split_date :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -91,7 +91,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -120,6 +120,12 @@ Contributors - Denis Roussel - Jacques-Etienne Baudoux (BCIM) +Other credits +------------- + +The migration of this module from 18.0 to 19.0 was financially supported +by SprintIT Ltd. + Maintainers ----------- @@ -133,6 +139,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/purchase-workflow `_ project on GitHub. +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_delivery_split_date/__manifest__.py b/purchase_delivery_split_date/__manifest__.py index b7ee4928af3..f08b2cb84fb 100644 --- a/purchase_delivery_split_date/__manifest__.py +++ b/purchase_delivery_split_date/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Purchase Delivery Split Date", - "version": "18.0.2.0.3", + "version": "19.0.1.0.0", "summary": "Allows Purchase Order you confirm to generate one Incoming " "Shipment for each expected date indicated in the Purchase Order Lines", "author": ( diff --git a/purchase_delivery_split_date/models/purchase_order_line.py b/purchase_delivery_split_date/models/purchase_order_line.py index e845db96998..07e338415e6 100644 --- a/purchase_delivery_split_date/models/purchase_order_line.py +++ b/purchase_delivery_split_date/models/purchase_order_line.py @@ -3,11 +3,9 @@ # Copyright 2021 Jacques-Etienne Baudoux (BCIM) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from itertools import groupby - import pytz -from odoo import fields, models +from odoo import models class PurchaseOrderLine(models.Model): @@ -22,11 +20,11 @@ def _purchase_split_date_get_group_keys(self, picking): can add additional keys or replace them by others. """ tz = self.order_id.picking_type_id.warehouse_id.partner_id.tz - wh_tz = pytz.timezone(tz or self.env.user.tz or "UTC") + wh_tz = pytz.timezone(tz) if tz else self.env.tz date_planned_tz = self.date_planned.astimezone(pytz.utc).astimezone(wh_tz) date = date_planned_tz.date() # Split date value to obtain only the attributes year, month and day - key = ({"date_planned": fields.Date.to_string(date)},) + key = (("date_planned", date),) return key def _purchase_split_date_get_sorted_keys(self): @@ -43,20 +41,15 @@ def _create_stock_moves(self, picking): # A picking should be provided return super()._create_stock_moves(picking) moves = self.env["stock.move"] - tz = picking.picking_type_id.warehouse_id.partner_id.tz or self.env.user.tz + tz = picking.picking_type_id.warehouse_id.partner_id.tz # Group the order lines by group key - order_lines = sorted( - self.filtered( - lambda line: not line.display_type and line.product_id.type == "consu" - ), - key=lambda line: line._purchase_split_date_get_sorted_keys(), + order_lines = self.filtered( + lambda line: not line.display_type and line.product_id.type == "consu" ) - date_groups = groupby( - order_lines, + date_groups = order_lines.grouped( lambda line: line._purchase_split_date_get_group_keys(picking), ) - for key, lines in date_groups: - po_lines = self.browse().concat(*lines) + for key, po_lines in date_groups.items(): if ( not picking.move_ids or picking.move_ids == po_lines diff --git a/purchase_delivery_split_date/models/stock_move.py b/purchase_delivery_split_date/models/stock_move.py index 11758cc4ed8..f4bdd2013a1 100644 --- a/purchase_delivery_split_date/models/stock_move.py +++ b/purchase_delivery_split_date/models/stock_move.py @@ -3,29 +3,28 @@ import pytz -from odoo import fields, models -from odoo.osv import expression -from odoo.tools import groupby +from odoo import models +from odoo.fields import Domain class StockMove(models.Model): _inherit = "stock.move" def _purchase_split_date_get_group_keys(self): - tz = self.picking_type_id.warehouse_id.partner_id.tz or self.env.user.tz - wh_tz = pytz.timezone(tz or "UTC") + tz = self.picking_type_id.warehouse_id.partner_id.tz + wh_tz = pytz.timezone(tz) if tz else self.env.tz date_planned_tz = self.date_deadline.astimezone(pytz.utc).astimezone(wh_tz) date = date_planned_tz.date() # Split date value to obtain only the attributes year, month and day - key = ({"date_planned": fields.Date.to_string(date)},) + key = (("date_planned", date),) return key def _search_picking_for_assignation_domain(self): domain = super()._search_picking_for_assignation_domain() if self.env.context.get("purchase_delivery_split_date"): key = self._purchase_split_date_get_group_keys() - tz = self.picking_type_id.warehouse_id.partner_id.tz or self.env.user.tz - domain = expression.AND( + tz = self.picking_type_id.warehouse_id.partner_id.tz + domain = Domain.AND( [domain, self.picking_id._purchase_split_date_assign_domain(key, tz)] ) return domain @@ -43,12 +42,10 @@ def _purchase_split_by_date(self, new_deadline): if not po_moves: return po_moves.date = new_deadline - for picking, moves_list in groupby(po_moves, lambda m: m.picking_id): + for picking, moves in po_moves.grouped("picking_id").items(): if picking.printed: # Do not split by date anymore continue - # todo: if all moves on the same date - moves = self.browse().concat(*moves_list) # the picking is not valid anymore reserved_moves = moves.filtered( lambda m: m.state in ("partially_available", "assigned") @@ -70,7 +67,8 @@ def _get_new_picking_values(self): if self.env.context.get("purchase_delivery_split_date"): is_dropship = all([move._is_dropshipped() for move in self]) if not vals.get("partner_id") or is_dropship: - vals["partner_id"] = fields.first(self.purchase_line_id.partner_id).id + partners = self.purchase_line_id.partner_id + vals["partner_id"] = next(iter(partners), partners).id return vals def _assign_picking_values(self, picking): diff --git a/purchase_delivery_split_date/models/stock_picking.py b/purchase_delivery_split_date/models/stock_picking.py index b834a2fc131..113a63bd0fc 100644 --- a/purchase_delivery_split_date/models/stock_picking.py +++ b/purchase_delivery_split_date/models/stock_picking.py @@ -13,13 +13,13 @@ class StockPicking(models.Model): @api.model def _purchase_split_date_assign_domain(self, key, tz): - date = key[0].get("date_planned") - wh_tz = pytz.timezone(tz or "UTC") + date = key[0][1] + wh_tz = pytz.timezone(tz) if tz else self.env.tz # The date is in local time dt_start_tz = wh_tz.localize(fields.Datetime.to_datetime(date)) dt_start = dt_start_tz.astimezone(pytz.utc).replace(tzinfo=None) dt_end = fields.Datetime.add(dt_start, days=1) return [ - ("scheduled_date", ">=", fields.Datetime.to_string(dt_start)), - ("scheduled_date", "<", fields.Datetime.to_string(dt_end)), + ("scheduled_date", ">=", dt_start), + ("scheduled_date", "<", dt_end), ] diff --git a/purchase_delivery_split_date/readme/CREDITS.md b/purchase_delivery_split_date/readme/CREDITS.md new file mode 100644 index 00000000000..47e2d463523 --- /dev/null +++ b/purchase_delivery_split_date/readme/CREDITS.md @@ -0,0 +1,2 @@ +The migration of this module from 18.0 to 19.0 was financially supported +by SprintIT Ltd. diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index c9f2525286e..9eca23d119a 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -374,7 +374,7 @@

    Purchase Delivery Split Date

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ca0a07dd8e1cd19fbcfcaccb875a0c4b14447e3b90b85299a228029fa9f5acbe !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

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

    When this module is installed, each Purchase Order you confirm will generate one Incoming Shipment for each schedule date indicated in the Purchase Order Lines.

    @@ -399,7 +399,8 @@

    Purchase Delivery Split Date

  • Credits
  • @@ -446,7 +447,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 to smash it by providing a detailed and welcomed -feedback.

    +feedback.

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

    @@ -475,8 +476,13 @@

    Contributors

  • Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
  • +
    +

    Other credits

    +

    The migration of this module from 18.0 to 19.0 was financially supported +by SprintIT Ltd.

    +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -484,7 +490,7 @@

    Maintainers

    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.

    +

    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_delivery_split_date/tests/test_purchase_delivery.py b/purchase_delivery_split_date/tests/test_purchase_delivery.py index 1645d2532b3..465ad48aae4 100644 --- a/purchase_delivery_split_date/tests/test_purchase_delivery.py +++ b/purchase_delivery_split_date/tests/test_purchase_delivery.py @@ -1,16 +1,17 @@ # Copyright 2014-2016 Numérigraphe SARL # Copyright 2017 ForgeFlow, S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + from freezegun import freeze_time from odoo import Command from odoo.fields import Datetime from odoo.tests import Form -from odoo.addons.base.tests.common import BaseCommon +from odoo.addons.purchase_stock.tests.common import PurchaseTestCommon -class TestDeliverySingle(BaseCommon): +class TestDeliverySingle(PurchaseTestCommon): @classmethod def setUpClass(cls): super().setUpClass() @@ -57,12 +58,12 @@ def setUpClass(cls): cls.po = cls.env["purchase.order"].create( { - "partner_id": cls.env.ref("base.res_partner_3").id, + "partner_id": cls.vendor.id, "order_line": [ Command.create( { "product_id": cls.p1.id, - "product_uom": cls.p1.uom_id.id, + "product_uom_id": cls.p1.uom_id.id, "name": cls.p1.name, "price_unit": cls.p1.standard_price, "date_planned": cls.date_sooner, @@ -72,7 +73,7 @@ def setUpClass(cls): Command.create( { "product_id": cls.p2.id, - "product_uom": cls.p2.uom_id.id, + "product_uom_id": cls.p2.uom_id.id, "name": cls.p2.name, "price_unit": cls.p2.standard_price, "date_planned": cls.date_sooner, @@ -82,7 +83,7 @@ def setUpClass(cls): Command.create( { "product_id": cls.p1.id, - "product_uom": cls.p1.uom_id.id, + "product_uom_id": cls.p1.uom_id.id, "name": cls.p1.name, "price_unit": cls.p1.standard_price, "date_planned": cls.date_sooner, @@ -120,7 +121,7 @@ def test_02_adding_line(self): # We first add a seller to the product self.env["product.supplierinfo"].create( { - "partner_id": self.env.ref("base.res_partner_3").id, + "partner_id": self.vendor.id, "product_tmpl_id": self.p1.product_tmpl_id.id, } ) @@ -279,7 +280,7 @@ def test_07_purchase_line_created_after_confirm(self): Command.create( { "product_id": self.p3.id, - "product_uom": self.p3.uom_id.id, + "product_uom_id": self.p3.uom_id.id, "name": self.p3.name, "price_unit": self.p3.standard_price, "date_planned": new_date, @@ -302,25 +303,40 @@ def test_08_purchase_line_date_change_tz_aware(self): self.po.button_confirm() line1 = self.po.order_line[0] line2 = self.po.order_line[1] - self.env.user.tz = "Europe/Brussels" + brussels_context = { + "tz": "Europe/Brussels", + } self.assertEqual(len(self.po.picking_ids), 1) - line1.write({"date_planned": "2021-05-05 03:00:00"}) + line1.with_context(**brussels_context).write( + {"date_planned": "2021-05-05 03:00:00"} + ) self.assertEqual(len(self.po.picking_ids), 2) # Time difference of at least +1 so should be same day (1 picking) - line2.write({"date_planned": "2021-05-04 23:00:00"}) + line2.with_context(**brussels_context).write( + {"date_planned": "2021-05-04 23:00:00"} + ) self.assertEqual(len(self.po.picking_ids), 1) - self.env.user.tz = "Etc/UTC" + utc_context = { + "tz": "Etc/UTC", + } # No time difference so will be another day (2 pickings) - line1.write({"date_planned": "2021-05-05 03:00:00"}) + line1.with_context(**utc_context).write({"date_planned": "2021-05-05 03:00:00"}) self.assertEqual(len(self.po.picking_ids), 2) - line2.write({"date_planned": "2021-05-04 23:00:00"}) + line2.with_context(**utc_context).write({"date_planned": "2021-05-04 23:00:00"}) self.assertEqual(len(self.po.picking_ids), 2) def test_09_create_from_form(self): partner_purchase = self.env["res.partner"].create( {"name": "Partner 1 of purchase on create from form"} ) + has_order_type = "order_type" in self.env["purchase.order"]._fields + if has_order_type: + order_type = self.env.ref("purchase_order_type.po_type_regular") + if order_type.company_id and order_type.company_id != self.company: + order_type.company_id = self.company + partner_purchase["purchase_type"] = order_type + with Form(self.env["purchase.order"]) as purchase_form: purchase_form.partner_id = partner_purchase self.assertEqual(purchase_form.partner_id, partner_purchase) @@ -332,7 +348,7 @@ def test_10_po_with_services(self): { "order_id": self.po.id, "product_id": self.service_1.id, - "product_uom": self.service_1.uom_id.id, + "product_uom_id": self.service_1.uom_id.id, "name": self.service_1.name, "price_unit": self.service_1.standard_price, "date_planned": self.date_later, @@ -424,7 +440,7 @@ def test_14_purchase_line_created_after_confirm_merge_pickings(self): 0, { "product_id": self.p3.id, - "product_uom": self.p3.uom_id.id, + "product_uom_id": self.p3.uom_id.id, "name": self.p3.name, "price_unit": self.p3.standard_price, "date_planned": new_date, @@ -469,7 +485,7 @@ def test_15_purchase_line_created_after_confirm_check_dates(self): 0, { "product_id": self.p3.id, - "product_uom": self.p3.uom_id.id, + "product_uom_id": self.p3.uom_id.id, "name": self.p3.name, "price_unit": self.p3.standard_price, "date_planned": new_date, From af6d931f0eeeb0f70172c6780088b558893caa0b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 23 Apr 2026 19:37:13 +0000 Subject: [PATCH 142/207] [UPD] Update purchase_delivery_split_date.pot --- .../i18n/purchase_delivery_split_date.pot | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot index 4fdcc8a01c2..824ea9f9663 100644 --- a/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot +++ b/purchase_delivery_split_date/i18n/purchase_delivery_split_date.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,6 +13,20 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: purchase_delivery_split_date +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_purchase_order_line__display_name +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_stock_move__display_name +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_stock_picking__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_delivery_split_date +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_purchase_order_line__id +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_stock_move__id +#: model:ir.model.fields,field_description:purchase_delivery_split_date.field_stock_picking__id +msgid "ID" +msgstr "" + #. module: purchase_delivery_split_date #: model:ir.model,name:purchase_delivery_split_date.model_purchase_order_line msgid "Purchase Order Line" From 2e9c9729eef3e4944038416f5d3a03024377d5d8 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 23 Apr 2026 19:40:42 +0000 Subject: [PATCH 143/207] [BOT] post-merge updates --- README.md | 1 + purchase_delivery_split_date/README.rst | 2 +- purchase_delivery_split_date/static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 634d46dca18..c332d181ad2 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ addon | version | maintainers | summary [purchase_advance_payment](purchase_advance_payment/) | 19.0.1.0.0 | LoisRForgeFlow | Allow to add advance payments on purchase orders [purchase_allowed_product](purchase_allowed_product/) | 19.0.1.0.0 | | This module allows to select only products that can be supplied by the vendor [purchase_default_terms_conditions](purchase_default_terms_conditions/) | 19.0.1.0.0 | | This module allows purchase default terms & conditions +[purchase_delivery_split_date](purchase_delivery_split_date/) | 19.0.1.0.0 | | Allows Purchase Order you confirm to generate one Incoming Shipment for each expected date indicated in the Purchase Order Lines [purchase_force_invoiced](purchase_force_invoiced/) | 19.0.1.0.0 | | Allows to force the billing status of the purchase order to "Invoiced" [purchase_line_reassign](purchase_line_reassign/) | 19.0.1.0.0 | | Purchase Line Reassign [purchase_no_rfq](purchase_no_rfq/) | 19.0.1.0.0 | legalsylvain | Purchase Order - No Request For Quotation diff --git a/purchase_delivery_split_date/README.rst b/purchase_delivery_split_date/README.rst index 2173879d744..95a156669f5 100644 --- a/purchase_delivery_split_date/README.rst +++ b/purchase_delivery_split_date/README.rst @@ -11,7 +11,7 @@ Purchase Delivery Split Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ca0a07dd8e1cd19fbcfcaccb875a0c4b14447e3b90b85299a228029fa9f5acbe + !! source digest: sha256:e14ccb527049e300440d09d5a59f338c8485b399aa99ad1c4b83db1c3f44e8c8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_delivery_split_date/static/description/index.html b/purchase_delivery_split_date/static/description/index.html index 9eca23d119a..9982163fee4 100644 --- a/purchase_delivery_split_date/static/description/index.html +++ b/purchase_delivery_split_date/static/description/index.html @@ -372,7 +372,7 @@

    Purchase Delivery Split Date

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

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

    When this module is installed, each Purchase Order you confirm will diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index d13260ba28e..f59dd956bc2 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-purchase-workflow" -version = "19.0.20260422.0" +version = "19.0.20260423.0" dependencies = [ "odoo-addon-partner_supplierinfo_smartbutton==19.0.*", "odoo-addon-procurement_purchase_no_grouping==19.0.*", @@ -8,6 +8,7 @@ dependencies = [ "odoo-addon-purchase_advance_payment==19.0.*", "odoo-addon-purchase_allowed_product==19.0.*", "odoo-addon-purchase_default_terms_conditions==19.0.*", + "odoo-addon-purchase_delivery_split_date==19.0.*", "odoo-addon-purchase_force_invoiced==19.0.*", "odoo-addon-purchase_line_reassign==19.0.*", "odoo-addon-purchase_no_rfq==19.0.*", From ae8ba416b169e2ebe4f4871d215c632c0490a3d1 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 5 May 2020 23:29:58 +0200 Subject: [PATCH 144/207] Add module purchase_reception_status --- purchase_reception_status/__init__.py | 1 + purchase_reception_status/__manifest__.py | 19 +++++++ purchase_reception_status/models/__init__.py | 1 + .../models/purchase_order.py | 50 ++++++++++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 5 ++ purchase_reception_status/readme/USAGE.rst | 1 + .../views/purchase_order.xml | 51 +++++++++++++++++++ 8 files changed, 129 insertions(+) create mode 100644 purchase_reception_status/__init__.py create mode 100644 purchase_reception_status/__manifest__.py create mode 100644 purchase_reception_status/models/__init__.py create mode 100644 purchase_reception_status/models/purchase_order.py create mode 100644 purchase_reception_status/readme/CONTRIBUTORS.rst create mode 100644 purchase_reception_status/readme/DESCRIPTION.rst create mode 100644 purchase_reception_status/readme/USAGE.rst create mode 100644 purchase_reception_status/views/purchase_order.xml diff --git a/purchase_reception_status/__init__.py b/purchase_reception_status/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/purchase_reception_status/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/purchase_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py new file mode 100644 index 00000000000..2c4e329bb7f --- /dev/null +++ b/purchase_reception_status/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Purchase Reception Status', + 'version': '12.0.1.0.0', + 'category': 'Purchases', + 'license': 'AGPL-3', + 'summary': 'Add reception status on purchase orders', + 'author': 'Akretion,Odoo Community Association (OCA)', + 'maintainers': ['alexis-via'], + 'website': 'https://github.com/OCA/purchase-workflow', + 'depends': ['purchase'], + 'data': [ + 'views/purchase_order.xml', + ], + 'installable': True, +} diff --git a/purchase_reception_status/models/__init__.py b/purchase_reception_status/models/__init__.py new file mode 100644 index 00000000000..9f03530643d --- /dev/null +++ b/purchase_reception_status/models/__init__.py @@ -0,0 +1 @@ +from . import purchase_order diff --git a/purchase_reception_status/models/purchase_order.py b/purchase_reception_status/models/purchase_order.py new file mode 100644 index 00000000000..5e7facc7a2d --- /dev/null +++ b/purchase_reception_status/models/purchase_order.py @@ -0,0 +1,50 @@ +# Copyright 2020 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import float_compare + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + reception_status = fields.Selection([ + ('no', 'Nothing Received'), + ('partial', 'Partially Received'), + ('received', 'Fully Received'), + ], compute='_compute_reception_status', + string='Reception Status', store=True) + force_received = fields.Boolean( + string='Force Received', + readonly=True, states={'done': [('readonly', False)]}, copy=False, + help="If true, the reception status will be forced to Fully Received, " + "even if some lines are not fully received. " + "To be able to modify this field, you must first lock the order.") + + @api.depends( + 'state', 'force_received', + 'order_line.qty_received', 'order_line.product_qty') + def _compute_reception_status(self): + prec = self.env['decimal.precision'].precision_get( + 'Product Unit of Measure') + for order in self: + status = 'no' + if order.state in ('purchase', 'done'): + if order.force_received: + status = 'received' + elif all([ + float_compare( + line.qty_received, + line.product_qty, + precision_digits=prec) >= 0 + for line in order.order_line]): + status = 'received' + elif any([ + float_compare( + line.qty_received, + 0, + precision_digits=prec) > 0 + for line in order.order_line]): + status = 'partial' + order.reception_status = status diff --git a/purchase_reception_status/readme/CONTRIBUTORS.rst b/purchase_reception_status/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..ff65d68ce6d --- /dev/null +++ b/purchase_reception_status/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/purchase_reception_status/readme/DESCRIPTION.rst b/purchase_reception_status/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..285d3626d25 --- /dev/null +++ b/purchase_reception_status/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: + +* Nothing Received +* Partially Received +* Fully Received diff --git a/purchase_reception_status/readme/USAGE.rst b/purchase_reception_status/readme/USAGE.rst new file mode 100644 index 00000000000..8af96fb5f2a --- /dev/null +++ b/purchase_reception_status/readme/USAGE.rst @@ -0,0 +1 @@ +If you are part of the *Purchase Manager* group, you can force a confirmed purchase order to **Full Received** status: you should first *lock* the order, then check the field **Force Received** located in the *Other Information* tab. diff --git a/purchase_reception_status/views/purchase_order.xml b/purchase_reception_status/views/purchase_order.xml new file mode 100644 index 00000000000..e3fb00b27e6 --- /dev/null +++ b/purchase_reception_status/views/purchase_order.xml @@ -0,0 +1,51 @@ + + + + + + + + received_status.purchase.order.form + purchase.order + + + + + + + + + + + received_status.purchase.order.tree + purchase.order + + + + + + + + + + received_status.purchase.order.search + purchase.order + + + + + + + + + + + + + + + From d2aa9049112199ea090f960d12c64c87215728c1 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 6 May 2020 13:39:05 +0000 Subject: [PATCH 145/207] [UPD] Update purchase_reception_status.pot --- .../i18n/purchase_reception_status.pot | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 purchase_reception_status/i18n/purchase_reception_status.pot diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot new file mode 100644 index 00000000000..2d2a5675089 --- /dev/null +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_reception_status +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received +msgid "Force Received" +msgstr "" + +#. module: purchase_reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +#: selection:purchase.order,reception_status:0 +msgid "Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received +msgid "If true, the reception status will be forced to Fully Received, even if some lines are not fully received. To be able to modify this field, you must first lock the order." +msgstr "" + +#. module: purchase_reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Not Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: selection:purchase.order,reception_status:0 +msgid "Nothing Received" +msgstr "" + +#. module: purchase_reception_status +#: selection:purchase.order,reception_status:0 +msgid "Partially Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model,name:purchase_reception_status.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Reception Status" +msgstr "" + From 8e9a63a1bcccca3787f32c1e12462cf06bb6bf33 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 6 May 2020 14:23:35 +0000 Subject: [PATCH 146/207] [UPD] README.rst --- purchase_reception_status/README.rst | 90 ++++ .../static/description/index.html | 431 ++++++++++++++++++ 2 files changed, 521 insertions(+) create mode 100644 purchase_reception_status/README.rst create mode 100644 purchase_reception_status/static/description/index.html diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst new file mode 100644 index 00000000000..5603de3ddff --- /dev/null +++ b/purchase_reception_status/README.rst @@ -0,0 +1,90 @@ +========================= +Purchase Reception Status +========================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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_reception_status + :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_reception_status + :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 adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: + +* Nothing Received +* Partially Received +* Fully Received + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +If you are part of the *Purchase Manager* group, you can force a confirmed purchase order to **Full Received** status: you should first *lock* the order, then check the field **Force Received** located in the *Other Information* tab. + +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 +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Alexis de Lattre + +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. + +.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via + +Current `maintainer `__: + +|maintainer-alexis-via| + +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_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html new file mode 100644 index 00000000000..1bc2a8757a0 --- /dev/null +++ b/purchase_reception_status/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Purchase Reception Status + + + +

    +

    Purchase Reception Status

    + + +

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

    +

    This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

    +
      +
    • Nothing Received
    • +
    • Partially Received
    • +
    • Fully Received
    • +
    +

    Table of contents

    + +
    +

    Usage

    +

    If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you should first lock the order, then check the field Force Received located in the Other Information tab.

    +
    +
    +

    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

    +
      +
    • Akretion
    • +
    +
    +
    +

    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.

    +

    Current maintainer:

    +

    alexis-via

    +

    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.

    +
    +
    +
    + + From 6c35de6fb3b1a2b591ea5628747e246424cab71e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 6 May 2020 14:23:35 +0000 Subject: [PATCH 147/207] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 purchase_reception_status/static/description/icon.png diff --git a/purchase_reception_status/static/description/icon.png b/purchase_reception_status/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 45c3e10a1caefb066f0c55c77d11fb3485bc0e23 Mon Sep 17 00:00:00 2001 From: Radovan Skolnik Date: Sat, 23 May 2020 20:40:46 +0200 Subject: [PATCH 148/207] [IMP] purchase_reception_status: black, isort, prettier --- purchase_reception_status/__manifest__.py | 24 +++-- .../models/purchase_order.py | 69 ++++++++------ .../views/purchase_order.xml | 93 ++++++++++--------- 3 files changed, 101 insertions(+), 85 deletions(-) diff --git a/purchase_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index 2c4e329bb7f..84756977d33 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -3,17 +3,15 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Purchase Reception Status', - 'version': '12.0.1.0.0', - 'category': 'Purchases', - 'license': 'AGPL-3', - 'summary': 'Add reception status on purchase orders', - 'author': 'Akretion,Odoo Community Association (OCA)', - 'maintainers': ['alexis-via'], - 'website': 'https://github.com/OCA/purchase-workflow', - 'depends': ['purchase'], - 'data': [ - 'views/purchase_order.xml', - ], - 'installable': True, + "name": "Purchase Reception Status", + "version": "12.0.1.0.0", + "category": "Purchases", + "license": "AGPL-3", + "summary": "Add reception status on purchase orders", + "author": "Akretion,Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "website": "https://github.com/OCA/purchase-workflow", + "depends": ["purchase"], + "data": ["views/purchase_order.xml",], + "installable": True, } diff --git a/purchase_reception_status/models/purchase_order.py b/purchase_reception_status/models/purchase_order.py index 5e7facc7a2d..5f9da770b55 100644 --- a/purchase_reception_status/models/purchase_order.py +++ b/purchase_reception_status/models/purchase_order.py @@ -7,44 +7,53 @@ class PurchaseOrder(models.Model): - _inherit = 'purchase.order' + _inherit = "purchase.order" - reception_status = fields.Selection([ - ('no', 'Nothing Received'), - ('partial', 'Partially Received'), - ('received', 'Fully Received'), - ], compute='_compute_reception_status', - string='Reception Status', store=True) + reception_status = fields.Selection( + [ + ("no", "Nothing Received"), + ("partial", "Partially Received"), + ("received", "Fully Received"), + ], + compute="_compute_reception_status", + string="Reception Status", + store=True, + ) force_received = fields.Boolean( - string='Force Received', - readonly=True, states={'done': [('readonly', False)]}, copy=False, + string="Force Received", + readonly=True, + states={"done": [("readonly", False)]}, + copy=False, help="If true, the reception status will be forced to Fully Received, " "even if some lines are not fully received. " - "To be able to modify this field, you must first lock the order.") + "To be able to modify this field, you must first lock the order.", + ) @api.depends( - 'state', 'force_received', - 'order_line.qty_received', 'order_line.product_qty') + "state", "force_received", "order_line.qty_received", "order_line.product_qty" + ) def _compute_reception_status(self): - prec = self.env['decimal.precision'].precision_get( - 'Product Unit of Measure') + prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") for order in self: - status = 'no' - if order.state in ('purchase', 'done'): + status = "no" + if order.state in ("purchase", "done"): if order.force_received: - status = 'received' - elif all([ + status = "received" + elif all( + [ float_compare( - line.qty_received, - line.product_qty, - precision_digits=prec) >= 0 - for line in order.order_line]): - status = 'received' - elif any([ - float_compare( - line.qty_received, - 0, - precision_digits=prec) > 0 - for line in order.order_line]): - status = 'partial' + line.qty_received, line.product_qty, precision_digits=prec + ) + >= 0 + for line in order.order_line + ] + ): + status = "received" + elif any( + [ + float_compare(line.qty_received, 0, precision_digits=prec) > 0 + for line in order.order_line + ] + ): + status = "partial" order.reception_status = status diff --git a/purchase_reception_status/views/purchase_order.xml b/purchase_reception_status/views/purchase_order.xml index e3fb00b27e6..d68659952c7 100644 --- a/purchase_reception_status/views/purchase_order.xml +++ b/purchase_reception_status/views/purchase_order.xml @@ -1,51 +1,60 @@ - + - - - - - received_status.purchase.order.form - purchase.order - - - - - + + received_status.purchase.order.form + purchase.order + + + + + + - - - - - received_status.purchase.order.tree - purchase.order - - - - + + + received_status.purchase.order.tree + purchase.order + + + + + - - - - - received_status.purchase.order.search - purchase.order - - - - - - - - - - - - - - + + + received_status.purchase.order.search + purchase.order + + + + + + + + + + + + From 69677413f92a91b04580e7e2cf775cafce58f189 Mon Sep 17 00:00:00 2001 From: Radovan Skolnik Date: Sun, 24 May 2020 00:32:28 +0200 Subject: [PATCH 149/207] [MIG] purchase_receptions_status: Migration to 13.0 --- purchase_reception_status/README.rst | 8 ++++---- purchase_reception_status/__manifest__.py | 4 ++-- .../i18n/purchase_reception_status.pot | 2 +- .../static/description/index.html | 6 +++--- purchase_reception_status/views/purchase_order.xml | 12 +++++++++++- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 5603de3ddff..2a27866368a 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -14,13 +14,13 @@ Purchase Reception Status :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_reception_status + :target: https://github.com/OCA/purchase-workflow/tree/13.0/purchase_reception_status :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_reception_status :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 + :target: https://runbot.odoo-community.org/runbot/142/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -47,7 +47,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. @@ -85,6 +85,6 @@ Current `maintainer `__: |maintainer-alexis-via| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index 84756977d33..62524282dd3 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Reception Status", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase orders", @@ -12,6 +12,6 @@ "maintainers": ["alexis-via"], "website": "https://github.com/OCA/purchase-workflow", "depends": ["purchase"], - "data": ["views/purchase_order.xml",], + "data": ["views/purchase_order.xml"], "installable": True, } diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot index 2d2a5675089..1eff77f55e9 100644 --- a/purchase_reception_status/i18n/purchase_reception_status.pot +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 1bc2a8757a0..7d5ebec62b8 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -367,7 +367,7 @@

    Purchase Reception Status

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

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

    +

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

    This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

    • Nothing Received
    • @@ -396,7 +396,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.

      @@ -422,7 +422,7 @@

      Maintainers

      promote its widespread use.

      Current maintainer:

      alexis-via

      -

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

      +

      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_reception_status/views/purchase_order.xml b/purchase_reception_status/views/purchase_order.xml index d68659952c7..b855040dbc2 100644 --- a/purchase_reception_status/views/purchase_order.xml +++ b/purchase_reception_status/views/purchase_order.xml @@ -30,10 +30,20 @@ + + received_status.purchase.order.tree + purchase.order + + + + + + + received_status.purchase.order.search purchase.order - + Date: Sat, 7 Nov 2020 15:08:05 +0000 Subject: [PATCH 150/207] Added translation using Weblate (Italian) --- purchase_reception_status/i18n/it.po | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 purchase_reception_status/i18n/it.po diff --git a/purchase_reception_status/i18n/it.po b/purchase_reception_status/i18n/it.po new file mode 100644 index 00000000000..f164be79955 --- /dev/null +++ b/purchase_reception_status/i18n/it.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_reception_status +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received +msgid "Force Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__received +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received +msgid "" +"If true, the reception status will be forced to Fully Received, even if some" +" lines are not fully received. To be able to modify this field, you must " +"first lock the order." +msgstr "" + +#. module: purchase_reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Not Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__no +msgid "Nothing Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__partial +msgid "Partially Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model,name:purchase_reception_status.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Reception Status" +msgstr "" From 747a7c65b2aad0b745a50db628925b2d1d568140 Mon Sep 17 00:00:00 2001 From: Alessandro Fiorino Date: Sat, 7 Nov 2020 15:08:22 +0000 Subject: [PATCH 151/207] Translated using Weblate (Italian) Currently translated at 100.0% (8 of 8 strings) Translation: purchase-workflow-13.0/purchase-workflow-13.0-purchase_reception_status Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-13-0/purchase-workflow-13-0-purchase_reception_status/it/ --- purchase_reception_status/i18n/it.po | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/purchase_reception_status/i18n/it.po b/purchase_reception_status/i18n/it.po index f164be79955..5a5d82e949b 100644 --- a/purchase_reception_status/i18n/it.po +++ b/purchase_reception_status/i18n/it.po @@ -6,24 +6,26 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2020-11-07 18:08+0000\n" +"Last-Translator: Alessandro Fiorino \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 3.10\n" #. module: purchase_reception_status #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received msgid "Force Received" -msgstr "" +msgstr "Forza Ricevuto" #. module: purchase_reception_status #: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__received #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Fully Received" -msgstr "" +msgstr "Ricevuto Completamente" #. module: purchase_reception_status #: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received @@ -32,29 +34,32 @@ msgid "" " lines are not fully received. To be able to modify this field, you must " "first lock the order." msgstr "" +"Se vero, lo stato di ricezione sarà forzato a Completamente Ricevuto, anche " +"se alcune righe non sono state completamente ricevute. Per essere in grado " +"di modificare questo campo, devi prima aver bloccato l'ordine." #. module: purchase_reception_status #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Not Fully Received" -msgstr "" +msgstr "Ricevuto Parzialmente" #. module: purchase_reception_status #: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__no msgid "Nothing Received" -msgstr "" +msgstr "Nulla Ricevuto" #. module: purchase_reception_status #: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__partial msgid "Partially Received" -msgstr "" +msgstr "Ricevuto Parzialmente" #. module: purchase_reception_status #: model:ir.model,name:purchase_reception_status.model_purchase_order msgid "Purchase Order" -msgstr "" +msgstr "Ordine d'Acquisto" #. module: purchase_reception_status #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__reception_status #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Reception Status" -msgstr "" +msgstr "Stato Ricezione" From 730e4e1672933ab6dfc35c563cd24d2e7649b91d Mon Sep 17 00:00:00 2001 From: koen Date: Tue, 5 Jan 2021 17:09:53 +0100 Subject: [PATCH 152/207] [14.0-mig-purchase] [MIG] purchase_reception_status: Migration to 14.0 --- purchase_reception_status/README.rst | 6 +++--- purchase_reception_status/__manifest__.py | 2 +- purchase_reception_status/static/description/index.html | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 2a27866368a..977a3946350 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -23,7 +23,7 @@ Purchase Reception Status :target: https://runbot.odoo-community.org/runbot/142/13.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: @@ -83,8 +83,8 @@ promote its widespread use. Current `maintainer `__: -|maintainer-alexis-via| +|maintainer-alexis-via| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index 62524282dd3..a69b328fe32 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Reception Status", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase orders", diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 7d5ebec62b8..967deb300f3 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -367,7 +367,7 @@

      Purchase Reception Status

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

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

      +

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

      This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

      • Nothing Received
      • @@ -396,7 +396,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.

        @@ -422,7 +422,7 @@

        Maintainers

        promote its widespread use.

        Current maintainer:

        alexis-via

        -

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

        +

        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.

        From ff3e2e492281471e3c28b6c9458536ecb941c097 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 12 Mar 2021 06:31:29 +0000 Subject: [PATCH 153/207] [UPD] Update purchase_reception_status.pot --- .../i18n/purchase_reception_status.pot | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot index 1eff77f55e9..15cd2cd7063 100644 --- a/purchase_reception_status/i18n/purchase_reception_status.pot +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -1,32 +1,50 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * purchase_reception_status +# * purchase_reception_status # 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" +"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_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__display_name +msgid "Display Name" +msgstr "" + #. module: purchase_reception_status #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received msgid "Force Received" msgstr "" #. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__received #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter -#: selection:purchase.order,reception_status:0 msgid "Fully Received" msgstr "" +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__id +msgid "ID" +msgstr "" + #. module: purchase_reception_status #: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received -msgid "If true, the reception status will be forced to Fully Received, even if some lines are not fully received. To be able to modify this field, you must first lock the order." +msgid "" +"If true, the reception status will be forced to Fully Received, even if some" +" lines are not fully received. To be able to modify this field, you must " +"first lock the order." +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order____last_update +msgid "Last Modified on" msgstr "" #. module: purchase_reception_status @@ -35,12 +53,12 @@ msgid "Not Fully Received" msgstr "" #. module: purchase_reception_status -#: selection:purchase.order,reception_status:0 +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__no msgid "Nothing Received" msgstr "" #. module: purchase_reception_status -#: selection:purchase.order,reception_status:0 +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__partial msgid "Partially Received" msgstr "" @@ -54,4 +72,3 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Reception Status" msgstr "" - From 185fd60d387ace190b28361efc381caeb4fa8cef Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 12 Mar 2021 06:48:55 +0000 Subject: [PATCH 154/207] [UPD] README.rst --- purchase_reception_status/README.rst | 12 ++++++------ .../static/description/index.html | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 977a3946350..5e9262c5828 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -14,16 +14,16 @@ Purchase Reception Status :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/13.0/purchase_reception_status + :target: https://github.com/OCA/purchase-workflow/tree/14.0/purchase_reception_status :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_reception_status + :target: https://translation.odoo-community.org/projects/purchase-workflow-14-0/purchase-workflow-14-0-purchase_reception_status :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/13.0 + :target: https://runbot.odoo-community.org/runbot/142/14.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: @@ -47,7 +47,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. @@ -83,7 +83,7 @@ promote its widespread use. Current `maintainer `__: -|maintainer-alexis-via| +|maintainer-alexis-via| This module is part of the `OCA/purchase-workflow `_ project on GitHub. diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 967deb300f3..d9de347bbf3 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -367,7 +367,7 @@

        Purchase Reception Status

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

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

        +

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

        This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

        • Nothing Received
        • From 88eeb967142f5f5af85affeb31ef083044528959 Mon Sep 17 00:00:00 2001 From: Emmanuel HURET Date: Thu, 27 Jan 2022 09:16:36 +0000 Subject: [PATCH 155/207] Added translation using Weblate (French) --- purchase_reception_status/i18n/fr.po | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 purchase_reception_status/i18n/fr.po diff --git a/purchase_reception_status/i18n/fr.po b/purchase_reception_status/i18n/fr.po new file mode 100644 index 00000000000..ce249e3f180 --- /dev/null +++ b/purchase_reception_status/i18n/fr.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_reception_status +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\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: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received +msgid "Force Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__received +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__id +msgid "ID" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received +msgid "" +"If true, the reception status will be forced to Fully Received, even if some" +" lines are not fully received. To be able to modify this field, you must " +"first lock the order." +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: purchase_reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Not Fully Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__no +msgid "Nothing Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__partial +msgid "Partially Received" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model,name:purchase_reception_status.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__reception_status +#: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter +msgid "Reception Status" +msgstr "" From 7db25ac03fb83206387730491f28ef70838a04e4 Mon Sep 17 00:00:00 2001 From: Emmanuel HURET Date: Wed, 9 Feb 2022 14:33:38 +0100 Subject: [PATCH 156/207] [MIG] purchase_reception_status: Migration to 15.0 --- purchase_reception_status/README.rst | 14 +++++++------- purchase_reception_status/__manifest__.py | 2 +- purchase_reception_status/models/purchase_order.py | 2 -- .../static/description/index.html | 8 ++++---- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 5e9262c5828..426f9a38438 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -14,16 +14,16 @@ Purchase Reception Status :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/14.0/purchase_reception_status + :target: https://github.com/OCA/purchase-workflow/tree/15.0/purchase_reception_status :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-14-0/purchase-workflow-14-0-purchase_reception_status + :target: https://translation.odoo-community.org/projects/purchase-workflow-15-0/purchase-workflow-15-0-purchase_reception_status :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/14.0 + :target: https://runbot.odoo-community.org/runbot/142/15.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: @@ -47,7 +47,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. @@ -83,8 +83,8 @@ promote its widespread use. Current `maintainer `__: -|maintainer-alexis-via| +|maintainer-alexis-via| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index a69b328fe32..a6b99313c49 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Reception Status", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase orders", diff --git a/purchase_reception_status/models/purchase_order.py b/purchase_reception_status/models/purchase_order.py index 5f9da770b55..f655aed4f8f 100644 --- a/purchase_reception_status/models/purchase_order.py +++ b/purchase_reception_status/models/purchase_order.py @@ -16,11 +16,9 @@ class PurchaseOrder(models.Model): ("received", "Fully Received"), ], compute="_compute_reception_status", - string="Reception Status", store=True, ) force_received = fields.Boolean( - string="Force Received", readonly=True, states={"done": [("readonly", False)]}, copy=False, diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index d9de347bbf3..8649b8a3181 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -3,7 +3,7 @@ - + Purchase Reception Status -
          -

          Purchase Reception Status

          +
          + + +Odoo Community Association + +
          +

          Purchase Reception Status

          -

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

          +

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

          This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

            @@ -390,14 +396,14 @@

            Purchase Reception Status

          -

          Usage

          +

          Usage

          If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you should first lock the order, then check the field Force Received located in the Other Information tab.

          -

          Bug Tracker

          +

          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 @@ -405,24 +411,26 @@

          Bug Tracker

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

          -

          Credits

          +

          Credits

          -

          Authors

          +

          Authors

          • Akretion
          -

          Maintainers

          +

          Maintainers

          This module is maintained by the OCA.

          -Odoo Community Association + +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.

          @@ -433,5 +441,6 @@

          Maintainers

          +
          From 2713359daf5146bf244c69a89e94ba2dd7202241 Mon Sep 17 00:00:00 2001 From: AaronHForgeFlow Date: Wed, 10 Sep 2025 16:54:40 +0200 Subject: [PATCH 181/207] [MIG] purchase_reception_status: Migration to v18 --- purchase_reception_status/README.rst | 16 +++----- purchase_reception_status/__manifest__.py | 2 +- .../static/description/index.html | 41 ++++++++----------- .../tests/test_purchase_reception_status.py | 3 +- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 873987370b8..2619825a6bc 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ========================= Purchase Reception Status ========================= @@ -17,17 +13,17 @@ Purchase Reception Status .. |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/license-AGPL--3-blue.png +.. |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/17.0/purchase_reception_status + :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_reception_status :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-17-0/purchase-workflow-17-0-purchase_reception_status + :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_reception_status :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -58,7 +54,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -97,6 +93,6 @@ Current `maintainer `__: |maintainer-alexis-via| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index 5edd0f77ff9..f62e1c0b5b3 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Reception Status", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase orders (OCA logic)", diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 35b24c85775..03bdc458805 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -3,16 +3,15 @@ -README.rst +Purchase Reception Status -
          +
          +

          Purchase Reception Status

          - - -Odoo Community Association - -
          -

          Purchase Reception Status

          -

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

          +

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

          This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

            @@ -396,51 +390,48 @@

            Purchase Reception Status

          -

          Usage

          +

          Usage

          If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you should first lock the order, then check the field Force Received located in the Other Information tab.

          -

          Bug Tracker

          +

          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.

          +feedback.

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

          -

          Credits

          +

          Credits

          -

          Authors

          +

          Authors

          • Akretion
          -

          Maintainers

          +

          Maintainers

          This module is maintained by the OCA.

          - -Odoo Community Association - +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.

          Current maintainer:

          alexis-via

          -

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

          +

          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_reception_status/tests/test_purchase_reception_status.py b/purchase_reception_status/tests/test_purchase_reception_status.py index de5a6e1704b..661c43b5916 100644 --- a/purchase_reception_status/tests/test_purchase_reception_status.py +++ b/purchase_reception_status/tests/test_purchase_reception_status.py @@ -19,9 +19,10 @@ def setUpClass(cls): cls.product_1 = cls.env["product.product"].create( { "name": "Test Product 1", - "type": "product", + "type": "consu", "purchase_method": "receive", "list_price": 100.0, + "is_storable": True, } ) From 5ce647f25b19099ddad490cdb246b6ab1c4a6392 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 16 Sep 2025 09:05:15 +0000 Subject: [PATCH 182/207] [UPD] Update purchase_reception_status.pot --- .../i18n/purchase_reception_status.pot | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot index cde69a8597b..ee494daadf4 100644 --- a/purchase_reception_status/i18n/purchase_reception_status.pot +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 17.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -57,3 +57,11 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Receipt Status" msgstr "" + +#. module: purchase_reception_status +#: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__receipt_status +msgid "" +"Red: Late\n" +" Orange: To process today\n" +" Green: On time" +msgstr "" From 7e045983d0883834733dcf9d5a36b5905e4118a4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Sep 2025 09:11:23 +0000 Subject: [PATCH 183/207] [BOT] post-merge updates --- purchase_reception_status/README.rst | 8 +++- .../static/description/index.html | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 2619825a6bc..1d8e5ec95dc 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ========================= Purchase Reception Status ========================= @@ -7,13 +11,13 @@ Purchase Reception Status !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ae44504fa319b3635d25e397e9d2fcbf84b8f051186e8c1ce9e6b288ee99fa9b + !! source digest: sha256:ffb8b08e10dfeca5608fead37d119b50b8dbbf441adf1e2a9d6af8ceca4122c2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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 diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 03bdc458805..47a6d92feeb 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -3,15 +3,16 @@ -Purchase Reception Status +README.rst -
          -

          Purchase Reception Status

          +
          + + +Odoo Community Association + +
          +

          Purchase Reception Status

          -

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

          +

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

          This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

            @@ -390,14 +396,14 @@

            Purchase Reception Status

          -

          Usage

          +

          Usage

          If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you should first lock the order, then check the field Force Received located in the Other Information tab.

          -

          Bug Tracker

          +

          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 @@ -405,24 +411,26 @@

          Bug Tracker

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

          -

          Credits

          +

          Credits

          -

          Authors

          +

          Authors

          • Akretion
          -

          Maintainers

          +

          Maintainers

          This module is maintained by the OCA.

          -Odoo Community Association + +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.

          @@ -433,5 +441,6 @@

          Maintainers

          +
          From d4eaf535570937377a170ca3ad7bed1405065890 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 16 Sep 2025 10:50:26 +0000 Subject: [PATCH 184/207] [UPD] Update purchase_reception_status.pot --- purchase_reception_status/i18n/purchase_reception_status.pot | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot index ee494daadf4..d26504cfc61 100644 --- a/purchase_reception_status/i18n/purchase_reception_status.pot +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -27,9 +27,8 @@ msgstr "" #. module: purchase_reception_status #: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received msgid "" -"If true, the reception status will be forced to Fully Received, even if some" -" lines are not fully received. To be able to modify this field, you must " -"first lock the order." +"If true, the order is marked forced only when all lines are fully received " +"and at least one line was manually forced." msgstr "" #. module: purchase_reception_status From f696b344be0e9331d4421afc0d57d9979fb7324a Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 17 Sep 2025 09:05:45 +0000 Subject: [PATCH 185/207] Translated using Weblate (Italian) Currently translated at 100.0% (8 of 8 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_reception_status Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_reception_status/it/ --- purchase_reception_status/i18n/it.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/purchase_reception_status/i18n/it.po b/purchase_reception_status/i18n/it.po index 7f7465ce868..bc0a69f80e6 100644 --- a/purchase_reception_status/i18n/it.po +++ b/purchase_reception_status/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-03-19 15:41+0000\n" +"PO-Revision-Date: 2025-09-17 10:36+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,12 +14,12 @@ msgstr "" "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" +"X-Generator: Weblate 5.10.4\n" #. module: purchase_reception_status #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received msgid "Force Received" -msgstr "Forza Ricevuto" +msgstr "Forza a ricevuto" #. module: purchase_reception_status #: model:ir.model.fields.selection,name:purchase_reception_status.selection__purchase_order__reception_status__received @@ -62,4 +62,4 @@ msgstr "Ordine di acquisto" #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__reception_status #: model_terms:ir.ui.view,arch_db:purchase_reception_status.view_purchase_order_filter msgid "Reception Status" -msgstr "Stato Ricezione" +msgstr "Stato ricezione" From 08b4fea1ff5d861fb57c39742904457484d9208b Mon Sep 17 00:00:00 2001 From: sbiosca-s73 Date: Fri, 9 Jan 2026 13:12:32 +0100 Subject: [PATCH 186/207] [MIG] purchase_reception_status: Migration to 19.0 --- purchase_reception_status/README.rst | 25 ++++++++++--------- purchase_reception_status/__manifest__.py | 4 +-- .../models/purchase_order.py | 10 +++++--- purchase_reception_status/readme/USAGE.md | 3 ++- .../static/description/index.html | 11 ++++---- .../tests/test_purchase_reception_status.py | 8 +++--- .../views/purchase_order.xml | 25 +++---------------- 7 files changed, 37 insertions(+), 49 deletions(-) diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index 1d8e5ec95dc..afff9b9d7e5 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -21,13 +21,13 @@ Purchase Reception Status :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/18.0/purchase_reception_status + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_reception_status :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-18-0/purchase-workflow-18-0-purchase_reception_status + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_reception_status :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -35,9 +35,9 @@ Purchase Reception Status This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: -- Nothing Received -- Partially Received -- Fully Received +- Nothing Received +- Partially Received +- Fully Received **Table of contents** @@ -49,8 +49,9 @@ Usage If you are part of the *Purchase Manager* group, you can force a confirmed purchase order to **Full Received** status: you should first -*lock* the order, then check the field **Force Received** located in the -*Other Information* tab. +*lock* the order (to enable locking, ensure the 'Locked' setting is +checked in the Purchase configuration), then check the field **Force +Received** located in the *Other Information* tab. Bug Tracker =========== @@ -58,7 +59,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -73,8 +74,8 @@ Authors Contributors ------------ -- Alexis de Lattre -- Urvisha Desai +- Alexis de Lattre +- Urvisha Desai Maintainers ----------- @@ -97,6 +98,6 @@ Current `maintainer `__: |maintainer-alexis-via| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_reception_status/__manifest__.py b/purchase_reception_status/__manifest__.py index f62e1c0b5b3..cf30ff8fdb4 100644 --- a/purchase_reception_status/__manifest__.py +++ b/purchase_reception_status/__manifest__.py @@ -4,14 +4,14 @@ { "name": "Purchase Reception Status", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase orders (OCA logic)", "author": "Akretion,Odoo Community Association (OCA)", "maintainers": ["alexis-via"], "website": "https://github.com/OCA/purchase-workflow", - "depends": ["purchase"], + "depends": ["purchase_stock"], "data": ["views/purchase_order.xml"], "installable": True, } diff --git a/purchase_reception_status/models/purchase_order.py b/purchase_reception_status/models/purchase_order.py index 109cee2347d..94173f257dc 100644 --- a/purchase_reception_status/models/purchase_order.py +++ b/purchase_reception_status/models/purchase_order.py @@ -27,13 +27,17 @@ class PurchaseOrder(models.Model): ) @api.depends( - "state", "force_received", "order_line.qty_received", "order_line.product_qty" + "state", + "force_received", + "locked", + "order_line.qty_received", + "order_line.product_qty", ) def _compute_oca_receipt_status(self): - prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") + prec = self.env["decimal.precision"].precision_get("Product Unit") for order in self: status = "pending" - if order.state in ("purchase", "done"): + if order.state == "purchase" or order.locked: if order.force_received: status = "full" elif all( diff --git a/purchase_reception_status/readme/USAGE.md b/purchase_reception_status/readme/USAGE.md index a4bfe4f37c9..c676e7b9532 100644 --- a/purchase_reception_status/readme/USAGE.md +++ b/purchase_reception_status/readme/USAGE.md @@ -1,4 +1,5 @@ If you are part of the *Purchase Manager* group, you can force a confirmed purchase order to **Full Received** status: you should first -*lock* the order, then check the field **Force Received** located in the +*lock* the order (to enable locking, ensure the 'Locked' setting is checked +in the Purchase configuration), then check the field **Force Received** located in the *Other Information* tab. diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 47a6d92feeb..4398b01975d 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -374,7 +374,7 @@

          Purchase Reception Status

          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ffb8b08e10dfeca5608fead37d119b50b8dbbf441adf1e2a9d6af8ceca4122c2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

          +

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

          This module adds a field Receiption Status on purchase orders. On a confirmed purchase order, it can have 3 different values:

            @@ -399,15 +399,16 @@

            Purchase Reception Status

            Usage

            If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you should first -lock the order, then check the field Force Received located in the -Other Information tab.

            +lock the order (to enable locking, ensure the ‘Locked’ setting is +checked in the Purchase configuration), then check the field Force +Received located in the Other Information tab.

            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.

            +feedback.

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

            @@ -436,7 +437,7 @@

            Maintainers

            promote its widespread use.

            Current maintainer:

            alexis-via

            -

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

            +

            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_reception_status/tests/test_purchase_reception_status.py b/purchase_reception_status/tests/test_purchase_reception_status.py index 661c43b5916..bf6f3cb8327 100644 --- a/purchase_reception_status/tests/test_purchase_reception_status.py +++ b/purchase_reception_status/tests/test_purchase_reception_status.py @@ -38,7 +38,7 @@ def test_01_receipt_status_functionality(self): "product_id": self.product_1.id, "name": self.product_1.name, "product_qty": 10.0, - "product_uom": self.product_1.uom_po_id.id, + "product_uom_id": self.product_1.uom_id.id, "price_unit": 100.0, "date_planned": fields.Date.today(), } @@ -47,7 +47,7 @@ def test_01_receipt_status_functionality(self): self.assertEqual(po.receipt_status, "pending") pol.qty_received = 5.0 self.assertEqual(po.receipt_status, "partial") - po.button_done() + po.button_lock() po.force_received = True self.assertEqual(po.receipt_status, "full") @@ -63,7 +63,7 @@ def test_02_receipt_status_draft_state(self): "product_id": self.product_1.id, "name": self.product_1.name, "product_qty": 10.0, - "product_uom": self.product_1.uom_po_id.id, + "product_uom_id": self.product_1.uom_id.id, "price_unit": 100.0, "date_planned": fields.Date.today(), } @@ -82,7 +82,7 @@ def test_03_receipt_status_over_received(self): "product_id": self.product_1.id, "name": self.product_1.name, "product_qty": 10.0, - "product_uom": self.product_1.uom_po_id.id, + "product_uom_id": self.product_1.uom_id.id, "price_unit": 100.0, "date_planned": fields.Date.today(), } diff --git a/purchase_reception_status/views/purchase_order.xml b/purchase_reception_status/views/purchase_order.xml index e0912de6d1f..a0396312b50 100644 --- a/purchase_reception_status/views/purchase_order.xml +++ b/purchase_reception_status/views/purchase_order.xml @@ -11,16 +11,12 @@ - @@ -41,21 +37,6 @@ - - received_status.purchase.order.tree - purchase.order - - - - - - - received_status.purchase.order.search purchase.order @@ -74,7 +55,7 @@ /> - + Date: Fri, 24 Apr 2026 14:35:12 +0000 Subject: [PATCH 187/207] [UPD] Update purchase_reception_status.pot --- .../i18n/purchase_reception_status.pot | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/purchase_reception_status/i18n/purchase_reception_status.pot b/purchase_reception_status/i18n/purchase_reception_status.pot index d26504cfc61..bc4cec9a596 100644 --- a/purchase_reception_status/i18n/purchase_reception_status.pot +++ b/purchase_reception_status/i18n/purchase_reception_status.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,6 +13,11 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__display_name +msgid "Display Name" +msgstr "" + #. module: purchase_reception_status #: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__force_received msgid "Force Received" @@ -24,11 +29,17 @@ msgstr "" msgid "Fully Received" msgstr "" +#. module: purchase_reception_status +#: model:ir.model.fields,field_description:purchase_reception_status.field_purchase_order__id +msgid "ID" +msgstr "" + #. module: purchase_reception_status #: model:ir.model.fields,help:purchase_reception_status.field_purchase_order__force_received msgid "" -"If true, the order is marked forced only when all lines are fully received " -"and at least one line was manually forced." +"If true, the reception status will be forced to Fully Received, even if some" +" lines are not fully received. To be able to modify this field, you must " +"first lock the order." msgstr "" #. module: purchase_reception_status From 4fedfc22126fc730b57418ffb3623d463f5ded6f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 24 Apr 2026 14:38:11 +0000 Subject: [PATCH 188/207] [BOT] post-merge updates --- README.md | 1 + purchase_reception_status/README.rst | 12 ++++++------ .../static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c332d181ad2..0c38bfca3ee 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ addon | version | maintainers | summary [purchase_order_type](purchase_order_type/) | 19.0.1.0.0 | | Purchase Order Type [purchase_order_weight_volume](purchase_order_weight_volume/) | 19.0.1.0.0 | ilyasProgrammer | Display purchase order weight and volume [purchase_partner_incoterm](purchase_partner_incoterm/) | 19.0.1.0.0 | TDu bealdav | Add a an incoterm field for supplier and use it on purchase order +[purchase_reception_status](purchase_reception_status/) | 19.0.1.0.0 | alexis-via | Add reception status on purchase orders (OCA logic) [purchase_request](purchase_request/) | 19.0.1.0.1 | | Use this module to have notification of requirements of materials and/or external services and keep track of such requirements. [purchase_stock_price_unit_sync](purchase_stock_price_unit_sync/) | 19.0.1.0.0 | | Update cost price in stock moves already done [purchase_tag](purchase_tag/) | 19.0.1.0.0 | | Allows to add multiple tags to purchase orders diff --git a/purchase_reception_status/README.rst b/purchase_reception_status/README.rst index afff9b9d7e5..b1dcec1741f 100644 --- a/purchase_reception_status/README.rst +++ b/purchase_reception_status/README.rst @@ -11,7 +11,7 @@ Purchase Reception Status !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ffb8b08e10dfeca5608fead37d119b50b8dbbf441adf1e2a9d6af8ceca4122c2 + !! source digest: sha256:eb110dde3c5c3aae79a419759824c8b09cc66edfd91880ec9c1ec93bed2089f5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -35,9 +35,9 @@ Purchase Reception Status This module adds a field *Receiption Status* on purchase orders. On a confirmed purchase order, it can have 3 different values: -- Nothing Received -- Partially Received -- Fully Received +- Nothing Received +- Partially Received +- Fully Received **Table of contents** @@ -74,8 +74,8 @@ Authors Contributors ------------ -- Alexis de Lattre -- Urvisha Desai +- Alexis de Lattre +- Urvisha Desai Maintainers ----------- diff --git a/purchase_reception_status/static/description/index.html b/purchase_reception_status/static/description/index.html index 4398b01975d..9d5b59b24c9 100644 --- a/purchase_reception_status/static/description/index.html +++ b/purchase_reception_status/static/description/index.html @@ -372,7 +372,7 @@

            Purchase Reception Status

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

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

            This module adds a field Receiption Status on purchase orders. On a diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index f59dd956bc2..cdbfa65d173 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-purchase-workflow" -version = "19.0.20260423.0" +version = "19.0.20260424.0" dependencies = [ "odoo-addon-partner_supplierinfo_smartbutton==19.0.*", "odoo-addon-procurement_purchase_no_grouping==19.0.*", @@ -18,6 +18,7 @@ dependencies = [ "odoo-addon-purchase_order_type==19.0.*", "odoo-addon-purchase_order_weight_volume==19.0.*", "odoo-addon-purchase_partner_incoterm==19.0.*", + "odoo-addon-purchase_reception_status==19.0.*", "odoo-addon-purchase_request==19.0.*", "odoo-addon-purchase_stock_price_unit_sync==19.0.*", "odoo-addon-purchase_tag==19.0.*", From 6654f07ecf6923a2c7f0f7ab4cfd668cb1112e69 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Mon, 14 Jul 2025 16:28:01 +0200 Subject: [PATCH 189/207] [IMP] purchase_order_line_menu: apply purchase and done filter by default --- purchase_invoice_status_line/readme/DESCRIPTION.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 purchase_invoice_status_line/readme/DESCRIPTION.rst diff --git a/purchase_invoice_status_line/readme/DESCRIPTION.rst b/purchase_invoice_status_line/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..e69de29bb2d From 60fb702b2c1ed5bb042055fa8c15dfe31c7c5a7e Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Thu, 10 Jul 2025 15:45:11 +0200 Subject: [PATCH 190/207] [ADD] purchase_invoice_status_line --- purchase_invoice_status_line/README.rst | 91 ++++ purchase_invoice_status_line/__init__.py | 1 + purchase_invoice_status_line/__manifest__.py | 21 + .../models/__init__.py | 2 + .../models/purchase_order.py | 61 +++ .../models/purchase_order_line.py | 53 +++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + purchase_invoice_status_line/readme/USAGE.rst | 3 + .../static/description/index.html | 428 ++++++++++++++++++ .../tests/__init__.py | 1 + .../test_purchase_invoice_status_line.py | 95 ++++ .../views/purchase_order_line_views.xml | 14 + 13 files changed, 772 insertions(+) create mode 100644 purchase_invoice_status_line/README.rst create mode 100644 purchase_invoice_status_line/__init__.py create mode 100644 purchase_invoice_status_line/__manifest__.py create mode 100644 purchase_invoice_status_line/models/__init__.py create mode 100644 purchase_invoice_status_line/models/purchase_order.py create mode 100644 purchase_invoice_status_line/models/purchase_order_line.py create mode 100644 purchase_invoice_status_line/readme/CONTRIBUTORS.rst create mode 100644 purchase_invoice_status_line/readme/USAGE.rst create mode 100644 purchase_invoice_status_line/static/description/index.html create mode 100644 purchase_invoice_status_line/tests/__init__.py create mode 100644 purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py create mode 100644 purchase_invoice_status_line/views/purchase_order_line_views.xml diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst new file mode 100644 index 00000000000..8ece2a2ca9a --- /dev/null +++ b/purchase_invoice_status_line/README.rst @@ -0,0 +1,91 @@ +============================ +Purchase Invoice Status Line +============================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ab5366cd79f6f05a64f3b9ef01996ebd0b314358aabf63b6c4c8ed8fbcaf9f52 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/15.0/purchase_invoice_status_line + :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-15-0/purchase-workflow-15-0-purchase_invoice_status_line + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the invoice status on the purchase order lines. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +In the lines, you will see the 'Invoice Status' field and you can force invoice. + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Joan Sisquella (JoanSForgeFlow) + +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. + +.. |maintainer-JoanSForgeFlow| image:: https://github.com/JoanSForgeFlow.png?size=40px + :target: https://github.com/JoanSForgeFlow + :alt: JoanSForgeFlow + +Current `maintainer `__: + +|maintainer-JoanSForgeFlow| + +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_invoice_status_line/__init__.py b/purchase_invoice_status_line/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/purchase_invoice_status_line/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py new file mode 100644 index 00000000000..6bccac8da09 --- /dev/null +++ b/purchase_invoice_status_line/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2025 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Purchase Invoice Status Line", + "version": "15.0.1.0.0", + "category": "Purchases", + "license": "AGPL-3", + "summary": "Add invoice status on purchase order lines", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "maintainers": ["JoanSForgeFlow"], + "website": "https://github.com/OCA/purchase-workflow", + "depends": [ + "purchase_force_invoiced", + "purchase_order_line_menu", + ], + "data": [ + "views/purchase_order_line_views.xml", + ], + "installable": True, +} diff --git a/purchase_invoice_status_line/models/__init__.py b/purchase_invoice_status_line/models/__init__.py new file mode 100644 index 00000000000..677dbb3b247 --- /dev/null +++ b/purchase_invoice_status_line/models/__init__.py @@ -0,0 +1,2 @@ +from . import purchase_order +from . import purchase_order_line diff --git a/purchase_invoice_status_line/models/purchase_order.py b/purchase_invoice_status_line/models/purchase_order.py new file mode 100644 index 00000000000..ca512956e64 --- /dev/null +++ b/purchase_invoice_status_line/models/purchase_order.py @@ -0,0 +1,61 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + force_invoiced = fields.Boolean( + compute="_compute_force_invoiced", + inverse="_inverse_force_invoiced", + store=True, + tracking=True, + help="If true, the order is marked forced only when all lines are fully invoiced" + " and at least one line was manually forced.", + ) + + @api.depends("order_line.invoice_status", "force_invoiced") + def _get_invoiced(self): + super(PurchaseOrder, self)._get_invoiced() + for order in self: + if not order.order_line: + order.invoice_status = "no" + continue + if order.force_invoiced: + order.invoice_status = "invoiced" + continue + if any(line.invoice_status == "to invoice" for line in order.order_line): + order.invoice_status = "to invoice" + elif all( + line.invoice_status == "invoiced" + for line in order.order_line.filtered( + lambda line: not line.display_type + ) + ): + order.invoice_status = "invoiced" + else: + order.invoice_status = "no" + return True + + @api.depends("order_line.invoice_status", "order_line.force_invoiced") + def _compute_force_invoiced(self): + for po in self: + all_invoiced = all( + line.invoice_status == "invoiced" for line in po.order_line + ) + any_forced = any(line.force_invoiced for line in po.order_line) + po.force_invoiced = all_invoiced and any_forced + + def _inverse_force_invoiced(self): + for po in self: + if po.force_invoiced: + to_force = po.order_line.filtered( + lambda l: l.invoice_status != "invoiced" + ) + to_force.write({"force_invoiced": True}) + else: + forced_lines = po.order_line.filtered(lambda l: l.force_invoiced) + forced_lines.write({"force_invoiced": False}) + forced_lines._compute_invoice_status() diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py new file mode 100644 index 00000000000..6b1850aa8c8 --- /dev/null +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -0,0 +1,53 @@ +# Copyright 2024 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import float_is_zero + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + invoice_status = fields.Selection( + selection=[ + ("no", "Nothing to Invoice"), + ("to invoice", "To Invoice"), + ("invoiced", "Fully Invoiced"), + ], + compute="_compute_invoice_status", + store=True, + related=False, + ) + + force_invoiced = fields.Boolean( + readonly=False, + states={"draft": [("readonly", True)]}, + store=True, + copy=False, + help="If true, the invoice status will be forced to Fully Invoiced, " + "even if some quantities are not fully invoiced. ", + tracking=True, + ) + + @api.depends("qty_invoiced", "product_qty", "force_invoiced") + def _compute_invoice_status(self): + precision = self.env["decimal.precision"].precision_get( + "Product Unit of Measure" + ) + for line in self: + if line.order_id.state not in ["purchase", "done"]: + line.invoice_status = "no" + continue + if line.display_type: + line.invoice_status = False + continue + if line.force_invoiced: + line.invoice_status = "invoiced" + continue + if float_is_zero(line.qty_to_invoice, precision_digits=precision): + if line.qty_invoiced >= line.product_qty: + line.invoice_status = "invoiced" + else: + line.invoice_status = "no" + else: + line.invoice_status = "to invoice" diff --git a/purchase_invoice_status_line/readme/CONTRIBUTORS.rst b/purchase_invoice_status_line/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..b5ae5f1b4a7 --- /dev/null +++ b/purchase_invoice_status_line/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Joan Sisquella (JoanSForgeFlow) diff --git a/purchase_invoice_status_line/readme/DESCRIPTION.rst b/purchase_invoice_status_line/readme/DESCRIPTION.rst index e69de29bb2d..36dc15095da 100644 --- a/purchase_invoice_status_line/readme/DESCRIPTION.rst +++ b/purchase_invoice_status_line/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds the invoice status on the purchase order lines. diff --git a/purchase_invoice_status_line/readme/USAGE.rst b/purchase_invoice_status_line/readme/USAGE.rst new file mode 100644 index 00000000000..c412c6e55cc --- /dev/null +++ b/purchase_invoice_status_line/readme/USAGE.rst @@ -0,0 +1,3 @@ +To use this module, you need to: + +In the lines, you will see the 'Invoice Status' field and you can force invoice. diff --git a/purchase_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html new file mode 100644 index 00000000000..94603ca087c --- /dev/null +++ b/purchase_invoice_status_line/static/description/index.html @@ -0,0 +1,428 @@ + + + + + +Purchase Invoice Status Line + + + +

            +

            Purchase Invoice Status Line

            + + +

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

            +

            This module adds the invoice status on the purchase order lines.

            +

            Table of contents

            + +
            +

            Usage

            +

            To use this module, you need to:

            +

            In the lines, you will see the ‘Invoice Status’ field and you can force invoice.

            +
            +
            +

            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

            +
              +
            • ForgeFlow
            • +
            +
            +
            +

            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.

            +

            Current maintainer:

            +

            JoanSForgeFlow

            +

            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_invoice_status_line/tests/__init__.py b/purchase_invoice_status_line/tests/__init__.py new file mode 100644 index 00000000000..4044c3b6290 --- /dev/null +++ b/purchase_invoice_status_line/tests/__init__.py @@ -0,0 +1 @@ +from . import test_purchase_invoice_status_line diff --git a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py new file mode 100644 index 00000000000..25e56708fc4 --- /dev/null +++ b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py @@ -0,0 +1,95 @@ +# Copyright 2025 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests import common + + +class TestPurchaseInvoiceStatusLine(common.TransactionCase): + def setUp(self): + super().setUp() + self.partner = self.env.ref("base.res_partner_12") + self.product_order = self.env.ref("product.product_product_4") + self.product_received = self.env.ref("product.product_product_6") + self.product_order.write({"purchase_method": "purchase"}) + self.product_received.write({"purchase_method": "receive"}) + + def _create_purchase_order(self, product, qty): + """Helper to create and confirm a PO for a given product and qty.""" + po_vals = { + "partner_id": self.partner.id, + "order_line": [ + ( + 0, + 0, + { + "name": product.name, + "product_id": product.id, + "product_qty": qty, + "price_unit": 10.0, + }, + ) + ], + } + po = self.env["purchase.order"].create(po_vals) + po.button_confirm() + return po + + def test_force_invoice_logic(self): + po = self.env["purchase.order"].create( + { + "partner_id": self.partner.id, + "order_line": [ + ( + 0, + 0, + { + "product_id": self.product_order.id, + "product_qty": 10, + "price_unit": 10.0, + }, + ), + ( + 0, + 0, + { + "product_id": self.product_order.id, + "product_qty": 5, + "price_unit": 20.0, + }, + ), + ], + } + ) + po.button_confirm() + line1 = po.order_line[0] + line2 = po.order_line[1] + self.assertEqual(line1.invoice_status, "to invoice") + self.assertEqual(line2.invoice_status, "to invoice") + self.assertFalse(po.force_invoiced, "PO should not be forced initially") + line1.force_invoiced = True + self.assertEqual( + line1.invoice_status, "invoiced", "L1 status should be invoiced" + ) + self.assertFalse(po.force_invoiced, "PO not forced if only one line is done") + line2.force_invoiced = True + self.assertEqual( + line2.invoice_status, "invoiced", "L2 status should be invoiced" + ) + self.assertTrue( + po.force_invoiced, "PO should be forced when all lines are invoiced" + ) + line1.force_invoiced = False + self.assertEqual(line1.invoice_status, "to invoice", "L1 status should revert") + self.assertFalse( + po.force_invoiced, "PO should be un-forced if one line reverts" + ) + po.force_invoiced = True + self.assertTrue(line1.force_invoiced, "L1 should be forced by PO") + self.assertTrue(line2.force_invoiced, "L2 should be forced by PO") + self.assertEqual(line1.invoice_status, "invoiced") + self.assertEqual(line2.invoice_status, "invoiced") + po.force_invoiced = False + self.assertFalse(line1.force_invoiced, "L1 should be un-forced by PO") + self.assertFalse(line2.force_invoiced, "L2 should be un-forced by PO") + self.assertEqual(line1.invoice_status, "to invoice") + self.assertEqual(line2.invoice_status, "to invoice") diff --git a/purchase_invoice_status_line/views/purchase_order_line_views.xml b/purchase_invoice_status_line/views/purchase_order_line_views.xml new file mode 100644 index 00000000000..173ed4f95c2 --- /dev/null +++ b/purchase_invoice_status_line/views/purchase_order_line_views.xml @@ -0,0 +1,14 @@ + + + + purchase.order.line.tree.invoice.status + purchase.order.line + + + + + + + + + From 897aecb9319227cb014054c749f8f11d184145ef Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Tue, 15 Jul 2025 12:22:26 +0200 Subject: [PATCH 191/207] [UPD] purchase_invoice_status_line: hook post install --- purchase_invoice_status_line/__init__.py | 1 + purchase_invoice_status_line/__manifest__.py | 1 + purchase_invoice_status_line/hooks.py | 18 ++++++++++++++++++ .../models/purchase_order_line.py | 7 ++++--- .../views/purchase_order_line_views.xml | 18 +++++++++++++++++- 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 purchase_invoice_status_line/hooks.py diff --git a/purchase_invoice_status_line/__init__.py b/purchase_invoice_status_line/__init__.py index 0650744f6bc..cc6b6354ad8 100644 --- a/purchase_invoice_status_line/__init__.py +++ b/purchase_invoice_status_line/__init__.py @@ -1 +1,2 @@ from . import models +from .hooks import post_init_hook diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index 6bccac8da09..77e0a471887 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -14,6 +14,7 @@ "purchase_force_invoiced", "purchase_order_line_menu", ], + "post_init_hook": "post_init_hook", "data": [ "views/purchase_order_line_views.xml", ], diff --git a/purchase_invoice_status_line/hooks.py b/purchase_invoice_status_line/hooks.py new file mode 100644 index 00000000000..38f1c094b18 --- /dev/null +++ b/purchase_invoice_status_line/hooks.py @@ -0,0 +1,18 @@ +"""Post initialization hooks for purchase_invoice_status_line module.""" + +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + lines_to_update = env["purchase.order.line"].search( + [ + ("force_invoiced", "=", False), + ("order_id.force_invoiced", "=", True), + ] + ) + if lines_to_update: + lines_to_update.write({"force_invoiced": True}) + all_lines = env["purchase.order.line"].search([]) + for line in all_lines: + line._compute_invoice_status() diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py index 6b1850aa8c8..3ae5182dc3d 100644 --- a/purchase_invoice_status_line/models/purchase_order_line.py +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -10,13 +10,14 @@ class PurchaseOrderLine(models.Model): invoice_status = fields.Selection( selection=[ - ("no", "Nothing to Invoice"), - ("to invoice", "To Invoice"), - ("invoiced", "Fully Invoiced"), + ("no", "Nothing to Bill"), + ("to invoice", "Waiting Bills"), + ("invoiced", "Fully Billed"), ], compute="_compute_invoice_status", store=True, related=False, + string="Billing Status", ) force_invoiced = fields.Boolean( diff --git a/purchase_invoice_status_line/views/purchase_order_line_views.xml b/purchase_invoice_status_line/views/purchase_order_line_views.xml index 173ed4f95c2..5c1f474bd43 100644 --- a/purchase_invoice_status_line/views/purchase_order_line_views.xml +++ b/purchase_invoice_status_line/views/purchase_order_line_views.xml @@ -1,6 +1,6 @@ - + purchase.order.line.tree.invoice.status purchase.order.line @@ -11,4 +11,20 @@
            + + purchase.order.line.tree.invoice.status + purchase.order.line + + + + 1 + + + From fac4b4044d7cec44d7e07a55900bd88bcfcf4ffd Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 8 Sep 2025 09:21:25 +0000 Subject: [PATCH 192/207] [UPD] Update purchase_invoice_status_line.pot --- .../i18n/purchase_invoice_status_line.pot | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot diff --git a/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot b/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot new file mode 100644 index 00000000000..ef6e727fa3f --- /dev/null +++ b/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot @@ -0,0 +1,64 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_invoice_status_line +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.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_invoice_status_line +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__invoice_status +msgid "Billing Status" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order__force_invoiced +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__force_invoiced +msgid "Force Invoiced" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__invoiced +msgid "Fully Billed" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order_line__force_invoiced +msgid "" +"If true, the invoice status will be forced to Fully Invoiced, even if some " +"quantities are not fully invoiced. " +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order__force_invoiced +msgid "" +"If true, the order is marked forced only when all lines are fully invoiced " +"and at least one line was manually forced." +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__no +msgid "Nothing to Bill" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model,name:purchase_invoice_status_line.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model,name:purchase_invoice_status_line.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__to_invoice +msgid "Waiting Bills" +msgstr "" From 44cb4263b97023c9fe84f227f6980ab5300db25d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 8 Sep 2025 09:29:35 +0000 Subject: [PATCH 193/207] [BOT] post-merge updates --- purchase_invoice_status_line/README.rst | 8 +++- .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 39 +++++++++++------- 3 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 purchase_invoice_status_line/static/description/icon.png diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index 8ece2a2ca9a..1d5372c4e0a 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============================ Purchase Invoice Status Line ============================ @@ -7,13 +11,13 @@ Purchase Invoice Status Line !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ab5366cd79f6f05a64f3b9ef01996ebd0b314358aabf63b6c4c8ed8fbcaf9f52 + !! source digest: sha256:3bc367787eeccd0a3d9f8bae4a44b19e3bf6d1003771801fc15480bebde2eb32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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 diff --git a/purchase_invoice_status_line/static/description/icon.png b/purchase_invoice_status_line/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 zcmbt)WmufcvhH9Zc!C8B?l8#UE&&o;gF7=g3=D(IAOS+K1lK^25Zv7%L4sRw_uvvF z*qyAk?>c**=lnR&y+1yw{;I3Hy6Ua2{<d0kcR+VvBo; zA_X`>;1;xAPL9rQqFxd#f5{a^zW*uaW+r3+U{|fRunu`GZhy$X z8_|Zi{zd#vIokczl8Xh*4Wi@i0+C?Rg1AB5VOEg8B>buLFCi~r5DPd2ED7QP2>^LO zKpr7+?*I1bPaFSLLEa0l2$tj*;u8Qtc=&(RUc*VK@ zjIN{I--GfO@vl+&r^eqy_BZ3dndN_PDzMc*W^!?dIsWAWU@LBjBg6^f4F6*!-hUYh zY$Xb}gF8b0%S1Ac@c%Rs()UCiEu3v6SiFE>h_!{gBb-H2{e=wB5o!YkT0>#LKZFw$ z?CuD0Gvfsb(|XbVxx0AL0%`gG2X+6|f;jiTHU9shtjoW-{2!| zMN*WuOj6elhD4zqgjNpX>F#JP{)hAbenX<+FPr>7jXM&q{|x+pbj8cU<=>Ej zWE1_%qoFVzDAZB%g@v<+1ud%<#2E~ML11jOV5pUZoXktGmzB38%te^i-3o9i$lge>z>tBcK|P2K0H9w{l#|i%$~egM)Ys{q>p<9yaE*%v2cy1wXE{AXqG1_b znfyg@Fq*e@yC)^(@$R*j^E;skyEM6pmL$1ctg*mWiWM&q1{nj>E^)Odw$RPr zhjesSk}k}@-e_%uZTy0t_*TJD&6%*HV0KH>xE@oBex6CL@`Ty3nH_2OF#M?6j(j|9 znRKGSfp3Q2i+|>}w?>8g$>r`|OcvG5r;p)z8DO8+O>EvYQ=_~`p}9!ReUEjUnNL@6 z+C*aoo67(sd|7QgW54@V9Y8PnBW$Q+7ZsRFA}Vj*viA!yWUfb!s*yJi6JKsXZCH4j z*B%nJpad-DDvJ8d>xrxkkh6A}i7V3nULqHCiG~|)YY6{NE3M}c^s#PQhzhsJUf^QW zR+F;up-dN*!)M1ZYl@d0HoqfVD2PNiQcPdzq4NDKO!8mUl{!t*ntBg_+-+lRlI0~Lr>5v!PiQj|hD7B-YFIs~6hIY*R6USZA zlb}=UxqxpSzIsL3pPmiuixCN|3LFBd?0Ih8Y6GWQ;U>dkdXtQaQ&8H|TGAQbuHY=F z_R83&B{1_hP7L#$^eAe?GPB_83y#HZKTwD>e-@E2P>Gk$BBb9|Ivfmdp za~s>3=aj(;xmz8n)sI}uFO$|C>0CZbcTY$Bq6~L-Bc9=vl@X#0S~Q@j8iKzuPeQE_ zQSI)wNz~CvJ>!%QszoCfUm9}h^DL!WYAN|FtMO#kpDXq74sYC87(uvv*jiCjV?Ta& zgO1D0OP3TEN3YnBpD6GnmsEolzEbGM{&VlTz_)J(o{nl0+TmNt{xL%L6G&UR$^aYC zQOA#W7R%9JsC5oTZJE>_?!Ci}mNH{0ObyUd%Q!k%5J8Z`8sR!m`~|Taje`(bLD7=a z-{-=d7w;k@DIrgU{I@K}eN`>S**Lg<@ChAf$M(&kV9TLUixqFQ>YoYHrI!K#R6`S> z%?d5hQ@&;Gje<|uRQZb%Hhibocl9(buI?=0aZW{JYXx?ZS@Lr%G8L<d+riEi2~+{HfHK{K^VrGYNi{2-WJOiC>Pz?f*)cxKCl>1H1=$jb!^ zpmYw>eoiM0Hy7$xbbX_e5o*+{7T2&-t%-h4i7MMo;k|tSqQAeNkwHS9hWY#EV7r3| zTmOmN{;b9OUZpp`LP(I9Wo%R#$b6YdH7GD4*p6>a2N2A04pQ*n;INQMh%+mj;x7>S z_(H?uJ^n!r1)kJH1*s+%$al#?C^Cw{H@RA^QGB=Dubyc)XUaY>f`(VKTlIO-YNCp{1n zOl*>jT?Dtf5fD$DY-j&B*Xmn|2-u2OB zBL@-lFs5lhcQKXBR*cIXmi%~EJcc^5#Xpg!E^A6sXf1#$qJGRpmU~A zcdj-cvBfx(fIRAMU(1obztJR%I7v3R-%$#~r!0sS^I(iC*5i6296*88A7I=_JhU3p zya!aCti0R5*RFT%LW0R|;u&oJ6=P-c$le4J0bi}u!!@;xzao|l6fJ{;Mld9hGhrJg zr_B)=4yktp)yPB@tCC_L9h1>GzXD6DA!W7xt{1)8!07~gONkEWC8@y%lciB{9ojy) zWm$drJ_9uVJ>Q$-`@q%OM7_S>(K=__CGYB~@@mE^Z=eT|x0Rv?Z-N)LLWR zod*Zy3v)iMX@usPX-OKBDgC8yq?fMhqf8H)A&C)Hi29YFn!NVf5!J0-F{wC&L5-3`#id=4?=2>Zp6Pdu4N6#bG&atu7 z8IET&ciXy_Tp4YjMx3yIAbw#_e2#jgGJ~ogkv-|M7|%Gio%2@mnS89NKUOM#Bzg4_ z9e9oN;^m>G*#?)AawODi6YckRPmkSKD_4b4WFpj|@|eS!B0WN@?QscYzTH`~6e%iz z!z1>ps)CG37%(E=kZ_>re)@ODv^0^=rWU^*m;6M&gD10EYImO98JVabRe5{#wrogYUKPB@_(#e7Ej9_x;n1oHDj5GawU)A&1hWj|HzJB(q{vMTX>jOW;Jz zBsW&SqTaR7!NXXg_A}$XnFpg_n)Zi;{e9eb*k|b(y$a}12boJ7rqQXQpVhU8HxHTl zt8Ln!KLFyfq!%}hdMXle^qajw2g6S{z&7tQ6J(w9 z3+!HTO{_TqM{9o$RR~lKFf4b4(xLUP?QG;McNFQc_Yd_mig9Ejy9%q~Ye>rIn3};U z)w&1@QCK;cC(;x0G&YuSad+>{c@ZsFJcUdcs@PP-x{mrO)|6_#CjMlXsMJx;Cr?FF zVFrlt@$Z-Ll^*7d0#`5Uez@bb{Xn(BQLhScBhF!6+aIso0=l{PP7P(6-ru>nVy%AP z+|eZpY(ooMU7rtG$l#14v=Z?@ebOjm(A2)5k_${|wAA$oq+;42wiS78ezjgWWnTrF z`1!i2h{fM91aD8uxz?tZpE(PsL37e3$*I6%un5Bzzpn10p`j72R;3=Oaug_|Z(y)@ z9$SJN@-5d1tNIy0=7|d&_HAnDx!yDd-u#qmfuDh)0a_CVje{hvQz9rDFHJTpQ0Dg@ zGQ3t*gZlcFSXfx%OG@Cds&NDROxd^osY_)abmo^dKMUY!R~kGH%*;rutPF@Mx$zrv z6Q1soKnYYRW#;Bi-!H)>Br0<`y+Wy~p7_<>{ljuG`Dpje=v1x}-ND<)bWBr|<}v6B zkDTUZ^@VsH>CyR}ml4j2rB{}0q8eGwX>ExkI9yZN0)(P}$N(yi$AxmBY#Xj`(7zs{ zJbn2&jE`-*0lww_r;|fNaWm_xp;c9JHIv|RExZGKP%18qjgYa);`N-^VqXNVz{~)~ z?^&D;ouy!pKPy?%@xH`A zSR z7x%N3@o&{YEjfa|1;*eW_4TU{ zt;qCcY3Hj(<0DJuny*QL!y!StcG{>bhpUP%eVMq=1xcR>yZT8X9)1;rXOmQjPcANs zr>&Qb{rr66;s|4v3iGmQlMjr9j;G6pqNs%;TsyVNd3{i~hpDX8ugdcnd&UQJzj)rH zh>S6#n`cCJ9CwHv<2Ht$o`R5(h#r||VB?%J?s5W48;^o)b`Pi1^~}5{Y19lg{&W@LfHt*gc1`w$RfLrK{~H?A1$5 z;5v?AIhpN%gQsR6+Act9-3y z8>jCTMnWQq-^s3#Lb|WalgB$k3F>}lyCxs<2&A;LS0}s#<|hPx9kM#B+Lu2DiD_3P zelg;N!80(j@HNc2pXs}re%sHi+{aqBt~qUOy86?zN>7)yiCEJqy@2Gh#gzJE6j6Rx zBQK{77zW?gLWtQ20Dzntu16k9^N>DQ@Nmbx*mOg=F=k)8VJfM%y(Xu41;8YCz+@K| z9u7vhlT`BOnk_oMTeC;u@OhhoTeA`^34^iMihCLM_uVD>rI-9@4l7ocZl@DJ8FWZU zB0lRBIqkHj4#pE&mD(X!e!~;G$`7f47k* zOznM2@`&KM(|f5}sz)z%2}yJ5YmMj5Zwzr-W?v3R&@KuJ+l0zo==N@)nsbMHqHV}w z7#_ntMGCNM21RuH^SYG+RH0sHUsF2z7ams57@2xbPj0y5)8h+caqv@P^q!do+}>+X zzUBx|mikTawzXWYzJ4(AqAJpBF4ObmD_@gyg->oFGB6`k(8+?rFRV5P1yDkFM=8(c z%RI)iG(rKtq-^V%B_(R9;tk6WIzA?x@cESTXg zWYDBxkoNB5v6J8BP&n@HVtBNb@r+XYpjgub zR4oE*$ffXJuh2g8TCaLnpNoSxJ~Jx@ayx9z5Osa)=AI#bg^5eQb<6gpR%c+Qs#N*e z@XE4pAmjdI#0%pV7sIN>mNa^jTkd=<==2_#t-}9Ju&Z^|Lp$%B92@eN%=MRc)LK$% z@!XAg;dQ8bt=@ZNey7+a(dy^o;QKGP@Rb5NJYQRrGEC{J=FB(Irw-MAfoP(9RK;)&jlxSCT=W;ODCf($WqRFhqN#LR^qVhK zWhEp4`{Nnk;n0FHj}eNCZpRM`Y-@MIM&pvr7zQOZ3Ik5;CmZbR99b&22(!-07YNF) z$o0MKej-jnvQV39{TH4r2R5univa1{ASc|VOTi4c@`t2FId|xkh5typ-rdU;1j){adk@*+( zkHj{5B~eSy&HrPOOvl_FJ98)0V;^d`0-u0FTslgiLBQVGSTiSyu zgMGAu&R}SbNa-DgKJb?;fe3Qys$?=;5?V`eRiq*Kj$I`}Z*x4rC~eNM=DsOq(=nUW>(+7o@O8K-_U(X? zTyg032nXKax5W~SF5|eBj%r8Fa>i!ejC72*sd}zJ)t7Xy!gFvM`c4@*Iw>z$u)j_l zR-Uqxymg}>Ti>i%9j*4kwfC33i~kyIQ``n)r(L z!|H2*)Mwj4dk%e*L0tgFdW185>j4<7YwLXwcOsed`%6mS{+=&d@d!B}GkbDV*0 zNIWzW^|trz!&;qeI&mPiVDOUL70xpqVv0fpN9tjpu)@1LD9D<9}9{57j9!W$`zC6&i zl9lKkmPh`x)5+h>>JtiRNNBW5$_)%-)#+SVSGsjX2T=+SRX05>yJZd`1hyk<@{%1+ zDu^k>J$d*Qz6BZMwHx!@O**^Tx&fsHDw%$@J0nfj^je^Ihy*aIx{B(hkBvSvh46Z9 zRO)BjjXL_IHXKo~$4es=8Wxk;Y+&nVBCXA;=MVuLgVn8Mk(*y^+kP3f?Pr~4^A}hXj9UHS}qeI%XKD3KhHnkrNH0(Y20BWl&!Kfm`EVh2;i5C zpirU^K0nc2-I{cqvjZKVx z=&hH#-d=gDWjVE}cMNAPJf;#NYdQ=h`twjX6yquXuCNgGx1~uk{YHAmFpQF`ZLGC=~ukEyj?cFDI zH=@XvV#AY1EY4qb`y*;Ki>KuFB|2|toL7__Cr0S1Dl{s#y0=~7HSq~&7lpBc*VLua zvv3r&-LM*{hq%IYP7<@)dG-G$kMrZaqs(MYoZ zugEeJ@u(ip9rMoVtoFe;dF`^Br5x7v!rr5`hb5mJ#ocGqXHnm9m`yILjd0>UQSMv) z^v}l5^bM6RZ6M%{mkI) zHOoSp&dX)*xUt+kXscna#a`XxI;Ul2Sxa^i5sZc=(Q)oA^2-_;!pfYHAul+oA@Ilelm;rw@FYR+SIaWS?;_ zUdw<|qqaYq(nqu>rG48E9dYAoT6GH;QRuBYK1}W#C_Z_?7~k*pJ3?MzVt&rhZTsBy zw?nN$_Z>kimtwWcy`0?G#!)&7GjOcxCQps@p&ml8>~z(t=sjhR$6aFh!Vw5GA(lTh z5GM)jCwloa6a}7mdfqNYE7oi`Jv$m5>5qR%9eZ=)=a z+K4j5NpcDHHdepCS+P*{@o=yNp&TE(Sd4b0Notqso-Kt_mhDk1<-fa>T4KdY2N`U) zxu41vD%T&k$Gl?CW81%7r#-o1TZ0&PCcy}L4TPiV;sz`|S!&w8-s$rLdM zF&)>@`7=)65PWn#oi|8tXNb|((2ojf9d0fNZ^l7xY~dX~%*Xf-v2W-2n$i~s!4?H; z2qbQscFN21tqB{|x1+(^G~xQSrvX&Y;V-%?b1}zjBQX{GOFcVYTcwm>>}>6^HA=$x zn+z^Biv_5}0!#@7z1~YXJFCT2?D^jm+kH7jAqBo?M@ZdMl|2|66oLnSJXUOJtVLxe z0vH)N^t*qrjq=eFRMV>BFEfS)-2RzKlt973;d3D}4edwIE>kGc5-o=JV56ird)RlS z{Jg@0t-b#Ife80%!E~(7`qkZ8O~Q-8_{j7G&tqwX&&>^tm-#*{v7j-f1n0}mCR#7P z-4FkajD2$9?4Fc7-C_|0Z_G^bxIs%tWk|aFgSQ(qkM+5PRh=g&ZeAZg35$-kn~}_;~&fP-dCNCzg>{gyW!~LZpn?aZ~Va3~H0Ta)z z<4XPVk@;#%1S@fq<(2#8T04#8$mz>vM;(jek0>Qh!K%t5*4tU(fVYwD3Ri~=D!AmI zV$Dt#TEDX7{lpW%tF&DOlTO)vZodn_%wYu~)ZQ}Qo^cBbDHd{YajkzNxttQW>ST<^ z2~^xhB_y1sjIF5;xchvCn{QVugIE2eYZDZ!-Y-4lJdb34*k({@M zJ5!9Di^||~(IZ4iOoAbtggao+CaYvJynmB^;4r-tY2gS_*P!?U?hlEX;l+^*{%B2n z)|1j9wOHQQ^5Xha>{Cu8_w^8=#6;Dz7kU~RgTqn;ynDm6{xdlkf2vk0UK^oS3yVy4 zE+v&qnlYtPHBk#X&2}r7`@K`J@^e~Qm?iRJ*tbAaZDZTmB&mWMkZp7Kj7^kth#_uX z5z>gC(8Xz|Ie(+#&wiF3;Aey|Db(R*-U)!6;l_5@u?-$>j0SgEl5+c}Lfe-$p-dFH zB_$bC<)x6#A_2Uuo8=^l1@}vK!gvbF#b&MoH8ac3xMxUz$LFb8KU(x$YhtHanM_sw zYOFMBX2iNNSe&a}!;G9nv(tsW4@%3iQcqczOCF*JOBQ@4Orw=o?_vc(9$hfO`>U6& zyY_CUa9pASiJpmv`@oR!k;&$`h8!)$uS=}d-fPddfIdMDUW@%3y1LI(1Q=e$)sz(QC*E;Nfl99YTgk+|@jl`+iF?<_D?4YqV0Zl)lO8YWC@1ZWW^mi{5ePQN<~FQ2NMG$|K{py5akJa zkezmqhN)>MGMp$7=sOo2(7ppv``dCIwf&MaQQis7S596kkiw8Do(jO?EY4iJ4Hec6 z4Hymzu`w)cI9Pbq6GPtTP)x&Lmk;FT=ZCB4>(5}c0?;2l`p&?>&<;2(P8a3lOTNP# zdEzF5qDpkRR&PZC&cS{7xD@qV;(g5X%xI?m$9Q -Purchase Invoice Status Line +README.rst -
            -

            Purchase Invoice Status Line

            +
            + + +Odoo Community Association + +
            +

            Purchase Invoice Status Line

            -

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

            +

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

            This module adds the invoice status on the purchase order lines.

            Table of contents

            @@ -384,12 +390,12 @@

            Purchase Invoice Status Line

          -

          Usage

          +

          Usage

          To use this module, you need to:

          In the lines, you will see the ‘Invoice Status’ field and you can force invoice.

          -

          Bug Tracker

          +

          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 @@ -397,23 +403,25 @@

          Bug Tracker

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

          -

          Credits

          +

          Credits

          -

          Authors

          +

          Authors

          • ForgeFlow
          -

          Contributors

          +

          Contributors

          -

          Maintainers

          +

          Maintainers

          This module is maintained by the OCA.

          -Odoo Community Association + +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.

          @@ -424,5 +432,6 @@

          Maintainers

          + From 46813f8f729114b71461ddb20b9144540c7301e4 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Mon, 8 Sep 2025 15:59:26 +0200 Subject: [PATCH 194/207] [IMP] purchase_invoice_status_line: pre-commit stuff --- purchase_invoice_status_line/models/purchase_order.py | 2 +- purchase_invoice_status_line/models/purchase_order_line.py | 2 +- .../tests/test_purchase_invoice_status_line.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_invoice_status_line/models/purchase_order.py b/purchase_invoice_status_line/models/purchase_order.py index ca512956e64..066c76f7dde 100644 --- a/purchase_invoice_status_line/models/purchase_order.py +++ b/purchase_invoice_status_line/models/purchase_order.py @@ -1,4 +1,4 @@ -# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# Copyright 2025 ForgeFlow (http://www.forgeflow.com/) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py index 3ae5182dc3d..260a8f44cac 100644 --- a/purchase_invoice_status_line/models/purchase_order_line.py +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -1,4 +1,4 @@ -# Copyright 2024 Joan Marín +# Copyright 2025 ForgeFlow (http://www.forgeflow.com/) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models diff --git a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py index 25e56708fc4..c4d624c7f4e 100644 --- a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py +++ b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py @@ -1,4 +1,4 @@ -# Copyright 2025 Joan Marín +# Copyright 2025 ForgeFlow (http://www.forgeflow.com/) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.tests import common From 3e2dabafaf21f7f62f534a90ec5488ef8c8b2bb8 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Mon, 8 Sep 2025 16:12:43 +0200 Subject: [PATCH 195/207] [MIG] purchase_invoice_status_line: Migration to 16.0 --- purchase_invoice_status_line/__init__.py | 1 - purchase_invoice_status_line/__manifest__.py | 3 +-- purchase_invoice_status_line/hooks.py | 18 ------------------ .../models/purchase_order_line.py | 1 - 4 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 purchase_invoice_status_line/hooks.py diff --git a/purchase_invoice_status_line/__init__.py b/purchase_invoice_status_line/__init__.py index cc6b6354ad8..0650744f6bc 100644 --- a/purchase_invoice_status_line/__init__.py +++ b/purchase_invoice_status_line/__init__.py @@ -1,2 +1 @@ from . import models -from .hooks import post_init_hook diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index 77e0a471887..a433f4c6533 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Invoice Status Line", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add invoice status on purchase order lines", @@ -14,7 +14,6 @@ "purchase_force_invoiced", "purchase_order_line_menu", ], - "post_init_hook": "post_init_hook", "data": [ "views/purchase_order_line_views.xml", ], diff --git a/purchase_invoice_status_line/hooks.py b/purchase_invoice_status_line/hooks.py deleted file mode 100644 index 38f1c094b18..00000000000 --- a/purchase_invoice_status_line/hooks.py +++ /dev/null @@ -1,18 +0,0 @@ -"""Post initialization hooks for purchase_invoice_status_line module.""" - -from odoo import SUPERUSER_ID, api - - -def post_init_hook(cr, registry): - env = api.Environment(cr, SUPERUSER_ID, {}) - lines_to_update = env["purchase.order.line"].search( - [ - ("force_invoiced", "=", False), - ("order_id.force_invoiced", "=", True), - ] - ) - if lines_to_update: - lines_to_update.write({"force_invoiced": True}) - all_lines = env["purchase.order.line"].search([]) - for line in all_lines: - line._compute_invoice_status() diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py index 260a8f44cac..fc3c761df68 100644 --- a/purchase_invoice_status_line/models/purchase_order_line.py +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -27,7 +27,6 @@ class PurchaseOrderLine(models.Model): copy=False, help="If true, the invoice status will be forced to Fully Invoiced, " "even if some quantities are not fully invoiced. ", - tracking=True, ) @api.depends("qty_invoiced", "product_qty", "force_invoiced") From 9d01d33796fc44bb7dfb9f7d5e264468ac329393 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Fri, 12 Sep 2025 10:28:57 +0200 Subject: [PATCH 196/207] [IMP] purchase_invoice_status_line: pre-commit auto fixes --- purchase_invoice_status_line/README.rst | 27 +++++------- .../models/purchase_order.py | 2 +- purchase_invoice_status_line/pyproject.toml | 3 ++ .../readme/CONTRIBUTORS.md | 1 + .../readme/CONTRIBUTORS.rst | 1 - .../{DESCRIPTION.rst => DESCRIPTION.md} | 0 .../readme/{USAGE.rst => USAGE.md} | 3 +- .../static/description/index.html | 44 ++++++++----------- 8 files changed, 37 insertions(+), 44 deletions(-) create mode 100644 purchase_invoice_status_line/pyproject.toml create mode 100644 purchase_invoice_status_line/readme/CONTRIBUTORS.md delete mode 100644 purchase_invoice_status_line/readme/CONTRIBUTORS.rst rename purchase_invoice_status_line/readme/{DESCRIPTION.rst => DESCRIPTION.md} (100%) rename purchase_invoice_status_line/readme/{USAGE.rst => USAGE.md} (85%) diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index 1d5372c4e0a..aea58cbc896 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ============================ Purchase Invoice Status Line ============================ @@ -17,17 +13,17 @@ Purchase Invoice Status Line .. |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/license-AGPL--3-blue.png +.. |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/15.0/purchase_invoice_status_line + :target: https://github.com/OCA/purchase-workflow/tree/17.0/purchase_invoice_status_line :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-15-0/purchase-workflow-15-0-purchase_invoice_status_line + :target: https://translation.odoo-community.org/projects/purchase-workflow-17-0/purchase-workflow-17-0-purchase_invoice_status_line :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -44,7 +40,8 @@ Usage To use this module, you need to: -In the lines, you will see the 'Invoice Status' field and you can force invoice. +In the lines, you will see the 'Invoice Status' field and you can force +invoice. Bug Tracker =========== @@ -52,7 +49,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -60,17 +57,17 @@ Credits ======= Authors -~~~~~~~ +------- * ForgeFlow Contributors -~~~~~~~~~~~~ +------------ -* Joan Sisquella (JoanSForgeFlow) +- Joan Sisquella (JoanSForgeFlow) Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -90,6 +87,6 @@ Current `maintainer `__: |maintainer-JoanSForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_invoice_status_line/models/purchase_order.py b/purchase_invoice_status_line/models/purchase_order.py index 066c76f7dde..85ae6835747 100644 --- a/purchase_invoice_status_line/models/purchase_order.py +++ b/purchase_invoice_status_line/models/purchase_order.py @@ -18,7 +18,7 @@ class PurchaseOrder(models.Model): @api.depends("order_line.invoice_status", "force_invoiced") def _get_invoiced(self): - super(PurchaseOrder, self)._get_invoiced() + super()._get_invoiced() for order in self: if not order.order_line: order.invoice_status = "no" diff --git a/purchase_invoice_status_line/pyproject.toml b/purchase_invoice_status_line/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/purchase_invoice_status_line/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/purchase_invoice_status_line/readme/CONTRIBUTORS.md b/purchase_invoice_status_line/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..ea5f5b47a53 --- /dev/null +++ b/purchase_invoice_status_line/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Joan Sisquella \ (JoanSForgeFlow) diff --git a/purchase_invoice_status_line/readme/CONTRIBUTORS.rst b/purchase_invoice_status_line/readme/CONTRIBUTORS.rst deleted file mode 100644 index b5ae5f1b4a7..00000000000 --- a/purchase_invoice_status_line/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1 +0,0 @@ -* Joan Sisquella (JoanSForgeFlow) diff --git a/purchase_invoice_status_line/readme/DESCRIPTION.rst b/purchase_invoice_status_line/readme/DESCRIPTION.md similarity index 100% rename from purchase_invoice_status_line/readme/DESCRIPTION.rst rename to purchase_invoice_status_line/readme/DESCRIPTION.md diff --git a/purchase_invoice_status_line/readme/USAGE.rst b/purchase_invoice_status_line/readme/USAGE.md similarity index 85% rename from purchase_invoice_status_line/readme/USAGE.rst rename to purchase_invoice_status_line/readme/USAGE.md index c412c6e55cc..c41b031431e 100644 --- a/purchase_invoice_status_line/readme/USAGE.rst +++ b/purchase_invoice_status_line/readme/USAGE.md @@ -1,3 +1,4 @@ To use this module, you need to: -In the lines, you will see the 'Invoice Status' field and you can force invoice. +In the lines, you will see the 'Invoice Status' field and you can force +invoice. diff --git a/purchase_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html index 6c521b5d2f7..2b72d4a3c25 100644 --- a/purchase_invoice_status_line/static/description/index.html +++ b/purchase_invoice_status_line/static/description/index.html @@ -3,16 +3,15 @@ -README.rst +Purchase Invoice Status Line -
          +
          +

          Purchase Invoice Status Line

          - - -Odoo Community Association - -
          -

          Purchase Invoice Status Line

          -

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

          +

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

          This module adds the invoice status on the purchase order lines.

          Table of contents

          @@ -390,48 +384,46 @@

          Purchase Invoice Status Line

        -

        Usage

        +

        Usage

        To use this module, you need to:

        -

        In the lines, you will see the ‘Invoice Status’ field and you can force invoice.

        +

        In the lines, you will see the ‘Invoice Status’ field and you can force +invoice.

        -

        Bug Tracker

        +

        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.

        +feedback.

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

        -

        Credits

        +

        Credits

        -

        Authors

        +

        Authors

        • ForgeFlow
        -

        Contributors

        +

        Contributors

        -

        Maintainers

        +

        Maintainers

        This module is maintained by the OCA.

        - -Odoo Community Association - +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.

        Current maintainer:

        JoanSForgeFlow

        -

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

        +

        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.

        - From 214567f98089258deb0f215a313d0b341ebca895 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Fri, 12 Sep 2025 10:50:44 +0200 Subject: [PATCH 197/207] [MIG] purchase_invoice_status_line: Migration to 17.0 --- purchase_invoice_status_line/__manifest__.py | 2 +- purchase_invoice_status_line/models/purchase_order.py | 7 ++++--- .../models/purchase_order_line.py | 2 -- .../views/purchase_order_line_views.xml | 9 ++++++++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index a433f4c6533..3e26fd5d3b6 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Invoice Status Line", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add invoice status on purchase order lines", diff --git a/purchase_invoice_status_line/models/purchase_order.py b/purchase_invoice_status_line/models/purchase_order.py index 85ae6835747..df60fc283ec 100644 --- a/purchase_invoice_status_line/models/purchase_order.py +++ b/purchase_invoice_status_line/models/purchase_order.py @@ -12,7 +12,8 @@ class PurchaseOrder(models.Model): inverse="_inverse_force_invoiced", store=True, tracking=True, - help="If true, the order is marked forced only when all lines are fully invoiced" + help="If true, the order is marked forced only " + "when all lines are fully invoiced" " and at least one line was manually forced.", ) @@ -52,10 +53,10 @@ def _inverse_force_invoiced(self): for po in self: if po.force_invoiced: to_force = po.order_line.filtered( - lambda l: l.invoice_status != "invoiced" + lambda line: line.invoice_status != "invoiced" ) to_force.write({"force_invoiced": True}) else: - forced_lines = po.order_line.filtered(lambda l: l.force_invoiced) + forced_lines = po.order_line.filtered(lambda line: line.force_invoiced) forced_lines.write({"force_invoiced": False}) forced_lines._compute_invoice_status() diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py index fc3c761df68..e129cfd55db 100644 --- a/purchase_invoice_status_line/models/purchase_order_line.py +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -21,8 +21,6 @@ class PurchaseOrderLine(models.Model): ) force_invoiced = fields.Boolean( - readonly=False, - states={"draft": [("readonly", True)]}, store=True, copy=False, help="If true, the invoice status will be forced to Fully Invoiced, " diff --git a/purchase_invoice_status_line/views/purchase_order_line_views.xml b/purchase_invoice_status_line/views/purchase_order_line_views.xml index 5c1f474bd43..52e3594512d 100644 --- a/purchase_invoice_status_line/views/purchase_order_line_views.xml +++ b/purchase_invoice_status_line/views/purchase_order_line_views.xml @@ -6,8 +6,15 @@ + - + From 6f94d5df64a0e267bee7fcb3685aa036e86c00f7 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Fri, 12 Sep 2025 10:58:14 +0200 Subject: [PATCH 198/207] [IMP] purchase_invoice_status_line: pre-commit auto fixes --- purchase_invoice_status_line/README.rst | 10 +++++----- .../static/description/index.html | 6 +++--- .../views/purchase_order_line_views.xml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index aea58cbc896..e8ad3244a40 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -17,13 +17,13 @@ Purchase Invoice Status Line :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/17.0/purchase_invoice_status_line + :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_invoice_status_line :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-17-0/purchase-workflow-17-0-purchase_invoice_status_line + :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_invoice_status_line :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -49,7 +49,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -87,6 +87,6 @@ Current `maintainer `__: |maintainer-JoanSForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html index 2b72d4a3c25..14896f0a3e9 100644 --- a/purchase_invoice_status_line/static/description/index.html +++ b/purchase_invoice_status_line/static/description/index.html @@ -368,7 +368,7 @@

        Purchase Invoice Status Line

        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:3bc367787eeccd0a3d9f8bae4a44b19e3bf6d1003771801fc15480bebde2eb32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

        +

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

        This module adds the invoice status on the purchase order lines.

        Table of contents

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

        +feedback.

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

        @@ -420,7 +420,7 @@

        Maintainers

        promote its widespread use.

        Current maintainer:

        JoanSForgeFlow

        -

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

        +

        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_invoice_status_line/views/purchase_order_line_views.xml b/purchase_invoice_status_line/views/purchase_order_line_views.xml index 52e3594512d..fbd0607308a 100644 --- a/purchase_invoice_status_line/views/purchase_order_line_views.xml +++ b/purchase_invoice_status_line/views/purchase_order_line_views.xml @@ -18,7 +18,7 @@
        - From 0b2ee9173252827c559b5cc7a692623304c67857 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Fri, 12 Sep 2025 11:51:40 +0200 Subject: [PATCH 199/207] [MIG] purchase_invoice_status_line: Migration to 18.0 --- purchase_invoice_status_line/__manifest__.py | 2 +- purchase_invoice_status_line/models/purchase_order.py | 8 ++++++-- .../tests/test_purchase_invoice_status_line.py | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index 3e26fd5d3b6..d20849bece7 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Invoice Status Line", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add invoice status on purchase order lines", diff --git a/purchase_invoice_status_line/models/purchase_order.py b/purchase_invoice_status_line/models/purchase_order.py index df60fc283ec..c5884487b97 100644 --- a/purchase_invoice_status_line/models/purchase_order.py +++ b/purchase_invoice_status_line/models/purchase_order.py @@ -43,10 +43,14 @@ def _get_invoiced(self): @api.depends("order_line.invoice_status", "order_line.force_invoiced") def _compute_force_invoiced(self): for po in self: + po.order_line._compute_invoice_status() + non_display_lines = po.order_line.filtered( + lambda line: not line.display_type + ) all_invoiced = all( - line.invoice_status == "invoiced" for line in po.order_line + line.invoice_status == "invoiced" for line in non_display_lines ) - any_forced = any(line.force_invoiced for line in po.order_line) + any_forced = any(line.force_invoiced for line in non_display_lines) po.force_invoiced = all_invoiced and any_forced def _inverse_force_invoiced(self): diff --git a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py index c4d624c7f4e..ad3eee02771 100644 --- a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py +++ b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py @@ -68,12 +68,12 @@ def test_force_invoice_logic(self): self.assertFalse(po.force_invoiced, "PO should not be forced initially") line1.force_invoiced = True self.assertEqual( - line1.invoice_status, "invoiced", "L1 status should be invoiced" + line1.invoice_status, "invoiced", "L1 status should be invoiced when forced" ) self.assertFalse(po.force_invoiced, "PO not forced if only one line is done") line2.force_invoiced = True self.assertEqual( - line2.invoice_status, "invoiced", "L2 status should be invoiced" + line2.invoice_status, "invoiced", "L2 status should be invoiced when forced" ) self.assertTrue( po.force_invoiced, "PO should be forced when all lines are invoiced" From ada20001f18a35b2aaa542a256de9f134308c74c Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 16 Sep 2025 10:14:58 +0000 Subject: [PATCH 200/207] [UPD] Update purchase_invoice_status_line.pot --- .../i18n/purchase_invoice_status_line.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot b/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot index ef6e727fa3f..45573fa0807 100644 --- a/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot +++ b/purchase_invoice_status_line/i18n/purchase_invoice_status_line.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" From fbff9671b11703c84066924d04b5e23112e7fe62 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Sep 2025 10:20:50 +0000 Subject: [PATCH 201/207] [BOT] post-merge updates --- purchase_invoice_status_line/README.rst | 8 +++- .../static/description/index.html | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index e8ad3244a40..ce80eaf7341 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============================ Purchase Invoice Status Line ============================ @@ -7,13 +11,13 @@ Purchase Invoice Status Line !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3bc367787eeccd0a3d9f8bae4a44b19e3bf6d1003771801fc15480bebde2eb32 + !! source digest: sha256:50afa38d1e00122fa09676fa4b4bade077ab0292b8507f363cdd5681fe2ddf55 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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 diff --git a/purchase_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html index 14896f0a3e9..49081118c64 100644 --- a/purchase_invoice_status_line/static/description/index.html +++ b/purchase_invoice_status_line/static/description/index.html @@ -3,15 +3,16 @@ -Purchase Invoice Status Line +README.rst -
        -

        Purchase Invoice Status Line

        +
        + + +Odoo Community Association + +
        +

        Purchase Invoice Status Line

        -

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

        +

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

        This module adds the invoice status on the purchase order lines.

        Table of contents

        @@ -384,13 +390,13 @@

        Purchase Invoice Status Line

      -

      Usage

      +

      Usage

      To use this module, you need to:

      In the lines, you will see the ‘Invoice Status’ field and you can force invoice.

      -

      Bug Tracker

      +

      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 @@ -398,23 +404,25 @@

      Bug Tracker

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

      -

      Credits

      +

      Credits

      -

      Authors

      +

      Authors

      • ForgeFlow
      -

      Contributors

      +

      Contributors

      -

      Maintainers

      +

      Maintainers

      This module is maintained by the OCA.

      -Odoo Community Association + +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.

      @@ -425,5 +433,6 @@

      Maintainers

      + From 4acea7e8eed3341a960c4cb17fc5279e1bf4f453 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 17 Sep 2025 13:13:59 +0000 Subject: [PATCH 202/207] Added translation using Weblate (Italian) --- purchase_invoice_status_line/i18n/it.po | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 purchase_invoice_status_line/i18n/it.po diff --git a/purchase_invoice_status_line/i18n/it.po b/purchase_invoice_status_line/i18n/it.po new file mode 100644 index 00000000000..e796a6c8ce7 --- /dev/null +++ b/purchase_invoice_status_line/i18n/it.po @@ -0,0 +1,65 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_invoice_status_line +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: purchase_invoice_status_line +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__invoice_status +msgid "Billing Status" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order__force_invoiced +#: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__force_invoiced +msgid "Force Invoiced" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__invoiced +msgid "Fully Billed" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order_line__force_invoiced +msgid "" +"If true, the invoice status will be forced to Fully Invoiced, even if some " +"quantities are not fully invoiced. " +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order__force_invoiced +msgid "" +"If true, the order is marked forced only when all lines are fully invoiced " +"and at least one line was manually forced." +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__no +msgid "Nothing to Bill" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model,name:purchase_invoice_status_line.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model,name:purchase_invoice_status_line.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_invoice_status_line +#: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__to_invoice +msgid "Waiting Bills" +msgstr "" From 36290afeccad4d60338f199f45fdb4b681b16973 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 17 Sep 2025 13:15:30 +0000 Subject: [PATCH 203/207] Translated using Weblate (Italian) Currently translated at 100.0% (9 of 9 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_invoice_status_line Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_invoice_status_line/it/ --- purchase_invoice_status_line/i18n/it.po | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/purchase_invoice_status_line/i18n/it.po b/purchase_invoice_status_line/i18n/it.po index e796a6c8ce7..fb380926fe8 100644 --- a/purchase_invoice_status_line/i18n/it.po +++ b/purchase_invoice_status_line/i18n/it.po @@ -6,29 +6,31 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2025-09-17 13:37+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 5.10.4\n" #. module: purchase_invoice_status_line #: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__invoice_status msgid "Billing Status" -msgstr "" +msgstr "Stato fatturazione" #. module: purchase_invoice_status_line #: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order__force_invoiced #: model:ir.model.fields,field_description:purchase_invoice_status_line.field_purchase_order_line__force_invoiced msgid "Force Invoiced" -msgstr "" +msgstr "Forza a fatturato" #. module: purchase_invoice_status_line #: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__invoiced msgid "Fully Billed" -msgstr "" +msgstr "Completamente pagato" #. module: purchase_invoice_status_line #: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order_line__force_invoiced @@ -36,6 +38,8 @@ msgid "" "If true, the invoice status will be forced to Fully Invoiced, even if some " "quantities are not fully invoiced. " msgstr "" +"Se è vero, lo stato della fattura verrà forzato su completamente fatturato, " +"anche se alcune quantità non sono completamente fatturate. " #. module: purchase_invoice_status_line #: model:ir.model.fields,help:purchase_invoice_status_line.field_purchase_order__force_invoiced @@ -43,23 +47,26 @@ msgid "" "If true, the order is marked forced only when all lines are fully invoiced " "and at least one line was manually forced." msgstr "" +"Se è vero, l'ordine viene contrassegnato come forzato solo quando tutte le " +"righe sono state completamente fatturate e almeno una riga è stata forzata " +"manualmente." #. module: purchase_invoice_status_line #: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__no msgid "Nothing to Bill" -msgstr "" +msgstr "Niente da fatturare" #. module: purchase_invoice_status_line #: model:ir.model,name:purchase_invoice_status_line.model_purchase_order msgid "Purchase Order" -msgstr "" +msgstr "Ordine di acquisto" #. module: purchase_invoice_status_line #: model:ir.model,name:purchase_invoice_status_line.model_purchase_order_line msgid "Purchase Order Line" -msgstr "" +msgstr "Riga ordine di acquisto" #. module: purchase_invoice_status_line #: model:ir.model.fields.selection,name:purchase_invoice_status_line.selection__purchase_order_line__invoice_status__to_invoice msgid "Waiting Bills" -msgstr "" +msgstr "Fatture in attesa" From 17e4427455304edbe57c8a5c751bec018bdb90de Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Tue, 30 Sep 2025 15:17:21 +0200 Subject: [PATCH 204/207] [ADD] purchase_invoice_status_line: reintroduce post_init_hook --- purchase_invoice_status_line/__init__.py | 1 + purchase_invoice_status_line/__manifest__.py | 1 + purchase_invoice_status_line/hooks.py | 12 ++++++++++++ 3 files changed, 14 insertions(+) create mode 100644 purchase_invoice_status_line/hooks.py diff --git a/purchase_invoice_status_line/__init__.py b/purchase_invoice_status_line/__init__.py index 0650744f6bc..cc6b6354ad8 100644 --- a/purchase_invoice_status_line/__init__.py +++ b/purchase_invoice_status_line/__init__.py @@ -1 +1,2 @@ from . import models +from .hooks import post_init_hook diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index d20849bece7..c279e3cb51a 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -14,6 +14,7 @@ "purchase_force_invoiced", "purchase_order_line_menu", ], + "post_init_hook": "post_init_hook", "data": [ "views/purchase_order_line_views.xml", ], diff --git a/purchase_invoice_status_line/hooks.py b/purchase_invoice_status_line/hooks.py new file mode 100644 index 00000000000..f2a1ceeb665 --- /dev/null +++ b/purchase_invoice_status_line/hooks.py @@ -0,0 +1,12 @@ +def post_init_hook(env): + lines_to_update = env["purchase.order.line"].search( + [ + ("force_invoiced", "=", False), + ("order_id.force_invoiced", "=", True), + ] + ) + if lines_to_update: + lines_to_update.write({"force_invoiced": True}) + all_lines = env["purchase.order.line"].search([]) + for line in all_lines: + line._compute_invoice_status() From 7e0488b8e70edec7b4b3620ebc490fd2eee7803c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 19 Nov 2025 11:34:56 +0000 Subject: [PATCH 205/207] [BOT] post-merge updates --- purchase_invoice_status_line/README.rst | 2 +- purchase_invoice_status_line/__manifest__.py | 2 +- purchase_invoice_status_line/static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index ce80eaf7341..540b88a4b5c 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -11,7 +11,7 @@ Purchase Invoice Status Line !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:50afa38d1e00122fa09676fa4b4bade077ab0292b8507f363cdd5681fe2ddf55 + !! source digest: sha256:28354a4b69311651d46cacb9a4e09e9c7e661178d169f701801369a29bd90a1c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index c279e3cb51a..c1f35ecf55f 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Invoice Status Line", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Purchases", "license": "AGPL-3", "summary": "Add invoice status on purchase order lines", diff --git a/purchase_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html index 49081118c64..2fdf535dbb6 100644 --- a/purchase_invoice_status_line/static/description/index.html +++ b/purchase_invoice_status_line/static/description/index.html @@ -372,7 +372,7 @@

      Purchase Invoice Status Line

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:50afa38d1e00122fa09676fa4b4bade077ab0292b8507f363cdd5681fe2ddf55 +!! source digest: sha256:28354a4b69311651d46cacb9a4e09e9c7e661178d169f701801369a29bd90a1c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

      This module adds the invoice status on the purchase order lines.

      From 84d9d7ff0a05acfc2fe1f7bda6e045329dfdcca2 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Tue, 28 Apr 2026 17:35:57 +0530 Subject: [PATCH 206/207] [MIG] purchase_invoice_status_line: Migration to 19.0 --- purchase_invoice_status_line/README.rst | 13 +++-- purchase_invoice_status_line/__manifest__.py | 2 +- .../models/purchase_order_line.py | 2 +- .../readme/CONTRIBUTORS.md | 2 + .../static/description/index.html | 10 ++-- .../test_purchase_invoice_status_line.py | 50 ++++++------------- .../views/purchase_order_line_views.xml | 2 +- 7 files changed, 35 insertions(+), 46 deletions(-) diff --git a/purchase_invoice_status_line/README.rst b/purchase_invoice_status_line/README.rst index 540b88a4b5c..e50d06ce581 100644 --- a/purchase_invoice_status_line/README.rst +++ b/purchase_invoice_status_line/README.rst @@ -21,13 +21,13 @@ Purchase Invoice Status Line :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/18.0/purchase_invoice_status_line + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_invoice_status_line :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-18-0/purchase-workflow-18-0-purchase_invoice_status_line + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_invoice_status_line :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -53,7 +53,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -69,6 +69,9 @@ Contributors ------------ - Joan Sisquella (JoanSForgeFlow) +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia Maintainers ----------- @@ -91,6 +94,6 @@ Current `maintainer `__: |maintainer-JoanSForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +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_invoice_status_line/__manifest__.py b/purchase_invoice_status_line/__manifest__.py index c1f35ecf55f..06960a93d9a 100644 --- a/purchase_invoice_status_line/__manifest__.py +++ b/purchase_invoice_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Invoice Status Line", - "version": "18.0.1.0.1", + "version": "19.0.1.0.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add invoice status on purchase order lines", diff --git a/purchase_invoice_status_line/models/purchase_order_line.py b/purchase_invoice_status_line/models/purchase_order_line.py index e129cfd55db..e294ec01c7a 100644 --- a/purchase_invoice_status_line/models/purchase_order_line.py +++ b/purchase_invoice_status_line/models/purchase_order_line.py @@ -27,7 +27,7 @@ class PurchaseOrderLine(models.Model): "even if some quantities are not fully invoiced. ", ) - @api.depends("qty_invoiced", "product_qty", "force_invoiced") + @api.depends("qty_invoiced", "product_qty", "force_invoiced", "qty_to_invoice") def _compute_invoice_status(self): precision = self.env["decimal.precision"].precision_get( "Product Unit of Measure" diff --git a/purchase_invoice_status_line/readme/CONTRIBUTORS.md b/purchase_invoice_status_line/readme/CONTRIBUTORS.md index ea5f5b47a53..8cd45d52132 100644 --- a/purchase_invoice_status_line/readme/CONTRIBUTORS.md +++ b/purchase_invoice_status_line/readme/CONTRIBUTORS.md @@ -1 +1,3 @@ - Joan Sisquella \ (JoanSForgeFlow) +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/purchase_invoice_status_line/static/description/index.html b/purchase_invoice_status_line/static/description/index.html index 2fdf535dbb6..f80da1391c9 100644 --- a/purchase_invoice_status_line/static/description/index.html +++ b/purchase_invoice_status_line/static/description/index.html @@ -374,7 +374,7 @@

      Purchase Invoice Status Line

      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:28354a4b69311651d46cacb9a4e09e9c7e661178d169f701801369a29bd90a1c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

      +

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

      This module adds the invoice status on the purchase order lines.

      Table of contents

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

      +feedback.

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

      @@ -415,6 +415,10 @@

      Authors

      Contributors

      @@ -428,7 +432,7 @@

      Maintainers

      promote its widespread use.

      Current maintainer:

      JoanSForgeFlow

      -

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

      +

      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_invoice_status_line/tests/test_purchase_invoice_status_line.py b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py index ad3eee02771..1b28f4d9596 100644 --- a/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py +++ b/purchase_invoice_status_line/tests/test_purchase_invoice_status_line.py @@ -1,56 +1,36 @@ # Copyright 2025 ForgeFlow (http://www.forgeflow.com/) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.tests import common +from odoo import Command +from odoo.tests import tagged +from odoo.addons.account.tests.common import AccountTestInvoicingCommon -class TestPurchaseInvoiceStatusLine(common.TransactionCase): - def setUp(self): - super().setUp() - self.partner = self.env.ref("base.res_partner_12") - self.product_order = self.env.ref("product.product_product_4") - self.product_received = self.env.ref("product.product_product_6") - self.product_order.write({"purchase_method": "purchase"}) - self.product_received.write({"purchase_method": "receive"}) - def _create_purchase_order(self, product, qty): - """Helper to create and confirm a PO for a given product and qty.""" - po_vals = { - "partner_id": self.partner.id, - "order_line": [ - ( - 0, - 0, - { - "name": product.name, - "product_id": product.id, - "product_qty": qty, - "price_unit": 10.0, - }, - ) - ], - } - po = self.env["purchase.order"].create(po_vals) - po.button_confirm() - return po +@tagged("post_install", "-at_install") +class TestPurchaseInvoiceStatusLine(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.partner_a + cls.product_order = cls.product_a + cls.product_received = cls.product_b + cls.product_order.write({"purchase_method": "purchase"}) + cls.product_received.write({"purchase_method": "receive"}) def test_force_invoice_logic(self): po = self.env["purchase.order"].create( { "partner_id": self.partner.id, "order_line": [ - ( - 0, - 0, + Command.create( { "product_id": self.product_order.id, "product_qty": 10, "price_unit": 10.0, }, ), - ( - 0, - 0, + Command.create( { "product_id": self.product_order.id, "product_qty": 5, diff --git a/purchase_invoice_status_line/views/purchase_order_line_views.xml b/purchase_invoice_status_line/views/purchase_order_line_views.xml index fbd0607308a..f5e570ade2c 100644 --- a/purchase_invoice_status_line/views/purchase_order_line_views.xml +++ b/purchase_invoice_status_line/views/purchase_order_line_views.xml @@ -5,7 +5,7 @@ purchase.order.line - + Date: Tue, 28 Apr 2026 17:41:49 +0530 Subject: [PATCH 207/207] [DON'T MERGE] test-requirements.txt --- test-requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test-requirements.txt diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000000..a7834895fb8 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-addon-purchase_order_line_menu @ git+https://github.com/OCA/purchase-workflow.git@refs/pull/2846/head#subdirectory=purchase_order_line_menu