From 8358fcc4b295d22c9f7a625f53a109288292c05d Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Fri, 18 Sep 2020 13:54:50 +0200 Subject: [PATCH 01/17] Allow to make parsing hook based on PartyIdentification/ID Some industries still identify party with a GLN and schemeID="GLN" or with a VAT number and schemeID=":VAT". This allow to process it with a parsing hook in the partner matching. Add module partner_identification_import to match partner by external identifier using the above hook. fixup! Allow to make parsing hook based on PartyIdentification/ID --- partner_identification_import/README.rst | 76 ++++ partner_identification_import/__init__.py | 1 + partner_identification_import/__manifest__.py | 17 + .../models/__init__.py | 1 + .../models/business_document_import.py | 43 ++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 421 ++++++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_business_document_import.py | 27 ++ 11 files changed, 592 insertions(+) create mode 100644 partner_identification_import/README.rst create mode 100644 partner_identification_import/__init__.py create mode 100644 partner_identification_import/__manifest__.py create mode 100644 partner_identification_import/models/__init__.py create mode 100644 partner_identification_import/models/business_document_import.py create mode 100644 partner_identification_import/readme/CONTRIBUTORS.rst create mode 100644 partner_identification_import/readme/DESCRIPTION.rst create mode 100644 partner_identification_import/static/description/icon.png create mode 100644 partner_identification_import/static/description/index.html create mode 100644 partner_identification_import/tests/__init__.py create mode 100644 partner_identification_import/tests/test_business_document_import.py diff --git a/partner_identification_import/README.rst b/partner_identification_import/README.rst new file mode 100644 index 0000000000..08a92a4ef5 --- /dev/null +++ b/partner_identification_import/README.rst @@ -0,0 +1,76 @@ +============================= +Partner Identification Import +============================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fedi-lightgray.png?logo=github + :target: https://github.com/OCA/edi/tree/13.0/partner_identification_import + :alt: OCA/edi +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-partner_identification_import + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/226/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Glue module between base_business_document_import and partner_identification (in OCA/partner-contact) + +Allow to define extra partner ID (thanks to partner_identification) and match +the partner using for exemple the UBL PartyIdentification/ID + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* BCIM + +Contributors +~~~~~~~~~~~~ + +* Jacques-Etienne Baudoux + +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/edi `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_identification_import/__init__.py b/partner_identification_import/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/partner_identification_import/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/partner_identification_import/__manifest__.py b/partner_identification_import/__manifest__.py new file mode 100644 index 0000000000..6fb6da4c7d --- /dev/null +++ b/partner_identification_import/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2020 Jacques-Etienne Baudoux +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Partner Identification Import", + "version": "13.0.1.0.0", + "category": "Tools", + "license": "AGPL-3", + "summary": "Provides partner matching on extra ID", + "author": "BCIM, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/edi", + "depends": [ + "base_business_document_import", + # OCA/partner-contact + "partner_identification", + ], +} diff --git a/partner_identification_import/models/__init__.py b/partner_identification_import/models/__init__.py new file mode 100644 index 0000000000..d695bc5f59 --- /dev/null +++ b/partner_identification_import/models/__init__.py @@ -0,0 +1 @@ +from . import business_document_import diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py new file mode 100644 index 0000000000..4ae22daed8 --- /dev/null +++ b/partner_identification_import/models/business_document_import.py @@ -0,0 +1,43 @@ +# Copyright 2020 Jacques-Etienne Baudoux +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, models + + +class BusinessDocumentImport(models.AbstractModel): + _inherit = "business.document.import" + + @api.model + def _hook_match_partner( + self, partner_dict, chatter_msg, domain, partner_type_label + ): + if partner_dict.get("id_number") and partner_dict.get("id_schemeID"): + categ = self.env["res.partner.id_category"].search( + [("code", "=", partner_dict.get("id_schemeID"))] + ) + if categ: + id_number = self.env["res.partner.id_number"].search( + [ + ("category_id", "=", categ.id), + ("name", "=", partner_dict["id_number"]), + ("status", "!=", "close"), + ], + limit=1, + ) + if id_number: + return id_number.partner_id + raise self.user_error_wrap( + _( + "Odoo couldn't find a partner corresponding to the " + "following information extracted from the business document:\n" + "ID Number: %s\n" + "ID Number Category: %s\n" + ) + % ( + partner_dict["id_number"], + partner_dict["id_schemeID"], + ) + ) + return super()._hook_match_partner( + partner_dict, chatter_msg, domain, partner_type_label + ) diff --git a/partner_identification_import/readme/CONTRIBUTORS.rst b/partner_identification_import/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..ed5b9eb64d --- /dev/null +++ b/partner_identification_import/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Jacques-Etienne Baudoux diff --git a/partner_identification_import/readme/DESCRIPTION.rst b/partner_identification_import/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..412c2631c6 --- /dev/null +++ b/partner_identification_import/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +Glue module between base_business_document_import and partner_identification (in OCA/partner-contact) + +Allow to define extra partner ID (thanks to partner_identification) and match +the partner using for exemple the UBL PartyIdentification/ID diff --git a/partner_identification_import/static/description/icon.png b/partner_identification_import/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/partner_identification_import/static/description/index.html b/partner_identification_import/static/description/index.html new file mode 100644 index 0000000000..5f132edc6b --- /dev/null +++ b/partner_identification_import/static/description/index.html @@ -0,0 +1,421 @@ + + + + + + +Partner Identification Import + + + +
+

