128 lines
4.6 KiB
TypeScript
128 lines
4.6 KiB
TypeScript
import xmlbuilder from "xmlbuilder";
|
|
import {randomUUID} from "node:crypto";
|
|
import dayjs from "dayjs";
|
|
import { and, eq, inArray } from "drizzle-orm";
|
|
import { createddocuments, tenants } from "../../../db/schema";
|
|
|
|
export const createSEPAExport = async (server,idsToExport, tenant_id) => {
|
|
const data = await server.db
|
|
.select()
|
|
.from(createddocuments)
|
|
.where(and(
|
|
eq(createddocuments.tenant, tenant_id),
|
|
inArray(createddocuments.id, idsToExport)
|
|
))
|
|
|
|
const tenantRows = await server.db
|
|
.select()
|
|
.from(tenants)
|
|
.where(eq(tenants.id, tenant_id))
|
|
.limit(1)
|
|
const tenantData = tenantRows[0]
|
|
console.log(tenantData)
|
|
|
|
console.log(data)
|
|
|
|
let transactions = []
|
|
|
|
let obj = {
|
|
Document: {
|
|
'@xmlns':"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02",
|
|
'CstmrDrctDbtInitn': {
|
|
'GrpHdr': {
|
|
'MsgId': randomUUID(),
|
|
'CredDtTm': dayjs().format("YYYY-MM-DDTHH:mm:ss"),
|
|
'NbOfTxs': transactions.length,
|
|
'CtrlSum': 0, // TODO: Total Sum
|
|
'InitgPty': {
|
|
'Nm': tenantData.name
|
|
}
|
|
},
|
|
'PmtInf': {
|
|
'PmtInfId': "", // TODO: Mandatsreferenz,
|
|
'PmtMtd': "DD",
|
|
'BtchBookg': "true", // TODO: BatchBooking,
|
|
'NbOfTxs': transactions.length,
|
|
'CtrlSum': 0, //TODO: Total Sum
|
|
'PmtTpInf': {
|
|
'SvcLvl': {
|
|
'Cd': "SEPA"
|
|
},
|
|
'LclInstrm': {
|
|
'Cd': "CORE" // Core für BASIS / B2B für Firmen
|
|
},
|
|
'SeqTp': "RCUR" // TODO: Unterscheidung Einmalig / Wiederkehrend
|
|
},
|
|
'ReqdColltnDt': dayjs().add(3, "days").format("YYYY-MM-DDTHH:mm:ss"),
|
|
'Cdtr': {
|
|
'Nm': tenantData.name
|
|
},
|
|
'CdtrAcct': {
|
|
'Id': {
|
|
'IBAN': "DE" // TODO: IBAN Gläubiger EINSETZEN
|
|
}
|
|
},
|
|
'CdtrAgt': {
|
|
'FinInstnId': {
|
|
'BIC': "BIC" // TODO: BIC des Gläubigers einsetzen
|
|
}
|
|
},
|
|
'ChrgBr': "SLEV",
|
|
'CdtrSchmeId': {
|
|
'Id': {
|
|
'PrvtId': {
|
|
'Othr': {
|
|
'Id': tenantData.creditorId,
|
|
'SchmeNm': {
|
|
'Prty': "SEPA"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
//TODO ITERATE ALL INVOICES HERE
|
|
'DrctDbtTxInf': {
|
|
'PmtId': {
|
|
'EndToEndId': "" // TODO: EINDEUTIGE ReFERENZ wahrscheinlich RE Nummer
|
|
},
|
|
'InstdAmt': {
|
|
'@Ccy':"EUR",
|
|
'#text':100 //TODO: Rechnungssumme zwei NK mit Punkt
|
|
},
|
|
'DrctDbtTx': {
|
|
'MndtRltdInf': {
|
|
'MndtId': "", // TODO: Mandatsref,
|
|
'DtOfSgntr': "", //TODO: Unterschrieben am,
|
|
'AmdmntInd': "" //TODO: Mandat geändert
|
|
}
|
|
},
|
|
'DbtrAgt': {
|
|
'FinInstnId': {
|
|
'BIC': "", //TODO: BIC Debtor
|
|
}
|
|
},
|
|
'Dbtr': {
|
|
'Nm': "" // TODO NAME Debtor
|
|
},
|
|
'DbtrAcct': {
|
|
'Id': {
|
|
'IBAN': "DE" // TODO IBAN Debtor
|
|
}
|
|
},
|
|
'RmtInf': {
|
|
'Ustrd': "" //TODO Verwendungszweck Rechnungsnummer
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
let doc = xmlbuilder.create(obj, {encoding: 'UTF-8', standalone: true})
|
|
|
|
console.log(doc.end({pretty:true}))
|
|
|
|
}
|