diff --git a/src/pretix/plugins/banktransfer/csvimport.py b/src/pretix/plugins/banktransfer/csvimport.py index 50794b3cb4..7eca4f75ff 100644 --- a/src/pretix/plugins/banktransfer/csvimport.py +++ b/src/pretix/plugins/banktransfer/csvimport.py @@ -18,16 +18,16 @@ def parse(data, hint): # Wrong column count continue if hint.get('payer') is not None: - resrow['payer'] = "\n".join([row[int(i)].strip() for i in hint.get('payer')]) + resrow['payer'] = "\n".join([row[int(i)].strip() for i in hint.get('payer')]).strip() if hint.get('reference') is not None: - resrow['reference'] = "\n".join([row[int(i)].strip() for i in hint.get('reference')]) + resrow['reference'] = "\n".join([row[int(i)].strip() for i in hint.get('reference')]).strip() if hint.get('amount') is not None: resrow['amount'] = row[int(hint.get('amount'))].strip() if hint.get('date') is not None: resrow['date'] = row[int(hint.get('date'))].strip() if len(resrow['amount']) == 0 or 'amount' not in resrow \ or resrow['amount'][0] not in list("1234567890," "+- ") \ - or len(resrow['reference']) == 0: + or len(resrow['reference']) == 0 or resrow['date'] == '': # This is probably a headline or something other special. continue result.append(resrow) diff --git a/src/tests/plugins/banktransfer/__init__.py b/src/tests/plugins/banktransfer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/tests/plugins/banktransfer/csvimport_data_de_bbbank.csv b/src/tests/plugins/banktransfer/csvimport_data_de_bbbank.csv new file mode 100644 index 0000000000..0f0b6c57f8 --- /dev/null +++ b/src/tests/plugins/banktransfer/csvimport_data_de_bbbank.csv @@ -0,0 +1,22 @@ +"BBBank eG" + +"Umsatzanzeige" + +"BLZ:";"2229428475";;"Datum:";"12.04.2015" +"Konto:";"4369871042";;"Uhrzeit:";"18:50:28" +"Abfrage von:";"Max Mustermann";;"Kontoinhaber:";"Max Mustermann" + +"Zeitraum:";"1 Woche";"von:";;"bis:"; +"Betrag in EUR:";;"von:";" ";"bis:";" " +"Sortiert nach:";"Buchungstag";"absteigend" + +"Buchungstag";"Valuta";"Auftraggeber/Zahlungsempfänger";"Empfänger/Zahlungspflichtiger";"Konto-Nr.";"BLZ";"Vorgang/Verwendungszweck";"Währung";"Umsatz";" " +"10.04.2015";"10.04.2015";"Mustermann, Max";"Einzug ";;;"LASTSCHRIFT +Einzug Nutzungsgebuehren IB +AN: DE76574670095813552253";"EUR";"42,23";"S" +"08.04.2015";"08.04.2015";"Mustermann, Max";"Kunde, Karl";;;"GUTSCHRIFT +Ticket 2015XAZTY IBAN: DE83 +839857672994615084";"EUR";"42,23";"H" + +"07.04.2015";;;;;;"EUR";"Anfangssaldo";"1.337,00";"H" +"10.04.2015";;;;;;"EUR";"Endsaldo";"1.337,00";"H" diff --git a/src/tests/plugins/banktransfer/csvimport_data_de_dab.csv b/src/tests/plugins/banktransfer/csvimport_data_de_dab.csv new file mode 100644 index 0000000000..9ca0c44b22 --- /dev/null +++ b/src/tests/plugins/banktransfer/csvimport_data_de_dab.csv @@ -0,0 +1,4 @@ +; +Buchungstag;Valuta;Buchungstext;Auftraggeber / Empfänger;Verwendungszweck;Betrag in EUR; +09.04.2015;09.04.2015;SEPA-Überweisung;Karl Kunde;Bestellung 2015ABCDE;23,00; +09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung 2015FGHIJ;42,00; diff --git a/src/tests/plugins/banktransfer/csvimport_data_de_gls.csv b/src/tests/plugins/banktransfer/csvimport_data_de_gls.csv new file mode 100644 index 0000000000..2f45d78e71 --- /dev/null +++ b/src/tests/plugins/banktransfer/csvimport_data_de_gls.csv @@ -0,0 +1,3 @@ +Kontonummer;Buchungstag;Wertstellung;Auftraggeber/Empfänger;Buchungstext;VWZ1;VWZ2;VWZ3;VWZ4;VWZ5;VWZ6;VWZ7;VWZ8;VWZ9;VWZ10;VWZ11;VWZ12;VWZ13;VWZ14;Betrag;Kontostand;Währung +123456789;09.04.2015;09.04.2015;"Lars Lieferant";"OnlBanking-Euro-Überweisung";BIC:THISINOBIC;IBAN:DE59433524647958971194;Datum: 09.04.15 Zeit: 10:47;KD 1234567 TAN 123456;Rechnung Nr. 123;456;;;;;;;;;-42,00;1.337,00;EUR +123456789;08.04.2015;08.04.2015;Karl Kunde;"SEPA-Überweisung";Ticket-Bestellung;Bestellnummer 2015ABC;DEV;;;;;;;;;;;;12,00;1.325,00;EUR diff --git a/src/tests/plugins/banktransfer/csvimport_data_de_sparkassernn.csv b/src/tests/plugins/banktransfer/csvimport_data_de_sparkassernn.csv new file mode 100644 index 0000000000..d0a2d73cc4 --- /dev/null +++ b/src/tests/plugins/banktransfer/csvimport_data_de_sparkassernn.csv @@ -0,0 +1,3 @@ +"Auftragskonto";"Buchungstag";"Valutadatum";"Buchungstext";"Verwendungszweck";"Begünstigter/Zahlungspflichtiger";"Kontonummer";"BLZ";"Betrag";"Währung";"Info" +"123456";"09.03";"09.03.15";"ONLINE-UEBERWEISUNG";"SVWZ+Begleichung Rechnung 1234";"Max Mustermann";"DE13495179316396679327";"THISISNOBIC";"-23,42";"EUR";"Umsatz gebucht" +"123456";"03.03";"03.03.15";"GUTSCHRIFT";"EREF+123456789 Ticket-Bestellung 2015XALSK";"Karl Kunde";"DE89701226010601035858";"THISISNOBIC";"42,32";"EUR";"Umsatz gebucht" diff --git a/src/tests/plugins/banktransfer/test_csvimport.py b/src/tests/plugins/banktransfer/test_csvimport.py new file mode 100644 index 0000000000..4141784b9e --- /dev/null +++ b/src/tests/plugins/banktransfer/test_csvimport.py @@ -0,0 +1,123 @@ +import os.path +from django.test import TestCase + +# Do NOT use relative imports here +from pretix.plugins.banktransfer import csvimport + +# These tests need data files. Don't worry, they are fully anonymized, +# all IBANs are random/fake. +DATA_DIR = os.path.dirname(__file__) + + +class CsvImportTest(TestCase): + + def _test_from_sample_file(self, filename, expected, hint, expected_parsed): + with open(os.path.join(DATA_DIR, filename), 'rb') as f: + data = csvimport.get_rows_from_file(f) + self.assertEqual(data, expected) + parsed = csvimport.parse(data, hint) + self.assertEqual(parsed, expected_parsed) + + def test_sample_file_bbbank(self): + expected = [ + ['Buchungstag', 'Valuta', 'Auftraggeber/Zahlungsempfänger', 'Empfänger/Zahlungspflichtiger', + 'Konto-Nr.', 'BLZ', 'Vorgang/Verwendungszweck', 'Währung', 'Umsatz', ' '], + ['10.04.2015', '10.04.2015', 'Mustermann, Max', 'Einzug ', '', '', + 'LASTSCHRIFT\nEinzug Nutzungsgebuehren IB\nAN: DE76574670095813552253', + 'EUR', '42,23', 'S'], + ['08.04.2015', '08.04.2015', 'Mustermann, Max', 'Kunde, Karl', '', '', + 'GUTSCHRIFT\nTicket 2015XAZTY IBAN: DE83\n839857672994615084', 'EUR', '42,23', 'H'], + [], + ['07.04.2015', '', '', '', '', '', 'EUR', 'Anfangssaldo', '1.337,00', 'H'], + ['10.04.2015', '', '', '', '', '', 'EUR', 'Endsaldo', '1.337,00', 'H'] + ] + hint = { + 'payer': [3], + 'reference': [6], + 'date': 1, + 'amount': 8, + 'cols': 10, + } + expected_parsed = [ + {'date': '10.04.2015', 'reference': 'LASTSCHRIFT\nEinzug Nutzungsgebuehren IB\nAN: DE76574670095813552253', + 'payer': 'Einzug', 'amount': '42,23'}, + {'date': '08.04.2015', 'reference': 'GUTSCHRIFT\nTicket 2015XAZTY IBAN: DE83\n839857672994615084', + 'payer': 'Kunde, Karl', 'amount': '42,23'}, + ] + filename = 'csvimport_data_de_bbbank.csv' + self._test_from_sample_file(filename, expected, hint, expected_parsed) + + def test_sample_file_sparkasse(self): + expected = [ + ['Auftragskonto', 'Buchungstag', 'Valutadatum', 'Buchungstext', 'Verwendungszweck', + 'Begünstigter/Zahlungspflichtiger', 'Kontonummer', 'BLZ', 'Betrag', 'Währung', 'Info'], + ['123456', '09.03', '09.03.15', 'ONLINE-UEBERWEISUNG', 'SVWZ+Begleichung Rechnung 1234', + 'Max Mustermann', 'DE13495179316396679327', 'THISISNOBIC', '-23,42', 'EUR', 'Umsatz gebucht'], + ['123456', '03.03', '03.03.15', 'GUTSCHRIFT', 'EREF+123456789 Ticket-Bestellung 2015XALSK', 'Karl Kunde', + 'DE89701226010601035858', 'THISISNOBIC', '42,32', 'EUR', 'Umsatz gebucht'] + ] + hint = { + 'payer': [5, 6, 7], + 'reference': [4], + 'date': 2, + 'amount': 8, + 'cols': 11, + } + expected_parsed = [ + {'date': '09.03.15', 'reference': 'SVWZ+Begleichung Rechnung 1234', + 'payer': 'Max Mustermann\nDE13495179316396679327\nTHISISNOBIC', 'amount': '-23,42'}, + {'date': '03.03.15', 'reference': 'EREF+123456789 Ticket-Bestellung 2015XALSK', + 'payer': 'Karl Kunde\nDE89701226010601035858\nTHISISNOBIC', 'amount': '42,32'} + ] + filename = 'csvimport_data_de_sparkassernn.csv' + self._test_from_sample_file(filename, expected, hint, expected_parsed) + + def test_sample_file_gls(self): + expected = [ + ['Kontonummer', 'Buchungstag', 'Wertstellung', 'Auftraggeber/Empfänger', 'Buchungstext', 'VWZ1', 'VWZ2', + 'VWZ3', 'VWZ4', 'VWZ5', 'VWZ6', 'VWZ7', 'VWZ8', 'VWZ9', 'VWZ10', 'VWZ11', 'VWZ12', 'VWZ13', 'VWZ14', + 'Betrag', 'Kontostand', 'Währung'], + ['123456789', '09.04.2015', '09.04.2015', 'Lars Lieferant', 'OnlBanking-Euro-Überweisung', + 'BIC:THISINOBIC', 'IBAN:DE59433524647958971194', 'Datum: 09.04.15 Zeit: 10:47', 'KD 1234567 TAN 123456', + 'Rechnung Nr. 123', '456', '', '', '', '', '', '', '', '', '-42,00', '1.337,00', 'EUR'], + ['123456789', '08.04.2015', '08.04.2015', 'Karl Kunde', 'SEPA-Überweisung', 'Ticket-Bestellung', + 'Bestellnummer 2015ABC', 'DEV', '', '', '', '', '', '', '', '', '', '', '', '12,00', '1.325,00', 'EUR'] + ] + hint = { + 'payer': [3], + 'reference': [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], + 'date': 2, + 'amount': 19, + 'cols': 22, + } + expected_parsed = [ + {'date': '09.04.2015', + 'reference': 'BIC:THISINOBIC\nIBAN:DE59433524647958971194\nDatum: 09.04.15 Zeit: 10:47\nKD 1234567 TAN ' + '123456\nRechnung Nr. 123\n456', + 'amount': '-42,00', 'payer': 'Lars Lieferant'}, + {'date': '08.04.2015', 'reference': 'Ticket-Bestellung\nBestellnummer 2015ABC\nDEV', + 'amount': '12,00', 'payer': 'Karl Kunde'} + ] + filename = "csvimport_data_de_gls.csv" + self._test_from_sample_file(filename, expected, hint, expected_parsed) + + def test_sample_file_dab(self): + expected = [ + ['Buchungstag', 'Valuta', 'Buchungstext', 'Auftraggeber / Empfänger', 'Verwendungszweck', 'Betrag in EUR', + ''], + ['09.04.2015', '09.04.2015', 'SEPA-Überweisung', 'Karl Kunde', 'Bestellung 2015ABCDE', '23,00', ''], + ['09.04.2015', '09.04.2015', 'SEPA-Überweisung', 'Karla Kundin', 'Bestellung 2015FGHIJ', '42,00', ''] + ] + hint = { + 'payer': [3], + 'reference': [4], + 'date': 1, + 'amount': 5, + 'cols': 7, + } + expected_parsed = [ + {'payer': 'Karl Kunde', 'reference': 'Bestellung 2015ABCDE', 'amount': '23,00', 'date': '09.04.2015'}, + {'payer': 'Karla Kundin', 'reference': 'Bestellung 2015FGHIJ', 'amount': '42,00', 'date': '09.04.2015'} + ] + filename = "csvimport_data_de_dab.csv" + self._test_from_sample_file(filename, expected, hint, expected_parsed)