Partner Identification Import

+ + +

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

+

Glue module between base_business_document_import and partner_identification (in OCA/partner-contact)

+

Allow to define extra partner ID (thanks to partner_identification) and match +the partner using for exemple the UBL PartyIdentification/ID

+

Table of contents

+ +
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • BCIM
  • +
+
+
+

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/edi project on GitHub.

+

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

+
+
+
+ + diff --git a/partner_identification_import/tests/__init__.py b/partner_identification_import/tests/__init__.py new file mode 100644 index 0000000000..12d28211d4 --- /dev/null +++ b/partner_identification_import/tests/__init__.py @@ -0,0 +1 @@ +from . import test_business_document_import diff --git a/partner_identification_import/tests/test_business_document_import.py b/partner_identification_import/tests/test_business_document_import.py new file mode 100644 index 0000000000..4007f3df87 --- /dev/null +++ b/partner_identification_import/tests/test_business_document_import.py @@ -0,0 +1,27 @@ +# Copyright 2020 Jacques-Etienne Baudoux +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import common + + +class TestBaseBusinessDocumentImport(common.SavepointCase): + def test_match_partner(self): + externalID = "MYEXTID" + externalSchemeID = "EXTCATEG" + partner1 = self.env["res.partner"].create({"name": "Extra ID"}) + categ = self.env["res.partner.id_category"].create( + {"name": "Extra Categ", "code": externalSchemeID} + ) + self.env["res.partner.id_number"].create( + { + "category_id": categ.id, + "name": externalSchemeID, + "partner_id": partner1.id, + } + ) + bdio = self.env["business.document.import"] + partner_dict = {"id_number": externalID, "id_schemeID": externalSchemeID} + warn = [] + res = bdio._match_partner(partner_dict, warn, partner_type=False) + self.assertEqual(res, partner1) + self.assertTrue(warn) From 4be61ea101d31f64170518ed2c5dd87bc8b03b80 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Sun, 4 Oct 2020 11:41:19 +0200 Subject: [PATCH 02/17] Improve partner contact matching --- .../models/business_document_import.py | 22 ++++++----- .../tests/test_business_document_import.py | 38 ++++++++++++++----- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index 4ae22daed8..101804a551 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -8,9 +8,7 @@ class BusinessDocumentImport(models.AbstractModel): _inherit = "business.document.import" @api.model - def _hook_match_partner( - self, partner_dict, chatter_msg, domain, partner_type_label - ): + def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): if partner_dict.get("id_number") and partner_dict.get("id_schemeID"): categ = self.env["res.partner.id_category"].search( [("code", "=", partner_dict.get("id_schemeID"))] @@ -25,6 +23,15 @@ def _hook_match_partner( limit=1, ) if id_number: + partner = id_number.partner_id + # Search for a contact of this partner + domain = [ + ("parent_id", "=", partner.id), + ("is_company", "=", False), + ] + contact = self._match_partner_contact(partner_dict, domain, order) + if contact: + return contact return id_number.partner_id raise self.user_error_wrap( _( @@ -33,11 +40,6 @@ def _hook_match_partner( "ID Number: %s\n" "ID Number Category: %s\n" ) - % ( - partner_dict["id_number"], - partner_dict["id_schemeID"], - ) + % (partner_dict["id_number"], partner_dict["id_schemeID"]) ) - return super()._hook_match_partner( - partner_dict, chatter_msg, domain, partner_type_label - ) + return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) diff --git a/partner_identification_import/tests/test_business_document_import.py b/partner_identification_import/tests/test_business_document_import.py index 4007f3df87..ebdbacba35 100644 --- a/partner_identification_import/tests/test_business_document_import.py +++ b/partner_identification_import/tests/test_business_document_import.py @@ -5,23 +5,41 @@ class TestBaseBusinessDocumentImport(common.SavepointCase): - def test_match_partner(self): + @classmethod + def setUpClass(cls): + super().setUpClass() externalID = "MYEXTID" externalSchemeID = "EXTCATEG" - partner1 = self.env["res.partner"].create({"name": "Extra ID"}) - categ = self.env["res.partner.id_category"].create( + cls.partner1 = cls.env["res.partner"].create({"name": "Extra ID"}) + categ = cls.env["res.partner.id_category"].create( {"name": "Extra Categ", "code": externalSchemeID} ) - self.env["res.partner.id_number"].create( + cls.env["res.partner.id_number"].create( { "category_id": categ.id, - "name": externalSchemeID, - "partner_id": partner1.id, + "name": externalID, + "partner_id": cls.partner1.id, } ) + cls.partner1_contact = cls.env["res.partner"].create( + {"name": "Contact", "parent_id": cls.partner1.id, "type": "contact"} + ) + cls.partner_dict = {"id_number": externalID, "id_schemeID": externalSchemeID} + + def test_match_partner(self): + bdio = self.env["business.document.import"] + warn = [] + res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + self.assertEqual(res, self.partner1) + + def test_match_partner_contact(self): bdio = self.env["business.document.import"] - partner_dict = {"id_number": externalID, "id_schemeID": externalSchemeID} warn = [] - res = bdio._match_partner(partner_dict, warn, partner_type=False) - self.assertEqual(res, partner1) - self.assertTrue(warn) + # Match contact + self.partner_dict["contact"] = "Contact" + res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + self.assertEqual(res, self.partner1_contact) + # Match partner + self.partner_dict["contact"] = "Contact2" + res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + self.assertEqual(res, self.partner1) From 4a09c172852b2ab28146753497ecafe0a995a60f Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Mon, 5 Oct 2020 00:22:28 +0200 Subject: [PATCH 03/17] Parse and import Sales Order Invoicing Partner. Refactor shipping partner matching. A shipping partner is not especially related to the ordering party. It could be any partner. However, we want to ensure that the address is respected. Fix-up: PartyIdentification/ID is a 1..N relation. Parse each of them for a match --- .../models/business_document_import.py | 30 ++++++++++++++----- .../tests/test_business_document_import.py | 4 ++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index 101804a551..c4e742d63e 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -9,15 +9,25 @@ class BusinessDocumentImport(models.AbstractModel): @api.model def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): - if partner_dict.get("id_number") and partner_dict.get("id_schemeID"): - categ = self.env["res.partner.id_category"].search( - [("code", "=", partner_dict.get("id_schemeID"))] + # Loop on all the partner_dict["id_number"] and search for a partner + # having one. If the schemeID matches an existing Id Number Category, + # then a match is required. + schemeIDs = [ + e["schemeID"] for e in partner_dict.get("id_number", []) if e["schemeID"] + ] + if schemeIDs: + schemes = self.env["res.partner.id_category"].search( + [("code", "in", schemeIDs)] ) - if categ: + unmatched = [] + for ident in partner_dict.get("id_number", []): + if ident.get("schemeID") not in schemes.mapped("code"): + continue + categ = schemes.filtered(lambda s: s.code == ident["schemeID"]) id_number = self.env["res.partner.id_number"].search( [ ("category_id", "=", categ.id), - ("name", "=", partner_dict["id_number"]), + ("name", "=", ident["value"]), ("status", "!=", "close"), ], limit=1, @@ -33,13 +43,17 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): if contact: return contact return id_number.partner_id + unmatched.append( + _("ID Number: %s\n" "ID Number Category: %s\n\n") + % (partner_dict["id_number"], partner_dict["id_schemeID"]) + ) + if unmatched: raise self.user_error_wrap( _( "Odoo couldn't find a partner corresponding to the " "following information extracted from the business document:\n" - "ID Number: %s\n" - "ID Number Category: %s\n" + "%s" ) - % (partner_dict["id_number"], partner_dict["id_schemeID"]) + % _("or\n").join(unmatched) ) return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) diff --git a/partner_identification_import/tests/test_business_document_import.py b/partner_identification_import/tests/test_business_document_import.py index ebdbacba35..9a35b1e3b9 100644 --- a/partner_identification_import/tests/test_business_document_import.py +++ b/partner_identification_import/tests/test_business_document_import.py @@ -24,7 +24,9 @@ def setUpClass(cls): cls.partner1_contact = cls.env["res.partner"].create( {"name": "Contact", "parent_id": cls.partner1.id, "type": "contact"} ) - cls.partner_dict = {"id_number": externalID, "id_schemeID": externalSchemeID} + cls.partner_dict = { + "id_number": [{"value": externalID, "schemeID": externalSchemeID}] + } def test_match_partner(self): bdio = self.env["business.document.import"] From 25e17784efeea4528aa6e9ddb6c442bec4d5050b Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Tue, 13 Oct 2020 15:08:37 +0200 Subject: [PATCH 04/17] Add UBL Order validation according to schema. + Fix partner identification (remove wrong namespace in attribute) squash! fixup! Allow to make parsing hook based on PartyIdentification/ID Prevent to fail if 2 categories have the same code --- .../i18n/partner_identification_import.pot | 42 +++++++++++++++++++ .../models/business_document_import.py | 4 +- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 partner_identification_import/i18n/partner_identification_import.pot diff --git a/partner_identification_import/i18n/partner_identification_import.pot b/partner_identification_import/i18n/partner_identification_import.pot new file mode 100644 index 0000000000..e6acf591d6 --- /dev/null +++ b/partner_identification_import/i18n/partner_identification_import.pot @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_identification_import +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: partner_identification_import +#: model:ir.model,name:partner_identification_import.model_business_document_import +msgid "Common methods to import business documents" +msgstr "" + +#. module: partner_identification_import +#: code:addons/partner_identification_import/models/business_document_import.py:0 +#, python-format +msgid "" +"ID Number: %s\n" +"ID Number Category: %s\n" +"\n" +msgstr "" + +#. module: partner_identification_import +#: code:addons/partner_identification_import/models/business_document_import.py:0 +#, python-format +msgid "" +"Odoo couldn't find a partner corresponding to the following information extracted from the business document:\n" +"%s" +msgstr "" + +#. module: partner_identification_import +#: code:addons/partner_identification_import/models/business_document_import.py:0 +#, python-format +msgid "or\n" +msgstr "" diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index c4e742d63e..f13607c2a3 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -26,7 +26,7 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): categ = schemes.filtered(lambda s: s.code == ident["schemeID"]) id_number = self.env["res.partner.id_number"].search( [ - ("category_id", "=", categ.id), + ("category_id", "in", categ.ids), ("name", "=", ident["value"]), ("status", "!=", "close"), ], @@ -45,7 +45,7 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): return id_number.partner_id unmatched.append( _("ID Number: %s\n" "ID Number Category: %s\n\n") - % (partner_dict["id_number"], partner_dict["id_schemeID"]) + % (ident["value"], ident["schemeID"]) ) if unmatched: raise self.user_error_wrap( From b0f22ed31c5917f9cdebf07da546577104bb7ec6 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 4 Nov 2020 08:09:06 +0000 Subject: [PATCH 05/17] partner_identification_import 13.0.2.0.0 --- partner_identification_import/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_identification_import/__manifest__.py b/partner_identification_import/__manifest__.py index 6fb6da4c7d..13fce424a0 100644 --- a/partner_identification_import/__manifest__.py +++ b/partner_identification_import/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Identification Import", - "version": "13.0.1.0.0", + "version": "13.0.2.0.0", "category": "Tools", "license": "AGPL-3", "summary": "Provides partner matching on extra ID", From babf270c2ffccaf6fcef398385e6b07613ce1d19 Mon Sep 17 00:00:00 2001 From: "dzung.tran" Date: Sat, 27 Feb 2021 16:36:35 +0700 Subject: [PATCH 06/17] [MIG] partner_identification_import: Migration to 14.0 --- partner_identification_import/README.rst | 21 +++++++++++---- partner_identification_import/__manifest__.py | 2 +- .../i18n/partner_identification_import.pot | 27 ++++++++++++------- .../models/business_document_import.py | 10 ++++--- .../readme/CONTRIBUTORS.rst | 4 +++ .../readme/CREDITS.rst | 3 +++ .../static/description/index.html | 22 +++++++++++---- 7 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 partner_identification_import/readme/CREDITS.rst diff --git a/partner_identification_import/README.rst b/partner_identification_import/README.rst index 08a92a4ef5..34e4168720 100644 --- a/partner_identification_import/README.rst +++ b/partner_identification_import/README.rst @@ -14,13 +14,13 @@ Partner Identification Import :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github - :target: https://github.com/OCA/edi/tree/13.0/partner_identification_import + :target: https://github.com/OCA/edi/tree/14.0/partner_identification_import :alt: OCA/edi .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-partner_identification_import + :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-partner_identification_import :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/226/13.0 + :target: https://runbot.odoo-community.org/runbot/226/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -41,7 +41,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. @@ -58,6 +58,17 @@ Contributors * Jacques-Etienne Baudoux +Trobz + +* Dung Tran + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Camptocamp + Maintainers ~~~~~~~~~~~ @@ -71,6 +82,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/edi `_ project on GitHub. +This module is part of the `OCA/edi `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_identification_import/__manifest__.py b/partner_identification_import/__manifest__.py index 13fce424a0..e61ac7ee53 100644 --- a/partner_identification_import/__manifest__.py +++ b/partner_identification_import/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Identification Import", - "version": "13.0.2.0.0", + "version": "14.0.1.0.0", "category": "Tools", "license": "AGPL-3", "summary": "Provides partner matching on extra ID", diff --git a/partner_identification_import/i18n/partner_identification_import.pot b/partner_identification_import/i18n/partner_identification_import.pot index e6acf591d6..4e85f0095c 100644 --- a/partner_identification_import/i18n/partner_identification_import.pot +++ b/partner_identification_import/i18n/partner_identification_import.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -18,25 +18,34 @@ msgstr "" msgid "Common methods to import business documents" msgstr "" +#. module: partner_identification_import +#: model:ir.model.fields,field_description:partner_identification_import.field_business_document_import__display_name +msgid "Display Name" +msgstr "" + +#. module: partner_identification_import +#: model:ir.model.fields,field_description:partner_identification_import.field_business_document_import__id +msgid "ID" +msgstr "" + #. module: partner_identification_import #: code:addons/partner_identification_import/models/business_document_import.py:0 #, python-format msgid "" -"ID Number: %s\n" -"ID Number Category: %s\n" +"ID Number: {}\n" +"ID Number Category: {}\n" "\n" msgstr "" #. module: partner_identification_import -#: code:addons/partner_identification_import/models/business_document_import.py:0 -#, python-format -msgid "" -"Odoo couldn't find a partner corresponding to the following information extracted from the business document:\n" -"%s" +#: model:ir.model.fields,field_description:partner_identification_import.field_business_document_import____last_update +msgid "Last Modified on" msgstr "" #. module: partner_identification_import #: code:addons/partner_identification_import/models/business_document_import.py:0 #, python-format -msgid "or\n" +msgid "" +"Odoo couldn't find a partner corresponding to the following information extracted from the business document:\n" +"{}" msgstr "" diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index f13607c2a3..85b3ad0269 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -44,16 +44,18 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): return contact return id_number.partner_id unmatched.append( - _("ID Number: %s\n" "ID Number Category: %s\n\n") - % (ident["value"], ident["schemeID"]) + _("ID Number: {}\nID Number Category: {}\n\n").format( + ident["value"], ident["schemeID"] + ) ) if unmatched: raise self.user_error_wrap( _( "Odoo couldn't find a partner corresponding to the " "following information extracted from the business document:\n" - "%s" + "{}" ) - % _("or\n").join(unmatched) + .format_("or\n") + .join(unmatched) ) return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) diff --git a/partner_identification_import/readme/CONTRIBUTORS.rst b/partner_identification_import/readme/CONTRIBUTORS.rst index ed5b9eb64d..0e357b3240 100644 --- a/partner_identification_import/readme/CONTRIBUTORS.rst +++ b/partner_identification_import/readme/CONTRIBUTORS.rst @@ -1 +1,5 @@ * Jacques-Etienne Baudoux + +Trobz + +* Dung Tran diff --git a/partner_identification_import/readme/CREDITS.rst b/partner_identification_import/readme/CREDITS.rst new file mode 100644 index 0000000000..f5cc070c78 --- /dev/null +++ b/partner_identification_import/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Camptocamp diff --git a/partner_identification_import/static/description/index.html b/partner_identification_import/static/description/index.html index 5f132edc6b..a8189298b3 100644 --- a/partner_identification_import/static/description/index.html +++ b/partner_identification_import/static/description/index.html @@ -367,7 +367,7 @@

