basic information of xml works, but Ntry is incomplete
This commit is contained in:
@ -14,16 +14,15 @@ import de.jottyfan.csv2camt.xml.CamtWriter;
|
|||||||
public class Converter {
|
public class Converter {
|
||||||
|
|
||||||
private CsvBean bean;
|
private CsvBean bean;
|
||||||
private String filenamePrefix;
|
private String filename;
|
||||||
|
|
||||||
public Converter readCsv(String filename) throws IOException {
|
public Converter readCsv(String filename) throws IOException {
|
||||||
String s = filename.contains("/") ? filename.substring(filename.lastIndexOf("/") + 1) : filename;
|
this.filename = filename.replace(".csv", ".xml");
|
||||||
filenamePrefix = s.contains(".") ? s.substring(0, s.indexOf(".")) : s;
|
|
||||||
bean = new CsvParser().read(filename);
|
bean = new CsvParser().read(filename);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeCamt() {
|
public void writeCamt() throws Exception {
|
||||||
new CamtWriter().write(bean, filenamePrefix.concat(".camt"));
|
new CamtWriter().write(bean, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
package de.jottyfan.csv2camt;
|
package de.jottyfan.csv2camt;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author jotty
|
* @author jotty
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class Main {
|
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();
|
new Converter().readCsv(args[1]).writeCamt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,20 @@
|
|||||||
package de.jottyfan.csv2camt.xml;
|
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.CsvBean;
|
||||||
|
import de.jottyfan.csv2camt.csv.CsvLine;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -9,8 +23,183 @@ import de.jottyfan.csv2camt.csv.CsvBean;
|
|||||||
*/
|
*/
|
||||||
public class CamtWriter {
|
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
|
||||||
|
// <Ntry>
|
||||||
|
// <Amt Ccy="EUR">128.00</Amt>
|
||||||
|
// <CdtDbtInd>CRDT</CdtDbtInd>
|
||||||
|
// <Sts>BOOK</Sts>
|
||||||
|
// <BookgDt>
|
||||||
|
// <Dt>2023-03-31</Dt>
|
||||||
|
// </BookgDt>
|
||||||
|
// <ValDt>
|
||||||
|
// <Dt>2023-03-31</Dt>
|
||||||
|
// </ValDt>
|
||||||
|
// <BkTxCd>
|
||||||
|
// <Domn>
|
||||||
|
// <Cd>PMNT</Cd>
|
||||||
|
// <Fmly>
|
||||||
|
// <Cd>RCDT</Cd>
|
||||||
|
// <SubFmlyCd>ESCT</SubFmlyCd>
|
||||||
|
// </Fmly>
|
||||||
|
// </Domn>
|
||||||
|
// <Prtry>
|
||||||
|
// <Cd>NTRF+166</Cd>
|
||||||
|
// <Issr>DK</Issr>
|
||||||
|
// </Prtry>
|
||||||
|
// </BkTxCd>
|
||||||
|
// <NtryDtls>
|
||||||
|
// <TxDtls>
|
||||||
|
// <Amt Ccy="EUR">128.00</Amt>
|
||||||
|
// <CdtDbtInd>CRDT</CdtDbtInd>
|
||||||
|
// <BkTxCd>
|
||||||
|
// <Domn>
|
||||||
|
// <Cd>PMNT</Cd>
|
||||||
|
// <Fmly>
|
||||||
|
// <Cd>RCDT</Cd>
|
||||||
|
// <SubFmlyCd>ESCT</SubFmlyCd>
|
||||||
|
// </Fmly>
|
||||||
|
// </Domn>
|
||||||
|
// <Prtry>
|
||||||
|
// <Cd>NTRF+166</Cd>
|
||||||
|
// <Issr>DK</Issr>
|
||||||
|
// </Prtry>
|
||||||
|
// </BkTxCd>
|
||||||
|
// <RltdPties>
|
||||||
|
// <Dbtr>
|
||||||
|
// <Nm>Mickey Mouse</Nm>
|
||||||
|
// </Dbtr>
|
||||||
|
// <Cdtr>
|
||||||
|
// <Nm>Evangelische-Freikirchliche Gemeinde Dresden Süd-Ost</Nm>
|
||||||
|
// </Cdtr>
|
||||||
|
// </RltdPties>
|
||||||
|
// <RmtInf>
|
||||||
|
// <Ustrd>Referenz NOTPROVIDED</Ustrd>
|
||||||
|
// <Ustrd>Gemeindefreizeit</Ustrd>
|
||||||
|
// </RmtInf>
|
||||||
|
// </TxDtls>
|
||||||
|
// </NtryDtls>
|
||||||
|
// </Ntry>
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
31
src/test/java/de/jottyfan/csv2camt/xml/TestCamtWriter.java
Normal file
31
src/test/java/de/jottyfan/csv2camt/xml/TestCamtWriter.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user