BOOL createSEPAFile( STRING Filename, _DLPSet &Rechnungen, TIME &Ausfuehrungsdatum, BOOL DemoVersion = FALSE ) BOOL ok; DBSTRINGSET SequenceTypes; FLOAT SummeErstlastschriften, SummeFolgelastschriften, Summe; HLOCAL XML, Document, CstmrDrctDbtInitn, GrpHdr, InitgPty; // GroupHeader HANDLE PmtInf, PmtTpInf, SvcLvl, LclInstrm, Cdtr, CdtrAcct, Id, CdtrAgt, FinInstnId, CdtrSchmeId, PrvtId, SchmeNm, Othr; // Payment Information HLOCAL DrctDbtTxInf, PmtId, InstdAmt, DrctDbtTx, MndtRltdInf, DbtrAgt, Dbtr, DbtrAcct, RmtInf; // Direct Debit Transaction Information INT AnzRechnungen, Pay, PaymentID, l, r; STRING FilePath, MessageID, Output; TIME now = TimeGetCurrTime(); AdresseNr AdrNr; Bankverbindung creditor, debitor; _RechnungSet Erstlastschriften, Folgelastschriften, ReS; _DLP Re; _Lastschriftmandat LM; #DEBUG_START _RechnungAllSet ReAS; DBASQuery( ReAS, "query _SepaStatus=1;", Rechnungen ); #DEBUG_END IF( DemoVersion ) AnzRechnungen = 5; ELSE AnzRechnungen = DBObSetGetCount( Rechnungen ); ENDIF Trace( "Es stehen " + IntToStr( AnzRechnungen ) + " Rechnung für Lastschrifteinzug bereit." ); IF( AnzRechnungen > 0 ) DBOCreate( creditor, "Bankverbindung", TRUE ); creditor.IBAN = "DE33291517001160015440"; creditor.BIC = "BRLADE21SYK"; creditor.Kontonummer = "1160015440"; creditor.BLZ = "29151700"; creditor.Kreditinstitut = "Kreissparkasse Syke"; DBObSetConstruct( Erstlastschriften, "_Rechnung" ); DBObSetConstruct( Folgelastschriften, "_Rechnung" ); FOR( r=1; r<=AnzRechnungen; r++ ) DBObSetGet( Rechnungen, Re, r ); AdrNr = Re._Poolpartner; IF( GetLastschriftmandat( AdrNr, LM ) ) IF( LM._Lastschriftart == 1 ) // Erstlastschrift DBObSetAdd( Erstlastschriften, Re ); SummeErstlastschriften = SummeErstlastschriften + Re._BruttoBetrag; ELSE // Folgelastschrift DBObSetAdd( Folgelastschriften, Re ); SummeFolgelastschriften = SummeFolgelastschriften + Re._BruttoBetrag; ENDIF ELSE Trace( "keine gülstiges Lastschriftmandat für %1 gefunden.", AdrNr.Nummer ); ENDIF NEXT DBStrConstruct( SequenceTypes ); IF( SummeErstlastschriften > 0 ) Trace( "Summe der Erstlastschriften: " + FloatToStr( SummeErstlastschriften, 2, LANGID_GERMAN, FALSE, TRUE ) ); DBStrAdd( SequenceTypes, "FRST" ); ENDIF IF( SummeFolgelastschriften > 0 ) Trace( "Summe der Folgelastschriften: " + FloatToStr( SummeFolgelastschriften, 2, LANGID_GERMAN, FALSE, TRUE ) ); DBStrAdd( SequenceTypes, "RCUR" ); ENDIF IF( DBStrGetCount( SequenceTypes ) > 0 ) XML = XMLDocumentConstruct(); Document = XMLElementConstruct(); CstmrDrctDbtInitn = XMLElementConstruct(); GrpHdr = XMLElementConstruct(); InitgPty = XMLElementConstruct(); PmtInf = XMLElementConstruct(); PmtTpInf = XMLElementConstruct(); SvcLvl = XMLElementConstruct(); LclInstrm = XMLElementConstruct(); Cdtr = XMLElementConstruct(); CdtrAcct = XMLElementConstruct(); Id = XMLElementConstruct(); CdtrAgt = XMLElementConstruct(); FinInstnId = XMLElementConstruct(); CdtrSchmeId = XMLElementConstruct(); PrvtId = XMLElementConstruct(); SchmeNm = XMLElementConstruct(); Othr = XMLElementConstruct(); DrctDbtTxInf = XMLElementConstruct(); PmtId = XMLElementConstruct(); InstdAmt = XMLElementConstruct(); DrctDbtTx = XMLElementConstruct(); MndtRltdInf = XMLElementConstruct(); DbtrAgt = XMLElementConstruct(); Dbtr = XMLElementConstruct(); DbtrAcct = XMLElementConstruct(); RmtInf = XMLElementConstruct(); XMLDocumentCreateProcessingInstruction( XML, "xml", "version=\"1.0\" encoding=\"UTF-8\"" ); XMLDocumentCreateDocumentElement( XML, "Document", Document, "urn:iso:std:iso:20022:tech:xsd:pain.008.003.02" ); XMLElementSetAttribute( Document, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" ); XMLElementSetAttribute( Document, "xsi:schemaLocation", "urn:iso:std:iso:20022:tech:xsd:pain.008.003.02 pain.008.003.02.xsd" ); XMLNodeAppendChildElement( Document, "CstmrDrctDbtInitn", CstmrDrctDbtInitn, TRUE ); MessageID = creditor.BIC; MessageID += IntToStr( PaymentID ); MessageID += TimeFormatDateStr( now, "ddyyyyMM" ); MessageID += TimeFormatTime( now, "HHmmss" ); // ***** GroupHeader ***** XMLNodeAppendChildElement( CstmrDrctDbtInitn, "GrpHdr", GrpHdr, TRUE ); XMLNodeAppendChildTextElement( GrpHdr, "MsgId", MessageID, TRUE ); XMLNodeAppendChildTextElement( GrpHdr, "CreDtTm", TimeISOFormatDateTime( now, TRUE ), TRUE ); XMLNodeAppendChildTextElement( GrpHdr, "NbOfTxs", IntToStr( AnzRechnungen ), TRUE ); XMLNodeAppendChildTextElement( GrpHdr, "CtrlSum", FloatToStr( SummeErstlastschriften + SummeFolgelastschriften, 2, LANGID_C ), TRUE ); XMLNodeAppendChildElement( GrpHdr, "InitgPty", InitgPty, TRUE ); XMLNodeAppendChildTextElement( InitgPty, "Nm", DBGetSystemSettingString( "Firma", "" ), TRUE ); FOR( Pay=1; Pay<= DBStrGetCount( SequenceTypes ); Pay++ ) // max 2 (FRST AND RCUR) PaymentID = DBGetNextCounterValue( "PaymentID" ); IF( DBStrGet( SequenceTypes, Pay ) == "FIRST" ) ReS = Erstlastschriften; AnzRechnungen = DBObSetGetCount( Erstlastschriften ); Summe = SummeErstlastschriften; ELSE // Folgelastschrift ReS = Folgelastschriften; AnzRechnungen = DBObSetGetCount( Folgelastschriften ); Summe = SummeFolgelastschriften; ENDIF // ***** Payment Information ***** XMLNodeAppendChildElement( CstmrDrctDbtInitn, "PmtInf", PmtInf, TRUE ); XMLNodeAppendChildTextElement( PmtInf, "PmtInfId", IntToStr( PaymentID ), TRUE ); XMLNodeAppendChildTextElement( PmtInf, "PmtMtd", "DD", TRUE ); XMLNodeAppendChildTextElement( PmtInf, "BtchBookg", "true", TRUE ); XMLNodeAppendChildTextElement( PmtInf, "NbOfTxs", IntToStr( AnzRechnungen ), TRUE ); XMLNodeAppendChildTextElement( PmtInf, "CtrlSum", FloatToStr( Summe, 2, LANGID_C ), TRUE ); // ***** Payment Type Information ***** XMLNodeAppendChildElement( PmtInf, "PmtTpInf", PmtTpInf, TRUE ); XMLNodeAppendChildElement( PmtTpInf, "SvcLvl", SvcLvl, TRUE ); XMLNodeAppendChildTextElement( SvcLvl, "Cd", "SEPA", TRUE ); XMLNodeAppendChildElement( PmtTpInf, "LclInstrm", LclInstrm, TRUE ); XMLNodeAppendChildTextElement( LclInstrm, "Cd", "CORE", TRUE ); XMLNodeAppendChildTextElement( PmtTpInf, "SeqTp", DBStrGet( SequenceTypes, Pay ), TRUE ); XMLNodeAppendChildTextElement( PmtInf, "ReqdColltnDt", TimeFormatDateStr( Ausfuehrungsdatum, "yyyy-MM-dd" ), TRUE ); XMLNodeAppendChildElement( PmtInf, "Cdtr", Cdtr, TRUE ); XMLNodeAppendChildTextElement( Cdtr, "Nm", DBGetSystemSettingString( "Firma", "" ), TRUE ); XMLNodeAppendChildElement( PmtInf, "CdtrAcct", CdtrAcct, TRUE ); XMLNodeAppendChildElement( CdtrAcct, "Id", Id, TRUE ); XMLNodeAppendChildTextElement( Id, "IBAN", creditor.IBAN, TRUE ); XMLNodeAppendChildElement( PmtInf, "CdtrAgt", CdtrAgt, TRUE ); XMLNodeAppendChildElement( CdtrAgt, "FinInstnId", FinInstnId, TRUE ); XMLNodeAppendChildTextElement( FinInstnId, "BIC", creditor.BIC, TRUE ); XMLNodeAppendChildTextElement( PmtInf, "ChrgBr", "SLEV", TRUE ); XMLNodeAppendChildElement( PmtInf, "CdtrSchmeId", CdtrSchmeId, TRUE ); XMLNodeAppendChildElement( CdtrSchmeId, "Id", Id, TRUE ); XMLNodeAppendChildElement( Id, "PrvtId", PrvtId, TRUE ); XMLNodeAppendChildElement( PrvtId, "Othr", Othr, TRUE ); XMLNodeAppendChildTextElement( Othr, "Id", DBGetSystemSettingString( "GläubigerID", "" ), TRUE ); XMLNodeAppendChildElement( Othr, "SchmeNm", SchmeNm, TRUE ); XMLNodeAppendChildTextElement( SchmeNm, "Prtry", "SEPA", TRUE ); FOR( l=1; l<=AnzRechnungen; l++ ) DBObSetGet( ReS, Re, l ); AdrNr = Re._Poolpartner; Trace( "Rechnung %1 für Honorarberater %2 wird beglichen", IntToStr( Re._Abrechnungsnummer ), AdrNr.Nummer ); GetLastschriftmandat( AdrNr, LM ); debitor = LM._Bankverbindung; // ***** Direct Debit Transaction Information ***** XMLNodeAppendChildElement( PmtInf, "DrctDbtTxInf", DrctDbtTxInf, TRUE ); XMLNodeAppendChildElement( DrctDbtTxInf, "PmtId", PmtId, TRUE ); XMLNodeAppendChildTextElement( PmtId, "EndToEndId", "NOTPROVIDED", TRUE ); XMLNodeAppendChildTextElementToElement( DrctDbtTxInf, "InstdAmt", FloatToStr( Re._BruttoBetrag, 2, LANGID_C ), InstdAmt, TRUE ); XMLElementSetAttribute( InstdAmt, "Ccy", "EUR" ); XMLNodeAppendChildElement( DrctDbtTxInf, "DrctDbtTx", DrctDbtTx, TRUE ); XMLNodeAppendChildElement( DrctDbtTx, "MndtRltdInf", MndtRltdInf, TRUE ); XMLNodeAppendChildTextElement( MndtRltdInf, "MndtId", LM._Referenznummer, TRUE ); XMLNodeAppendChildTextElement( MndtRltdInf, "DtOfSgntr", TimeFormatDateStr( LM._Mandatsdatum, "yyyy-MM-dd" ), TRUE ); XMLNodeAppendChildTextElement( MndtRltdInf, "AmdmntInd", "false", TRUE ); XMLNodeAppendChildElement( DrctDbtTxInf, "DbtrAgt", DbtrAgt, TRUE ); XMLNodeAppendChildElement( DbtrAgt, "FinInstnId", FinInstnId, TRUE ); XMLNodeAppendChildTextElement( FinInstnId, "BIC", debitor.BIC, TRUE ); XMLNodeAppendChildElement( DrctDbtTxInf, "Dbtr", Dbtr, TRUE ); XMLNodeAppendChildTextElement( Dbtr, "Nm", debitor.Kontoinhaber, TRUE ); XMLNodeAppendChildElement( DrctDbtTxInf, "DbtrAcct", DbtrAcct, TRUE ); XMLNodeAppendChildElement( DbtrAcct, "Id", Id, TRUE ); XMLNodeAppendChildTextElement( Id, "IBAN", debitor.IBAN, TRUE ); XMLNodeAppendChildElement( DrctDbtTxInf, "RmtInf", RmtInf, TRUE ); XMLNodeAppendChildTextElement( RmtInf, "Ustrd", IntToStr( Re._Abrechnungsnummer ), TRUE ); NEXT // nächste Rechnung NEXT // max 2 (FRST AND RCUR) IF( XMLDocumentSave( XML, Filename ) == 0 ) ok = TRUE; ENDIF DBStrDestruct( SequenceTypes ); XMLDocumentDestruct( XML ); XMLElementDestruct( CstmrDrctDbtInitn ); XMLElementDestruct( GrpHdr ); XMLElementDestruct( InitgPty ); XMLElementDestruct( PmtInf ); XMLElementDestruct( PmtTpInf ); XMLElementDestruct( SvcLvl ); XMLElementDestruct( LclInstrm ); XMLElementDestruct( Cdtr ); XMLElementDestruct( CdtrAcct ); XMLElementDestruct( Id ); XMLElementDestruct( CdtrAgt ); XMLElementDestruct( FinInstnId ); XMLElementDestruct( CdtrSchmeId ); XMLElementDestruct( PrvtId ); XMLElementDestruct( SchmeNm ); XMLElementDestruct( Othr ); XMLElementDestruct( DrctDbtTxInf ); XMLElementDestruct( PmtId ); XMLElementDestruct( InstdAmt ); XMLElementDestruct( DrctDbtTx ); XMLElementDestruct( MndtRltdInf ); XMLElementDestruct( DbtrAgt ); XMLElementDestruct( Dbtr ); XMLElementDestruct( DbtrAcct ); XMLElementDestruct( RmtInf ); ENDIF // Rechnungssummer vorhanden ENDIF // Rechnungen vorhanden RETURN( ok );