--- /dev/null
+/*
+ * Copyright (c) $today.year-$today.month-24.
+ * By elGekko
+ */
+
+package hu.user.lis.workflow;
+
+import hu.user.lis.service.mbh.StatementParser;
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+
+@Log4j2
+@RunWith(SpringRunner.class)
+@ComponentScan("hu.user.lis")
+@SpringBootTest
+@ActiveProfiles("dev")
+//@TestPropertySource("classpath:application-dev.yaml")
+//@AutoConfigureMockMvc
+public class StatementParserIT {
+ @Autowired
+ private StatementParser statementParser;
+
+ @Test
+ public void testParse() throws IOException {
+ statementParser.parse(Paths.get("src/test/resources/mbh/STATEMENT_1.STM"));
+ statementParser.parse(Paths.get("src/test/resources/mbh/STATEMENT_2.STM"));
+ statementParser.parse(Paths.get("src/test/resources/mbh/STATEMENT_3.STM"));
+ }
+
+}
--- /dev/null
+11002 101022442428160001004996USDUSER Rendszerház Kft 2023110220231102 2271166 3312115USER RENDSZERHÁZ INFORMATIKAI KORLÁTOLT FELELÕSSÉGBUDAPEST PÜNKÖSDFÜRDÕ UTCA 52. 1039 HU
+1200100 000BICH23304000 000000001042035USD Umbrella Kreativ Muhely HU32108000077000000014144021 E-USER-2023-236 USER RENDSZERHÁZ KFT 101022442428160001004996 101022442428160001004996USD000000000104203520231101
+12JTERH 000BICH23304000-000000000001086USD USER RENDSZERHÁZ KFT 101022442428160001004996 E-USER-2023-236 USER RENDSZERHAZ KFT HU23101022442428160001004996 101022442428160001004996USD000000000000108620231101
+13
+14
--- /dev/null
+11007 101022442428160001004305EURUSER Rendszerház Kft 2023110220231102 6915989 4819787USER RENDSZERHÁZ INFORMATIKAI KORLÁTOLT FELELÕSSÉGBUDAPEST PÜNKÖSDFÜRDÕ UTCA 52. 1039 HU
+1200100 000FNER23306200-000000002092960EUR USER RENDSZERHÁZ KFT 101022442428160001004305 INV019/2023 CNW Rendszerintegrcis Zrt. HU59101008400321720001003300 101022442428160001004305EUR000000000209296020231102
+12JTERH 000FNER23306200-000000000002614EUR USER RENDSZERHÁZ KFT 101022442428160001004305 INV019/2023 CNW Rendszerintegrcis Zrt. HU59101008400321720001003300 101022442428160001004305EUR000000000000261420231102
+12JTERH 000FNER23306200-000000000000628EUR USER RENDSZERHÁZ KFT 101022442428160001004305 INV019/2023 CNW Rendszerintegrcis Zrt. HU59101008400321720001003300 101022442428160001004305EUR000000000000062820231102
+13
+14
--- /dev/null
+11018 101022442428160001004006HUFUSER Rendszerház Kft 2023110220231102 2414568500 10723405400USER RENDSZERHÁZ INFORMATIKAI KORLÁTOLT FELELÕSSÉGBUDAPEST PÜNKÖSDFÜRDÕ UTCA 52. 1039 HU
+1200100 000TIGT23306169 000000010953800HUF Mitra Informatikai Zrt. HU54182030330600075140010013 E-USER-2023-242 AIX, PowerVM, Po werHA,Tivoli tam. 2023.09.ho USER RENDSZERHÁZ KFT 101022442428160001004006 17 101022442428160001004006HUF000000001095380020231102 MKKBHUHB 18203033
+1200100 007FTRQ23306002 000000134094600HUF USER RENDSZERHÁZ KFT USER RENDSZERHÁZ KFT LÉVAI TIBOR SÁNDORFund Transfer from - 2428160002005000 - to - 2428160001004006 USER RENDSZERHÁZ KFT 101022442428160001004006 101022442428160001004006HUF000000013409460020231102
+1200100 007NSCB23298003 000000015111100HUF USER RENDSZERHÁZ KFT 101022442428160001004006 Kamat elszámolás 101022442428160001004006 101022442428160001004006HUF000000001511110020231102
+1200100 000TIGT23306169 000000069850000HUF Mitra Informatikai Zrt. HU54182030330600075140010013 E-USER-2023-240 IBM Spectrum Pro tect uzemeltetes-tamogat 2023.09 USER RENDSZERHÁZ KFT 101022442428160001004006 18 101022442428160001004006HUF000000006985000020231102 MKKBHUHB 18203033
+1200100 000TIGT23306169 000000078105000HUF Mitra Informatikai Zrt. HU54182030330600075140010013 E-USER-2023-239 Takarekinfo Powe res mentes support 2023.09. USER RENDSZERHÁZ KFT 101022442428160001004006 16 101022442428160001004006HUF000000007810500020231102 MKKBHUHB 18203033
+1200100 007NSCB23298003 000008000000000HUF USER RENDSZERHÁZ KFT 101022442428160001004006 Tõke elszámolása 101022442428160001004006 101022442428160001004006HUF000000800000000020231102
+1200100 000PIGT23306AG3 000000087376000HUF Erste Bank Hungary Zrt. Budapest HU41116990063791200000000008 E-USER-2023-238 USER RENDSZERHÁZ KFT 101022442428160001004006 101022442428160001004006HUF000000008737600020231102 MKKBHUHB KÁLLÓI ÚT 63.C.ÉP NYÍREGYHÁZA 11699006
+
+13
+14
--- /dev/null
+package hu.user.lis.service.mbh;
+
+import lombok.Builder;
+import lombok.ToString;
+
+import java.time.LocalDate;
+
+@ToString
+@Builder
+public class StatementDataRecord extends StatementRecord {
+
+ private String transactionType;
+
+ private String id;
+
+ private float amount;
+
+ private String currency;
+
+ private String principalBankName;
+
+ private String principalName;
+
+ private String principalAccount;
+
+ private String notice;
+
+ private String assignBankName;
+
+ private String assignName;
+
+ private String assignAccount;
+
+ private String receiptNr;
+
+ private String creditAccount;
+
+ private String creditCurrency;
+
+ private float creditAmount;
+
+ private LocalDate creditDate;
+
+ private String chargingAccount;
+
+ private String chargingCurrency;
+
+ private float chargingAmount;
+
+ private LocalDate chargingDate;
+
+ private String principalCountry;
+
+ private String assignCountry;
+
+ private String code;
+
+ private String transactionId;
+
+ private String giroId;
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+import lombok.Builder;
+import lombok.ToString;
+
+import java.time.LocalDate;
+
+@ToString
+@Builder
+public class StatementHeaderRecord extends StatementRecord {
+
+ private String id;
+
+ private String account;
+
+ private String currency;
+
+ private String accountName;
+
+ private LocalDate startDay;
+
+ private LocalDate endDay;
+
+ private String clientName;
+
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+public class StatementItem {
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+import hu.user.lis.service.mbh.builder.StatementRecordBuilder;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Log4j2
+@Service
+public class StatementParser {
+ private static final String CHARSET_ISO_8859_2 = "ISO-8859-2";
+
+ @Autowired
+ private List<StatementRecordBuilder<? extends StatementRecord>> builders;
+
+ public List<StatementRecord> parse(Path inputFile) throws IOException {
+ List<String> lines = Files.readAllLines(inputFile, Charset.forName(CHARSET_ISO_8859_2));
+ return lines.stream().map(this::processLine).collect(Collectors.toList());
+ }
+
+ Optional<StatementRecordType> getRecordType(String line) {
+ return StatementRecordType.valueOfLabel(line.substring(0, 2));
+ }
+
+ private StatementRecord processLine(final String line) {
+ try {
+ String encodedLine = new String(line.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
+ Optional<StatementRecordType> recordType = getRecordType(encodedLine);
+ if (recordType.isPresent()) {
+ for (StatementRecordBuilder<? extends StatementRecord> builder : builders) {
+ if (builder.canBuild(recordType.get())) {
+ StatementRecord result = builder.build(encodedLine);
+ log.info(result);
+ return result;
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error(e);
+ }
+ return null;
+ }
+
+
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+public class StatementRecord {
+
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+@Getter
+public enum StatementRecordType {
+ HEADER("11"), DATA("12"), FOOTER("13"), EOF("14");
+
+ private final String val;
+
+ StatementRecordType(String val) {
+ this.val = val;
+ }
+
+ public static Optional<StatementRecordType> valueOfLabel(String label) {
+ return Arrays.stream(values()).filter(en -> label.equals(en.getVal())).findFirst();
+ }
+
+}
--- /dev/null
+package hu.user.lis.service.mbh;
+
+import lombok.Builder;
+
+@Builder
+public class StatementToken {
+
+ private String data;
+
+
+}
--- /dev/null
+package hu.user.lis.service.mbh.builder;
+
+import hu.user.lis.service.mbh.StatementDataRecord;
+import hu.user.lis.service.mbh.StatementRecordType;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StatementDataRecordBuilder extends StatementRecordBuilder<StatementDataRecord> {
+
+ @Override
+ public boolean canBuild(StatementRecordType type) {
+ return StatementRecordType.DATA.equals(type);
+ }
+
+ @Override
+ public StatementDataRecord build(String data) {
+ return StatementDataRecord.builder()
+ .transactionType(getString(data, 3, 6))
+ .id(getString(data, 9, 15))
+ .amount(getFloat(data, 24, 16))
+ .currency(getString(data, 40, 3))
+ .principalBankName(getString(data, 43, 35))
+ .principalName(getString(data, 183, 35))
+ .principalAccount(getString(data, 323, 34))
+ .notice(getString(data, 357, 35))
+ .assignBankName(getString(data, 497, 35))
+ .assignName(getString(data, 637, 35))
+ .assignAccount(getString(data, 777, 34))
+ .receiptNr(getString(data, 811, 6))
+ .creditAccount(getString(data, 825, 24))
+ .creditCurrency(getString(data, 849, 3))
+ .creditAmount(getFloat(data, 852, 16))
+ .build();
+ }
+
+
+}
--- /dev/null
+package hu.user.lis.service.mbh.builder;
+
+import hu.user.lis.service.mbh.StatementHeaderRecord;
+import hu.user.lis.service.mbh.StatementRecordType;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StatementHeaderRecordBuilder extends StatementRecordBuilder<StatementHeaderRecord> {
+
+ @Override
+ public boolean canBuild(StatementRecordType type) {
+ return StatementRecordType.HEADER.equals(type);
+ }
+
+ @Override
+ public StatementHeaderRecord build(String data) {
+ return StatementHeaderRecord.builder()
+ .id(getString(data, 3, 8))
+ .account(getString(data, 11, 24))
+ .currency(getString(data, 35, 3))
+ .accountName(getString(data, 38, 20))
+ .startDay(getLocalDate(data, 86, 8))
+ .endDay(getLocalDate(data, 94, 8))
+ .clientName(getString(data, 140, 50))
+ .build();
+ }
+}
--- /dev/null
+package hu.user.lis.service.mbh.builder;
+
+import hu.user.lis.service.mbh.StatementRecord;
+import hu.user.lis.service.mbh.StatementRecordType;
+import lombok.extern.log4j.Log4j2;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+@Log4j2
+public abstract class StatementRecordBuilder<T extends StatementRecord> {
+
+ public abstract boolean canBuild(StatementRecordType type);
+
+ public abstract T build(String data);
+
+ String getString(String data, int pos, int length) {
+ return data.substring(pos - 1, pos - 1 + length).trim();
+ }
+
+ int getInt(String data, int pos, int length) {
+ int result = 0;
+ try {
+ result = Integer.parseInt(getString(data, pos, length));
+ } catch (Exception e) {
+ log.debug(e);
+ }
+ return result;
+ }
+
+ LocalDate getLocalDate(String data, int pos, int length) {
+ LocalDate result = null;
+ try {
+ result = LocalDate.parse(getString(data, pos, length), DateTimeFormatter.ofPattern("yyyyMMdd"));
+ } catch (Exception e) {
+ log.debug(e);
+ }
+ return result;
+ }
+
+ float getFloat(String data, int pos, int length) {
+ float result = 0;
+ try {
+ result = Float.parseFloat(getString(data, pos, length));
+ } catch (Exception e) {
+ log.debug(e);
+ }
+ return result;
+ }
+}