Skip to content

Commit

Permalink
Release 1.4.0 ready.
Browse files Browse the repository at this point in the history
  • Loading branch information
gpaulissen committed Jul 19, 2022
1 parent ed59ff1 commit c2a82bb
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 12 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.4.0] - 2022-07-19

### Added

- Reading CSV of the ASN Bank

## [1.3.3] - 2022-01-05
Expand Down
19 changes: 12 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ PYTHON = python
MYPY = mypy
PIP = pip
PROJECT = ofxstatement-dutch
# Otherwise perl may complain on a Mac
LANG = C

# OS specific section
ifeq '$(findstring ;,$(PATH))' ';'
Expand All @@ -24,36 +26,39 @@ endif

.PHONY: clean install test dist distclean upload

clean:
help: ## This help.
@perl -ne 'printf(qq(%-30s %s\n), $$1, $$2) if (m/^((?:\w|[.%-])+):.*##\s*(.*)$$/)' $(MAKEFILE_LIST)

clean: ## Cleanup the package and remove it from the Python installation path.
$(PYTHON) setup.py clean --all
$(RM_EGGS)
$(PYTHON) -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
$(PYTHON) -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
-$(PYTHON) -Bc "import shutil; shutil.rmtree('.pytest_cache')"

install: clean
install: clean ## Install the package to the Python installation path.
$(PIP) install -e .
$(PIP) install -r test_requirements.txt

test:
test: ## Test the package.
$(MYPY) --show-error-codes src
$(PYTHON) -m pytest --exitfirst

