From cb29db252def3e4db86caa3c36f53b95d4da1ee3 Mon Sep 17 00:00:00 2001 From: Maxence Groine Date: Fri, 1 Jun 2018 15:10:44 +0200 Subject: [PATCH] Rename module Also: - Use context managers for file opening/closing in tests - Changed use of deprecated `BadZipfile` exception - Removed debugging code left by mistake --- .../README.rst | 52 ++++ .../__init__.py | 3 + .../__manifest__.py | 16 ++ .../i18n/de.po | 24 ++ .../i18n/es.po | 55 ++++ .../i18n/fi.po | 34 +++ .../i18n/fr.po | 55 ++++ .../i18n/fr_CH.po | 34 +++ .../i18n/gl.po | 34 +++ .../i18n/hr.po | 54 ++++ .../i18n/lt_LT.po | 23 ++ .../i18n/nb_NO.po | 34 +++ .../i18n/nl.po | 24 ++ .../i18n/pt_BR.po | 23 ++ .../i18n/pt_PT.po | 23 ++ .../i18n/sl.po | 23 ++ .../models/__init__.py | 4 + .../models/account_bank_statement_import.py | 40 +++ .../models/parser.py | 240 +++++++++++++++++ .../test_files/golden-camt053-txdtls.pydata | 18 ++ .../test_files/golden-camt053.pydata | 27 ++ .../test_files/test-camt053 | 241 ++++++++++++++++++ .../test_files/test-camt053-txdtls | 214 ++++++++++++++++ .../test_files/test-camt053.zip | Bin 0 -> 3111 bytes .../tests/__init__.py | 4 + .../tests/test_import_bank_statement.py | 127 +++++++++ .../views/account_bank_statement_import.xml | 13 + 27 files changed, 1439 insertions(+) create mode 100644 account_bank_statement_import_camt_oca/README.rst create mode 100644 account_bank_statement_import_camt_oca/__init__.py create mode 100644 account_bank_statement_import_camt_oca/__manifest__.py create mode 100644 account_bank_statement_import_camt_oca/i18n/de.po create mode 100644 account_bank_statement_import_camt_oca/i18n/es.po create mode 100644 account_bank_statement_import_camt_oca/i18n/fi.po create mode 100644 account_bank_statement_import_camt_oca/i18n/fr.po create mode 100644 account_bank_statement_import_camt_oca/i18n/fr_CH.po create mode 100644 account_bank_statement_import_camt_oca/i18n/gl.po create mode 100644 account_bank_statement_import_camt_oca/i18n/hr.po create mode 100644 account_bank_statement_import_camt_oca/i18n/lt_LT.po create mode 100644 account_bank_statement_import_camt_oca/i18n/nb_NO.po create mode 100644 account_bank_statement_import_camt_oca/i18n/nl.po create mode 100644 account_bank_statement_import_camt_oca/i18n/pt_BR.po create mode 100644 account_bank_statement_import_camt_oca/i18n/pt_PT.po create mode 100644 account_bank_statement_import_camt_oca/i18n/sl.po create mode 100644 account_bank_statement_import_camt_oca/models/__init__.py create mode 100644 account_bank_statement_import_camt_oca/models/account_bank_statement_import.py create mode 100644 account_bank_statement_import_camt_oca/models/parser.py create mode 100644 account_bank_statement_import_camt_oca/test_files/golden-camt053-txdtls.pydata create mode 100644 account_bank_statement_import_camt_oca/test_files/golden-camt053.pydata create mode 100644 account_bank_statement_import_camt_oca/test_files/test-camt053 create mode 100644 account_bank_statement_import_camt_oca/test_files/test-camt053-txdtls create mode 100644 account_bank_statement_import_camt_oca/test_files/test-camt053.zip create mode 100644 account_bank_statement_import_camt_oca/tests/__init__.py create mode 100644 account_bank_statement_import_camt_oca/tests/test_import_bank_statement.py create mode 100644 account_bank_statement_import_camt_oca/views/account_bank_statement_import.xml diff --git a/account_bank_statement_import_camt_oca/README.rst b/account_bank_statement_import_camt_oca/README.rst new file mode 100644 index 0000000..327bd47 --- /dev/null +++ b/account_bank_statement_import_camt_oca/README.rst @@ -0,0 +1,52 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: https://www.gnu.com/licenses/agpl + :alt: License: AGPL-3 + +========================= +Bank Statement Parse Camt +========================= + +Module to import SEPA CAMT.053 and CAMT.054 Format bank statement files. + +Based on the Banking addons framework. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/174/11.0 + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smash it by providing a detailed and welcomed feedback. + + +Credits +======= + +Contributors +------------ + +* Holger Brunn +* Stefan Rijnhart +* Ronald Portier +* Andrea Stirpe +* Maxence Groine + +Do not contact contributors directly about support or help with technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/account_bank_statement_import_camt_oca/__init__.py b/account_bank_statement_import_camt_oca/__init__.py new file mode 100644 index 0000000..867022b --- /dev/null +++ b/account_bank_statement_import_camt_oca/__init__.py @@ -0,0 +1,3 @@ +# © 2013-2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import models diff --git a/account_bank_statement_import_camt_oca/__manifest__.py b/account_bank_statement_import_camt_oca/__manifest__.py new file mode 100644 index 0000000..f2ca11a --- /dev/null +++ b/account_bank_statement_import_camt_oca/__manifest__.py @@ -0,0 +1,16 @@ +# © 2013-2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': 'CAMT Format Bank Statements Import', + 'version': '11.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Odoo Community Association (OCA), Therp BV', + 'website': 'https://github.com/OCA/bank-statement-import', + 'category': 'Banking addons', + 'depends': [ + 'account_bank_statement_import', + ], + 'data': [ + 'views/account_bank_statement_import.xml', + ], +} diff --git a/account_bank_statement_import_camt_oca/i18n/de.po b/account_bank_statement_import_camt_oca/i18n/de.po new file mode 100644 index 0000000..f4d4e71 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/de.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-24 21:51+0000\n" +"PO-Revision-Date: 2015-10-04 11:43+0200\n" +"Last-Translator: Rudolf Schnapka \n" +"Language-Team: French (http://www.transifex.com/oca/OCA-bank-statement-import-8-0/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 1.8.3\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Kontoauszug importieren" diff --git a/account_bank_statement_import_camt_oca/i18n/es.po b/account_bank_statement_import_camt_oca/i18n/es.po new file mode 100644 index 0000000..e56d7f8 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/es.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# OCA Transbot , 2017 +# enjolras , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 01:41+0000\n" +"PO-Revision-Date: 2018-02-21 01:41+0000\n" +"Last-Translator: enjolras , 2018\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" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "CAMT" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_id +msgid "ID" +msgstr "ID" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importar extracto bancario" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser___last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import_camt_oca_parser +msgid "account.bank.statement.import.camt.parser" +msgstr "account.bank.statement.import.camt.parser" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "CAMT en .zip" diff --git a/account_bank_statement_import_camt_oca/i18n/fi.po b/account_bank_statement_import_camt_oca/i18n/fi.po new file mode 100644 index 0000000..f91f6c9 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/fi.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Jarmo Kortetjärvi , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-10 05:00+0000\n" +"PO-Revision-Date: 2016-12-10 05:00+0000\n" +"Last-Translator: Jarmo Kortetjärvi , 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: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Tuo pankkiaineisto" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "" diff --git a/account_bank_statement_import_camt_oca/i18n/fr.po b/account_bank_statement_import_camt_oca/i18n/fr.po new file mode 100644 index 0000000..11f802f --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/fr.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Quentin THEURET , 2017 +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 01:42+0000\n" +"PO-Revision-Date: 2017-11-21 01:42+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" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "CAMT" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_id +msgid "ID" +msgstr "ID" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importer Relevé Bancaire" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser___last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import_camt_oca_parser +msgid "account.bank.statement.import.camt.parser" +msgstr "" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "CAMT zippé" diff --git a/account_bank_statement_import_camt_oca/i18n/fr_CH.po b/account_bank_statement_import_camt_oca/i18n/fr_CH.po new file mode 100644 index 0000000..4a5d587 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/fr_CH.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# OCA Transbot , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-09 17:00+0000\n" +"PO-Revision-Date: 2016-12-09 17:00+0000\n" +"Last-Translator: OCA Transbot , 2016\n" +"Language-Team: French (Switzerland) (https://www.transifex.com/oca/teams/23907/fr_CH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr_CH\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importer Relevé" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "" diff --git a/account_bank_statement_import_camt_oca/i18n/gl.po b/account_bank_statement_import_camt_oca/i18n/gl.po new file mode 100644 index 0000000..b8d5ab4 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/gl.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Alejandro Santana , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-09 17:00+0000\n" +"PO-Revision-Date: 2016-12-09 17:00+0000\n" +"Last-Translator: Alejandro Santana , 2016\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: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importar extracto bancario" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "" diff --git a/account_bank_statement_import_camt_oca/i18n/hr.po b/account_bank_statement_import_camt_oca/i18n/hr.po new file mode 100644 index 0000000..b8d38f5 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/hr.po @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Bole , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 01:41+0000\n" +"PO-Revision-Date: 2018-02-21 01:41+0000\n" +"Last-Translator: Bole , 2018\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr\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: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "CAMT" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_display_name +msgid "Display Name" +msgstr "Naziv" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser_id +msgid "ID" +msgstr "ID" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Uvoz bankovnog izvoda" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model.fields,field_description:account_bank_statement_import_camt_oca.field_account_bank_statement_import_camt_oca_parser___last_update +msgid "Last Modified on" +msgstr "Zadnje modificirano" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import_camt_oca_parser +msgid "account.bank.statement.import.camt.parser" +msgstr "account.bank.statement.import.camt.parser" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "kompresirani CAMT" diff --git a/account_bank_statement_import_camt_oca/i18n/lt_LT.po b/account_bank_statement_import_camt_oca/i18n/lt_LT.po new file mode 100644 index 0000000..0820966 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/lt_LT.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-24 21:51+0000\n" +"PO-Revision-Date: 2015-07-24 07:41+0000\n" +"Last-Translator: <>\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/oca/OCA-bank-statement-import-8-0/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importuoti banko išrašą" diff --git a/account_bank_statement_import_camt_oca/i18n/nb_NO.po b/account_bank_statement_import_camt_oca/i18n/nb_NO.po new file mode 100644 index 0000000..ad504a0 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/nb_NO.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Imre Kristoffer Eilertsen , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-09 17:00+0000\n" +"PO-Revision-Date: 2016-12-09 17:00+0000\n" +"Last-Translator: Imre Kristoffer Eilertsen , 2016\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/oca/teams/23907/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "CAMT" +msgstr "" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importer bankutsagn" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.ui.view,arch_db:account_bank_statement_import_camt_oca.account_bank_statement_import_view +msgid "zipped CAMT" +msgstr "" diff --git a/account_bank_statement_import_camt_oca/i18n/nl.po b/account_bank_statement_import_camt_oca/i18n/nl.po new file mode 100644 index 0000000..fa6dec9 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/nl.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +# Erwin van der Ploeg , 2015 +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-24 21:51+0000\n" +"PO-Revision-Date: 2015-07-31 06:44+0000\n" +"Last-Translator: Erwin van der Ploeg \n" +"Language-Team: Dutch (http://www.transifex.com/oca/OCA-bank-statement-import-8-0/language/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importeer bankafschrift" diff --git a/account_bank_statement_import_camt_oca/i18n/pt_BR.po b/account_bank_statement_import_camt_oca/i18n/pt_BR.po new file mode 100644 index 0000000..c27fa00 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/pt_BR.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 09:23+0000\n" +"PO-Revision-Date: 2015-10-09 00:26+0000\n" +"Last-Translator: danimaribeiro \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-bank-statement-import-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: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importar Extrato Bancário" diff --git a/account_bank_statement_import_camt_oca/i18n/pt_PT.po b/account_bank_statement_import_camt_oca/i18n/pt_PT.po new file mode 100644 index 0000000..62f2b77 --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/pt_PT.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-08-18 10:27+0000\n" +"PO-Revision-Date: 2015-07-24 07:41+0000\n" +"Last-Translator: <>\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/oca/OCA-bank-statement-import-8-0/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: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Importar Extrato Bancário" diff --git a/account_bank_statement_import_camt_oca/i18n/sl.po b/account_bank_statement_import_camt_oca/i18n/sl.po new file mode 100644 index 0000000..fe1211d --- /dev/null +++ b/account_bank_statement_import_camt_oca/i18n/sl.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_camt_oca +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-import (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-24 21:51+0000\n" +"PO-Revision-Date: 2015-07-25 12:19+0000\n" +"Last-Translator: Matjaž Mozetič \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-bank-statement-import-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: account_bank_statement_import_camt_oca +#: model:ir.model,name:account_bank_statement_import_camt_oca.model_account_bank_statement_import +msgid "Import Bank Statement" +msgstr "Uvoz bančnega izpiska" diff --git a/account_bank_statement_import_camt_oca/models/__init__.py b/account_bank_statement_import_camt_oca/models/__init__.py new file mode 100644 index 0000000..8b7d2c6 --- /dev/null +++ b/account_bank_statement_import_camt_oca/models/__init__.py @@ -0,0 +1,4 @@ +# © 2013-2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import parser +from . import account_bank_statement_import diff --git a/account_bank_statement_import_camt_oca/models/account_bank_statement_import.py b/account_bank_statement_import_camt_oca/models/account_bank_statement_import.py new file mode 100644 index 0000000..f3ec1a5 --- /dev/null +++ b/account_bank_statement_import_camt_oca/models/account_bank_statement_import.py @@ -0,0 +1,40 @@ +"""Add process_camt method to account.bank.statement.import.""" +# © 2013-2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging +from io import BytesIO +import zipfile +from odoo import api, models + +_logger = logging.getLogger(__name__) + + +class AccountBankStatementImport(models.TransientModel): + """Add process_camt method to account.bank.statement.import.""" + _inherit = 'account.bank.statement.import' + + @api.model + def _parse_file(self, data_file): + """Parse a CAMT053 XML file.""" + try: + parser = self.env['account.bank.statement.import.camt.parser'] + _logger.debug("Try parsing with camt.") + return parser.parse(data_file) + except ValueError: + try: + with zipfile.ZipFile(BytesIO(data_file)) as data: + currency = None + account_number = None + transactions = [] + for member in data.namelist(): + currency, account_number, new = self._parse_file( + data.open(member).read() + ) + transactions.extend(new) + return currency, account_number, transactions + except (zipfile.BadZipFile, ValueError): + pass + # Not a camt file, returning super will call next candidate: + _logger.debug("Statement file was not a camt file.", + exc_info=True) + return super(AccountBankStatementImport, self)._parse_file(data_file) diff --git a/account_bank_statement_import_camt_oca/models/parser.py b/account_bank_statement_import_camt_oca/models/parser.py new file mode 100644 index 0000000..0668422 --- /dev/null +++ b/account_bank_statement_import_camt_oca/models/parser.py @@ -0,0 +1,240 @@ +"""Class to parse camt files.""" +# © 2013-2016 Therp BV +# Copyright 2017 Open Net Sàrl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import re +from lxml import etree + +from odoo import models + + +class CamtParser(models.AbstractModel): + """Parser for camt bank statement import files.""" + _name = 'account.bank.statement.import.camt.parser' + + def parse_amount(self, ns, node): + """Parse element that contains Amount and CreditDebitIndicator.""" + if node is None: + return 0.0 + sign = 1 + amount = 0.0 + sign_node = node.xpath('ns:CdtDbtInd', namespaces={'ns': ns}) + if sign_node and sign_node[0].text == 'DBIT': + sign = -1 + amount_node = node.xpath('ns:Amt', namespaces={'ns': ns}) + if amount_node: + amount = sign * float(amount_node[0].text) + return amount + + def add_value_from_node( + self, ns, node, xpath_str, obj, attr_name, join_str=None): + """Add value to object from first or all nodes found with xpath. + + If xpath_str is a list (or iterable), it will be seen as a series + of search path's in order of preference. The first item that results + in a found node will be used to set a value.""" + if not isinstance(xpath_str, (list, tuple)): + xpath_str = [xpath_str] + for search_str in xpath_str: + found_node = node.xpath(search_str, namespaces={'ns': ns}) + if found_node: + if join_str is None: + attr_value = found_node[0].text + else: + attr_value = join_str.join([x.text for x in found_node]) + obj[attr_name] = attr_value + break + + def parse_transaction_details(self, ns, node, transaction): + """Parse TxDtls node.""" + # message + self.add_value_from_node( + ns, node, [ + './ns:RmtInf/ns:Ustrd', + './ns:AddtlNtryInf', + './ns:Refs/ns:InstrId', + ], transaction, 'note', join_str='\n') + # name + self.add_value_from_node( + ns, node, [ + './ns:AddtlTxInf', + ], transaction, 'name', join_str='\n') + # eref + self.add_value_from_node( + ns, node, [ + './ns:RmtInf/ns:Strd/ns:CdtrRefInf/ns:Ref', + './ns:Refs/ns:EndToEndId', + './ns:Ntry/ns:AcctSvcrRef' + ], + transaction, 'ref' + ) + amount = self.parse_amount(ns, node) + if amount != 0.0: + transaction['amount'] = amount + # remote party values + party_type = 'Dbtr' + party_type_node = node.xpath( + '../../ns:CdtDbtInd', namespaces={'ns': ns}) + if party_type_node and party_type_node[0].text != 'CRDT': + party_type = 'Cdtr' + party_node = node.xpath( + './ns:RltdPties/ns:%s' % party_type, namespaces={'ns': ns}) + if party_node: + self.add_value_from_node( + ns, party_node[0], './ns:Nm', transaction, 'partner_name') + # Get remote_account from iban or from domestic account: + account_node = node.xpath( + './ns:RltdPties/ns:%sAcct/ns:Id' % party_type, + namespaces={'ns': ns} + ) + if account_node: + iban_node = account_node[0].xpath( + './ns:IBAN', namespaces={'ns': ns}) + if iban_node: + transaction['account_number'] = iban_node[0].text + else: + self.add_value_from_node( + ns, account_node[0], './ns:Othr/ns:Id', transaction, + 'account_number' + ) + + def parse_entry(self, ns, node): + """Parse an Ntry node and yield transactions""" + transaction = {'name': '/', 'amount': 0} # fallback defaults + self.add_value_from_node( + ns, node, './ns:BookgDt/ns:Dt', transaction, 'date') + amount = self.parse_amount(ns, node) + if amount != 0.0: + transaction['amount'] = amount + self.add_value_from_node( + ns, node, './ns:AddtlNtryInf', transaction, 'name') + self.add_value_from_node( + ns, node, [ + './ns:NtryDtls/ns:RmtInf/ns:Strd/ns:CdtrRefInf/ns:Ref', + './ns:NtryDtls/ns:Btch/ns:PmtInfId', + './ns:NtryDtls/ns:TxDtls/ns:Refs/ns:AcctSvcrRef' + ], + transaction, 'ref' + ) + + details_nodes = node.xpath( + './ns:NtryDtls/ns:TxDtls', namespaces={'ns': ns}) + if len(details_nodes) == 0: + yield transaction + return + transaction_base = transaction + for node in details_nodes: + transaction = transaction_base.copy() + self.parse_transaction_details(ns, node, transaction) + yield transaction + + def get_balance_amounts(self, ns, node): + """Return opening and closing balance. + + Depending on kind of balance and statement, the balance might be in a + different kind of node: + OPBD = OpeningBalance + PRCD = PreviousClosingBalance + ITBD = InterimBalance (first ITBD is start-, second is end-balance) + CLBD = ClosingBalance + """ + start_balance_node = None + end_balance_node = None + for node_name in ['OPBD', 'PRCD', 'CLBD', 'ITBD']: + code_expr = ( + './ns:Bal/ns:Tp/ns:CdOrPrtry/ns:Cd[text()="%s"]/../../..' % + node_name + ) + balance_node = node.xpath(code_expr, namespaces={'ns': ns}) + if balance_node: + if node_name in ['OPBD', 'PRCD']: + start_balance_node = balance_node[0] + elif node_name == 'CLBD': + end_balance_node = balance_node[0] + else: + if not start_balance_node: + start_balance_node = balance_node[0] + if not end_balance_node: + end_balance_node = balance_node[-1] + return ( + self.parse_amount(ns, start_balance_node), + self.parse_amount(ns, end_balance_node) + ) + + def parse_statement(self, ns, node): + """Parse a single Stmt node.""" + result = {} + self.add_value_from_node( + ns, node, [ + './ns:Acct/ns:Id/ns:IBAN', + './ns:Acct/ns:Id/ns:Othr/ns:Id', + ], result, 'account_number' + ) + self.add_value_from_node( + ns, node, './ns:Id', result, 'name') + self.add_value_from_node( + ns, node, './ns:Acct/ns:Ccy', result, 'currency') + result['balance_start'], result['balance_end_real'] = ( + self.get_balance_amounts(ns, node)) + entry_nodes = node.xpath('./ns:Ntry', namespaces={'ns': ns}) + transactions = [] + for entry_node in entry_nodes: + transactions.extend(self.parse_entry(ns, entry_node)) + result['transactions'] = transactions + result['date'] = sorted(transactions, + key=lambda x: x['date'], + reverse=True + )[0]['date'] + return result + + def check_version(self, ns, root): + """Validate validity of camt file.""" + # Check whether it is camt at all: + re_camt = re.compile( + r'(^urn:iso:std:iso:20022:tech:xsd:camt.' + r'|^ISO:camt.)' + ) + if not re_camt.search(ns): + raise ValueError('no camt: ' + ns) + # Check whether version 052 ,053 or 054: + re_camt_version = re.compile( + r'(^urn:iso:std:iso:20022:tech:xsd:camt.054.' + r'|^urn:iso:std:iso:20022:tech:xsd:camt.053.' + r'|^urn:iso:std:iso:20022:tech:xsd:camt.052.' + r'|^ISO:camt.054.' + r'|^ISO:camt.053.' + r'|^ISO:camt.052.)' + ) + if not re_camt_version.search(ns): + raise ValueError('no camt 052 or 053 or 054: ' + ns) + # Check GrpHdr element: + root_0_0 = root[0][0].tag[len(ns) + 2:] # strip namespace + if root_0_0 != 'GrpHdr': + raise ValueError('expected GrpHdr, got: ' + root_0_0) + + def parse(self, data): + """Parse a camt.052 or camt.053 or camt.054 file.""" + try: + root = etree.fromstring( + data, parser=etree.XMLParser(recover=True)) + except etree.XMLSyntaxError: + # ABNAmro is known to mix up encodings + root = etree.fromstring( + data.decode('iso-8859-15').encode('utf-8')) + if root is None: + raise ValueError( + 'Not a valid xml file, or not an xml file at all.') + ns = root.tag[1:root.tag.index("}")] + self.check_version(ns, root) + statements = [] + currency = None + account_number = None + for node in root[0][1:]: + statement = self.parse_statement(ns, node) + if len(statement['transactions']): + if 'currency' in statement: + currency = statement.pop('currency') + if 'account_number' in statement: + account_number = statement.pop('account_number') + statements.append(statement) + return currency, account_number, statements diff --git a/account_bank_statement_import_camt_oca/test_files/golden-camt053-txdtls.pydata b/account_bank_statement_import_camt_oca/test_files/golden-camt053-txdtls.pydata new file mode 100644 index 0000000..9b73d97 --- /dev/null +++ b/account_bank_statement_import_camt_oca/test_files/golden-camt053-txdtls.pydata @@ -0,0 +1,18 @@ +(None, + 'CH1111000000123456789', + [{'balance_end_real': 79443.15, + 'balance_start': 75960.15, + 'date': '2017-03-22', + 'name': '20170323123456789012345', + 'transactions': [{'account_number': 'CH2222000000123456789', + 'amount': 2187.0, + 'date': '2017-03-22', + 'name': 'CRÉDIT GROUPÉ BVR TRAITEMENT DU 22.03.2017 NUMÉRO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE', + 'partner_name': 'Banque Cantonale Vaudoise', + 'ref': '302388292000011111111111111'}, + {'account_number': 'CH3333000000123456789', + 'amount': 1296.0, + 'date': '2017-03-22', + 'name': 'CRÉDIT GROUPÉ BVR TRAITEMENT DU 22.03.2017 NUMÉRO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE', + 'partner_name': 'Banque Cantonale Vaudoise', + 'ref': '302388292000022222222222222'}]}]) diff --git a/account_bank_statement_import_camt_oca/test_files/golden-camt053.pydata b/account_bank_statement_import_camt_oca/test_files/golden-camt053.pydata new file mode 100644 index 0000000..ba7cb95 --- /dev/null +++ b/account_bank_statement_import_camt_oca/test_files/golden-camt053.pydata @@ -0,0 +1,27 @@ +(None, + 'NL77ABNA0574908765', + [{'balance_end_real': 15121.12, + 'balance_start': 15568.27, + 'date': '2014-01-05', + 'name': '1234Test/1', + 'transactions': [{'account_number': 'NL46ABNA0499998748', + 'amount': -754.25, + 'date': '2014-01-05', + 'name': 'MKB Insurance 859239PERIOD 01.01.2014 - 31.12.2014', + 'note': 'Insurance policy 857239PERIOD 01.01.2014 - 31.12.2014', + 'partner_name': 'INSURANCE COMPANY TESTX', + 'ref': '435005714488-ABNO33052620'}, + {'account_number': 'NL46ABNA0499998748', + 'amount': -594.05, + 'date': '2014-01-05', + 'name': 'Direct debit S14 0410 AC07 Rek.nummer blokkade TESTBANK/NL/20141229/01206408', + 'note': 'Direct Debit S14 0410', + 'partner_name': 'Test Customer', + 'ref': 'TESTBANK/NL/20141229/01206408'}, + {'account_number': 'NL69ABNA0522123643', + 'amount': 1405.31, + 'date': '2014-01-05', + 'name': '#RD PARTY MEDIA CUSNO 90782 4210773', + 'note': 'INNDNL2U20140105000217200000708', + 'partner_name': '3rd party Media', + 'ref': '115'}]}]) diff --git a/account_bank_statement_import_camt_oca/test_files/test-camt053 b/account_bank_statement_import_camt_oca/test_files/test-camt053 new file mode 100644 index 0000000..4a2a047 --- /dev/null +++ b/account_bank_statement_import_camt_oca/test_files/test-camt053 @@ -0,0 +1,241 @@ + + + + TESTBANK/NL/1420561226673 + 2014-01-06T16:20:26.673Z + + + 1234Test/1 + 2 + 2014-01-06T16:20:26.673Z + + 2014-01-05T00:00:00.000Z + 2014-01-05T23:59:59.999Z + + + + NL77ABNA0574908765 + + Example company + + + ABNANL2A + + + + + + + OPBD + + + 15568.27 + CRDT +
+
2014-01-05
+ +
+ + + + CLBD + + + 15121.12 + CRDT +
+
2014-01-05
+ +
+ + 754.25 + DBIT + BOOK + +
2014-01-05
+
+ +
2014-01-05
+
+ + + PMNT + + RDDT + ESDD + + + + EI + + + + + + INNDNL2U20141231000142300002844 + 435005714488-ABNO33052620 + 1880000341866 + + + + 754.25 + + + + + INSURANCE COMPANY TESTX + + TEST STREET 20 + 1234 AB TESTCITY + NL + + + + + NL46ABNA0499998748 + + + + + + + ABNANL2A + + + + + Insurance policy 857239PERIOD 01.01.2014 - 31.12.2014 + + MKB Insurance 859239PERIOD 01.01.2014 - 31.12.2014 + + +
+ + 594.05 + DBIT + true + BOOK + +
2014-01-05
+
+ +
2014-01-05
+
+ + + PMNT + + IDDT + UPDD + + + + EIST + + + + + + TESTBANK/NL/20141229/01206408 + TESTBANK/NL/20141229/01206408 + NL22ZZZ524885430000-C0125.1 + + + + 564.05 + + + + + Test Customer + + NL + + + + + NL46ABNA0499998748 + + + + + + + ABNANL2A + + + + + Direct Debit S14 0410 + + + + AC06 + + + Direct debit S14 0410 AC07 Rek.nummer blokkade TESTBANK/NL/20141229/01206408 + + +
+ + 1405.31 + CRDT + BOOK + +
2014-01-05
+
+ +
2014-01-05
+
+ + + PMNT + + RCDT + ESCT + + + + ET + + + + + + INNDNL2U20140105000217200000708 + 115 + + + + 1405.31 + + + + + 3rd party Media + + SOMESTREET 570-A + 1276 ML HOUSCITY + NL + + + + + NL69ABNA0522123643 + + + + + + + ABNANL2A + + + + #RD PARTY MEDIA CUSNO 90782 4210773 + + +
+
+
+
diff --git a/account_bank_statement_import_camt_oca/test_files/test-camt053-txdtls b/account_bank_statement_import_camt_oca/test_files/test-camt053-txdtls new file mode 100644 index 0000000..cf7c38f --- /dev/null +++ b/account_bank_statement_import_camt_oca/test_files/test-camt053-txdtls @@ -0,0 +1,214 @@ + + + + + 20170323312345678900000 + 2017-03-23T14:47:00 + + 1 + true + + Test + + + 20170323123456789012345 + 58 + 2017-03-23T14:47:00 + + 2017-03-23T00:00:00 + 2017-03-23T23:59:59 + + + + CH1111000000123456789 + + + Open Net S. à r.l. Prilly + + + + + + OPBD + + + 75960.15 + CRDT +
+
2017-03-22
+ +
+ + + + CLBD + + + 79443.15 + CRDT +
+
2017-03-23
+ +
+ + 012345678 + 3483.00 + CRDT + false + BOOK + +
2017-03-22
+
+ +
2017-03-23
+
+ 20170323001234567891234567891234 + + + PMNT + + RCDT + VCOM + + + + + + 2 + + + + 123456CHCAFEBABE + + 01 + 123456CHCAFEBABE + + + 2187.00 + CRDT + + + PMNT + + RCDT + AUTT + + + + + + Banque Cantonale Vaudoise + + Place Saint-François + 14 + 1003 + Lausanne + CH1 + + + + + CH2222000000123456789 + + + + + + + POFICHBEXXX + POSTFINANCE AG + + MINGERSTRASSE 20 + 3030 BERNE + + + + + + + + + + ISR Reference + + + 302388292000011111111111111 + + ?REJECT?0 + + + + 2017-03-22T20:00:00 + + + + + 123456CHCAFEBABE + + 01 + 123456CHCAFEBABE + + + 1296.00 + CRDT + + + PMNT + + RCDT + AUTT + + + + + + Banque Cantonale Vaudoise + + Place Saint-François + 14 + 1003 + Lausanne + CH2 + + + + + CH3333000000123456789 + + + + + + + POFICHBEYYY + POSTFINANCE AG + + MINGERSTRASSE 20 + 3030 BERNE + + + + + + + + + + ISR Reference + + + 302388292000022222222222222 + + ?REJECT?0 + + + + 2017-03-22T20:00:00 + + + + CRÉDIT GROUPÉ BVR TRAITEMENT DU 22.03.2017 NUMÉRO CLIENT 01-70884-3 PAQUET ID: 123456CHCAFEBABE +
+
+
+
diff --git a/account_bank_statement_import_camt_oca/test_files/test-camt053.zip b/account_bank_statement_import_camt_oca/test_files/test-camt053.zip new file mode 100644 index 0000000000000000000000000000000000000000..ccf5b3c2ba72ad03cc137edcf2ee55f67b7a2952 GIT binary patch literal 3111 zcmeH}=T{S08pZ=5FccF7R764P14xk;5EP_{0RmY=5O4w{AVr!$C=oHlAWJhyReBE! zAqJ!U#$s;Q+O;qQmC7X$#CFp;S53XKp3 z@bIyK0Kng`kJ*<4=k&#UW|xqT(@Tov5YUyorl#QtnL>GL823Dkl9(M6fc0cI%(|Ni z6Q^GLcu71wsM2}%?CvjH!8b!s<&9$V%#|&29fp7$*Z6H3|gs9r@Iab`}w zn70^AGxt!43sw21&ugEeu5!s zB=aSvS|O$Bs(_1W`3N!7kW{?C+9uvd?a-AuvRv(>X!goeIdlV;b{mCeyP1vK$0=9p zhvGziT|Owbw0q_obsli0rv4Sr^-c(wMC`04QcZhDwWKHp@XFHQlHEbhsWMKSBZZOw zA}>C4#%A3WrP-sj`HDO4lA-;!yrBVX&3%#eOMKMU@+IV(nv7lhYS%{;$3{6@D@-?8 zj%$0W-f~sSJ^sQi^P9;MO$$IZFznJn;)6b5Ft;O?XIp3Wvr?Mxgx4Co_F1d*^z6>W z16A~WLf`!H5cIp~GA4ZCR{`G`WEw$zws*gec}$;&fZM zo5o5(B`9uG=!A2Ina*WDMms&g&>^6!qHt5;GqTVR1>*Ec+Z)I*wlOs-1v{7k(SD7cx&3TX>4UUU|z4aL*H}d*MEMlY`)`QpML{Lh>UZ>Y$ z#RRHb?tB{p^?Uws=MQd|l>2$Th%nhp47tF`Rx7B!RoxbGo{x9Ijt)~YQ+V444% zPzs&KG$xTJ)T2(Qz^8|QRB}mXgGS2uVz8>+^ZoN75^~j6MqhVW51<$wUzWDyF|J1 zirME@jT#|^OHAAz3aV0H+~Jxv^`tk-VY6f-Rl*g=@Y-F-Ba{e9gU80nOv-XmG14&C zV(E)5%on5Y=I7h_Gab0duA42{ST}8V<9on@o5adK;Lj4$TmL;iTZRlaNcE zF1&6LTv;hka~iWF8};~H>r~tMthOl-2An0f&eCUPY+h! z>c3ZOHlMoCRY`(}DnQqY19eBIViuA`HhKm_r5I4{dR+8rdB$SfS*>Oa_D7-8&b&W) z{U@*guX)YGD-Hakf-SLEya527J(Uu_PrqBYLI0@RzhO7R`d`NX9R>ex{Ae#A{?quM b!LVoiJE4HE2JwIY3-8{k*?V1uzi)p7q~E=A literal 0 HcmV?d00001 diff --git a/account_bank_statement_import_camt_oca/tests/__init__.py b/account_bank_statement_import_camt_oca/tests/__init__.py new file mode 100644 index 0000000..5198b77 --- /dev/null +++ b/account_bank_statement_import_camt_oca/tests/__init__.py @@ -0,0 +1,4 @@ +"""Test import of bank statement for camt.053.""" +# © 2013-2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_import_bank_statement diff --git a/account_bank_statement_import_camt_oca/tests/test_import_bank_statement.py b/account_bank_statement_import_camt_oca/tests/test_import_bank_statement.py new file mode 100644 index 0000000..d96b051 --- /dev/null +++ b/account_bank_statement_import_camt_oca/tests/test_import_bank_statement.py @@ -0,0 +1,127 @@ +"""Run test to import camt.053 import.""" +# © 2013-2016 Therp BV +# Copyright 2017 Open Net Sàrl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import base64 +import difflib +import pprint +import tempfile + + +from odoo.tests.common import TransactionCase +from odoo.modules.module import get_module_resource + + +class TestParser(TransactionCase): + """Tests for the camt parser itself.""" + def setUp(self): + super(TestParser, self).setUp() + self.parser = self.env['account.bank.statement.import.camt.parser'] + + def _do_parse_test(self, inputfile, goldenfile): + testfile = get_module_resource( + 'account_bank_statement_import_camt_oca', + 'test_files', + inputfile, + ) + with open(testfile, 'rb') as data: + res = self.parser.parse(data.read()) + with tempfile.NamedTemporaryFile(mode='w+', + suffix='.pydata') as temp: + pprint.pprint(res, temp, width=160) + goldenfile_res = get_module_resource( + 'account_bank_statement_import_camt_oca', + 'test_files', + goldenfile, + ) + with open(goldenfile_res, 'r') as golden: + temp.seek(0) + diff = list( + difflib.unified_diff(golden.readlines(), + temp.readlines(), + golden.name, + temp.name)) + if len(diff) > 2: + self.fail( + "actual output doesn't match expected " + + "output:\n%s" % + "".join(diff)) + + def test_parse(self): + self._do_parse_test( + 'test-camt053', + 'golden-camt053.pydata') + + def test_parse_txdtls(self): + self._do_parse_test( + 'test-camt053-txdtls', + 'golden-camt053-txdtls.pydata') + + +class TestImport(TransactionCase): + """Run test to import camt import.""" + transactions = [ + { + 'account_number': 'NL46ABNA0499998748', + 'amount': -754.25, + 'date': '2014-01-05', + 'ref': '435005714488-ABNO33052620', + }, + ] + + def setUp(self): + super(TestImport, self).setUp() + bank = self.env['res.partner.bank'].create({ + 'acc_number': 'NL77ABNA0574908765', + 'partner_id': self.env.ref('base.main_partner').id, + 'company_id': self.env.ref('base.main_company').id, + 'bank_id': self.env.ref('base.res_bank_1').id, + }) + self.env['account.journal'].create({ + 'name': 'Bank Journal - (test camt)', + 'code': 'TBNKCAMT', + 'type': 'bank', + 'bank_account_id': bank.id, + }) + + def test_statement_import(self): + """Test correct creation of single statement.""" + testfile = get_module_resource( + 'account_bank_statement_import_camt_oca', + 'test_files', + 'test-camt053', + ) + with open(testfile, 'rb') as datafile: + action = self.env['account.bank.statement.import'].create({ + 'data_file': base64.b64encode(datafile.read()) + }).import_file() + + for statement in self.env['account.bank.statement'].browse( + action['context']['statement_ids'] + ): + self.assertTrue(any( + all( + line[key] == self.transactions[0][key] + for key in ['amount', 'date', 'ref'] + ) and + line.bank_account_id.acc_number == + self.transactions[0]['account_number'] + for line in statement.line_ids + )) + + def test_zip_import(self): + """Test import of multiple statements from zip file.""" + testfile = get_module_resource( + 'account_bank_statement_import_camt_oca', + 'test_files', + 'test-camt053.zip', + ) + with open(testfile, 'rb') as datafile: + action = self.env['account.bank.statement.import'].create({ + 'data_file': base64.b64encode(datafile.read()), + }).import_file() + + for statement in self.env['account.bank.statement'].browse( + action['context']['statement_ids'] + ): + self.assertTrue(statement.line_ids) diff --git a/account_bank_statement_import_camt_oca/views/account_bank_statement_import.xml b/account_bank_statement_import_camt_oca/views/account_bank_statement_import.xml new file mode 100644 index 0000000..92d3c08 --- /dev/null +++ b/account_bank_statement_import_camt_oca/views/account_bank_statement_import.xml @@ -0,0 +1,13 @@ + + + + account.bank.statement.import + + +
    +
  • CAMT
  • +
  • zipped CAMT
  • +
+
+
+