SEPA-XML mit DOCUcontrol® erstellen

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 );