diff --git a/src/main/java/de/jottyfan/csv2camt/Converter.java b/src/main/java/de/jottyfan/csv2camt/Converter.java index 3f0f271..a7e56ac 100644 --- a/src/main/java/de/jottyfan/csv2camt/Converter.java +++ b/src/main/java/de/jottyfan/csv2camt/Converter.java @@ -14,16 +14,15 @@ import de.jottyfan.csv2camt.xml.CamtWriter; public class Converter { private CsvBean bean; - private String filenamePrefix; + private String filename; public Converter readCsv(String filename) throws IOException { - String s = filename.contains("/") ? filename.substring(filename.lastIndexOf("/") + 1) : filename; - filenamePrefix = s.contains(".") ? s.substring(0, s.indexOf(".")) : s; + this.filename = filename.replace(".csv", ".xml"); bean = new CsvParser().read(filename); return this; } - public void writeCamt() { - new CamtWriter().write(bean, filenamePrefix.concat(".camt")); + public void writeCamt() throws Exception { + new CamtWriter().write(bean, filename); } } diff --git a/src/main/java/de/jottyfan/csv2camt/Main.java b/src/main/java/de/jottyfan/csv2camt/Main.java index f750f4b..da3f462 100644 --- a/src/main/java/de/jottyfan/csv2camt/Main.java +++ b/src/main/java/de/jottyfan/csv2camt/Main.java @@ -1,14 +1,12 @@ package de.jottyfan.csv2camt; -import java.io.IOException; - /** * * @author jotty * */ public class Main { - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws Exception { new Converter().readCsv(args[1]).writeCamt(); } } diff --git a/src/main/java/de/jottyfan/csv2camt/xml/CamtWriter.java b/src/main/java/de/jottyfan/csv2camt/xml/CamtWriter.java index 0ca0b06..4656c17 100644 --- a/src/main/java/de/jottyfan/csv2camt/xml/CamtWriter.java +++ b/src/main/java/de/jottyfan/csv2camt/xml/CamtWriter.java @@ -1,6 +1,20 @@ package de.jottyfan.csv2camt.xml; +import java.io.FileWriter; +import java.io.StringWriter; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + import de.jottyfan.csv2camt.csv.CsvBean; +import de.jottyfan.csv2camt.csv.CsvLine; /** * @@ -9,8 +23,183 @@ import de.jottyfan.csv2camt.csv.CsvBean; */ public class CamtWriter { - public void write(CsvBean bean, String filename) { + protected Document generateXml(CsvBean bean) throws Exception { + if (bean.getIban() == null || bean.getIban().length() < 10){ + throw new Exception(String.format("invalid iban: %s", bean.getIban())); + } else if (bean.getKontostandFinal() == null) { + throw new Exception("no kontostandFinal"); + } + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + + Document xml = builder.newDocument(); + xml.setXmlStandalone(true); + + Element document = xml.createElement("Document"); + document.setAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:camt.052.001.06"); + xml.appendChild(document); + + Element BkToCstmrAcctRpt = xml.createElement("BkToCstmrAcctRpt"); + document.appendChild(BkToCstmrAcctRpt); + + Element GrpHdr = xml.createElement("GrpHdr"); + BkToCstmrAcctRpt.appendChild(GrpHdr); + + Element MsgId = xml.createElement("MsgId"); + StringBuilder buf = new StringBuilder("KtoNr"); + buf.append(bean.getIban().substring(bean.getIban().length() - 10)); + buf.append("_"); + buf.append(bean.getKontostandDatum().replace(".", "-")); + buf.append("_0000"); // no creation time in csv + MsgId.setTextContent(buf.toString()); + GrpHdr.appendChild(MsgId); + + Element CreDtTm = xml.createElement("CreDtTm"); + buf = new StringBuilder(); + buf.append(bean.getKontostandDatum().replace(".", "-")); + buf.append("T00:00:00.000+02:00"); // no creation time in csv + CreDtTm.setTextContent(buf.toString()); + GrpHdr.appendChild(CreDtTm); + + Element MsgRcpt = xml.createElement("MsgRcpt"); + GrpHdr.appendChild(MsgRcpt); + + Element Nm = xml.createElement("Nm"); + Nm.setTextContent("Evangelische-Freikirchliche Gemeinde Dresden Süd-Ost"); + MsgRcpt.appendChild(Nm); + + Element Rpt = xml.createElement("Rpt"); + BkToCstmrAcctRpt.appendChild(Rpt); + + Element Id = xml.createElement("Id"); + Id.setTextContent(MsgId.getTextContent()); + Rpt.appendChild(Id); + + Rpt.appendChild(CreDtTm.cloneNode(true)); + + Element Acct = xml.createElement("Acct"); + Rpt.appendChild(Acct); + + Element AcctId = xml.createElement("Id"); + Acct.appendChild(AcctId); + + Element IBAN = xml.createElement("IBAN"); + IBAN.setTextContent(bean.getIban()); + AcctId.appendChild(IBAN); + + Element Bal = xml.createElement("Bal"); + Rpt.appendChild(Bal); + + Element Tp = xml.createElement("Tp"); + Bal.appendChild(Tp); + + Element CdOrPrtry = xml.createElement("CdOrPrtry"); + Tp.appendChild(CdOrPrtry); + + Element Cd = xml.createElement("Cd"); + Cd.setTextContent("CLAV"); + CdOrPrtry.appendChild(Cd); + + Element Amt = xml.createElement("Amt"); + Amt.setAttribute("Ccy", bean.getWaehrung()); + Amt.setTextContent(bean.getKontostandFinal().replace(".", "").replace(",", ".")); // not sure if correct... + Bal.appendChild(Amt); + + Element CdtDbtInd = xml.createElement("CdtDbtInd"); + CdtDbtInd.setTextContent("CRDT"); + Bal.appendChild(CdtDbtInd); + + Element Dt = xml.createElement("Dt"); + Bal.appendChild(Dt); + + Element DtTm = xml.createElement("DtTm"); + DtTm.setTextContent(CreDtTm.getTextContent()); + Dt.appendChild(DtTm); + + for (CsvLine trans : bean.getList()) { + Element Ntry = xml.createElement("Ntry"); + Rpt.appendChild(Ntry); + + Element NtryAmt = xml.createElement("Amt"); + NtryAmt.setAttribute("Ccy", trans.Waehrung()); + NtryAmt.setTextContent(trans.Betrag().replace(".", "").replace(",", ".")); + Ntry.appendChild(NtryAmt); + + } + + // TODO: add the rest, the Ntry elements, as children of Rpt +// +// 128.00 +// CRDT +// BOOK +// +//
2023-03-31
+//
+// +//
2023-03-31
+//
+// +// +// PMNT +// +// RCDT +// ESCT +// +// +// +// NTRF+166 +// DK +// +// +// +// +// 128.00 +// CRDT +// +// +// PMNT +// +// RCDT +// ESCT +// +// +// +// NTRF+166 +// DK +// +// +// +// +// Mickey Mouse +// +// +// Evangelische-Freikirchliche Gemeinde Dresden Süd-Ost +// +// +// +// Referenz NOTPROVIDED +// Gemeindefreizeit +// +// +// +//
+ + return xml; } + public void write(CsvBean bean, String filename) throws Exception { + Document document = generateXml(bean); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + StringWriter writer = new StringWriter(); + transformer.transform(new DOMSource(document), new StreamResult(writer)); + + String xmlString = writer.toString(); + + try (FileWriter fileWriter = new FileWriter(filename)) { + fileWriter.write(xmlString); + fileWriter.flush(); + } + } } diff --git a/src/test/java/de/jottyfan/csv2camt/xml/TestCamtWriter.java b/src/test/java/de/jottyfan/csv2camt/xml/TestCamtWriter.java new file mode 100644 index 0000000..deb7fe6 --- /dev/null +++ b/src/test/java/de/jottyfan/csv2camt/xml/TestCamtWriter.java @@ -0,0 +1,31 @@ +package de.jottyfan.csv2camt.xml; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import de.jottyfan.csv2camt.csv.CsvBean; +import de.jottyfan.csv2camt.csv.CsvLine; + +/** + * + * @author jotty + * + */ +public class TestCamtWriter { + @Test + public void testWrite() throws Exception { + CamtWriter writer = new CamtWriter(); + CsvBean bean = new CsvBean(); + bean.setIban("DE12345678901234567890"); + bean.setKontostandDatum("01-02-2003"); + bean.setKontostandFinal("12345,67"); + bean.setWaehrung("EUR"); + bean.getList().add(new CsvLine("31.3.2023", "31.3.2023", "SEPA Überweisung", "Mickey Mouse", "Gemeindefreizeit", + "DE98765432109876543210", null, "NOTPROVIDED", null, null, null, "128,00", null, null, null, null, "128", "EUR")); + bean.getList().add(new CsvLine("31.3.2023", "31.3.2023", "SEPA Überweisung", "Donald Duck", "Gemeindefreizeit", + "DE98765432109876543210", null, "NOTPROVIDED", null, null, null, "64,00", null, null, null, null, "64", "EUR")); + writer.write(bean, "/home/jotty/Schreibtisch/example.xml"); + assertTrue(true); + } +}