dist: install test
dist: install test ## Prepare the distribution the package by installing and testing it.
$(PYTHON) setup.py sdist bdist_wheel
$(PYTHON) -m twine check dist/*

upload_test: dist
upload_test: dist ## Upload the package to PyPI test.
$(PYTHON) -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

upload: dist
upload: dist ## Upload the package to PyPI.
$(PYTHON) -m twine upload dist/*

# This is GNU specific I guess
VERSION = $(shell $(PYTHON) __about__.py)

TAG = v$(VERSION)

tag:
tag: ## Tag the package on GitHub.
git tag -a $(TAG) -m "$(TAG)"
git push origin $(TAG)
81 changes: 76 additions & 5 deletions src/ofxstatement/plugins/nl/asn.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,80 @@
class Parser(CsvStatementParser):
"""
Veldnaam Formaat Omschrijving Voorbeeld
-------- ------- ------------ ---------
Boekingsdatum dd­mm­jjjj Dit veld geeft de datum weer waarop de transactie daadwerkelijk heeft plaatsgevonden. 3­4­2000
Opdrachtgeversrekening X (18) Uw ASN­Rekening (IBAN). NL01ASNB0123456789
Tegenrekeningnummer X (34) Dit veld bevat het rekeningnummer (IBAN) naar of waarvan de transactie afkomstig is. NL01BANK0123456789
Het IBAN telt maximaal 34 alfanumerieke tekens en heeft een vaste lengte per land
Het IBAN bestaat uit een landcode (twee letters), een controlegetal (twee cijfers)
en een (voor bepaalde landen aangevuld) nationaal rekeningnummer.
Naam tegenrekening X (70) Hier wordt de naam van de tegenrekening vermeld. jansen
De naam is maximaal 70 posities lang en wordt in kleine letters weergegeven.
Valutasoort rekening XXX Dit veld geeft de ISO valutasoort van de rekening weer. EUR
Een bestand kan verschillende valutasoorten bevatten.
Saldo rekening voor mutatie ­999999999.99 Geeft het saldo weer van de rekening voordat de mutatie is verwerkt. 122800.83 of ­123.30
Als decimaal scheidingsteken wordt een punt gebruikt. Er wordt geen duizend separator
gebruikt. In het geval van een negatieve waarde wordt het bedrag voorafgegaan van een
– (min) teken.
Valutasoort mutatie XXX Dit veld geeft de ISO valutasoort van de mutatie weer. EUR
Een bestand kan verschillende valutasoorten bevatten.
Transactiebedrag ­999999999.99 Geeft het transactiebedrag weer. Als decimaal scheidingsteken wordt een punt gebruikt. 238.45 of ­43.90
Een negatief bedrag wordt voorafgegaan door een – (min) teken.
Journaaldatum dd­mm­jjjj De journaaldatum is de datum waarop een transactie in de systemen van ASN Bank wordt 21­01­2000
geboekt. Dit hoeft niet noodzakelijkerwijs gelijk te zijn aan de boekingsdatum.
Valutadatum dd­mm­jjjj Dit veld geeft de valutadatum weer. De valutadatum is de datum waarop een bedrag 01­04­2001
rentedragend wordt.
Interne transactiecode 9999 Dit is een interne transactiecode zoals die door de ASN Bank wordt gebruikt. Deze 8810 of 9820
transactiecodes kunnen gebruikt worden om heel verfijnd betaalde transacties te
herkennen. Zoals een bijboeking van een geldautomaat opname. Er kan geen garantie
worden gegeven dat deze codes in de toekomst hetzelfde blijven en/of dat er codes
vervallen en/of toegevoegd zullen worden.
Globale transactiecode XXX De globale transactiecode is een vertaling van de interne transactiecode. Gebruikte GEA of BEA of VV
afkortingen zijn bijvoorbeeld BEA voor een betaalautomaat opname of GEA voor een
geldautomaat opname. In de bijlage wordt een overzicht gegeven van alle gebruikte
afkortingen.
Zie ook Bijlage 1: Gebruikte boekingscodes
Volgnummer transactie N (8) Geeft het transactievolgnummer van de transactie weer. Dit volgnummer vormt samen met 90043054
de journaaldatum een uniek transactie id.
Betalingskenmerk X (16) Het betalingskenmerk bevat de meest relevante gegevens zoals die door de betaler zijn ’factuur 9234820’
opgegeven. Zoals debiteuren nummer en/of factuurnummer. Het betalingskenmerk wordt
tussen enkele quotes (’) geplaatst.
Omschrijving X (140) De omschrijving zoals die bij de overboeking is opgegeven. De omschrijving kan ’02438000140032extra trekking werelddierendag 4info’
maximaal 140 posities beslaan.
Afschriftnummer N (3) Het nummer van het afschrift waar de betreffende boeking op staat vermeld. 42
===
Bijlage 1: Gebruikte boekingscodes
ACC Acceptgirobetaling AF Afboeking
AFB Afbetalen
BEA Betaalautomaat BIJ Bijboeking
BTL Buitenlandse Overboeking
CHP Chipknip
CHQ Cheque
COR Correctie
DIV Diversen
EFF Effectenboeking
ETC Euro traveller cheques GBK GiroBetaalkaart
GEA Geldautomaat
INC Incasso
IDB iDEAL betaling
IMB iDEAL betaling via mobiel IOB Interne Overboeking
KAS Kas post
KTN Kosten/provisies
KST Kosten/provisies
OVB Overboeking
PRM Premies
PRV Provisies
RNT Rente
STO Storno
TEL Telefonische Overboeking VV Vreemde valuta
===
These fields are from the Statement class:
id = ""
Expand Down Expand Up @@ -133,7 +207,8 @@ def parse(self) -> Statement:
def split_records(self) -> Iterator[Any]:
"""Return iterable object consisting of a line per transaction
"""
return csv.reader(self.fin, delimiter=',')
# strip quotes around memo
return csv.reader(self.fin, delimiter=',', quotechar="'")

def parse_record(self,
line: List[Optional[str]]) -> Optional[StatementLine]:
Expand Down Expand Up @@ -195,10 +270,6 @@ def parse_transaction(self,
else:
stmt_line.bank_account_to = None

# strip quotes around memo
if len(stmt_line.memo) >= 2 and stmt_line.memo[0] == "'" and stmt_line.memo[-1] == "'":
stmt_line.memo = stmt_line.memo[1:-1]

return stmt_line


Expand Down
12 changes: 12 additions & 0 deletions tests/samples/transactie-historie_fail.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
17-06-2022,NL00ASNB9999999999,NL99ASNB0000000000,XXXXXXXXX Z Z Z Z,,,,EUR,130.44,EUR,223.77,17-06-2022,17-06-2022,2754,NGM,51392971,,,26
17-06-2022,NL00ASNB9999999999,NL11ABNA0000000000,International Card Services B V,,,,EUR,354.21,EUR,-200.00,17-06-2022,17-06-2022,9856,IDM,51402299,,'000000000000000000000000000000000 1111111111111111 Betaling aan ICS 99999999999 ICS Referentie: 2022-06-17 14:21 000000000000000',26
25-06-2022,NL00ASNB9999999999,,,,,,EUR,154.21,EUR,0.00,25-06-2022,25-06-2022,7241,MSC,50951651,,'Kosten gebruik betaalrekening inclusief 1 betaalpas',26
25-06-2022,NL00ASNB9999999999,,,,,,EUR,154.21,EUR,-2.20,25-06-2022,25-06-2022,7241,MSC,50951652,,'Kosten gebruik betaalrekening inclusief 1 betaalpas',26
27-06-2022,NL00ASNB9999999999,NL25INGB0000000000,Optimal BV,,,,EUR,152.01,EUR,503.15,27-06-2022,27-06-2022,8809,OVS,00000000,,'DIVIDEND 27/06/2022',28
28-06-2022,NL00ASNB9999999999,NL24ABNA0000000000,DE VOLKSKRANT B V,,,,EUR,655.16,EUR,-22.95,28-06-2022,28-06-2022,9714,EIC,00000000,,'0000000000000000 ABONNR 00000000 DE VOLKSKRANT VANAF 03/07/2022 4 KRANTEN INCL 9 PCT BTW 1 89 203NL00ASNB9999999999',28
28-06-2022,NL00ASNB9999999999,NL99ASNB0000000000,ASN Optimaalbeleggen,,,,EUR,632.21,EUR,-400.00,29-06-2022,28-06-2022,3754,NGM,50139616,,,28
05-07-2022,NL00ASNB9999999999,NL11ABNA0000000000,International Card Services B V,,,,EUR,232.21,EUR,-147.97,05-07-2022,05-07-2022,9856,IDM,00000000,,'000000000000000000000000000000000 0000000000000000 Betaling aan ICS 00000000000 ICS Referentie: 2022-07-05 09:45 000000000000000',28
07-07-2022,NL00ASNB9999999999,FR0000000000000000000000000,M XXXXXXXXX ET MME,,,,EUR,84.24,EUR,2560.00,07-07-2022,07-07-2022,8809,OVS,00000000,,'Virement de Compte Commun',28
08-07-2022,NL00ASNB9999999999,FR0000000000000000000000000,M XXXXXXXXX ET MME YYYYYYYYY,,,,EUR,2644.24,EUR,-1000.00,08-07-2022,08-07-2022,9720,NGI,00000000,,'AAAAAA',28
09-07-2022,NL00ASNB9999999999,FR0000000000000000000000000,M XXXXXXXXX ET MME YYYYYYYYY,,,,EUR,1644.24,EUR,-1000.00,09-07-2022,09-07-2022,9720,NGI,00000000,,,28
11-07-2022,NL00ASNB9999999998,FR0000000000000000000000000,M XXXXXXXXX ET MME YYYYYYYYY,,,,EUR,644.24,EUR,-560.00,11-07-2022,11-07-2022,9720,NGI,00000000,,,30
12 changes: 12 additions & 0 deletions tests/test_asn.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import os
from unittest import TestCase
from decimal import Decimal
import pytest
from datetime import datetime

from ofxstatement.exceptions import ParseError

from ofxstatement.plugins.nl.asn import Plugin


Expand Down Expand Up @@ -40,3 +43,12 @@ def test_ok(self):
self.assertIsNone(statement.lines[2].payee)
self.assertEqual(statement.lines[2].memo,
"Kosten gebruik betaalrekening inclusief 1 betaalpas")

@pytest.mark.xfail(raises=ParseError)
def test_fail(self):
here = os.path.dirname(__file__)
text_filename = os.path.join(here, 'samples', 'transactie-historie_fail.csv')
parser = Plugin(None, None).get_parser(text_filename)

# And parse csv:
parser.parse()

0 comments on commit c2a82bb

Please sign in to comment.