diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug01.txt new file mode 100644 index 0000000000..4f1f9e85c1 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug01.txt @@ -0,0 +1,208 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +Sparkasse +S +Sparkasse Schweinfurt-Haßberge +Schweinfurt-Haßberge +Herrn +Ihr Ansprechpartner: +Max Mustermann +Beate Meier +Stasse +Kundenberatung Stadt +Stasse 7 Marktplatz 7 +99999 Stadt +99999 Stadt +Telefon 09999 99-999 +Fax 09999 99-999 +Beate.Meier@sparkasse-sw-has.de +1. April 2023 +Kontoauszug 5/2023 Seite 1 von 4 +S-Giro Smart 190999999, DE34 7935 0101 9999 9999 99 + +Datum Erläuterung Betrag Soll EUR Betrag Haben EUR + 9.999,79 +Kontostand am 28.02.2023, Auszug Nr. 4 + -1,00 +01.03.2023 Überweisung online +solarisBank AG BISON App DATUM 28.02.2023, 21.54 UHR +69e99931-14992875-21539999-20230228 + -1,50 +01.03.2023 Lastschrift +IGM Schweinfurt Industriegewerkschaft Metall BEITRAG BIS +02/23 MANDATSREF 999999 9999 GLAEUBIGER-ID +DE71ZZZ000000535 93 NAECHSTER BEITRAGSEINZUG IN +BEKA NNTER HOEHE UND VEREINBARTEM TURNUS +189990317 1140893701 Gläubiger-ID: +DE71ZZZ00000053593 + -1,80 +03.03.2023 Kartenzahlung +OKTAN TANKSTELLE SCHWEINFURT//Schwe infurt/DE +2023-03-02T15:59 Debitk.5 2026-12 + -2,00 +06.03.2023 Überweisung online +Emilio Klassen Brio Bahn DATUM 04.03.2023, 18.40 UHR +56b9999ff1-764437-18409975-20230304 + -3,00 +06.03.2023 Überweisung online +eBay Kleinanzeigen GmbH 6YDYJP8 tra 8f1b0b54d7a7 Ho +lzbahn Format Brio DATUM 04.03.2023, 10.35 UHR + -4,00 +08.03.2023 Überweisung online +Max Mustermann ETF DATUM 07.03.2023, 20.56 UHR +ddf19999b-7398562-20550987-20230307 + 3,00 +08.03.2023 GutschriftÜberweisung +Online Payments Foundation Rueckerstattung fuer +tra8f1b0b54d7a 7 - Online Payments Foundation - eB ay +Kleinanzeigen - Anzeigennr.: 237 3391032 +AWV-MELDEPFLICHT BEACHTEN HOTLINE BUNDESBANK: +(0800) 9999-111 ref-e9999e6bb908 + -10,00 +14.03.2023 Lastschrift +PayPal Europe S.a.r.l. et Cie S.C.A 1025755846077 . +Telekom Deutschland GmbH, Ihr Einkauf bei Telekom Deut +schland GmbH AWV-MELDEPFLICHT BEACHTEN HOTLINE +BUNDESBANK: (0800) 1234-111 1999995846077 +4CU2224VNSRPG Gläubiger-ID: +LxxxZZZ0000000000000999999 +Übertrag: 1.724,49 +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 999 999 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +Sparkasse +S +Schweinfurt-Haßberge +Kontoauszug 5/2023 Seite 2 von 4 +S-Giro Smart 190999999, DE34 7935 0101 9999 9999 99, Max Mustermann +Datum Erläuterung Betrag Soll EUR Betrag Haben EUR +Übertrag: 1.724,49 + -8,60 +14.03.2023 Lastschrift +LOTTO24 LOTTO24 C99685998 T930917703336 +CDF5XK2D496RTJ482C B9CFPGQV9Q683VB2 +Gläubiger-ID: NL48ZZZ399999900000 + -224,00 +20.03.2023 Lastschrift +Bundeskasse in Weiden Kfz-Steuer fuer XXX XX 99 fuer die +Zeit vom 19.03.2023 bis zum 18.03.2 024 Kassenzeichen +K1089999960 K10999920960/000031/299996F +KFZF999999996027092018 Gläubiger-ID: +DE99999990000001 + -189,90 +20.03.2023 Lastschrift +AMAZON EU S.A R.L., NIEDERLASSUNG D +305-8256010-7715520 Amazon.de 1XXQE OXIBDOB3TWX +1XXQEOXIBDOB3TWX +KcoKMYuv9999td-,O0?0,pPDaFQVWe Gläubiger-ID: + +DE24ZZZ00000561652 + -7,87 +21.03.2023 Lastschrift +PayPal Europe S.a.r.l. et Cie S.C.A 1025910619291 +PP.9962.PP . Autoteil e Gigant GmbH, Ihr Einkauf bei Auto +teile Gigant GmbH AWV-MELDEPFLICHT BEACHTEN +HOTLINE BUNDESBANK: (0800) 1234-111 10999999291 +4CU2999NSRPG Gläubiger-ID: +LU96999990000000000000058 + -90,18 +23.03.2023 Kartenzahlung +OKTAN TANKSTELLE SCHWEINFURT//Schwe infurt/DE +2023-03-22T16:20 Debitk.5 2026-12 + 189,90 +23.03.2023 GutschriftÜberweisung +AMAZON EU S.A R.L., NIEDERLASSUNG D +305-8256010-7715520 AMZ Amazon.de 5 +TGZV24J9999S0H 5TGZV24J56BT2S0H + -191,00 +27.03.2023 Kartenzahlung +Autohaus Hennig Fil. Ebern//Ebern/D E 2023-03-25T12:29 +Debitk.5 2026-12 + -8,60 +28.03.2023 Lastschrift +LOTTO24 LOTTO24 C99685998 T183144533936 +CMLBJL2BGDG7PQR32C B9CFPGQV9Q683VB2 +Gläubiger-ID: NL48ZZZ342764500000 + -1.000,00 +30.03.2023 Dauerauftrag +Max Mustermann ETF + 25,63 +30.03.2023 Lohn, Gehalt, Rente +ZF FRIEDRICHSHAFEN A Lohn/Gehalt 0999999/202303 + -5,40 +31.03.2023 Entgeltabrechnung / Wert: 01.04.2023 +siehe Anlage Nr. 1 + 0,00 +31.03.2023 Abrechnung 31.03.2023 / Wert: 01.04.2023 +siehe Anlage Nr. 2 + 2.702,47 +Kontostand am 31.03.2023 um 20:01 Uhr +Der Kontostand kann Beträge mit späterer Wertstellung enthalten, bitte Hinweise zum Kontoauszug beachten. +Anzahl Anlagen 2 +Ihr Kreditlimit EUR: 2.000,00 +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 999 999 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +Sparkasse +S +Schweinfurt-Haßberge +Kontoauszug 5/2023 Seite 3 von 4 +S-Giro Smart 190999999, DE34 7935 0101 9999 9999 99, Max Mustermann +Entgeltabschluss: Anlage 1 +Entgelte vom 01.03.2023 bis 31.03.2023 5,40- +Grundpreis (Kontoführung) 4,00- +Zahlungsverkehr 1,40- + -------------- +Abrechnung 31.03.2023 5,40- +Es handelt sich hierbei um eine umsatzsteuerfreie Leistung. +Rechnungsnummer: 20299999-BY999-00099999023 + +Bitte beachten Sie die Hinweise zum Kontoauszug. +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 999 999 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +Sparkasse +S +Schweinfurt-Haßberge +Kontoauszug 5/2023 Seite 4 von 4 +S-Giro Smart 190999999, DE34 7935 0101 9999 9999 99, Max Mustermann +Rechnungsabschluss: Anlage 2 +Kontostand in EUR am 31.03.2023 9.999,47 + + -------------- +Abrechnungszeitraum vom 01.01.2023 bis 31.03.2023 +Abrechnung 31.03.2023 0,00+ +Sollzinssätze am 30.03.2023 +10,6500 v.H. für eingeräumte Kontoüberziehung +(aktuell eingeräumte Kontoüberziehung 9.9999,00) +13,6500 v.H. für geduldete Kontoüberziehung +über die eingeräumte Kontoüberziehung hinaus + +Die Anpassungen des Zinssatzes für Kontoüberziehungen sind abhängig von +der Entwicklung des 3-Monats-Euribor. +Es handelt sich hierbei um eine umsatzsteuerfreie Leistung. +Kontostand/Rechnungsabschluss in EUR am 31.03.2023 9.999,47 + +Rechnungsnummer: 20230331-BY044-00017206021 +Bitte beachten Sie die Hinweise zum Kontoauszug. +Hinweise zum Kontoauszug: +l Einwendungen gegen den Kontoauszug teilen Sie uns bitte unverzüglich mit. +l Rechnungsabschlüsse gelten als genehmigt, sofern Sie innerhalb von sechs Wochen nach Zugang keine Einwendungen erheben. +Einwendungen gegen Rechnungsabschlüsse müssen der Sparkasse zugehen. Zur Fristwahrung genügt die rechtzeitige +Absendung (Nr. 7 Abs. 3 unserer Allgemeinen Geschäftsbedingungen). +l Der angegebene Kontostand berücksichtigt nicht die Werstellung der einzelnen Buchungen. Dies bedeutet, dass der genannte +Betrag nicht dem für die Zinsrechnung maßgeblichen Kontostand entsprechen muss und bei Verfügungen möglicherweise +Zinsen für die Inanspruchnahme einer eingeräumten oder geduldeten Kontoüberziehung anfallen können. +l Gutschriften aus eingereichten Schecks, Lastschriften und anderen Einzugspapieren erfolgen unter dem Vorbehalt der +Einlösung. +l Sparkontoauszüge heften Sie bitte in Ihr Loseblatt-Sparkassenbuch ein. +l Dieser Kontoauszug gilt im Zusammenhang mit den zugrunde liegenden Verträgen laut angegebener Kontonummer als +Rechnung im Sinne des UStG. +l Bitte beachten Sie: Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere +Informationen können dem "Informationsbogen für den Einleger" entnommen werden. +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 999 999 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug02.txt new file mode 100644 index 0000000000..1a84daea0f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/GiroKontoauszug02.txt @@ -0,0 +1,248 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +S Sparkasse +Schweinfurt-Haßberge +341 00 00 81 +Herrn Ihr Ansprechpartner: +Max Mustermann Max Mustermann +Strasse Kundenberatung Stadt +Frankenweg 7 Marktplatz 7 +99999 Stadt 99999 Stadt +Telefon 99999 99-764 +Fax 99999 99-499 +xxxxxx@sparkasse-sw-has.de + + + +1. April 2020 +. Kontoauszug 4/2020 Seite 1 von 5 +Giro Sm@rt 190999981, DE99 9999 9999 9999 9999 99 + +Datum Wert Erläuterung Betrag Soll EUR Betrag Haben EUR + Kontostand am 28.02.2020, Auszug Nr. 3 2,02+ +02.03.2020 02.03.2020 Lastschrift 2,00- +HFH Hamburger Fern-Hochschule gemei +200088229716999999999999Nr.1110428/ +1.2.2020Studiengebuehren Monat 02/2 +020 +2000882297 +. 16999999999999 +Gläubiger-ID: DE88ZZZ00000410829 +02.03.2020 02.03.2020 Überweisung online 1,00- +Armin Mustermann +DATUM 01.03.2020, 20.59 UHR +1.TAN 296567 +b03e5e226-6069921-20590733-20200301 +02.03.2020 02.03.2020 Lastschrift 3,50- +IGM Schweinfurt +Industriegewerkschaft Metall +BEITRAG BIS 02/20 MANDATSREF 999999 +3701 GLAEUBIGER-ID DE71ZZZ999999999 +93 NAECHSTER BEITRAGSEINZUG IN BEKA +NNTER HOEHE UND VEREINBARTEM TURNUS +126744737 +9999993701 +Gläubiger-ID: DE71ZZZ99999999993 +04.03.2020 04.03.2020 Lastschrift 8,60- +Lotto24 AG +C99685998 T181725108255 Spieleinsat +z per Bankeinzug +C99685998-T181725108255 +LOTTO24AG-99685998-190404173234 +Gläubiger-ID: 9999999999900071398 +Übertrag: 2,92+ +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 793 501 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +0.53.2.5910101 960483.0.10.02 1(F2assung November 2013) - (V1) +Finanz Informatik +Urheberrechtlich geschützt +S Sparkasse +Schweinfurt-Haßberge +Kontoauszug 4/2020 Seite 2 von 5 +Giro Sm@rt 190999981, DE99 9999 9999 9999 9999 99 Max Mustermann +Datum Wert Erläuterung Betrag Soll EUR Betrag Haben EUR +Übertrag: 2,92+ +09.03.2020 09.03.2020 Überweisung online 10,00- +Max Mustermann +127500 richtig +DATUM 09.03.2020, 16.54 UHR +1.TAN 778376 +e6f29d164-1473109-16492948-20200309 +09.03.2020 09.03.2020 Überweisung online 4,00- +HFH Hamburger Fern-Hochschule +Prüfungsgebühr Bachelorarbeit 11104 +28 +DATUM 09.03.2020, 16.55 UHR +1.TAN 519417 +9d346e97b-1732140-16534851-20200309 +09.03.2020 09.03.2020 Kartenzahlung 5,96- + ARAL Schweinfurt Strasburgstrase 1/ +/Schweinfurt/DE +2020-03-06T15:18 Debitk.5 2022-12 +12.03.2020 12.03.2020 Überweisung online 5,00- +Max Mustermann +128000 +DATUM 12.03.2020, 19.39 UHR +1.TAN 826390 +b1e24b2c-12532421-19382280-20200312 +19.03.2020 19.03.2020 Lastschrift 2,00- +. Bundeskasse in Weiden +Kfz-Steuer fuer 99999999 fuer die +Zeit vom 19.03.2020 bis zum 18.03.2 +021 Kassenzeichen K10850020960 +K10850020960/000022/20ZVS06F +KFZFK1085002096027092018 +Gläubiger-ID: DE09ZZZ00000000001 +19.03.2020 19.03.2020 Lastschrift 8,60- +Lotto24 AG +C99685998 T607480062218 Spieleinsat +z per Bankeinzug +C99685998-T607480062218 +LOTTO24AG-99685998-190404173234 +Gläubiger-ID: 9999999999900071398 +30.03.2020 30.03.2020 Lastschrift 3,15- +AMAZON PAYMENTS EUROPE S.C.A. +303-6388892-9432340 AMZN Mktp DE 5O +5XJGBW6W0NKWYG +5O5XJGBW6W0NKWYG +KcoKMYuvg4ojtd-,O0?0,pPDaFQVWe +Gläubiger-ID: DE94ZZZ00000561653 +30.03.2020 30.03.2020 Lohn, Gehalt, Rente 9.999,37+ +ZF FRIEDRICHSHAFEN A +Lohn/Gehalt 99999999/202003 +Übertrag: 2,58+ +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 793 501 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +0.53.2.5910101 960483.0.10.02 1(F2assung November 2013) - (V1) +Finanz Informatik +Urheberrechtlich geschützt +S Sparkasse +Schweinfurt-Haßberge +Kontoauszug 4/2020 Seite 3 von 5 +Giro Sm@rt 190999981, DE99 9999 9999 9999 9999 99 Max Mustermann +Datum Wert Erläuterung Betrag Soll EUR Betrag Haben EUR +Übertrag: 2,58+ +31.03.2020 31.03.2020 Überweisung online 1,00- +Mustermann Max +DATUM 31.03.2020, 16.54 UHR +1.TAN 871088 +428d19b31c-267390-16532976-20200331 +31.03.2020 31.03.2020 Lastschrift 6,99- +AMAZON PAYMENTS EUROPE S.C.A. +303-8052379-0257133 AMZN Mktp DE 4X +ULD0DDWTLIME6K +4XULD0DDWTLIME6K +KcoKMYuvg4ojtd-,O0?0,pPDaFQVWe +Gläubiger-ID: DE94ZZZ00000561653 +31.03.2020 01.04.2020 Entgeltabrechnung 4,70- +siehe Anlage Nr. 1 + 3 1.03.2020 01.04.2020 Abrechnung 31.03.2020 0,66- +siehe Anlage Nr. 2 + Kontostand am 31.03.2020 um 20:03 Uhr 6,23+ +Der Kontostand kann Beträge mit späterer Wertstellung enthalten, bitte Hinweise zum Kontoauszug beachten. +Anzahl Anlagen 2 +Ihr Dispositionskredit EUR: 2.000,00 +. +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 793 501 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +0.53.2.5910101 960483.0.10.02 1(F2assung November 2013) - (V1) +Finanz Informatik +Urheberrechtlich geschützt +S Sparkasse +Schweinfurt-Haßberge +Kontoauszug 4/2020 Seite 4 von 5 +Giro Sm@rt 190999981, DE99 9999 9999 9999 9999 99 Max Mustermann +Entgeltabschluss: Anlage 1 + +Entgelte vom 29.02.2020 bis 31.03.2020 4,70- + +Grundpreis (Kontoführung) 2,00- +Zahlungsverkehr 2,70- + -------------- +Abrechnung 31.03.2020 4,70- + +Es handelt sich hierbei um eine umsatzsteuerfreie Leistung. +Rechnungsnummer: 20200331-BY044-00009635280 + +. + +Bitte beachten Sie die Hinweise zum Kontoauszug. +. +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 793 501 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +0.53.2.5910101 960483.0.10.02 1(F2assung November 2013) - (V1) +Finanz Informatik +Urheberrechtlich geschützt +S Sparkasse +Schweinfurt-Haßberge +Kontoauszug 4/2020 Seite 5 von 5 +Giro Sm@rt 190999981, DE99 9999 9999 9999 9999 99 Max Mustermann +Rechnungsabschluss: Anlage 2 + +Kontostand in EUR am 31.03.2020 1,89 + + -------------- +Abrechnungszeitraum vom 01.01.2020 bis 31.03.2020 +Zinsen für eingeräumte Kontoüberziehung 0,66- +10,0500 v.H. Kred-Zins bis 29.03.2020 + + -------------- +Abrechnung 31.03.2020 0,66- + +Sollzinssätze am 30.03.2020 +. 10,0500 v.H. für eingeräumte Kontoüberziehung + (aktuell eingeräumte Kontoüberziehung 2.000,00) +10,0500 v.H. für geduldete Kontoüberziehung +über die eingeräumte Kontoüberziehung hinaus + +Die Anpassungen des Zinssatzes für Kontoüberziehungen sind abhängig von +der Entwicklung des 3-Monats-Euribor. + +Es handelt sich hierbei um eine umsatzsteuerfreie Leistung. + +. Kontostand/Rechnungsabschluss in EUR am 31.03.2020 1,23 + +Rechnungsnummer: 20200331-BY044-00009635278 + +Bitte beachten Sie die Hinweise zum Kontoauszug. +Hinweise zum Kontoauszug: +Sehr geehrte Kundin, sehr geehrter Kunde, +bitte prüfen Sie die Buchungen und Berechnungen in diesem Kontoauszug. Eventuelle Rückfragen besprechen Sie bitte mit Ihrem +Kundenberater. +l Einwendungen gegen den Kontoauszug richten Sie bitte unverzüglich an unsere Revisionsabteilung. Unsere Anschrift(en) +entnehmen Sie bitte unserem Preis- und Leistungsverzeichnis. +l Der angegebene Kontostand berücksichtigt nicht die Wertstellung der einzelnen Buchungen. Dies bedeutet, dass der genannte +Betrag nicht dem für die Zinsrechnung maßgeblichen Kontostand entsprechen muss und bei Verfügungen möglicherweise +Zinsen für die Inanspruchnahme einer eingeräumten oder geduldeten Kontoüberziehung anfallen können. +l Rechnungsabschlüsse gelten als genehmigt, sofern Sie innerhalb von sechs Wochen nach Zugang keine Einwendungen erheben. +Einwendungen gegen Rechnungsabschlüsse müssen der Sparkasse zugehen. Zur Fristwahrung genügt die rechtzeitige +Absendung (Nr. 7 Abs. 3 unserer Allgemeinen Geschäftsbedingungen). +l Gutschriften aus eingereichten Schecks, Lastschriften und anderen Einzugspapieren erfolgen unter dem Vorbehalt der +Einlösung. +l Schecks und andere Einzugspapiere sind erst dann eingelöst, wenn sie nicht bis zum Ablauf des übernächsten Bankarbeitstages +storniert oder korrigiert werden. Diese Papiere sind auch eingelöst, wenn die Sparkasse ihren Einlösungswillen schon vorher +Dritten gegenüber erkennbar bekundet hat (z. B. durch Bezahltmeldung). Für Lastschriften gelten die Einlösungsregeln in den +hierfür vereinbarten besonderen Bedingungen. +l Sparkontoauszüge heften Sie bitte in Ihr Loseblatt-Sparkassenbuch ein. +l Dieser Kontoauszug gilt im Zusammenhang mit den zugrunde liegenden Verträgen laut angegebener Kontonummer als +Rechnung im Sinne des UStG. +l Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere Informationen können +dem "Informationsbogen für den Einleger" entnommen werden. +Unsere für den Geschäftsverkehr mit Ihnen geltenden Allgemeinen Geschäftsbedingungen und besonderen Bedingungen stellen +wir Ihnen auf Wunsch gern zur Verfügung. +Mit freundlichen Grüßen +Ihre Sparkasse Schweinfurt-Haßberge +Sparkasse Schweinfurt-Haßberge Anstalt des öffentlichen Rechts Telefon 09999/999-0 www.sparkasse-sw-has.de +Jägersbrunnen 1-7 HR Nr. A/1124 (AG Schweinfurt) Telefax 09999/999-3229 info@sparkasse-sw-has.de +97421 Schweinfurt USt-IdNr. DE 133 906 578 BLZ: 793 501 01 BIC: BYLADEM1KSW +Sparkassen-Finanzgruppe +0.53.2.5910101 960483.0.10.02 1(F2assung November 2013) - (V1) +Finanz Informatik +Urheberrechtlich geschützt \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug01.txt new file mode 100644 index 0000000000..62dba12b1a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug01.txt @@ -0,0 +1,85 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- + Allgemeine Fragen zu Ihrer VISA Card beantwortet +Ihnen: +Tel.: +49 (0)89 999 999 - 336 +Fax: +49 (0)89 999 999 - 400 +SPARKASSE SCHWEINFURT-HASSBERGE, 97410 SCHWEINFURT E-Mail: kreditkartenservice@bayerncard.de +Bei Kartenverlust wählen Sie bitte: +Tel.: +49 (0)89 999 999 - 446 + + + +Herrn +Max Mustermannn +Strasse. 8 +99999 Stadt +Abrechnung: Oktober 2022 +Ihre Abrechnung vom 02.09.2022 bis 05.10.2022 Abrechnungsdatum: 5. Oktober 2022 +VISA Card-Nummer: 9999 99XX XXXX 0842 +Karteninhaber: Max Mustermannn +Seite 1 von 2 +Datum Datum Angabe des Unternehmens / Währung Betrag Kurs Betrag in +Beleg BuchungVerwendungszweck EUR +02.09.22 Saldo letzte Abrechnung 1.345,61 - +02.09.22 03.09.22 Lastschrift 1.345,61+ +02.09.22 05.09.22 PAYPAL *LUKASMATHY, 38888899999 3,00 - +02.09.22 05.09.22 PAYPAL *AUTOTEILEGI, 38888899999 7,62 - +02.09.22 05.09.22 MGP*Vinted 40530371895, L-1125 6,54 - +LUXEMB +04.09.22 06.09.22 PAYPAL *ANNA.JAEGER97, 12,90 - +38888899999 +07.09.22 08.09.22 PAYPAL *NETFLIX.COM, 38888899999 1,99 - +09.09.22 12.09.22 PAYPAL *BEYMARVIN2001, 5,00 - +38888899999 +09.09.22 12.09.22 PAYPAL *F_KLUGE, 38888899999 0,75 - +11.09.22 12.09.22 PAYPAL *POSTCODELOT, 38888899999 1,50 - +11.09.22 12.09.22 Gutmann am Dutzendteich, Nuernberg 2,40 - +08.09.22 12.09.22 HEM Tankstelle, Ebersdorf 1,08 - +13.09.22 16.09.22 PAYPAL *MEDPEXVERSA, 38888899999 5,50 - +15.09.22 16.09.22 PAYPAL *LWA24, 38888899999 15,00 - +14.09.22 19.09.22 PAYPAL *EBAY DE, 38888899999 9,59 - +14.09.22 03.09.22 PAYPAL *EBAY DE, 38888899999 20,29+ +20.09.22 21.09.22 PAYPAL *EBAY DE, 38888899999 39,98 - +21.09.22 22.09.22 PAYPAL *LWA24, 38888899999 4,00 - +22.09.22 23.09.22 PAYPAL *BRITTAWENDLAND, 10,00 - +38888899999 +Zwischensumme Seite 1 2,56 - + Allgemeine Fragen zu Ihrer VISA Card beantwortet +Ihnen: +Tel.: +49 (0)89 999 999 - 336 +Fax: +49 (0)89 999 999 - 400 +SPARKASSE SCHWEINFURT-HASSBERGE, 97410 SCHWEINFURT E-Mail: kreditkartenservice@bayerncard.de +Bei Kartenverlust wählen Sie bitte: +Tel.: +49 (0)89 999 999 - 446 + + + +Herrn +Max Mustermannn +Strasse. 8 +99999 Stadt +Abrechnung: Oktober 2022 +Ihre Abrechnung vom 02.09.2022 bis 05.10.2022 Abrechnungsdatum: 5. Oktober 2022 +VISA Card-Nummer: 9999 99XX XXXX 0842 +Karteninhaber: Max Mustermannn +Seite 2 von 2 +Datum Datum Angabe des Unternehmens / Währung Betrag Kurs Betrag in +Beleg BuchungVerwendungszweck EUR +Übertrag von Seite 1 2,56 - +23.09.22 26.09.22 PAYPAL *AUTOTEILEGI, 38888899999 95,21 - +26.09.22 27.09.22 PAYPAL *EBAY DE, 38888899999 7,99 - +26.09.22 27.09.22 PAYPAL *EBAY DE, 38888899999 5,89 - +26.09.22 28.09.22 PAYPAL *DHL OL, 38888899999 5,49 - +27.09.22 29.09.22 PAYPAL *EBAY DE, 38888899999 6,35 - +Neuer Saldo 3,49 - +Sehr geehrter Herr Max Mustermannn, +bitte prüfen Sie diese Abrechnung/Saldenmitteilung auf ihre Richtigkeit. Etwaige Einwendungen müssen Ihrer Sparkasse unter BCS +Kartenservice, Postfach 2562, 94015 Passau unverzüglich nach Zugang dieser Abrechnung/Saldenmitteilung schriftlich mitgeteilt +werden. +Der Rechnungsbetrag wird Ihrem Konto Nr. XXXXXX9999, Hinweis: +BLZ 793 501 01 belastet. Über Zinsen und Gebühren informieren auch der Preisaushang +und das Preisverzeichnis in den Geschäftsstellen Ihres +Der monatliche Verfügungsrahmen Ihrer VISA Card beträgt Kreditinstitutes. +9.999 EUR. Umsatzsteuernummer: DE133999999 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug02.txt new file mode 100644 index 0000000000..701d4a80b3 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/KreditKontoauszug02.txt @@ -0,0 +1,91 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- + Allgemeine Fragen zu Ihrer VISA Card beantwortet +Ihnen: +Tel.: +49 (0)89 411 116 - 336 +Fax: +49 (0)89 411 116 - 400 +SPARKASSE SCHWEINFURT-HASSBERGE, 97410 SCHWEINFURT E-Mail: kreditkartenservice@bayerncard.de +Bei Kartenverlust wählen Sie bitte: +Tel.: +49 (0)89 411 116 - 446 + + + +Herrn +Max Max +Strasse. 8 +99990 Stadt +Abrechnung: Februar 2021 +Ihre Abrechnung vom 05.01.2021 bis 02.02.2021 Abrechnungsdatum: 2. Februar 2021 +VISA Card-Nummer: 9999 62XX XXXX 0842 +Karteninhaber: Max Max +Seite 1 von 2 +Datum Datum Angabe des Unternehmens / Währung Betrag Kurs Betrag in +Beleg BuchungVerwendungszweck EUR +05.01.21 Saldo letzte Abrechnung 862,96 - +05.01.21 06.01.21 Lastschrift 862,96+ +04.01.21 06.01.21 PAYPAL *JESSICAWILDE, 35314369001 6,99 - +05.01.21 06.01.21 PAYPAL *BATTERIUM BATT, 19,42 - +35314369001 +07.01.21 08.01.21 PAYPAL *NETFLIX.COM, 35314369001 1,99 - +08.01.21 06.01.21 AMZN Mktp US, Amzn.com/bill 3,89+ +11.01.21 12.01.21 PAYPAL *EBAY DE, 35314369001 2,90 - +11.01.21 12.01.21 WWW.ALIEXPRESS.COM, 60,80 - +LUXEMBOURG +11.01.21 12.01.21 SHELL 1708, LICHTENFELS 40,22 - +12.01.21 14.01.21 PAYPAL *ATU EBAY ATU, 35314369001 1,40 - +12.01.21 14.01.21 PAYPAL *Q PARTS24 EBAY, 1,28 - +35314369001 +14.01.21 18.01.21 PAYPAL *MMSECOMMERC EB, 6,99 - +35314369001 +17.01.21 18.01.21 ALIEXPRESS.COM, Luxembourg 43,52 - +20.01.21 21.01.21 WWW.ALIEXPRESS.COM, 9,68 - +LUXEMBOURG +21.01.21 22.01.21 PAYPAL *EBAY DE, 35314369001 1,00 - +22.01.21 25.01.21 PAYPAL *UVISION EBAY U, 7,95 - +35314369001 +22.01.21 25.01.21 PAYPAL *ZHANGSHAZHI EB, 1,29 - +35314369001 +Zwischensumme Seite 1 1.184,54 - + Allgemeine Fragen zu Ihrer VISA Card beantwortet +Ihnen: +Tel.: +49 (0)89 411 116 - 336 +Fax: +49 (0)89 411 116 - 400 +SPARKASSE SCHWEINFURT-HASSBERGE, 97410 SCHWEINFURT E-Mail: kreditkartenservice@bayerncard.de +Bei Kartenverlust wählen Sie bitte: +Tel.: +49 (0)89 411 116 - 446 + + + +Herrn +Max Max +Strasse. 8 +99990 Stadt +Abrechnung: Februar 2021 +Ihre Abrechnung vom 05.01.2021 bis 02.02.2021 Abrechnungsdatum: 2. Februar 2021 +VISA Card-Nummer: 9999 62XX XXXX 0842 +Karteninhaber: Max Max +Seite 2 von 2 +Datum Datum Angabe des Unternehmens / Währung Betrag Kurs Betrag in +Beleg BuchungVerwendungszweck EUR +Übertrag von Seite 1 1.184,54 - +23.01.21 25.01.21 EVERDRIVE.ME, KRAKOW USD 181,00 1,2192 148,46 - +2% für Währungsumrechnung 2,97 - +22.01.21 25.01.21 PAYPAL *HAIBEILIKEJ EB, 4029357733 1,96 - +25.01.21 06.01.21 PAYPAL *ATU EBAY ATU, 35314369001 5,40+ +29.01.21 01.02.21 PAYPAL *AUTOTEILEGI AU, 24,71 - +35314369001 +29.01.21 06.01.21 PAYPAL *MMSECOMMERC EB, 6,99+ +35314369001 +29.01.21 01.02.21 PAYPAL *FHUAUTOWALD EB, 1,99 - +35314369001 +Neuer Saldo 9.999,24 - +Sehr geehrter Herr Max Max, +bitte prüfen Sie diese Abrechnung/Saldenmitteilung auf ihre Richtigkeit. Etwaige Einwendungen müssen Ihrer Sparkasse unter BCS +Kartenservice, Postfach 2562, 94015 Passau unverzüglich nach Zugang dieser Abrechnung/Saldenmitteilung schriftlich mitgeteilt +werden. +Der Rechnungsbetrag wird Ihrem Konto Nr. XXXXXX7063, Hinweis: +BLZ 793 501 01 belastet. Über Zinsen und Gebühren informieren auch der Preisaushang +und das Preisverzeichnis in den Geschäftsstellen Ihres +Der monatliche Verfügungsrahmen Ihrer VISA Card beträgt Kreditinstitutes. +9.990 EUR. Umsatzsteuernummer: DE139906578 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/SBrokerPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/SBrokerPDFExtractorTest.java index 9a529cece1..51b1b68f82 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/SBrokerPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/SBrokerPDFExtractorTest.java @@ -7,11 +7,13 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.junit.Test; import name.abuchen.portfolio.Messages; +import name.abuchen.portfolio.datatransfer.Extractor; import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem; import name.abuchen.portfolio.datatransfer.Extractor.Item; import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem; @@ -1706,4 +1708,923 @@ public void testDividendeStorno02() assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); } + + @Test + public void testGiroKontoauszug01() + { + SBrokerPDFExtractor extractor = new SBrokerPDFExtractor(new Client()); + + List errors = new ArrayList(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "GiroKontoauszug01.txt"), + errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(20)); + + // check transaction + // get transactions + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(20L)); + + Item item = iter.next(); + + // assert transaction + AccountTransaction transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-01T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.50)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-01T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.80)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-03T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Kartenzahlung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-08T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-08T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("GutschriftÜberweisung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-14T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.60)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-14T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(224.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-20T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(189.90)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-20T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.87)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-21T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(90.18)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-23T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(189.90)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Kartenzahlung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-23T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(191.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("GutschriftÜberweisung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-27T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.60)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Kartenzahlung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-28T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-30T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.63)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Dauerauftrag")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-30T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.40)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lohn, Gehalt, Rente")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.40)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Entgelte vom 01.03.2023 bis 31.03.2023")); + + item = iter.next(); + + // assert transaction is cancellation + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Abrechnungszeitraum vom 01.01.2023 bis 31.03.2023")); + + // check cancellation (Amount = 0,00) transaction + TransactionItem cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation.getSubject()).getType(), is(AccountTransaction.Type.INTEREST)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2023-03-31T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(0))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("GiroKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Abrechnungszeitraum vom 01.01.2023 bis 31.03.2023")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testGiroKontoauszug02() + { + SBrokerPDFExtractor extractor = new SBrokerPDFExtractor(new Client()); + + List errors = new ArrayList(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "GiroKontoauszug02.txt"), + errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(16)); + + // check transaction + // get transactions + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(16L)); + + Item item = iter.next(); + + // assert transaction + AccountTransaction transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-02T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-02T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-02T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.50)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-04T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.60)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-09T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-09T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-09T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.96)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Kartenzahlung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.60)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-30T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.15)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-30T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9999.37)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lohn, Gehalt, Rente")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Überweisung online")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.99)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.70)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Entgelte vom 29.02.2020 bis 31.03.2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST_CHARGE)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-03-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); + assertThat(transaction.getSource(), is("GiroKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Abrechnungszeitraum vom 01.01.2020 bis 31.03.2020")); + } + + @Test + public void testKreditKontoauszug01() + { + SBrokerPDFExtractor extractor = new SBrokerPDFExtractor(new Client()); + + List errors = new ArrayList(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "KreditKontoauszug01.txt"), + errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(23)); + + // check transaction + // get transactions + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(23L)); + + Item item = iter.next(); + + // assert transaction + AccountTransaction transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-03T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1345.61)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-05T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *LUKASMATHY, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-05T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.62)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *AUTOTEILEGI, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-05T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.54)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("MGP*Vinted 40530371895, L-1125")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.90)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *ANNA.JAEGER97")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-08T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *NETFLIX.COM, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *BEYMARVIN2001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.75)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *F_KLUGE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.50)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *POSTCODELOT, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.40)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("Gutmann am Dutzendteich, Nuernberg")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.08)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("HEM Tankstelle, Ebersdorf")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.50)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *MEDPEXVERSA, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *LWA24, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-19T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.59)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-03T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.29)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-21T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(39.98)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-22T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *LWA24, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-23T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *BRITTAWENDLAND")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-26T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(95.21)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *AUTOTEILEGI, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-27T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-27T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.89)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-28T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.49)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *DHL OL, 38888899999")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-29T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.35)))); + assertThat(transaction.getSource(), is("KreditKontoauszug01.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 38888899999")); + } + + @Test + public void testKreditKontoauszug02() + { + SBrokerPDFExtractor extractor = new SBrokerPDFExtractor(new Client()); + + List errors = new ArrayList(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "KreditKontoauszug02.txt"), + errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(23)); + + // check transaction + // get transactions + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(23L)); + + Item item = iter.next(); + + // assert transaction + AccountTransaction transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(862.96)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("Lastschrift")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *JESSICAWILDE, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(19.42)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *BATTERIUM BATT")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-08T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *NETFLIX.COM, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.89)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("AMZN Mktp US, Amzn.com/bill")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.90)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.80)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("WWW.ALIEXPRESS.COM")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-12T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.22)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("SHELL 1708, LICHTENFELS")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-14T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.40)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *ATU EBAY ATU, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-14T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.28)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *Q PARTS24 EBAY")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-18T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *MMSECOMMERC EB")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-18T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(43.52)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("ALIEXPRESS.COM, Luxembourg")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-21T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.68)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("WWW.ALIEXPRESS.COM")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-22T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *EBAY DE, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-25T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.95)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *UVISION EBAY U")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-25T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.29)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *ZHANGSHAZHI EB")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-25T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(145.49)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("EVERDRIVE.ME, KRAKOW")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-25T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.96)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *HAIBEILIKEJ EB, 4029357733")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.40)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *ATU EBAY ATU, 35314369001")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-02-01T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(24.71)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *AUTOTEILEGI AU")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.DEPOSIT)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-06T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *MMSECOMMERC EB")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.REMOVAL)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-02-01T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.99)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("PAYPAL *FHUAUTOWALD EB")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-01-25T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.97)))); + assertThat(transaction.getSource(), is("KreditKontoauszug02.txt")); + assertThat(transaction.getNote(), is("2% für Währungsumrechnung")); + } } diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java index f9b68c6f17..cef591660d 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java @@ -302,7 +302,6 @@ public class Messages extends NLS public static String PDFdbMsgCannotDetermineFileType; public static String PDFMsgExtracingFiles; public static String PDFMsgFileNotSupported; - public static String PDFMsgMissingShares; public static String QuoteFeedManual; public static String SecurityBasedExchangeRateProvider; public static String VINISAppValueCapitalGainsCurrentYear; diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/SBrokerPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/SBrokerPDFExtractor.java index b366795dd0..7602161da7 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/SBrokerPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/SBrokerPDFExtractor.java @@ -5,6 +5,9 @@ import static name.abuchen.portfolio.util.TextUtil.trim; import java.math.BigDecimal; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import name.abuchen.portfolio.Messages; import name.abuchen.portfolio.datatransfer.ExtrExchangeRate; @@ -32,6 +35,8 @@ public SBrokerPDFExtractor(Client client) addBuySellTransaction(); addDividendTransaction(); + addAccountStatementTransaction(); + addCreditcardStatementTransaction(); } @Override @@ -61,7 +66,7 @@ private void addBuySellTransaction() .section("type").optional() .match("^(Wertpapier Abrechnung )?(?(Ausgabe Investmentfonds|Kauf|Verkauf)).*$") .assign((t, v) -> { - if (v.get("type").equals("Verkauf")) + if ("Verkauf".equals(v.get("type"))) t.setType(PortfolioTransaction.Type.SELL); }) @@ -229,7 +234,9 @@ private void addDividendTransaction() }); pdfTransaction + // @formatter:off // Storno unserer Erträgnisgutschrift Nr. 81565205 vom 15.06.2016. + // @formatter:on .section("type").optional() .match("^(?Storno) unserer Ertr.gnisgutschrift .*$") .assign((t, v) -> v.getTransactionContext().put(FAILURE, @@ -254,10 +261,10 @@ private void addDividendTransaction() .match("^(Storno \\- )?(?Ertragsthesaurierung)$") .match("^Wert Konto\\-Nr\\.( Devisenkurs)? Betrag zu Ihren (?(Gunsten|Lasten))$") .assign((t, v) -> { - if (v.get("type").equals("Ertragsthesaurierung") && v.get("sign").equals("Gunsten")) + if ("Ertragsthesaurierung".equals(v.get("type")) && "Gunsten".equals(v.get("sign"))) t.setType(AccountTransaction.Type.TAX_REFUND); - if (v.get("type").equals("Ertragsthesaurierung") && v.get("sign").equals("Lasten")) + if ("Ertragsthesaurierung".equals(v.get("type")) && "Lasten".equals(v.get("sign"))) t.setType(AccountTransaction.Type.TAXES); }) @@ -532,6 +539,343 @@ private void addTaxReturnBlock(DocumentType type) })); } + private void addAccountStatementTransaction() + { + final DocumentType type = new DocumentType("Kontoauszug [\\d]+\\/[\\d]{4}", (context, lines) -> { + Pattern pCurrency = Pattern.compile("^Datum Erl.uterung Betrag Soll [\\w]{3} Betrag Haben (?[\\w]{3})$"); + + for (String line : lines) + { + Matcher m = pCurrency.matcher(line); + if (m.matches()) + context.put("currency", m.group("currency")); + } + }); + this.addDocumentTyp(type); + + Block depositRemovalBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}( [\\d]{2}\\.[\\d]{2}\\.[\\d]{4})? " + + "(Lastschrift" + + "|.berweisung online" + + "|Kartenzahlung" + + "|Gutschrift.berweisung" + + "|Dauerauftrag" + + "|Lohn, Gehalt, Rente).*$"); + type.addBlock(depositRemovalBlock); + depositRemovalBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.DEPOSIT); + return entry; + }) + + .oneOf( + // @formatter:off + // 01.03.2023 Lastschrift + // 03.03.2023 Kartenzahlung + // 06.03.2023 Überweisung online + // 08.03.2023 GutschriftÜberweisung + // 30.03.2023 Dauerauftrag + // 30.03.2023 Lohn, Gehalt, Rente + // @formatter:on + section -> section + .attributes("date", "note", "amount", "type") + .match("^(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " + + "(?(Lastschrift" + + "|.berweisung online" + + "|Kartenzahlung" + + "|Gutschrift.berweisung" + + "|Dauerauftrag" + + "|Lohn, Gehalt, Rente))" + + ".*$") + .match("^[\\s]+ (?\\s(\\-)?)(?[\\.,\\d]+)$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + // Is type is "-" change from DEPOSIT to REMOVAL + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.REMOVAL); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + t.setNote(v.get("note")); + + if (t.getAmount() == 0) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + }) + , + // @formatter:off + // 02.03.2020 02.03.2020 Lastschrift 2,00- + // 02.03.2020 02.03.2020 Überweisung online 1,00- + // @formatter:on + section -> section + .attributes("date", "note", "type", "amount") + .match("^(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?(Lastschrift" + + "|.berweisung online" + + "|Kartenzahlung" + + "|Gutschrift.berweisung" + + "|Dauerauftrag" + + "|Lohn, Gehalt, Rente)) " + + "[\\s]+" + + "(?[\\.,\\d]+)" + + "(?([\\-|\\+])?)$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + // Is type is "-" change from DEPOSIT to REMOVAL + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.REMOVAL); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + t.setNote(v.get("note")); + + if (t.getAmount() == 0) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + }) + ) + + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); + + return item; + })); + + // @formatter:off + // Entgeltabschluss: Anlage 1 + // + // Entgelte vom 29.02.2020 bis 31.03.2020 4,70- + // + // Grundpreis (Kontoführung) 2,00- + // Zahlungsverkehr 2,70- + // -------------- + // Abrechnung 31.03.2020 4,70- + // @formatter:on + Block feesBlock = new Block("^Entgeltabschluss: .*$", "^Abrechnung .*$"); + type.addBlock(feesBlock); + feesBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.FEES_REFUND); + return entry; + }) + + .section("note", "date", "amount", "type") + .match("^(?Entgelte vom [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} bis [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") + .match("^Abrechnung (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) .* (?[\\.,\\d]+)(?([\\-|\\+])?)$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + // Is type is "-" change from FEES_REFUND to FEES + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.FEES); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + t.setNote(trim(v.get("note"))); + + if (t.getAmount() == 0) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + }) + + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); + + return item; + })); + + // @formatter:off + // Rechnungsabschluss: Anlage 2 + // + // Kontostand in EUR am 31.03.2020 1,89 + + // -------------- + // Abrechnungszeitraum vom 01.01.2020 bis 31.03.2020 + // Zinsen für eingeräumte Kontoüberziehung 0,66- + // 10,0500 v.H. Kred-Zins bis 29.03.2020 + // + // -------------- + // Abrechnung 31.03.2020 0,66- + // @formatter:on + Block interestBlock = new Block("^Rechnungsabschluss: .*$", "^Abrechnung .*$"); + type.addBlock(interestBlock); + interestBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.INTEREST); + return entry; + }) + + .section("note", "date", "amount", "type") + .match("^(?Abrechnungszeitraum vom [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} bis [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") + .match("^Abrechnung (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) .* (?[\\.,\\d]+)(?([\\-|\\+])?)$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + // Is type is "-" change from INTEREST to INTEREST_CHARGE + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.INTEREST_CHARGE); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + t.setNote(trim(v.get("note"))); + + if (t.getAmount() == 0) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + }) + + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); + + return item; + })); + } + + private void addCreditcardStatementTransaction() + { + DocumentType type = new DocumentType("Ihre Abrechnung vom ", (context, lines) -> { + Pattern pCurrency = Pattern.compile("^Beleg BuchungVerwendungszweck (?[\\w]{3})$"); + + for (String line : lines) + { + Matcher m = pCurrency.matcher(line); + if (m.matches()) + context.put("currency", m.group("currency")); + } + }); + this.addDocumentTyp(type); + + Block depositRemovalBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{2} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2} .* [\\.,\\d]+([\\s])?([\\-|\\+])$"); + type.addBlock(depositRemovalBlock); + depositRemovalBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.DEPOSIT); + return entry; + }) + + .oneOf( + // @formatter:off + // 23.01.21 25.01.21 EVERDRIVE.ME, KRAKOW USD 181,00 1,2192 148,46 - + // 2% für Währungsumrechnung 2,97 - + // @formatter:on + section -> section + .attributes("date", "note", "amount", "type", "fee") + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{2} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{2}) " + + "(?.*) " + + "[\\w]{3} [\\.,\\d]+ [\\.,\\d]+ " + + "(?[\\.,\\d]+)" + + "([\\s])?(?([\\-|\\+]))$") + .match("^[\\.,\\d]+% f.r W.hrungsumrechnung (?[\\.,\\d]+)([\\s])?\\-$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + Money fee = Money.of(asCurrencyCode(context.get("currency")), asAmount(v.get("fee"))); + Money amount = Money.of(asCurrencyCode(context.get("currency")), asAmount(v.get("amount"))); + + // Is type is "-" change from DEPOSIT to REMOVAL + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.REMOVAL); + + t.setDateTime(asDate(v.get("date"))); + + // Subtract currency exchange fees from the amount + t.setMonetaryAmount(amount.subtract(fee)); + + // Formatting some notes + if (trim(v.get("note")).endsWith(",")) + v.put("note", trim(v.get("note")).substring(0, trim(v.get("note")).length() - 1)); + + t.setNote(trim(v.get("note"))); + }) + , + // @formatter:off + // 02.09.22 03.09.22 Lastschrift 1.345,61+ + // 14.09.22 03.09.22 PAYPAL *EBAY DE, 38888899999 20,29+ + // + // 04.09.22 06.09.22 PAYPAL *ANNA.JAEGER97, 12,90 - + // 22.09.22 23.09.22 PAYPAL *BRITTAWENDLAND, 10,00 - + // @formatter:on + section -> section + .attributes("date", "note", "amount", "type") + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{2} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{2})" + + "(?.*) " + + "(?[\\.,\\d]+)" + + "([\\s])?(?([\\-|\\+]))$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + // Is type is "-" change from DEPOSIT to REMOVAL + if ("-".equals(trim(v.get("type")))) + t.setType(AccountTransaction.Type.REMOVAL); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + + // Formatting some notes + if (trim(v.get("note")).endsWith(",")) + v.put("note", trim(v.get("note")).substring(0, trim(v.get("note")).length() - 1)); + + t.setNote(trim(v.get("note"))); + }) + ) + + .wrap(TransactionItem::new)); + + Block feesExchangeBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{2} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2} .* [\\w]{3} [\\.,\\d]+ [\\.,\\d]+ [\\.,\\d]+([\\s])?([\\-|\\+])$"); + type.addBlock(feesExchangeBlock); + feesExchangeBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.FEES); + return entry; + }) + + // @formatter:off + // 23.01.21 25.01.21 EVERDRIVE.ME, KRAKOW USD 181,00 1,2192 148,46 - + // 2% für Währungsumrechnung 2,97 - + // @formatter:on + .section("date", "note", "amount") + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{2} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{2}) " + + ".* " + + "[\\w]{3} [\\.,\\d]+ [\\.,\\d]+ " + + "[\\.,\\d]+" + + "([\\s])?\\-$") + .match("^(?[\\.,\\d]+% f.r W.hrungsumrechnung) (?[\\.,\\d]+)([\\s])?\\-$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(context.get("currency"))); + t.setNote(trim(v.get("note"))); + }) + + .wrap(TransactionItem::new)); + } + private > void addTaxesSectionsTransaction(T transaction, DocumentType type) { // If we have a tax refunds, we set a flag and don't book tax below. diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages.properties index a9b7a3dcfa..3508aa200c 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages.properties @@ -528,7 +528,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Security: {0}\nIssue: No holdings for MsgErrorTradeCollector_NoHoldingsForTransfer = Security: {0}\nIssue: No holdings to transfer transaction security from ''{1}'' to ''{2}''.\nTransaction: {3} -MsgErrorTransactionTypeNotSupported = Transaction is not supported or needed by PP: {0} +MsgErrorTransactionTypeNotSupported = Transaction is not supported or required. MsgErrorUnexpectedStatusCode = Unexpected Status Code. Ticker: {0}, Code: {1}, URL: {2} @@ -592,8 +592,6 @@ PDFMsgExtracingFiles = Extracting transactions from PDF files... PDFMsgFileNotSupported = {1}: File ''{0}'' is not a supported document -PDFMsgMissingShares = Number of shares not found for this transaction - PDFdbMsgCannotDetermineFileType = {0}: Unknown or unsupported transaction type in ''{1}'' QuoteFeedManual = No automatic quote download diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_cs.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_cs.properties index d88343b5f5..643ffb4898 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_cs.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_cs.properties @@ -528,7 +528,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Cenn\u00FD pap\u00EDr: {0}\nProbl\u00 MsgErrorTradeCollector_NoHoldingsForTransfer = Cenn\u00FD pap\u00EDr: {0}\nProbl\u00E9m: \u017E\u00E1dn\u00E9 pod\u00EDly pro p\u0159evod cenn\u00FDch pap\u00EDr\u016F z ''{1}'' do ''{2}''\nTransakce: {3} -MsgErrorTransactionTypeNotSupported = Transakce nen\u00ED podporov\u00E1na nebo pot\u0159ebn\u00E1 pro PP: {0} +MsgErrorTransactionTypeNotSupported = Transakce nen\u00ED podporov\u00E1na ani vy\u017Eadov\u00E1na. MsgErrorUnexpectedStatusCode = Neo\u010Dek\u00E1van\u00FD stavov\u00FD k\u00F3d. Ticker: {0}, K\u00F3d: {1}, URL: {2} @@ -592,8 +592,6 @@ PDFMsgExtracingFiles = Extrahov\u00E1n\u00ED transakc\u00ED ze soubor\u016F PDF. PDFMsgFileNotSupported = {1}: Soubor ''{0}'' nen\u00ED podporovan\u00FDm dokumentem -PDFMsgMissingShares = Po\u010Det akci\u00ED, kter\u00E9 nebyly pro tuto transakci nalezeny - PDFdbMsgCannotDetermineFileType = {0}: Nezn\u00E1m\u00FD nebo nepodporovan\u00FD typ transakce v ''{1}'' QuoteFeedManual = \u017D\u00E1dn\u00E9 automatick\u00E9 stahov\u00E1n\u00ED kurz\u016F diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_da.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_da.properties index 30fc8f109a..04a03d3a9a 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_da.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_da.properties @@ -527,7 +527,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = V\u00E6rdipapir: {0}\nProblem: Ingen MsgErrorTradeCollector_NoHoldingsForTransfer = V\u00E6rdipapir: {0}\nProblem: Ingen beholdninger til at overf\u00F8re transaktionsv\u00E6rdipapir fra ''{1}'' til ''{2}''.\nTransaktion: {3} -MsgErrorTransactionTypeNotSupported = Transaktionen er ikke underst\u00F8ttet eller n\u00F8dvendig af PP: {0} +MsgErrorTransactionTypeNotSupported = Transaktionen er ikke underst\u00F8ttet eller p\u00E5kr\u00E6vet. MsgErrorUnexpectedStatusCode = Uventet statuskode. V\u00E6rdipapirkode: {0}, Kode: {1}, URL: {2} @@ -591,8 +591,6 @@ PDFMsgExtracingFiles = Udtr\u00E6kker transaktioner fra PDF filer... PDFMsgFileNotSupported = {1}: Fil ''{0}'' er ikke et supportet dokument -PDFMsgMissingShares = Antal aktier ikke fundet for denne transaktion - PDFdbMsgCannotDetermineFileType = {0}: Ukendt eller ikke underst\u00F8ttet transaktionstype i ''{1}'' QuoteFeedManual = Ingen download af automatisk kurs diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_de.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_de.properties index 6c2c733896..1d34146c2c 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_de.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_de.properties @@ -528,7 +528,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Wertpapier: {0}\nProblem: Kein Bestan MsgErrorTradeCollector_NoHoldingsForTransfer = Wertpapier: {0}\nProblem: Kein Bestand f\u00FCr die Umbuchung von ''{1}'' nach ''{2}''.\nBuchung: {3} -MsgErrorTransactionTypeNotSupported = Buchung wird von PP nicht unterst\u00FCtzt bzw. ben\u00F6tigt: {0} +MsgErrorTransactionTypeNotSupported = Buchung wird nicht unterst\u00FCtzt bzw. ben\u00F6tigt. MsgErrorUnexpectedStatusCode = Unerwarteter Status Code. Ticker: {0}, Code: {1}, URL: {2} @@ -592,8 +592,6 @@ PDFMsgExtracingFiles = Buchungen werden aus den PDF Dateien extrahiert... PDFMsgFileNotSupported = {1}: Datei ''{0}'' ist kein unterst\u00FCtztes Dokument -PDFMsgMissingShares = Keine Informationen zu der Anzahl der St\u00FCcke gefunden - PDFdbMsgCannotDetermineFileType = {0}: Unbekannter oder nicht unterst\u00FCtzter Buchungstyp in Datei ''{1}'' QuoteFeedManual = Kein automatischer Download diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_es.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_es.properties index 1c2edfa3c5..9bd3f848f5 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_es.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_es.properties @@ -528,7 +528,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Valor: {0}\nProblema: No hay particip MsgErrorTradeCollector_NoHoldingsForTransfer = Valor: {0}\nProblema: No hay cantidad para transferir los activos del ''{1}'' a ''{2}''.\nTransacci\u00F3n: {2} -MsgErrorTransactionTypeNotSupported = La transacci\u00F3n no es soportada o requerida por PP: {0} +MsgErrorTransactionTypeNotSupported = La transacci\u00F3n no es compatible ni necesaria. MsgErrorUnexpectedStatusCode = Estado inesperado. Ticker: {0}, Code: {1}, URL: {2} @@ -592,8 +592,6 @@ PDFMsgExtracingFiles = Extrayendo transacciones de ficheros PDF ... PDFMsgFileNotSupported = {1} : El archivo ''{0}'' no es un documento en formato compatible. -PDFMsgMissingShares = N\u00FAmero de acciones no encontradas para esta transacci\u00F3n - PDFdbMsgCannotDetermineFileType = {0}: Tipo de transacci\u00F3n desconocido o no soportado en ''{1}'' QuoteFeedManual = Sin descarga autom\u00E1tica de cotizaciones diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_fr.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_fr.properties index de74ebea65..e663bde29f 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_fr.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_fr.properties @@ -512,7 +512,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Titre : {0}\nErreur : pas de stock po MsgErrorTradeCollector_NoHoldingsForTransfer = Titre : {0}\nErreur : pas de stock pour transfert depuis ''{1}'' vers ''{2}'' .\nOp\u00E9ration : {3} -MsgErrorTransactionTypeNotSupported = Op\u00E9ration non prise en charge ou non n\u00E9cessaire pour PP : {0} +MsgErrorTransactionTypeNotSupported = La transaction n'est pas prise en charge ou requise . MsgErrorUnexpectedStatusCode = Code d'\u00E9tat inattendu. Symbole : {0}, Code : {1}, URL : {2} @@ -576,8 +576,6 @@ PDFMsgExtracingFiles = Extraction des op\u00E9rations \u00E0 partir des fichiers PDFMsgFileNotSupported = {1} : le fichier ''{0}'' n'est pas un document au format compatible -PDFMsgMissingShares = Nombre de part manquant pour cette op\u00E9ration - PDFdbMsgCannotDetermineFileType = {0} : type d'op\u00E9ration inconnu ou non pris en charge dans ''{1}'' QuoteFeedManual = Pas de t\u00E9l\u00E9chargement automatique des cours diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_it.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_it.properties index 21ed7ac1ac..21392e56e2 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_it.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_it.properties @@ -527,7 +527,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Titolo: {0}\nProblema: non c'\u00E8 c MsgErrorTradeCollector_NoHoldingsForTransfer = Titolo: {0}\nProblema: non c'\u00E8 consistenza per operazioni di trasferimento titolo da "{1}" a "{2}".\nOperazione: {3} -MsgErrorTransactionTypeNotSupported = L'operazione non \u00E8 supportata o necessaria per PP: {0} +MsgErrorTransactionTypeNotSupported = La transazione non \u00E8 supportata o richiesta. MsgErrorUnexpectedStatusCode = Codice di stato inatteso. Ticker: {0}, Codice: {1}, URL: {2} @@ -591,8 +591,6 @@ PDFMsgExtracingFiles = Estrazione operazioni dal file PDF... PDFMsgFileNotSupported = {1}: Il file ''{0}'' non \u00E8 un documento supportato -PDFMsgMissingShares = Numero di azioni non trovato per questa operazione - PDFdbMsgCannotDetermineFileType = {0}: Tipo di operazione sconosciuta o non supportata in ''{1}'' QuoteFeedManual = Nessun download automatico quotazioni diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_nl.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_nl.properties index 65980de4a1..4c75c52885 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_nl.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_nl.properties @@ -528,7 +528,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Effect: {0}\nProbleem: Onvoldoende st MsgErrorTradeCollector_NoHoldingsForTransfer = Effect: {0}\nProbleem: Onvoldoende stukken in bezit voor de overdracht van {1}' naar ''{2}''.\nTransactie: {2} -MsgErrorTransactionTypeNotSupported = Transactie wordt niet ondersteund of vereist voor PP: {0} +MsgErrorTransactionTypeNotSupported = Transactie wordt niet ondersteund of vereist. MsgErrorUnexpectedStatusCode = Onverwachte statuscode. Ticker: {0}, Code: {1}, URL: {2} @@ -592,8 +592,6 @@ PDFMsgExtracingFiles = Extractie van transacties uit PDF-bestanden ... PDFMsgFileNotSupported = {1}: Bestand ''{0}'' is geen ondersteund document -PDFMsgMissingShares = Aantal effecten niet gevonden voor deze transactie - PDFdbMsgCannotDetermineFileType = {0}: Onbekend of niet-ondersteund transactietype in ''{1}'' QuoteFeedManual = Geen automatische koersinformatie downloaden diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pl.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pl.properties index 49a1d77f75..783f0c6412 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pl.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pl.properties @@ -527,7 +527,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Walor: {0}\nProblem: Brak udzia\u0142 MsgErrorTradeCollector_NoHoldingsForTransfer = Walor: {0}\nProblem: Brak udzia\u0142\u00F3w dla przeniesienia waloru z ''{1}'' do ''{2}''.\nTransakcja: {3} -MsgErrorTransactionTypeNotSupported = Transakcja nie jest obs\u0142ugiwana lub potrzebna przez PP: {0} +MsgErrorTransactionTypeNotSupported = Transakcja nie jest obs\u0142ugiwana ani wymagana. MsgErrorUnexpectedStatusCode = Niespodziewany kod statusowy. Ticker: {0}, Kod: {1}, URL: {2} @@ -591,8 +591,6 @@ PDFMsgExtracingFiles = Wydobywanie transakcji z plik\u00F3w PDF... PDFMsgFileNotSupported = {1}: File ''{0}'' is not a supported document -PDFMsgMissingShares = Nie znaleziono liczby akcji dla tej transakcji - PDFdbMsgCannotDetermineFileType = {0}: Nieznany lub niewspierany typ transakcji w "{1}" QuoteFeedManual = Brak automatycznego pobierania notowa\u0144 diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pt.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pt.properties index dd5f3f8c10..d2a8f1023c 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pt.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_pt.properties @@ -514,7 +514,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = T\u00EDtulo: {0}\nProblema: Nenhuma p MsgErrorTradeCollector_NoHoldingsForTransfer = T\u00EDtulo: {0}\nProblema: Nenhuma participa\u00E7\u00E3o para transferir a transa\u00E7\u00E3o do ativo de ''{1}'' para ''{2}''.\nTransa\u00E7\u00E3o: {3} -MsgErrorTransactionTypeNotSupported = A transa\u00E7\u00E3o n\u00E3o \u00E9 suportada ou necess\u00E1ria pelo PP: {0} +MsgErrorTransactionTypeNotSupported = A transac\u00E7\u00E3o n\u00E3o \u00E9 suportada nem exigida. MsgErrorUnexpectedStatusCode = C\u00F3digo de status inesperado. S\u00EDmbolo: {0}, C\u00F3digo: {1}, URL: {2} @@ -578,8 +578,6 @@ PDFMsgExtracingFiles = A extrair transa\u00E7\u00F5es de ficheiros PDF ... PDFMsgFileNotSupported = {1}: O ficheiro ''{0}'' n\u00E3o \u00E9 um documento suportado -PDFMsgMissingShares = Quantidade de a\u00E7\u00F5es n\u00E3o encontrada para esta transa\u00E7\u00E3o - PDFdbMsgCannotDetermineFileType = {0}: Tipo de transa\u00E7\u00E3o desconhecida ou n\u00E3o suportada em ''{1}'' QuoteFeedManual = Sem download de cota\u00E7\u00E3o autom\u00E1tico diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_ru.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_ru.properties index 03b48653a8..137a521b9a 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_ru.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_ru.properties @@ -527,7 +527,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = \u0410\u043A\u0442\u0438\u0432: {0}\n MsgErrorTradeCollector_NoHoldingsForTransfer = \u0410\u043A\u0442\u0438\u0432: {0}\n\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0430: \u043D\u0435\u0442 \u0430\u043A\u0446\u0438\u0439 \u0432\u043E \u0432\u043B\u0430\u0434\u0435\u043D\u0438\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u0430 \u0442\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u0438 \u0438\u0437 '' {1} '' \u0432 '' {2} ''.\n\u0422\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u044F: {3} -MsgErrorTransactionTypeNotSupported = \u0422\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u044F \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0438\u043B\u0438 \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F PP: {0} +MsgErrorTransactionTypeNotSupported = \u0422\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u044F \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0438\u043B\u0438 \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F. MsgErrorUnexpectedStatusCode = \u041D\u0435\u043E\u0436\u0438\u0434\u0430\u043D\u043D\u044B\u0439 \u043A\u043E\u0434 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F. \u0422\u0438\u043A\u0435\u0440: {0}, \u043A\u043E\u0434: {1}, URL: {2} @@ -591,8 +591,6 @@ PDFMsgExtracingFiles = \u0418\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0 PDFMsgFileNotSupported = {1}: \u0444\u0430\u0439\u043B "{0}" \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u043C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043C -PDFMsgMissingShares = \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0430\u043A\u0446\u0438\u0439, \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u0442\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u0438 - PDFdbMsgCannotDetermineFileType = {0}: \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 \u0438\u043B\u0438 \u043D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0442\u0438\u043F \u0442\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u0438 \u0432 "{1}" QuoteFeedManual = \u0411\u0435\u0437 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043E\u043A diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_sk.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_sk.properties index c60975ac8c..1c7eaf8ad7 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_sk.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_sk.properties @@ -527,7 +527,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = Cenn\u00FD papier: {0}\nVydanie: Na \ MsgErrorTradeCollector_NoHoldingsForTransfer = Cenn\u00FD papier: {0}\nVydanie: \u017Diadne podiely na prevode cenn\u00FDch papierov transakcie z ''{1}'' na ''{2}''. \nTransakcia: {3} -MsgErrorTransactionTypeNotSupported = Transakcia nie je podporovan\u00E1 alebo potrebn\u00E1 v PP: {0} +MsgErrorTransactionTypeNotSupported = Transakcia nie je podporovan\u00E1 ani po\u017Eadovan\u00E1. MsgErrorUnexpectedStatusCode = Neo\u010Dak\u00E1van\u00FD stavov\u00FD k\u00F3d. Ticker: {0}, K\u00F3d: {1}, URL: {2} @@ -591,8 +591,6 @@ PDFMsgExtracingFiles = Extrahovanie transakci\u00ED zo s\u00FAborov PDF... PDFMsgFileNotSupported = {1}: S\u00FAbor ''{0}'' nie je podporovan\u00FD dokument -PDFMsgMissingShares = Po\u010Det akci\u00ED, ktor\u00E9 neboli n\u00E1jden\u00E9 pre t\u00FAto transakciu - PDFdbMsgCannotDetermineFileType = {0}: Nezn\u00E1my alebo nepodporovan\u00FD typ transakcie v ''{1}'' QuoteFeedManual = \u017Diadne automatick\u00E9 s\u0165ahovanie kurzov diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_zh.properties b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_zh.properties index ba9198a7c6..13c67f50c8 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_zh.properties +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/messages_zh.properties @@ -525,7 +525,7 @@ MsgErrorTradeCollector_NoHoldingsForSell = \u8BC1\u5238\uFF1A{0}\n\u95EE\u9898\u MsgErrorTradeCollector_NoHoldingsForTransfer = \u8BC1\u5238\uFF1A{0}\n\u95EE\u9898\uFF1A\u65E0\u6301\u4ED3\u4EE5\u4ECE \u201C{1}\u201D \u4E2D\u8F6C\u5165 \u201C{2}\u201D\u3002\n\u8D26\u5355\uFF1A{3} -MsgErrorTransactionTypeNotSupported = Portfolio Performance \u4E0D\u652F\u6301\u6216\u4E0D\u9700\u8981\u8D26\u5355\uFF1A{0} +MsgErrorTransactionTypeNotSupported = Portfolio Performance \u4E0D\u652F\u6301\u6216\u4E0D\u9700\u8981\u8D26\u5355 MsgErrorUnexpectedStatusCode = \u5F02\u5E38\u7684\u72B6\u6001\u4EE3\u7801\u3002\u8BC1\u5238\u4EE3\u7801\uFF1A{0}\uFF0C\u4EE3\u7801\uFF1A{1}\uFF0CURL\uFF1A{2} @@ -589,8 +589,6 @@ PDFMsgExtracingFiles = \u6B63\u5728\u4ECE PDF \u6587\u4EF6\u4E2D\u63D0\u53D6\u8D PDFMsgFileNotSupported = {1}\uFF1A\u4E0D\u652F\u6301\u6587\u4EF6 \u201C{0}\u201D -PDFMsgMissingShares = \u6B64\u8D26\u5355\u7F3A\u5C11\u80A1\u7968\u6570\u91CF - PDFdbMsgCannotDetermineFileType = {0}\uFF1A\u5728 \u201C{1}\u201D \u5B58\u5728\u672A\u77E5\u6216\u4E0D\u652F\u6301\u7684\u8D26\u5355\u7C7B\u578B QuoteFeedManual = \u4E0D\u81EA\u52A8\u4E0B\u8F7D\u62A5\u4EF7