Partner Identification Import

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

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

+

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

Glue module between base_business_document_import and partner_identification (in OCA/partner-contact)

Allow to define extra partner ID (thanks to partner_identification) and match the partner using for exemple the UBL PartyIdentification/ID

@@ -378,7 +378,8 @@

Partner Identification Import

  • Credits
  • @@ -388,7 +389,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.

    @@ -404,15 +405,26 @@

    Contributors

    +

    Trobz

    + +
    +
    +

    Other credits

    +

    The development of this module has been financially supported by:

    +
      +
    • Camptocamp
    • +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association

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

    -

    This module is part of the OCA/edi project on GitHub.

    +

    This module is part of the OCA/edi project on GitHub.

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

    From 0884228ab1eaecd8e6c61614af640b8cbf42e375 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 4 Nov 2021 13:02:14 +0100 Subject: [PATCH 07/17] partner_identification_import: fix typo from v14 mig --- .../models/business_document_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index 85b3ad0269..538bf41e5d 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -55,7 +55,7 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): "following information extracted from the business document:\n" "{}" ) - .format_("or\n") + .format("or\n") .join(unmatched) ) return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) From bcfb254dcf7a75207fddee529d8bebd3a74fe7e0 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Sat, 30 Oct 2021 08:34:42 +0200 Subject: [PATCH 08/17] partner_identification_import: fix match partner --- .../models/business_document_import.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index 538bf41e5d..4201bc89e6 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -39,7 +39,9 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): ("parent_id", "=", partner.id), ("is_company", "=", False), ] - contact = self._match_partner_contact(partner_dict, domain, order) + contact = self._match_partner_contact( + partner_dict, chatter_msg, domain, order + ) if contact: return contact return id_number.partner_id From 709c78d22c88b08da064ef02fba08c4051c4827d Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 4 Nov 2021 15:24:17 +0100 Subject: [PATCH 09/17] partner_identification_import: user_error_wrap call --- .../models/business_document_import.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index 4201bc89e6..dfdba4b2d8 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -52,12 +52,14 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): ) if unmatched: raise self.user_error_wrap( + "_hook_match_partner", + partner_dict, _( "Odoo couldn't find a partner corresponding to the " "following information extracted from the business document:\n" "{}" ) .format("or\n") - .join(unmatched) + .join(unmatched), ) return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) From 559394191a1eb198bc41be85e4ade0b0fbca0e6b Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 5 Nov 2021 09:07:15 +0000 Subject: [PATCH 10/17] partner_identification_import 14.0.1.0.1 --- partner_identification_import/README.rst | 15 +++++--- partner_identification_import/__manifest__.py | 2 +- .../static/description/index.html | 38 ++++++++++--------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/partner_identification_import/README.rst b/partner_identification_import/README.rst index 34e4168720..562bcaa7b5 100644 --- a/partner_identification_import/README.rst +++ b/partner_identification_import/README.rst @@ -2,10 +2,13 @@ Partner Identification Import ============================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:041f414c34955af0f78d39a3dd18311af1920907947fb7c00ba200076d0dd946 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Partner Identification Import .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-partner_identification_import :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/226/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi&target_branch=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Glue module between base_business_document_import and partner_identification (in OCA/partner-contact) @@ -40,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 +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/partner_identification_import/__manifest__.py b/partner_identification_import/__manifest__.py index e61ac7ee53..0684eb083d 100644 --- a/partner_identification_import/__manifest__.py +++ b/partner_identification_import/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Identification Import", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "category": "Tools", "license": "AGPL-3", "summary": "Provides partner matching on extra ID", diff --git a/partner_identification_import/static/description/index.html b/partner_identification_import/static/description/index.html index a8189298b3..16967b0327 100644 --- a/partner_identification_import/static/description/index.html +++ b/partner_identification_import/static/description/index.html @@ -1,20 +1,20 @@ - + - + Partner Identification Import -
    -

    Partner Identification Import

    +
    + + +Odoo Community Association + +
    +

    Partner Identification Import

    -

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

    +

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

    Glue module between base_business_document_import and partner_identification (in OCA/partner-contact)

    Allow to define extra partner ID (thanks to partner_identification) and @@ -388,7 +393,7 @@

    Partner Identification Import

    -

    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 @@ -396,15 +401,15 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • BCIM
    -

    Contributors

    +

    Contributors

    @@ -414,14 +419,14 @@

    Contributors

    -

    Other credits

    +

    Other credits

    The development of this module has been financially supported by:

    • Camptocamp
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -434,5 +439,6 @@

    Maintainers

    +
    diff --git a/partner_identification_import/tests/test_business_document_import.py b/partner_identification_import/tests/test_business_document_import.py index 240b047be1..3ea6e6910e 100644 --- a/partner_identification_import/tests/test_business_document_import.py +++ b/partner_identification_import/tests/test_business_document_import.py @@ -8,6 +8,7 @@ class TestBaseBusinessDocumentImport(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) externalID = "MYEXTID" externalSchemeID = "EXTCATEG" cls.partner1 = cls.env["res.partner"].create({"name": "Extra ID"}) From 123f6b570ab5432962ce9185f808c4b75a852954 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 17 Jun 2025 06:27:27 +0000 Subject: [PATCH 16/17] Translated using Weblate (Italian) Currently translated at 100.0% (6 of 6 strings) Translation: edi-18.0/edi-18.0-partner_identification_import Translate-URL: https://translation.odoo-community.org/projects/edi-18-0/edi-18-0-partner_identification_import/it/ --- partner_identification_import/i18n/it.po | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/partner_identification_import/i18n/it.po b/partner_identification_import/i18n/it.po index 695c6305b4..d7fcce5095 100644 --- a/partner_identification_import/i18n/it.po +++ b/partner_identification_import/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: 2025-05-27 14:26+0000\n" +"PO-Revision-Date: 2025-06-17 06:39+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -19,7 +19,7 @@ msgstr "" #. module: partner_identification_import #: model:ir.model,name:partner_identification_import.model_business_document_import msgid "Common methods to import business documents" -msgstr "" +msgstr "Metodi comuni per l'importazione di documenti di lavoro" #. module: partner_identification_import #: model:ir.model.fields,field_description:partner_identification_import.field_business_document_import__display_name @@ -39,11 +39,14 @@ msgid "" "ID Number Category: {}\n" "\n" msgstr "" +"Numero ID: {}\n" +"Numero ID categoria: {}\n" +"\n" #. module: partner_identification_import #: model:ir.model.fields,field_description:partner_identification_import.field_business_document_import____last_update msgid "Last Modified on" -msgstr "" +msgstr "Ultima modifica il" #. module: partner_identification_import #: code:addons/partner_identification_import/models/business_document_import.py:0 @@ -52,3 +55,6 @@ msgid "" "Odoo couldn't find a partner corresponding to the following information extracted from the business document:\n" "{}" msgstr "" +"Odoo non trova un partner che corrisponda alle seguenti informazioni " +"estratte dal documento commerciale\n" +"{}" From 91046e78f4623437bba2de3dd5d8f21da43a163a Mon Sep 17 00:00:00 2001 From: Maksym Yankin Date: Fri, 3 Apr 2026 14:18:55 +0300 Subject: [PATCH 17/17] [19.0][MIG] partner_identification_import: Migration to 19.0 --- partner_identification_import/README.rst | 10 +++--- partner_identification_import/__manifest__.py | 2 +- .../models/business_document_import.py | 32 +++++++++++-------- .../static/description/index.html | 6 ++-- .../tests/test_business_document_import.py | 14 ++++---- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/partner_identification_import/README.rst b/partner_identification_import/README.rst index 2fb7f39d2e..743108d9ef 100644 --- a/partner_identification_import/README.rst +++ b/partner_identification_import/README.rst @@ -21,13 +21,13 @@ Partner Identification Import :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github - :target: https://github.com/OCA/edi/tree/18.0/partner_identification_import + :target: https://github.com/OCA/edi/tree/19.0/partner_identification_import :alt: OCA/edi .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/edi-18-0/edi-18-0-partner_identification_import + :target: https://translation.odoo-community.org/projects/edi-19-0/edi-19-0-partner_identification_import :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/edi&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi&target_branch=19.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. @@ -90,6 +90,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/edi `_ project on GitHub. +This module is part of the `OCA/edi `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_identification_import/__manifest__.py b/partner_identification_import/__manifest__.py index f60cca604a..94e885b35a 100644 --- a/partner_identification_import/__manifest__.py +++ b/partner_identification_import/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Identification Import", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "category": "Tools", "license": "AGPL-3", "summary": "Provides partner matching on extra ID", diff --git a/partner_identification_import/models/business_document_import.py b/partner_identification_import/models/business_document_import.py index ff1b0969fa..459acd2149 100644 --- a/partner_identification_import/models/business_document_import.py +++ b/partner_identification_import/models/business_document_import.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, models +from odoo.fields import Domain class BusinessDocumentImport(models.AbstractModel): @@ -17,7 +18,7 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): ] if schemeIDs: schemes = self.env["res.partner.id_category"].search( - [("code", "in", schemeIDs)] + Domain("code", "in", schemeIDs) ) unmatched = [] for ident in partner_dict.get("id_number", []): @@ -25,20 +26,24 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): continue categ = schemes.filtered(lambda s, _id=ident: s.code == _id["schemeID"]) id_number = self.env["res.partner.id_number"].search( - [ - ("category_id", "in", categ.ids), - ("name", "=", ident["value"]), - ("status", "!=", "close"), - ], + Domain.AND( + [ + Domain("category_id", "in", categ.ids), + Domain("name", "=", ident["value"]), + Domain("status", "!=", "close"), + ] + ), limit=1, ) if id_number: partner = id_number.partner_id # Search for a contact of this partner - domain = [ - ("parent_id", "=", partner.id), - ("is_company", "=", False), - ] + domain = Domain.AND( + [ + Domain("parent_id", "=", partner.id), + Domain("is_company", "=", False), + ] + ) contact = self._match_partner_contact( partner_dict, chatter_msg, domain, order ) @@ -58,9 +63,8 @@ def _hook_match_partner(self, partner_dict, chatter_msg, domain, order): self.env._( "Odoo couldn't find a partner corresponding to the " "following information extracted from the business document:\n" - "{}" - ) - .format("or\n") - .join(unmatched), + "%(join_unmatched)s", + join_unmatched="or\n".join(unmatched), + ), ) return super()._hook_match_partner(partner_dict, chatter_msg, domain, order) diff --git a/partner_identification_import/static/description/index.html b/partner_identification_import/static/description/index.html index 01beba3e0c..211e353138 100644 --- a/partner_identification_import/static/description/index.html +++ b/partner_identification_import/static/description/index.html @@ -374,7 +374,7 @@

    Partner Identification Import

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:4bfd68c6b919e15048cf359cd28bb03fbc267eb6f47891289f708a933eff9db8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

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

    Glue module between base_business_document_import and partner_identification (in OCA/partner-contact)

    Allow to define extra partner ID (thanks to partner_identification) and @@ -397,7 +397,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,7 +434,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/edi project on GitHub.

    +

    This module is part of the OCA/edi project on GitHub.

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

    diff --git a/partner_identification_import/tests/test_business_document_import.py b/partner_identification_import/tests/test_business_document_import.py index 3ea6e6910e..3efa3fb979 100644 --- a/partner_identification_import/tests/test_business_document_import.py +++ b/partner_identification_import/tests/test_business_document_import.py @@ -1,14 +1,14 @@ # Copyright 2020 Jacques-Etienne Baudoux # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests.common import TransactionCase -from odoo.tests import common - -class TestBaseBusinessDocumentImport(common.TransactionCase): +class TestBaseBusinessDocumentImport(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.bdio = cls.env["business.document.import"] externalID = "MYEXTID" externalSchemeID = "EXTCATEG" cls.partner1 = cls.env["res.partner"].create({"name": "Extra ID"}) @@ -30,19 +30,17 @@ def setUpClass(cls): } def test_match_partner(self): - bdio = self.env["business.document.import"] warn = [] - res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + res = self.bdio._match_partner(self.partner_dict, warn, partner_type=False) self.assertEqual(res, self.partner1) def test_match_partner_contact(self): - bdio = self.env["business.document.import"] warn = [] # Match contact self.partner_dict["contact"] = "Contact" - res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + res = self.bdio._match_partner(self.partner_dict, warn, partner_type=False) self.assertEqual(res, self.partner1_contact) # Match partner self.partner_dict["contact"] = "Contact2" - res = bdio._match_partner(self.partner_dict, warn, partner_type=False) + res = self.bdio._match_partner(self.partner_dict, warn, partner_type=False) self.assertEqual(res, self.partner1)