diff --git a/datev_import_csv_dtvf/README.rst b/datev_import_csv_dtvf/README.rst new file mode 100644 index 00000000..e9f97bb6 --- /dev/null +++ b/datev_import_csv_dtvf/README.rst @@ -0,0 +1,143 @@ +============================ +Account Move CSV Import DTVF +============================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:710f6da6ad52c0b309c445f855811937e8c6715aa79f31fbbf7af6a5caed124e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fl10n--germany-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-germany/tree/14.0/datev_import_csv_dtvf + :alt: OCA/l10n-germany +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-germany-14-0/l10n-germany-14-0-datev_import_csv_dtvf + :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/l10n-germany&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +DATEV Format .csv Import +======================== + +The module "datev_import_csv_dtvf" enables the import of DATEV journal entries into Odoo. +Possible use cases include: + +- DATEV journal entries from payroll and salary accounting +- DATEV journal entries in the context of annual financial statements +- DATEV journal entries in the context of reallocations by the tax consultant +- DATEV journal entries in the context of depreciation (AfA) bookings by the tax consultant +- DATEV journal entries in the context of loans + +Currently, the following limitations exist: + +- DATEV journal entries containing tax-related booking keys require adjustments in Odoo +- Under certain circumstances, DATEV journal entries on creditor and debtor accounts may also be affected. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Import from DATEV into Odoo +=========================== + +Requirements +~~~~~~~~~~~~ + +#. Make sure your user has group 'Full accounting features' +#. Check if the file you want to import into Odoo is DATEV format .csv (move lines start is line 3) +#. Check the description in order to check if your use case is supported +#. Take care of the limitation to import account moves with taxes + + +DATEV Import +~~~~~~~~~~~~~ + +#. Go to `Accounting/Actions/DATEV Import` + +#. Upload your DATEV format .csv file from your tax advisor + +#. Take care the file format is "DATEV Format .csv" (old version: Generic CSV) + +#. Take care your file encoding fits to the provided file (usually "Western (Windows-1252)"), if it is the original file from your tax advisor + +#. Optionally you may activate "Post Journal Entry" in order to immidiately confirm the created Journal Entry + +#. Select the mandatory journal (f.e. "Payroll Account Moves"), usually the journal type will be "Miscellaneous" + +#. Enter optionally the "Force Date" field ((will be the field "Date" in your Journal Entry) + +#. Enter the mandatory field "Reference" (will be the field "Reference" in your Journal Entry) + +#. Enter optionally the field "Force Label" (will be the field "Name" in your Journal Items) + +#. Finally click on "Run Import" + + +.. image:: https://raw.githubusercontent.com/OCA/l10n-germany/14.0/datev_import_csv_dtvf/static/description/datev_import_csv_wizard.png + :width: 100% + + +If everyting works fine, you should now see your created Journal Entry in draft (execept you activated "Post Journal Entry") + + +Typical issue +~~~~~~~~~~~~~ + +If accounts doesen't exist in Odoo the wizard may interrupt and show you potential missing accounts. + + +.. image:: https://raw.githubusercontent.com/OCA/l10n-germany/14.0/datev_import_csv_dtvf/static/description/datev_import_csv_wizard_error.png + :width: 100% + +In this case you have to ensure to create the missing accounts in Odoo. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Contributors +~~~~~~~~~~~~ + +* Holger Brunn (https://hunki-enterprises.com) + +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/l10n-germany `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/datev_import_csv_dtvf/__init__.py b/datev_import_csv_dtvf/__init__.py new file mode 100644 index 00000000..9b429614 --- /dev/null +++ b/datev_import_csv_dtvf/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/datev_import_csv_dtvf/__manifest__.py b/datev_import_csv_dtvf/__manifest__.py new file mode 100644 index 00000000..c5265ad6 --- /dev/null +++ b/datev_import_csv_dtvf/__manifest__.py @@ -0,0 +1,20 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Account Move CSV Import DTVF", + "summary": "Import account moves generated by external software", + "author": "Odoo Community Association (OCA)", + "version": "14.0.1.0.0", + "category": "Accounting", + "depends": ["account"], + "website": "https://github.com/OCA/l10n-germany", + "demo": [], + "external_dependencies": {"python": ["unicodecsv"]}, + "data": [ + "security/ir.model.access.csv", + "data/sequence.xml", + "wizard/import_move_view.xml", + ], + "installable": True, + "auto_install": False, + "license": "AGPL-3", +} diff --git a/datev_import_csv_dtvf/data/sequence.xml b/datev_import_csv_dtvf/data/sequence.xml new file mode 100644 index 00000000..64ad37ce --- /dev/null +++ b/datev_import_csv_dtvf/data/sequence.xml @@ -0,0 +1,12 @@ + + + + + Account Move Import + account.move.import + IMPORT + 3 + + + + diff --git a/datev_import_csv_dtvf/examples/datev_export.csv b/datev_import_csv_dtvf/examples/datev_export.csv new file mode 100644 index 00000000..2f5c69c9 --- /dev/null +++ b/datev_import_csv_dtvf/examples/datev_export.csv @@ -0,0 +1,100 @@ +EXTF,700,22,Buchungsstapel,12,20230417083808874,,,,,12345,1234,20220101,4,20221201,20221231,Buchungsstapel 20220101,MM,1,,,EUR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Umsatz (ohne Soll/Haben-Kz),Soll/Haben-Kennzeichen,WKZ Umsatz,Kurs,Basis-Umsatz,WKZ Basis-Umsatz,Konto,Gegenkonto (ohne BU-Schlüssel),BU-Schlüssel,Belegdatum,Belegfeld 1,Belegfeld 2,Skonto,Buchungstext,Postensperre,Diverse Adressnummer,Geschäftspartnerbank,Sachverhalt,Zinssperre,Beleglink,Beleginfo - Art 1,Beleginfo - Inhalt 1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"0,01",H,,,,,4900,1588,,3112,MISC/2022/12/990001,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,2123e4a7-c837-4c0a-93e7-b66f59f5facc,,,0,,,,,,,,1,,,,1,,,,0 +10000,H,,,,,1210,0731,,3112,MISC/2022/12/990002,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,b8353f4a-a980-4057-a169-60b07f2cab4a,,,0,,,,,,,,1,,,,0,,,,0 +900,H,,,,,2735,0974,,3112,MISC/2022/12/990003,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,f9998b58-e899-4974-b472-766423f12aec,,,0,,,,,,,,1,,,,0,,,,0 +10000,S,,,,,1202,0731,,3112,MISC/2022/12/990004,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,201b0c44-0a7b-497a-898f-b44723ff4c5b,,,0,,,,,,,,1,,,,1,,,,0 +"3950,49",H,,,,,2735,0965,,3112,MISC/2022/12/990005,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,8e85a4e8-5f49-4913-973d-594657d546b4,,,0,,,,,,,,1,,,,0,,,,0 +50000,H,,,,,8977,7095,,3112,MISC/2022/12/990006,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,ed06dfc4-ab45-4300-b16f-446b73b813e9,,,0,,,,,,,,1,,,,0,,,,0 +"433,97",H,,,,,0731,1200,,3112,MISC/2022/12/990007,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,2f94abc0-f6c9-4291-846a-d63fe8451365,,,0,,,,,,,,1,,,,1,,,,0 +"433,97",H,,,,,1200,2114,,3112,MISC/2022/12/990008,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,ea7e2b3a-bf4c-4bea-8db3-9ece469c862f,,,0,,,,,,,,1,,,,0,,,,0 +"618,9",H,,,,,0731,1200,,3112,MISC/2022/12/990009,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,2356cdac-00b1-41fd-a413-3410d56e9b53,,,0,,,,,,,,1,,,,1,,,,0 +"618,9",H,,,,,1200,2114,,3112,MISC/2022/12/990010,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,5e1c97d0-ed2d-49bd-90a2-122c6e133be6,,,0,,,,,,,,1,,,,0,,,,0 +"678,08",H,,,,,0731,1200,,3112,MISC/2022/12/990011,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,0e758efe-d8d0-4a1c-b696-8fc0382599d2,,,0,,,,,,,,1,,,,1,,,,0 +"678,08",H,,,,,1200,2114,,3112,MISC/2022/12/990012,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,2d7c23e9-18e4-4eee-b7ac-9842da3b93bd,,,0,,,,,,,,1,,,,0,,,,0 +579,H,,,,,0980,4930,,3112,MISC/2022/12/990013,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,8fe6e1b5-f3e9-4bbb-98c8-59b9c381779e,,,0,,,,,,,,1,,,,0,,,,0 +2304,H,,,,,0980,4930,,3112,MISC/2022/12/990014,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,918fac41-5e9b-435c-8eb8-a17688c857f0,,,0,,,,,,,,1,,,,0,,,,0 +2306,H,,,,,0980,4167,,3112,MISC/2022/12/990015,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,1c5662b7-69e7-4e43-941f-b4e4fb743da2,,,0,,,,,,,,1,,,,0,,,,0 +2134,H,,,,,0980,4167,,3112,MISC/2022/12/990016,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,244255bf-7964-436b-a29a-f2db6121ad12,,,0,,,,,,,,1,,,,0,,,,0 +1055,H,,,,,0980,4167,,3112,MISC/2022/12/990017,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,64e32284-271d-4c20-8ca4-8f97b8106a56,,,0,,,,,,,,1,,,,0,,,,0 +892,H,,,,,0980,4360,,3112,MISC/2022/12/990018,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,26951b3a-7e1e-49e0-94e0-210c6134b81f,,,0,,,,,,,,1,,,,0,,,,0 +1283,H,,,,,0980,4360,,3112,MISC/2022/12/990019,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,15073479-d72f-44e9-aeea-b1cf942690b1,,,0,,,,,,,,1,,,,0,,,,0 +"2179,87",H,,,,,0980,4360,,3112,MISC/2022/12/990020,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,f6d10ec3-0562-4220-b717-2656c1837df5,,,0,,,,,,,,1,,,,0,,,,0 +"1366,58",H,,,,,0980,4360,,3112,MISC/2022/12/990021,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,5fe25876-a6ea-44ca-8200-a9b7d1ff3b6c,,,0,,,,,,,,1,,,,0,,,,0 +"141,37",S,,,,,4360,1610,,3112,MISC/2022/12/990022,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,70313b37-fc10-4e81-9c0f-be9f08f28401,,,0,,,,,,,,1,,,,1,,,,0 +"141,37",H,,,,,4360,1610,,3112,MISC/2022/12/990023,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,9af74142-7e9b-414b-b659-a1165c41346b,,,0,,,,,,,,1,,,,0,,,,0 +"1366,58",H,,,,,4360,0980,,3112,MISC/2022/12/990024,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,eee3358c-7a1b-4f10-bd48-5ab4e258337a,,,0,,,,,,,,1,,,,0,,,,0 +"2179,87",H,,,,,4360,0980,,3112,MISC/2022/12/990025,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,7944efbb-0f89-4018-8f54-8e3aa4257733,,,0,,,,,,,,1,,,,0,,,,0 +733,H,,,,,4520,0980,,3112,MISC/2022/12/990026,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,b5acc52d-9806-4e53-93be-68368a581976,,,0,,,,,,,,1,,,,0,,,,0 +"921,25",H,,,,,4520,0980,,3112,MISC/2022/12/990027,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,48112951-c498-452d-9d58-e37ad704ed94,,,0,,,,,,,,1,,,,0,,,,0 +10,H,,,,,4580,1610,,3112,MISC/2022/12/990028,101120,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a77f49ec-04c6-40b3-a7da-4335ff8defd9,,,0,,,,,,,,1,,,,1,,,,0 +10,H,,,,,1610,4655,,3112,MISC/2022/12/990029,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a758e088-9403-47d9-a9c2-f650a632e2b3,,,0,,,,,,,,1,,,,0,,,,0 +"969,91",H,,,,,4651,4653,,3112,MISC/2022/12/990030,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,47af40f2-3d5f-4db6-a3f2-cc0bd4dec60b,,,0,,,,,,,,1,,,,0,,,,0 +"190,37",S,,,,,1610,4666,,3112,MISC/2022/12/990031,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,0aa1f4df-6455-42c2-b6e2-125695c8f4b9,,,0,,,,,,,,1,,,,1,,,,0 +"190,37",H,,,,,1610,4663,,3112,MISC/2022/12/990032,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,d438fc44-3318-4310-bcc1-1e5e251221e0,,,0,,,,,,,,1,,,,0,,,,0 +210,S,,,,,4930,1610,,3112,MISC/2022/12/990033,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,ded0b449-08b2-45a4-b939-43c09202e4e4,,,0,,,,,,,,1,,,,1,,,,0 +188,H,,,,,4510,0980,,3112,MISC/2022/12/990034,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,737d8d48-cde4-4b36-bac5-aba6a29cf6b1,,,0,,,,,,,,1,,,,0,,,,0 +"99,63",H,,,,,4650,4654,,3112,MISC/2022/12/990035,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,d676b254-326c-4f2d-9c6c-e95d13be3af7,,,0,,,,,,,,1,,,,0,,,,0 +515,H,,,,,0980,4930,,3112,MISC/2022/12/990036,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,787bc4db-643e-4efe-a457-e1ccaf49558d,,,0,,,,,,,,1,,,,0,,,,0 +5000,S,,,,,8200,1200,,3112,MISC/2022/12/990037,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,bde12aa9-f955-44b3-b3a3-ee52e5f79c18,,,0,,,,,,,,1,,,,1,,,,0 +5000,S,,,,,1200,2709,,3112,MISC/2022/12/990038,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,d2449037-b965-4f60-999b-af3d08001922,,,0,,,,,,,,1,,,,0,,,,0 +6000,S,,,,,8339,1410,,3112,MISC/2022/12/990039,281120,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,GB106487414,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S105030,,0,,,,0,JA,24c91e80-2953-4f59-af6e-258da2309f71,,,0,,,,,,,,1,,,,1,,,,0 +6000,H,,,,,8125,1410,,3112,MISC/2022/12/990040,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,GB106487414,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,e556f44a-084d-49a0-aa6e-919f2611524d,,,0,,,,,,,,1,,,,0,,,,0 +7000,S,,,,,8339,1410,,3112,MISC/2022/12/990041,281120,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S105030,,0,,,,0,JA,61224e01-38bb-4614-9ea6-e63607f97cd3,,,0,,,,,,,,1,,,,1,,,,0 +7000,H,,,,,8125,1410,,3112,MISC/2022/12/990042,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,GB106487414,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,14bfa00d-cfad-4719-90b5-1c1c7c699ef2,,,0,,,,,,,,1,,,,0,,,,0 +8000,S,,,,,8339,1410,,3112,MISC/2022/12/990043,130121,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S105600,,0,,,,0,JA,4047af57-0ad5-4deb-844a-084dbc8ec3fc,,,0,,,,,,,,1,,,,1,,,,0 +8000,H,,,,,8125,1410,,3112,MISC/2022/12/990044,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,GB106487414,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,be453309-72fb-44e6-b92c-b49b95a662d5,,,0,,,,,,,,1,,,,0,,,,0 +"743,04",H,,,,,1500,4900,,3112,MISC/2022/12/990045,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,06316c78-2d18-4874-aa95-4db047b88911,,,0,,,,,,,,1,,,,0,,,,0 +40,H,,,,,1590,1610,,3112,MISC/2022/12/990046,170720,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,56323c4f-be39-42d0-93d4-92e2b541ac76,,,0,,,,,,,,1,,,,1,,,,0 +40,H,,,,,1610,4900,,3112,MISC/2022/12/990047,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,246b2474-b3cc-4ce7-abe7-c9e24b5764d4,,,0,,,,,,,,1,,,,0,,,,0 +"2179,76",S,,,,,1740,1590,,3112,MISC/2022/12/990048,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,97fe0258-d2a1-4e8f-a779-42ec98679e9f,,,0,,,,,,,,1,,,,1,,,,0 +"2179,76",H,,,,,1740,4120,,3112,MISC/2022/12/990049,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,43fd187c-4a1e-4153-b68d-4a9c3de0acca,,,0,,,,,,,,1,,,,0,,,,0 +"0,17",H,,,,,1590,4120,,3112,MISC/2022/12/990050,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,067c3bbf-b660-40b9-97b9-ef3df2de31c3,,,0,,,,,,,,1,,,,0,,,,0 +"2522,26",H,,,,,1240,2150,,3112,MISC/2022/12/990051,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,dfdd673a-73e6-432e-bbba-e85af295c2df,,,0,,,,,,,,1,,,,0,,,,0 +"7272,88",H,,,,,2712,1502,,3112,MISC/2022/12/990052,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,1042f4b0-4154-4f50-9dd7-2908a020eebc,,,0,,,,,,,,1,,,,0,,,,0 +"6989,64",H,,,,,2712,1503,,3112,MISC/2022/12/990053,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,cd2400e2-7a25-4569-bbe2-f804d1587a5c,,,0,,,,,,,,1,,,,0,,,,0 +"12,4",S,,,,,1210,1010,,3112,MISC/2022/12/990054,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,70581441-1c13-4b4a-91fc-99c8c5d8e1a9,,,0,,,,,,,,1,,,,0,,,,0 +"3351,48",H,,,,,4138,1610,,3112,MISC/2022/12/990055,230520,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,7117dcbb-85af-4904-b791-33cfbbd771f2,,,0,,,,,,,,1,,,,1,,,,0 +"3351,48",H,,,,,1610,1700,,3112,MISC/2022/12/990056,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,0eae8f88-8bba-43d1-9796-8aa9ef0d7d98,,,0,,,,,,,,1,,,,0,,,,0 +3,S,,,,,4900,1200,,3112,MISC/2022/12/990057,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a906986c-722c-472e-9539-6c4e4ac714b2,,,0,,,,,,,,1,,,,0,,,,0 +"13,93",H,,,,,4900,1010,,3112,MISC/2022/12/990058,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,2a176a17-8c41-477b-bae5-3d3330c06456,,,0,,,,,,,,1,,,,0,,,,0 +"5,94",H,,,,,1610,1576,,3112,MISC/2022/12/990059,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,271af3b5-3467-4397-b23f-b5f49f27c03d,,,0,,,,,,,,1,,,,0,,,,0 +3300,H,,,,,1610,4138,,3112,MISC/2022/12/990060,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,05987251-1ad4-4009-9e34-108225636217,,,0,,,,,,,,1,,,,0,,,,0 +"2516,7",H,,,,,4160,1610,,3112,MISC/2022/12/990061,201020,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,f87f1ce7-375f-41bd-a8c1-05adbf2ada2b,,,0,,,,,,,,1,,,,1,,,,0 +"2328,16",H,,,,,4160,1610,,3112,MISC/2022/12/990062,201020,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,758e1c98-c2fb-43eb-bf1c-eb95538bfa94,,,0,,,,,,,,1,,,,1,,,,0 +"1151,62",H,,,,,4160,1610,,3112,MISC/2022/12/990063,201020,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,9b86e51e-eed1-4b0c-97e6-cae5b026ae16,,,0,,,,,,,,1,,,,1,,,,0 +"2516,7",H,,,,,1610,4167,,3112,MISC/2022/12/990064,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,344be5d6-32c0-45c4-9a7a-853ac3ff020f,,,0,,,,,,,,1,,,,0,,,,0 +"2328,16",H,,,,,1610,4167,,3112,MISC/2022/12/990065,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,df3fe6a4-c0f4-4875-adb9-f70940e19520,,,0,,,,,,,,1,,,,0,,,,0 +"1151,62",H,,,,,1610,4167,,3112,MISC/2022/12/990066,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,5eebe54a-faa1-4bef-8dbb-c1ade63d4ebe,,,0,,,,,,,,1,,,,0,,,,0 +2097,H,,,,,4167,0980,,3112,MISC/2022/12/990067,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,c73d4b45-6245-4c63-a4a8-c124017e0f26,,,0,,,,,,,,1,,,,0,,,,0 +1940,H,,,,,4167,0980,,3112,MISC/2022/12/990068,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,9860d616-9050-47f5-88a4-52f2c87bf3a3,,,0,,,,,,,,1,,,,0,,,,0 +959,H,,,,,4167,0980,,3112,MISC/2022/12/990069,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,17ad8b09-c868-442e-840c-98cf8124012e,,,0,,,,,,,,1,,,,0,,,,0 +"271,36",S,,,,,4110,1200,,3112,MISC/2022/12/990070,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,de72855d-67dc-465d-ab21-92d8a64efa9e,,,0,,,,,,,,1,,,,1,,,,0 +"271,36",S,,,,,1200,2709,,3112,MISC/2022/12/990071,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,0c22829f-5a0d-42ae-9ed1-16ed639e36aa,,,0,,,,,,,,1,,,,0,,,,0 +"30782,11",S,,,,,1789,1780,,3112,MISC/2022/12/990072,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,415448a3-6ad7-4720-9f0c-9448275a6ccb,,,0,,,,,,,,1,,,,1,,,,0 +"30782,11",H,,,,,1789,1200,,3112,MISC/2022/12/990073,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,8d638284-bd75-497d-a596-354adef1f06a,,,0,,,,,,,,1,,,,1,,,,0 +"30782,11",H,,,,,1200,1790,,3112,MISC/2022/12/990074,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,9a57084e-8bea-4e16-bc64-82f44c802a61,,,0,,,,,,,,1,,,,0,,,,0 +"3517,27",H,,,,,1789,1780,,3112,MISC/2022/12/990075,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,7d4a5826-d772-4d7b-a476-a30b899b62ff,,,0,,,,,,,,1,,,,0,,,,0 +"26602,52",H,,,,,1789,1200,,3112,MISC/2022/12/990076,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,59b85686-03fe-4300-bf33-2463ecaf5f9d,,,0,,,,,,,,1,,,,1,,,,0 +"26602,52",H,,,,,1200,1780,,3112,MISC/2022/12/990077,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,97508a7d-1a24-4672-8d12-9269b4d38f4e,,,0,,,,,,,,1,,,,0,,,,0 +"3739,01",H,,,,,1789,1200,,3112,MISC/2022/12/990078,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,9ffb8a71-68d8-4ce8-82cd-6695d07260c7,,,0,,,,,,,,1,,,,1,,,,0 +"3739,01",H,,,,,1200,1780,,3112,MISC/2022/12/990079,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,dfd7e07a-5073-4a03-9701-52b0c13901b8,,,0,,,,,,,,1,,,,0,,,,0 +"15039,37",H,,,,,1789,1200,,3112,MISC/2022/12/990080,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,645914a3-0e10-44c1-9827-836b0bc80f4e,,,0,,,,,,,,1,,,,1,,,,0 +"15039,37",H,,,,,1200,1780,,3112,MISC/2022/12/990081,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,de61be72-3c06-4b4f-97c4-bc9deede0209,,,0,,,,,,,,1,,,,0,,,,0 +"4406,62",H,,,,,1789,1200,,3112,MISC/2022/12/990082,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,cececb2b-dbd0-4a74-8254-b8275c1013c2,,,0,,,,,,,,1,,,,1,,,,0 +"4406,62",H,,,,,1200,1780,,3112,MISC/2022/12/990083,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,acd026e4-1ab2-4938-a195-319d675fc6e4,,,0,,,,,,,,1,,,,0,,,,0 +"6534,63",S,,,,,1789,1741,,3112,MISC/2022/12/990084,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,c20b3331-6b03-4996-ba7b-92e2053c0d93,,,0,,,,,,,,1,,,,1,,,,0 +"588,36",S,,,,,1789,1741,,3112,MISC/2022/12/990085,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a4cbd0b2-e24f-4c05-9660-067f4758d63c,,,0,,,,,,,,1,,,,1,,,,0 +"1790,12",S,,,,,1789,1741,,3112,MISC/2022/12/990086,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a1537b96-da3a-49b8-816c-d4c5b81e260a,,,0,,,,,,,,1,,,,1,,,,0 +"588,36",H,,,,,1780,1741,,3112,MISC/2022/12/990087,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,141a343c-e606-419f-bcde-e3593a490261,,,0,,,,,,,,1,,,,0,,,,0 +"6534,63",H,,,,,1780,1741,,3112,MISC/2022/12/990088,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,43d5bd48-c8af-4ca3-a7c3-ec0ae538c5ac,,,0,,,,,,,,1,,,,0,,,,0 +"1790,12",H,,,,,1780,1741,,3112,MISC/2022/12/990089,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,b920e943-8a85-4b68-a6e9-dec7b66de897,,,0,,,,,,,,1,,,,0,,,,0 +"1790,12",S,,,,,1780,1789,,3112,MISC/2022/12/990090,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,539a81ab-d5c3-4cc1-9f20-63c1ff7e8200,,,0,,,,,,,,1,,,,1,,,,0 +,S,,,,,1789,1610,,3112,MISC/2022/12/990091,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,7048db67-6e4b-49a6-8f1b-b14687e158c0,,,0,,,,,,,,1,,,,1,,,,0 +15,S,,,,,1610,4900,,3112,MISC/2022/12/990092,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,42fd144e-549a-4c5c-8d5e-dbadc45055a8,,,0,,,,,,,,1,,,,0,,,,0 +"3237,31",H,,,,,1790,1545,,3112,MISC/2022/12/990093,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,33b52173-1714-4d12-8bd1-0ae8aa00c9ce,,,0,,,,,,,,1,,,,0,,,,0 +"109,99",S,,,,,1360,3435,,3112,MISC/2022/12/990094,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,a0c480ee-f39a-4b91-8a10-9005df48cc10,,,0,,,,,,,,1,,,,1,,,,0 +"109,99",H,,,,,1360,3425,,3112,MISC/2022/12/990095,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,535bd7ee-7509-4e43-a3e1-45f6f373f85d,,,0,,,,,,,,1,,,,0,,,,0 +"0,24",S,,,,,1789,8605,,3112,MISC/2022/12/990096,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,US,fd51fd16-f82f-4f1d-b633-55ad33f571ec,,,0,,,,,,,,1,,,,0,,,,0 +40,H,,,,,1750,4170,,3112,MISC/2022/12/990097,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,6e1d5031-6eb0-474c-a748-80f1d24e3395,,,0,,,,,,,,1,,,,0,,,,0 +72,H,,,,,0996,2450,,3112,MISC/2022/12/990098,,,Buchungsstapel 20220101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,0,JA,ba23453b-3a9a-42ad-9e42-b0eea65ef341,,,0,,,,,,,,1,,,,0,,,,0 diff --git a/datev_import_csv_dtvf/i18n/datev_import_csv_dtvf.pot b/datev_import_csv_dtvf/i18n/datev_import_csv_dtvf.pot new file mode 100644 index 00000000..388d84c9 --- /dev/null +++ b/datev_import_csv_dtvf/i18n/datev_import_csv_dtvf.pot @@ -0,0 +1,384 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * datev_import_csv_dtvf +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-26 10:50+0000\n" +"PO-Revision-Date: 2023-08-26 10:50+0000\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: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Columns\n" +" :" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"DateFormat\n" +" : %d/%m/%Y" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Decimal separator\n" +" : . (dot) or , (coma)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Field separator\n" +" : auto-detected" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "First Row : contains information like year" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Second Row : contains header of columns" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Text separator\n" +" : \" (quote)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Third Row : starts records of account.move" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Belegdatum (DDMM)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Buchungstext" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_line__indicator +msgid "" +"Can be used to decide Soll/Haben-Kennzeichen,to decide credit or debit entry" +" in first move line.if 'S' then fill 'Credit' value in first move line OR if" +" 'H' then 'Debit' value in first move line" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_line__import_external_id +msgid "" +"Can be used to tag imported move. Delete all importred move if need (error " +"on file imported)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Cancel" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__create_uid +msgid "Created by" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__create_date +msgid "Created on" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__date_format +msgid "Date Format" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__date_format +msgid "Date format is applicable only on Generic csv file ex \"%d%m%Y\"" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__display_name +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__display_name +msgid "Display Name" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_encoding +msgid "File Encoding" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_format +msgid "File Format" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__file_to_import +msgid "File containing the journal entry(ies) to import." +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_to_import +msgid "File to Import" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__filename +msgid "Filename" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_date +msgid "Force Date" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_line_name +msgid "Force Label" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Gegenkonto (ohne BU-Schl?ssel)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_format__genericcsv +msgid "Generic CSV" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__id +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__id +msgid "ID" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__post_move +msgid "If True, the journal entry will be posted after the import." +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.actions.act_window,name:datev_import_csv_dtvf.account_move_import_action +#: model:ir.ui.menu,name:datev_import_csv_dtvf.account_move_import_menu +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Import Account Move" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__import_external_id +msgid "Import External" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model,name:datev_import_csv_dtvf.model_account_move_import +msgid "Import account move from CSV file" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Imported Journal Entries" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__indicator +msgid "Indicator" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Information about the Generic CSV format" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_journal_id +msgid "Journal" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model,name:datev_import_csv_dtvf.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__force_journal_id +msgid "Journal in which the journal entry will be created" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Konto" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import____last_update +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__write_date +msgid "Last Updated on" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad date format %s" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad value for credit (%s)." +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad value for debit (%s)." +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: missing date." +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: missing label." +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"List of %s that don't exist in Odoo:\n" +"%s\n" +"\n" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"List of misc errors:\n" +"%s" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Note this import does not handle taxes!" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__post_move +msgid "Post Journal Entry" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_ref +msgid "Reference" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Run Import" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__file_format +msgid "Select the type of file you are importing." +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Soll/Haben-Kennzeichen" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"The journal entry that ends on line %d is not balanced (balance is %s)." +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"The journal entry that ends on the last line is not balanced (balance is " +"%s)." +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_encoding__utf-8 +msgid "UTF-8" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Umsatz (ohne Soll/Haben-Kz)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_encoding__windows-1252 +msgid "Western (Windows-1252)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "account codes" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "contra account codes" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "journal codes" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "move should have more than 1 line num: %s,data : %s" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "time data : '%s' in line %s does not match format '%s" +msgstr "" diff --git a/datev_import_csv_dtvf/i18n/de.po b/datev_import_csv_dtvf/i18n/de.po new file mode 100644 index 00000000..a8a2c573 --- /dev/null +++ b/datev_import_csv_dtvf/i18n/de.po @@ -0,0 +1,406 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * datev_import_csv_dtvf +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-26 10:50+0000\n" +"PO-Revision-Date: 2023-08-26 10:50+0000\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: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Columns\n" +" :" +msgstr "" +"Spalten\n" +" :" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"DateFormat\n" +" : %d/%m/%Y" +msgstr "" +"Datumsformat\n" +" : DDMM" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Decimal separator\n" +" : . (dot) or , (coma)" +msgstr "" +"Dezimaltrennzeichen\n" +" : . (Punkt) oder , (Komma)" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Field separator\n" +" : auto-detected" +msgstr "" +"Feldtrennzeichen\n" +" : Automatische Erkennung" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "First Row : contains information like year" +msgstr "Erste Zeile : enthält z.B. das Jahr" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Second Row : contains header of columns" +msgstr "Zweite Zeile : enthält die Spalten" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "" +"Text separator\n" +" : \" (quote)" +msgstr "" +"Texttrennzeichen\n" +" : \" (Anführungszeichen)" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Third Row : starts records of account.move" +msgstr "Dritte Zeile : erste Zeile mit Buchungszeilen" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Belegdatum (DDMM)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Buchungstext" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_line__indicator +msgid "" +"Can be used to decide Soll/Haben-Kennzeichen,to decide credit or debit entry" +" in first move line.if 'S' then fill 'Credit' value in first move line OR if" +" 'H' then 'Debit' value in first move line" +msgstr "" +"Das Soll/Haben-Kennzeichen wird genutzt,um zu entscheiden, ob die erste Zeile" +" im Soll oder Haben gebucht wird. Bei 'S' wird der Betrag der erste Zeile im 'Haben' eingetragen, bei" +" 'H' wird der Betrag im 'Soll' eingetragen." + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_line__import_external_id +msgid "" +"Can be used to tag imported move. Delete all importred move if need (error " +"on file imported)" +msgstr "" +"Kann zur Kennzeichnung der importierten Buchung genutzt werden. Lösche bei Bedarf alle importierten " +"Buchungen im Fehlerfall" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Cancel" +msgstr "Abbrechen" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__date_format +msgid "Date Format" +msgstr "Datumsformat" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__date_format +msgid "Date format is applicable only on Generic csv file ex \"%d%m%Y\"" +msgstr "Datumsformate wie \"%d%m%Y\ können nur beim DATEV Format CSV angewendet werden " + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__display_name +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__display_name +msgid "Display Name" +msgstr "Anzeige Name" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_encoding +msgid "File Encoding" +msgstr "Zeichenkodierung" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_format +msgid "File Format" +msgstr "Datei Format" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__file_to_import +msgid "File containing the journal entry(ies) to import." +msgstr "Datei enthält zu importierende Buchungssätze" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__file_to_import +msgid "File to Import" +msgstr "Import Datei" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__filename +msgid "Filename" +msgstr "Datei Name" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_date +msgid "Force Date" +msgstr "Erzwinge Datum" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_line_name +msgid "Force Label" +msgstr "Erzwinge Buchungstext" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Gegenkonto (ohne BU-Schl?ssel)" +msgstr "Gegenkonto (ohne BU-Schlüssel)" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_format__genericcsv +msgid "Generic CSV" +msgstr "DATEV Format .csv" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__id +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__id +msgid "ID" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__post_move +msgid "If True, the journal entry will be posted after the import." +msgstr "Bei Aktivierung wird nach Import direkt gebucht" + +#. module: datev_import_csv_dtvf +#: model:ir.actions.act_window,name:datev_import_csv_dtvf.account_move_import_action +#: model:ir.ui.menu,name:datev_import_csv_dtvf.account_move_import_menu +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Import Account Move" +msgstr "DATEV Import" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__import_external_id +msgid "Import External" +msgstr "Externer Import" + +#. module: datev_import_csv_dtvf +#: model:ir.model,name:datev_import_csv_dtvf.model_account_move_import +msgid "Import account move from CSV file" +msgstr "DATEV Import durch .csv Datei" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Imported Journal Entries" +msgstr "Importierte Buchungssätze" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line__indicator +msgid "Indicator" +msgstr "Indikator" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Information about the Generic CSV format" +msgstr "Informationen zum DATEV Format .csv" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_journal_id +msgid "Journal" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model,name:datev_import_csv_dtvf.model_account_move_line +msgid "Journal Item" +msgstr "Buchungssatz" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__force_journal_id +msgid "Journal in which the journal entry will be created" +msgstr "Journal in dem der Buchungssatz erstellt wird" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Konto" +msgstr "Konto" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import____last_update +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_line____last_update +msgid "Last Modified on" +msgstr "Geändert am" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__write_uid +msgid "Last Updated by" +msgstr "Aktualisiert durch" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__write_date +msgid "Last Updated on" +msgstr "Aktualisiert am" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad date format %s" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad value for credit (%s)." +msgstr "Buchungszeile %d: falsches Format %s" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: bad value for debit (%s)." +msgstr "Buchunsgzeile %d: falscher Wert im Soll %s" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: missing date." +msgstr "Buchunsgzeile %d: fehlendes Datum." + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "Line %d: missing label." +msgstr "Buchungszeile %d: fehlender Buchungstext." + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"List of %s that don't exist in Odoo:\n" +"%s\n" +"\n" +msgstr "" +"Liste der nicht existierenden %s in Odoo:\n" +"%s\n" +"\n" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"List of misc errors:\n" +"%s" +msgstr "" +"Liste der sonstigen Fehler:\n" +"%s" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Note this import does not handle taxes!" +msgstr "HINWEIS: Der Import kann aktuell keine DATEV Buchungsschlüssel verarbeiten !" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__post_move +msgid "Post Journal Entry" +msgstr "Bestätige Buchung" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,field_description:datev_import_csv_dtvf.field_account_move_import__force_move_ref +msgid "Reference" +msgstr "Referenz" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Run Import" +msgstr "Import" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields,help:datev_import_csv_dtvf.field_account_move_import__file_format +msgid "Select the type of file you are importing." +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Soll/Haben-Kennzeichen" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"The journal entry that ends on line %d is not balanced (balance is %s)." +msgstr "" +"Die Buchung mit der letzten Zeile %d ist nicht ausgegelichen (Saldo ist %s)." + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "" +"The journal entry that ends on the last line is not balanced (balance is " +"%s)." +msgstr "" +"Die Buchung mit der letzten Zeile %d ist nicht ausgegelichen (Saldo ist %s)." + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_encoding__utf-8 +msgid "UTF-8" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model_terms:ir.ui.view,arch_db:datev_import_csv_dtvf.account_move_import_form +msgid "Umsatz (ohne Soll/Haben-Kz)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: model:ir.model.fields.selection,name:datev_import_csv_dtvf.selection__account_move_import__file_encoding__windows-1252 +msgid "Western (Windows-1252)" +msgstr "" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "account codes" +msgstr "Konto" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "contra account codes" +msgstr "Gegenkonto" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "journal codes" +msgstr "Journal Kürzel" + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "move should have more than 1 line num: %s,data : %s" +msgstr "die Buchung sollte mindestens eine Zeile haben: Nummer: %s,Daten : %s " + +#. module: datev_import_csv_dtvf +#: code:addons/datev_import_csv_dtvf/wizard/import_move.py:0 +#, python-format +msgid "time data : '%s' in line %s does not match format '%s" +msgstr "Datum : '%s' in der Zeile %s passt nicht zum Format '%s" diff --git a/datev_import_csv_dtvf/models/__init__.py b/datev_import_csv_dtvf/models/__init__.py new file mode 100644 index 00000000..8795b3be --- /dev/null +++ b/datev_import_csv_dtvf/models/__init__.py @@ -0,0 +1 @@ +from . import account_move_line diff --git a/datev_import_csv_dtvf/models/account_move_line.py b/datev_import_csv_dtvf/models/account_move_line.py new file mode 100644 index 00000000..f9454caf --- /dev/null +++ b/datev_import_csv_dtvf/models/account_move_line.py @@ -0,0 +1,21 @@ +# Copyright 2017-2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + import_external_id = fields.Char( + help="Can be used to tag imported move." + " Delete all importred move if need (error on file imported)" + ) + indicator = fields.Char( + string="Indicator", + help="Can be used to decide Soll/Haben-Kennzeichen," + "to decide credit or debit entry in first move line." + "if 'S' then fill 'Credit' value in first move line OR " + "if 'H' then 'Debit' value in first move line", + ) diff --git a/datev_import_csv_dtvf/readme/CONTRIBUTORS.rst b/datev_import_csv_dtvf/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..33b6eb2c --- /dev/null +++ b/datev_import_csv_dtvf/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Holger Brunn (https://hunki-enterprises.com) diff --git a/datev_import_csv_dtvf/readme/DESCRIPTION.rst b/datev_import_csv_dtvf/readme/DESCRIPTION.rst new file mode 100644 index 00000000..df252239 --- /dev/null +++ b/datev_import_csv_dtvf/readme/DESCRIPTION.rst @@ -0,0 +1,16 @@ +DATEV Format .csv Import +======================== + +The module "datev_import_csv_dtvf" enables the import of DATEV journal entries into Odoo. +Possible use cases include: + +- DATEV journal entries from payroll and salary accounting +- DATEV journal entries in the context of annual financial statements +- DATEV journal entries in the context of reallocations by the tax consultant +- DATEV journal entries in the context of depreciation (AfA) bookings by the tax consultant +- DATEV journal entries in the context of loans + +Currently, the following limitations exist: + +- DATEV journal entries containing tax-related booking keys require adjustments in Odoo +- Under certain circumstances, DATEV journal entries on creditor and debtor accounts may also be affected. diff --git a/datev_import_csv_dtvf/readme/USAGE.rst b/datev_import_csv_dtvf/readme/USAGE.rst new file mode 100644 index 00000000..7b38179b --- /dev/null +++ b/datev_import_csv_dtvf/readme/USAGE.rst @@ -0,0 +1,53 @@ +Import from DATEV into Odoo +=========================== + +Requirements +~~~~~~~~~~~~ + +#. Make sure your user has group 'Full accounting features' +#. Check if the file you want to import into Odoo is DATEV format .csv (move lines start is line 3) +#. Check the description in order to check if your use case is supported +#. Take care of the limitation to import account moves with taxes + + +DATEV Import +~~~~~~~~~~~~~ + +#. Go to `Accounting/Actions/DATEV Import` + +#. Upload your DATEV format .csv file from your tax advisor + +#. Take care the file format is "DATEV Format .csv" (old version: Generic CSV) + +#. Take care your file encoding fits to the provided file (usually "Western (Windows-1252)"), if it is the original file from your tax advisor + +#. Optionally you may activate "Post Journal Entry" in order to immidiately confirm the created Journal Entry + +#. Select the mandatory journal (f.e. "Payroll Account Moves"), usually the journal type will be "Miscellaneous" + +#. Enter optionally the "Force Date" field ((will be the field "Date" in your Journal Entry) + +#. Enter the mandatory field "Reference" (will be the field "Reference" in your Journal Entry) + +#. Enter optionally the field "Force Label" (will be the field "Name" in your Journal Items) + +#. Finally click on "Run Import" + + +.. image:: ../static/description/datev_import_csv_wizard.png + :width: 100% + + +If everyting works fine, you should now see your created Journal Entry in draft (execept you activated "Post Journal Entry") + + +Typical issue +~~~~~~~~~~~~~ + +If accounts doesen't exist in Odoo the wizard may interrupt and show you potential missing accounts. + + +.. image:: ../static/description/datev_import_csv_wizard_error.png + :width: 100% + +In this case you have to ensure to create the missing accounts in Odoo. diff --git a/datev_import_csv_dtvf/security/ir.model.access.csv b/datev_import_csv_dtvf/security/ir.model.access.csv new file mode 100644 index 00000000..b2b5b871 --- /dev/null +++ b/datev_import_csv_dtvf/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_move_import,access_account_move_import,model_account_move_import,base.group_user,1,1,1,0 diff --git a/datev_import_csv_dtvf/static/description/datev_import_csv_wizard.png b/datev_import_csv_dtvf/static/description/datev_import_csv_wizard.png new file mode 100644 index 00000000..de2bbde7 Binary files /dev/null and b/datev_import_csv_dtvf/static/description/datev_import_csv_wizard.png differ diff --git a/datev_import_csv_dtvf/static/description/datev_import_csv_wizard_error.png b/datev_import_csv_dtvf/static/description/datev_import_csv_wizard_error.png new file mode 100644 index 00000000..44aad2a4 Binary files /dev/null and b/datev_import_csv_dtvf/static/description/datev_import_csv_wizard_error.png differ diff --git a/datev_import_csv_dtvf/static/description/index.html b/datev_import_csv_dtvf/static/description/index.html new file mode 100644 index 00000000..899d37c3 --- /dev/null +++ b/datev_import_csv_dtvf/static/description/index.html @@ -0,0 +1,458 @@ + + + + + + +Account Move CSV Import DTVF + + + +
+

