summaryrefslogtreecommitdiff
path: root/importers/cragr/cragr_ofx.py
diff options
context:
space:
mode:
Diffstat (limited to 'importers/cragr/cragr_ofx.py')
-rw-r--r--importers/cragr/cragr_ofx.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/importers/cragr/cragr_ofx.py b/importers/cragr/cragr_ofx.py
new file mode 100644
index 0000000..25abb30
--- /dev/null
+++ b/importers/cragr/cragr_ofx.py
@@ -0,0 +1,48 @@
+"""Importer for Crédit Agricole OFX files.
+
+Based on OFX importer, clean the narration field."""
+#
+# Copyright (C) 2019 Nicolas Schodet
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+#
+from beancount.ingest.importers import ofx
+from beancount.core import data
+import re
+
+
+class Importer(ofx.Importer):
+ """An importer for Crédit Agricole OFX files."""
+
+ def extract(self, file, existing_entries=None):
+ entries = super().extract(file)
+ new_entries = []
+ for entry in entries:
+ if isinstance(entry, data.Transaction):
+ m = re.fullmatch(r'(.*) / (.*) / OTHER', entry.narration)
+ if m:
+ name, memo = m.groups()
+ if memo == '.':
+ memo = None
+ else:
+ memo = ' '.join(memo.split())
+ new_narration = ' / '.join(filter(None, [name, memo]))
+ entry = entry._replace(narration=new_narration)
+ new_entries.append(entry)
+ return new_entries