Account Move CSV Import DTVF

+ + +

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

+
+

DATEV Format .csv Import

+

The module “datev_import_csv_dtvf” enables the import of DATEV journal entries into Odoo. +Possible use cases include:

+
    +
  • DATEV journal entries from payroll and salary accounting
  • +
  • DATEV journal entries in the context of annual financial statements
  • +
  • DATEV journal entries in the context of reallocations by the tax consultant
  • +
  • DATEV journal entries in the context of depreciation (AfA) bookings by the tax consultant
  • +
  • DATEV journal entries in the context of loans
  • +
+

Currently, the following limitations exist:

+
    +
  • DATEV journal entries containing tax-related booking keys require adjustments in Odoo
  • +
  • Under certain circumstances, DATEV journal entries on creditor and debtor accounts may also be affected.
  • +
+

Table of contents

+
+
+

Usage

+
+
+

Import from DATEV into Odoo

+
+

Requirements

+
    +
  1. Make sure your user has group ‘Full accounting features’
  2. +
  3. Check if the file you want to import into Odoo is DATEV format .csv (move lines start is line 3)
  4. +
  5. Check the description in order to check if your use case is supported
  6. +
  7. Take care of the limitation to import account moves with taxes
  8. +
+
+
+

DATEV Import

+
    +
  1. Go to Accounting/Actions/DATEV Import
  2. +
  3. Upload your DATEV format .csv file from your tax advisor
  4. +
  5. Take care the file format is “DATEV Format .csv” (old version: Generic CSV)
  6. +
  7. Take care your file encoding fits to the provided file (usually “Western (Windows-1252)”), if it is the original file from your tax advisor
  8. +
  9. Optionally you may activate “Post Journal Entry” in order to immidiately confirm the created Journal Entry
  10. +
  11. Select the mandatory journal (f.e. “Payroll Account Moves”), usually the journal type will be “Miscellaneous”
  12. +
  13. Enter optionally the “Force Date” field ((will be the field “Date” in your Journal Entry)
  14. +
  15. Enter the mandatory field “Reference” (will be the field “Reference” in your Journal Entry)
  16. +
  17. Enter optionally the field “Force Label” (will be the field “Name” in your Journal Items)
  18. +
  19. Finally click on “Run Import”
  20. +
+https://raw.githubusercontent.com/OCA/l10n-germany/14.0/datev_import_csv_dtvf/static/description/datev_import_csv_wizard.png +

If everyting works fine, you should now see your created Journal Entry in draft (execept you activated “Post Journal Entry”)

+
+
+

Typical issue

+

If accounts doesen’t exist in Odoo the wizard may interrupt and show you potential missing accounts.

+https://raw.githubusercontent.com/OCA/l10n-germany/14.0/datev_import_csv_dtvf/static/description/datev_import_csv_wizard_error.png +

In this case you have to ensure to create the missing accounts in Odoo.

+
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

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

+

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

+
+
+
+ + diff --git a/datev_import_csv_dtvf/tests/__init__.py b/datev_import_csv_dtvf/tests/__init__.py new file mode 100644 index 00000000..0dfaf277 --- /dev/null +++ b/datev_import_csv_dtvf/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2023 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_datev_import_csv_dtvf diff --git a/datev_import_csv_dtvf/tests/test_datev_import_csv_dtvf.py b/datev_import_csv_dtvf/tests/test_datev_import_csv_dtvf.py new file mode 100644 index 00000000..d4cbe3c0 --- /dev/null +++ b/datev_import_csv_dtvf/tests/test_datev_import_csv_dtvf.py @@ -0,0 +1,146 @@ +# Copyright 2023 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from base64 import b64encode + +from odoo import exceptions +from odoo.tests import TransactionCase +from odoo.tools.misc import file_open + + +class TestDatevImportCsvDtvf(TransactionCase): + def setUp(self): + super().setUp() + for code in ( + "0731", + "0980", + "0996", + "1200", + "1202", + "1240", + "1360", + "1500", + "1590", + "1610", + "1740", + "1750", + "1780", + "1789", + "1790", + "2712", + "2735", + "4110", + "4138", + "4160", + "4167", + "4360", + "4510", + "4520", + "4580", + "4650", + "4651", + "4900", + "4930", + "8125", + "8200", + "8339", + "8977", + "0965", + "0974", + "1200", + "1502", + "1503", + "1545", + "1576", + "1588", + "1700", + "1741", + "2114", + "2150", + "2450", + "2709", + "3425", + "3435", + "4120", + "4170", + "4653", + "4654", + "4655", + "4663", + "4666", + "7095", + "8605", + ): + if self.env["account.account"].search( + [ + ("code", "=", code), + ("company_id", "=", self.env.company.id), + ] + ): + continue + self.env["account.account"].create( + { + "name": code, + "code": code, + "user_type_id": self.env.ref( + "account.data_account_type_receivable" + ).id, + "reconcile": True, + } + ) + self.env["account.account"].search([("code", "=", "7095")]).code = "7095000" + self.env["account.account"].search([("code", "=", "1700")]).code = "170" + + def test_wizard(self): + wizard = self.env["account.move.import"].create( + { + "file_to_import": b64encode( + file_open("datev_import_csv_dtvf/examples/datev_export.csv") + .read() + .encode("utf8") + ), + "force_journal_id": self.env["account.journal"] + .search([("type", "=", "sale")], limit=1) + .id, + "force_move_ref": "/", + "force_move_line_name": "/", + "post_move": True, + } + ) + action = wizard.run_import() + move = self.env[action["res_model"]].browse(action["res_id"]) + self.assertEqual(len(move.line_ids), 196) + first_line = move.line_ids[:1] + self.assertEqual(first_line.account_id.code, "4900") + self.assertEqual(first_line.credit, 0.01) + last_line = move.line_ids[-1:] + self.assertEqual(last_line.account_id.code, "2450") + self.assertEqual(last_line.debit, 72) + + def test_wizard_broken_file(self): + wizard = self.env["account.move.import"].create( + { + "file_to_import": b64encode( + b"file,with\nwrong\ndate,format,in,third,line,,,,,wrong date" + ), + "force_journal_id": self.env["account.journal"] + .search([("type", "=", "sale")], limit=1) + .id, + "force_move_ref": "/", + "force_move_line_name": "/", + } + ) + with self.assertRaises(exceptions.UserError): + wizard.run_import() + + def test_nonexisting_account_journal(self): + wizard = self.env["account.move.import"].create( + { + "file_to_import": b64encode( + b"EXTF,700,22,Buchungsstapel,12,20230417083808874,,,,,12345,1234,20220101," + b"4,20221201,20221231,Buchungsstapel 20220101,MM,1,,,EUR," + b"\nnonexisting,accounts\n42,H,,,,,42424242,424242420,,23/01" + ), + } + ) + with self.assertRaises(exceptions.UserError): + wizard.run_import() diff --git a/datev_import_csv_dtvf/wizard/__init__.py b/datev_import_csv_dtvf/wizard/__init__.py new file mode 100644 index 00000000..fb76cbf3 --- /dev/null +++ b/datev_import_csv_dtvf/wizard/__init__.py @@ -0,0 +1 @@ +from . import import_move diff --git a/datev_import_csv_dtvf/wizard/import_move.py b/datev_import_csv_dtvf/wizard/import_move.py new file mode 100644 index 00000000..df8d8b98 --- /dev/null +++ b/datev_import_csv_dtvf/wizard/import_move.py @@ -0,0 +1,401 @@ +# Copyright 2012-2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import base64 +import logging +from datetime import date as datelib, datetime +from tempfile import TemporaryFile + +import unicodecsv + +from odoo import _, fields, models +from odoo.exceptions import UserError +from odoo.tools import float_is_zero + +_logger = logging.getLogger(__name__) + +GENERIC_CSV_DEFAULT_DATE = "%d/%m/%Y" + + +class AccountMoveImport(models.TransientModel): + _name = "account.move.import" + _description = "Import account move from CSV file" + + file_to_import = fields.Binary( + string="File to Import", + required=True, + help="File containing the journal entry(ies) to import.", + ) + filename = fields.Char() + post_move = fields.Boolean( + string="Post Journal Entry", + help="If True, the journal entry will be posted after the import.", + ) + force_journal_id = fields.Many2one( + "account.journal", + string="Journal", + help="Journal in which the journal entry will be created", + ) + force_move_ref = fields.Char("Reference") + force_move_line_name = fields.Char("Force Label") + force_move_date = fields.Date("Force Date") + date_format = fields.Char( + default=GENERIC_CSV_DEFAULT_DATE, + required=True, + help='Date format is applicable only on Generic csv file ex "%d%m%Y"', + ) + + def run_import(self): + self.ensure_one() + fileobj = TemporaryFile("wb+") + file_bytes = base64.b64decode(self.file_to_import) + fileobj.write(file_bytes) + fileobj.seek(2) # We must start reading 3rd line ! + pivot = self.genericcsv2pivot(fileobj) + fileobj.close() + _logger.debug("pivot before update: %s", pivot) + self.clean_strip_pivot(pivot) + self.update_pivot(pivot) + moves = self.create_moves_from_pivot(pivot, post=self.post_move) + action = { + "name": _("Imported Journal Entries"), + "res_model": "account.move", + "type": "ir.actions.act_window", + "nodestroy": False, + "target": "current", + } + + if len(moves) == 1: + action.update( + { + "view_mode": "form,tree", + "res_id": moves[0].id, + } + ) + else: + action.update( + { + "view_mode": "tree,form", + "domain": [("id", "in", moves.ids)], + } + ) + return action + + def clean_strip_pivot(self, pivot): + for l in pivot: # noqa: E741 + for key, value in l.items(): + if value: + if isinstance(value, str): + l[key] = value.strip() or False + else: + l[key] = False + + def update_pivot(self, pivot): + force_move_date = self.force_move_date + force_move_ref = self.force_move_ref + force_move_line_name = self.force_move_line_name + force_journal_code = ( + self.force_journal_id and self.force_journal_id.code or False + ) + for l in pivot: # noqa: E741 + if force_move_date: + l["date"] = force_move_date + if force_move_line_name: + l["name"] = force_move_line_name + if force_move_ref: + l["ref"] = force_move_ref + if force_journal_code: + l["journal"] = force_journal_code + if not l["credit"]: + l["credit"] = 0.0 + if not l["debit"]: + l["debit"] = 0.0 + + def genericcsv2pivot(self, fileobj): + # Prisme + fieldnames = [ + "sales", + "indicator", + "wkz_sales", + "course", + "basic_sales", + "wkz_base_sales", + "account", + "contra_account", + "BU_key", + "date", + "doc_field_1", + "doc_field_2", + "discount", + "name", + ] + first_line = fileobj.readline().decode() + dialect = unicodecsv.Sniffer().sniff(first_line) + fileobj.seek(0) + reader = unicodecsv.DictReader( + fileobj, + fieldnames=fieldnames, + delimiter=dialect.delimiter, + quotechar='"', + quoting=unicodecsv.QUOTE_MINIMAL, + encoding="ISO-8859-1", + ) + res = [] + year_str = "" + i = 0 + for l in reader: # noqa: E741 + i += 1 + if i == 1 and l["discount"]: + year_str = l["discount"][0:4] + if i >= 3: + date_str = l["date"][0:2] + "/" + l["date"][-2:] + "/" + year_str + try: + date = datetime.strptime(date_str, self.date_format) + except Exception: + raise UserError( + (_("time data : '%s' in line %s does not match format '%s")) + % (date_str, i, self.date_format) + ) + vals = { + "journal": self.force_journal_id.id, + "account": l["account"], + "contra_account": l["contra_account"], + "credit": float(l["sales"].replace(",", ".") or 0), + "debit": float(l["sales"].replace(",", ".") or 0), + "date": date, + "name": l["name"], + "ref": l.get("indicator", "").upper() + if not self.force_move_ref + else self.force_move_ref, + "indicator": l.get("indicator", "").upper(), + "line": i, + } + res.append(vals) + return res + + def create_moves_from_pivot(self, pivot, post=False): # noqa: C901 + _logger.debug("Final pivot: %s", pivot) + amo = self.env["account.move"] + company_id = self.env.company.id + # Generate SPEED DICTS + # account + acc_speed_dict = { + account["code"].upper(): account["id"] + for account in self.env["account.account"].search_read( + [("company_id", "=", company_id), ("deprecated", "=", False)], ["code"] + ) + } + # contra_account + accc_speed_dict = acc_speed_dict.copy() + # journal + journal_speed_dict = { + journal["code"].upper(): journal["id"] + for journal in self.env["account.journal"].search_read( + [("company_id", "=", company_id)], ["code"] + ) + } + key2label = { + "account": _("account codes"), + "contra_account": _("contra account codes"), + "journal": _("journal codes"), + } + errors = {"other": []} + for key in key2label.keys(): + errors[key] = {} + + def match_account(line, speed_dict, id_field, code_field): + if line[code_field] in speed_dict: + line[id_field] = speed_dict[l[code_field]] + if not line.get(id_field): + # Match when import = 61100000 and Odoo has 611000 + acc_code_tmp = l[code_field] + while acc_code_tmp and acc_code_tmp[-1] == "0": + acc_code_tmp = acc_code_tmp[:-1] + if acc_code_tmp and acc_code_tmp in speed_dict: + line[id_field] = speed_dict[acc_code_tmp] + break + if not line.get(id_field): + # Match when import = 611000 and Odoo has 611000XX + for code, account_id in speed_dict.items(): + if code.startswith(line[code_field]): + _logger.warning( + "Approximate match: import account %s has been matched " + "with Odoo account %s" % (line[code_field], code) + ) + line[id_field] = account_id + break + if not line.get(id_field): + errors["account"].setdefault(line[code_field], []).append(l["line"]) + + # MATCHES + CHECKS + for l in pivot: # noqa: E741 + assert l.get("line") and isinstance( + l.get("line"), int + ), "missing line number" + # 1. account + match_account(l, acc_speed_dict, "account_id", "account") + # 2. contra_account + match_account(l, accc_speed_dict, "contra_account_id", "contra_account") + # 3. journal + if l["journal"] in journal_speed_dict: + l["journal_id"] = journal_speed_dict[l["journal"]] + else: + errors["journal"].setdefault(l["journal"], []).append(l["line"]) + # 4. name + if not l.get("name"): + errors["other"].append(_("Line %d: missing label.") % l["line"]) + # 5. date + if not l.get("date"): + errors["other"].append(_("Line %d: missing date.") % l["line"]) + else: + if not isinstance(l.get("date"), datelib): + try: + l["date"] = datetime.strptime(l["date"], "%Y-%m-%d") + except Exception: + errors["other"].append( + _("Line %d: bad date format %s") % (l["line"], l["date"]) + ) + # 6. credit + if not isinstance(l.get("credit"), float): + errors["other"].append( + _("Line %d: bad value for credit (%s).") % (l["line"], l["credit"]) + ) + # 7. debit + if not isinstance(l.get("debit"), float): + errors["other"].append( + _("Line %d: bad value for debit (%s).") % (l["line"], l["debit"]) + ) + # test that they don't have both a value + # LIST OF ERRORS + msg = "" + for key, label in key2label.items(): + if errors[key]: + msg += _("List of %s that don't exist in Odoo:\n%s\n\n") % ( + label, + "\n".join( + [ + "- %s : line(s) %s" + % (code, ", ".join([str(i) for i in lines])) + for (code, lines) in errors[key].items() + ] + ), + ) + if errors["other"]: + msg += _("List of misc errors:\n%s") % ( + "\n".join(["- %s" % e for e in errors["other"]]) + ) + if msg: + raise UserError(msg) + # EXTRACT MOVES + moves = [] + cur_balance = 0.0 + cur_date = False + prec = self.env.company.currency_id.rounding + seq = self.env["ir.sequence"].next_by_code("account.move.import") + cur_move = {} + for l in pivot: # noqa: E741 + indicator = l.get("indicator", False) + if cur_date == l["date"]: + cur_move["line_ids"].append( + (0, 0, self._prepare_move_line_01(l, seq, indicator)) + ) + cur_move["line_ids"].append( + (0, 0, self._prepare_move_line_02(l, seq, indicator)) + ) + else: + # new move + if moves and not float_is_zero(cur_balance, precision_rounding=prec): + raise UserError( + _( + "The journal entry that ends on line %d is not " + "balanced (balance is %s)." + ) + % (l["line"] - 1, cur_balance) + ) + if cur_move: + if len(cur_move["line_ids"]) <= 1: + raise UserError( + _("move should have more than 1 line num: %s," "data : %s") + % (l["line"], cur_move["line_ids"]) + ) + moves.append(cur_move) + cur_move = self._prepare_move(l) + cur_move["line_ids"] = [ + (0, 0, self._prepare_move_line_01(l, seq, indicator)), + (0, 0, self._prepare_move_line_02(l, seq, indicator)), + ] + cur_date = l["date"] + cur_balance += l["credit"] - l["debit"] + if cur_move: + moves.append(cur_move) + if not float_is_zero(cur_balance, precision_rounding=prec): + raise UserError( + _( + "The journal entry that ends on the last line is not " + "balanced (balance is %s)." + ) + % cur_balance + ) + rmoves = self.env["account.move"] + for move in moves: + rmoves += amo.create(move) + _logger.info("Account moves IDs %s created via file import" % rmoves.ids) + if post: + rmoves._post() + return rmoves + + def _prepare_move(self, pivot_line): + vals = { + "journal_id": pivot_line["journal_id"], + "ref": pivot_line.get("ref"), + "date": pivot_line["date"], + } + return vals + + def _prepare_move_line_01(self, pivot_line, sequence, indicator): + vals = {} + if indicator == "S": + vals.update( + { + "credit": 0.0, + "debit": pivot_line["debit"], + } + ) + if indicator == "H": + vals.update({"credit": pivot_line["credit"], "debit": 0}) + vals.update( + { + "name": pivot_line["name"], + "account_id": pivot_line["account_id"], + "import_external_id": "%s-%s" % (sequence, pivot_line.get("line")), + "indicator": indicator, + } + ) + return vals + + def _prepare_move_line_02(self, pivot_line, sequence, indicator): + vals = {} + if indicator == "S": + vals.update( + { + "credit": pivot_line["debit"], + "debit": 0, + } + ) + if indicator == "H": + vals.update( + { + "credit": 0, + "debit": pivot_line["credit"], + } + ) + vals.update( + { + "name": pivot_line["name"], + "account_id": pivot_line["contra_account_id"], + "import_external_id": "%s-%s" % (sequence, pivot_line.get("line")), + "indicator": indicator, + } + ) + return vals diff --git a/datev_import_csv_dtvf/wizard/import_move_view.xml b/datev_import_csv_dtvf/wizard/import_move_view.xml new file mode 100644 index 00000000..849d960c --- /dev/null +++ b/datev_import_csv_dtvf/wizard/import_move_view.xml @@ -0,0 +1,100 @@ + + + + + account.move.import.form + account.move.import + +
+ + + + + + + + + + +
+ Note this import does not handle taxes! +
+
+

Information about the DATEV CSV format

+
    +
  • + First Row : contains information like year +
  • +
  • + Second Row : contains header of columns +
  • +
  • + Third Row : starts records of account.move +
  • +
  • + Columns + : +
      +
    1. Umsatz (ohne Soll/Haben-Kz)
    2. +
    3. Soll/Haben-Kennzeichen
    4. +
    5. +
    6. +
    7. +
    8. +
    9. Konto
    10. +
    11. Gegenkonto (ohne BU-Schl?ssel)
    12. +
    13. +
    14. Belegdatum (DDMM)
    15. +
    16. +
    17. +
    18. +
    19. Buchungstext
    20. +
    +
  • +
  • + Field separator + : auto-detected +
  • +
  • + Text separator + : " (quote) +
  • +
  • + Decimal separator + : . (dot) or , (coma) +
  • +
  • + DateFormat + : %d/%m/%Y +
  • +
+
+
+
+
+
+
+ + + Import DATEV Format (.csv) + account.move.import + form + new + + + +
+ +
diff --git a/oca_dependencies.txt b/oca_dependencies.txt index 915f441f..c3621c32 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -1,2 +1,3 @@ # See https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#oca_dependencies-txt partner-contact +unicodecsv diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..cbba956c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +# generated from manifests external_dependencies +unicodecsv diff --git a/setup/datev_import_csv_dtvf/odoo/addons/datev_import_csv_dtvf b/setup/datev_import_csv_dtvf/odoo/addons/datev_import_csv_dtvf new file mode 120000 index 00000000..f8a3f6b7 --- /dev/null +++ b/setup/datev_import_csv_dtvf/odoo/addons/datev_import_csv_dtvf @@ -0,0 +1 @@ +../../../../datev_import_csv_dtvf \ No newline at end of file diff --git a/setup/datev_import_csv_dtvf/setup.py b/setup/datev_import_csv_dtvf/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/datev_import_csv_dtvf/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)