TARGET-Tage SEPA

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

TARGET-Tage SEPA

Beitrag von Werner_Bayern »

Servus,

sicherlich hat das jeder schon gelöst, ich habe hier aber leider dazu nichts gefunden, bzw. wird offensichtlich oft der "Fehler" gemacht, dass nationale Feiertage berücksichtigt werden.

Hat jemand schon mal den korrekten Code dazu gemacht? Bisher benutze ich folgenden leicht abgeänderten Code aus dem Forum:

Code: Alles auswählen

local nFrist := 1 // Frist bei Überweisungen oder B2B

   if lLastschrift .and. cLastschriftart == "C"   // nur bei Core
      nFrist := if(cLastschrArt == "F", 2, 5) // Folge 2, einmalige/erstmalige 5 Tage, aber nur bei CORE, sonst 1 Tag bei B2B
   endif
   nFrist ++  // 1 Tag Vorlaufzeit
   if dAusfDatum <= date() + nFrist
      dAusfDatum := date() + nFrist
   endif
   if dow(dAusfDatum) = 1
     dAusfDatum ++
   endif
   if dow(dAusfDatum) = 7
     dAusfDatum += 2
   endif
return dAusfDatum
Hierzu das:

Wie berechne ich das Einreichdatum für meine SEPA-Lastschriften?
Durch die SEPA-Einführung wird der europäische Zahlungsverkehr vereinheitlicht und
standardisiert. Dazu gehören unter anderem einheitliche Fristen für die Vorlage von
Lastschriften beim Kreditinstitut des Zahlungspflichtigen (=Zahlstelle). Dies setzt
wiederum voraus, dass der Zahlungsempfänger die Lastschriften frühzeitig seinem
Kreditinstitut zum Einzug einreicht.
Besonders wichtig ist in diesem Zusammenhang der Begriff der TARGET-Tage
(Trans-European Automated Real-time Gross Settlement Express Transfer System).
TARGET-Tage sind die Tage, an denen die Kreditinstitute in Europa Zahlungen
bearbeiten. Die Erreichbarkeit der Institute erhöht sich dadurch, dass neben
Samstagen und Sonntagen lediglich 6 einheitliche Feiertage existieren.
Nationale Feiertage bleiben unberücksichtigt.
Die einheitlichen Feiertage im TARGET-Kalender:
■ Neujahr
■ Karfreitag
■ Ostermontag
■ 1. Mai / Tag der Arbeit
■ 1. und 2. Weihnachtsfeiertag.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: TARGET-Tage SEPA

Beitrag von Werner_Bayern »

Hab das jetzt mal umgesetzt, Code ist getestet, aber noch nicht produktiv beim Kunden, sollte aber passen.
Voraussetzung: Datum ist im Format tt.mm.jjjj

Code: Alles auswählen

function Sepa_Frist(dAusfDatum, nFrist) // Ausführungsfrist bei Überweisungen oder Lastschriften, Anzahl von EU-Bankarbeitstagen!
local nA, nB, nC, nE, nTag, nMonat, nJahr, dTempDatum := date()   // nicht static!
static dOsterSonntag

   if dOsterSonntag == NIL // einmalig berechnen für dieses Jahr
      nJahr := year(date())   // (4-stellig) 1900 bis 2099 mit Ergänzung bis 2199
      nA := ( nJahr % 19 * 19  + 24 ) % 30   // (Jahr 4-stellig)
      nB := 120 + nA - int(nA / 27)   // mit Ergänzung für Jahre 1954, 1981, 2049 und 2076
      nC := (nB + int(nJahr * 5 / 4) - int(nJahr / 2100)) % 7   // mit Ergänzung gültig bis 2199
      nE := nB - nC  // nE  Osterkennzahl (Easter), Bezugswert für alle beweglichen Feiertage
      nTag := 1 + nE % 31  // Ostersonntag  (Datum Tag)
      nMonat := int(nE / 31) // Ostermonat     (Monat)
      dOsterSonntag := ctod(gn(2, nTag) + "." + gn(2, nMonat) + "." + ltrim(str(nJahr)))
   endif

   nFrist ++  // 1 Tag Vorlaufzeit
   do while nFrist > 0
      dTempDatum++
      nFrist--
      dTempDatum := Samstag_Sonntag(dTempDatum)
      do case  // jetzt noch die 6 einheitlichen Feiertage (nationale Feiertage bleiben unberücksichtigt!)
         case left(dtoc(dTempDatum), 5) == "01.01" // Neujahr
            dTempDatum++
            dTempDatum := Samstag_Sonntag(dTempDatum)
         case dTempDatum == dOsterSonntag -2 // Karfreitag
            dTempDatum += 4   // Ostermontag auch überspringen
         case dTempDatum == dOsterSonntag +1 // Ostermontag
            dTempDatum++
         case left(dtoc(dTempDatum), 5) == "01.05" // Tag der Arbeit
            dTempDatum++
            dTempDatum := Samstag_Sonntag(dTempDatum)
         case left(dtoc(dTempDatum), 5) == "25.12" // 1. Weihnachtsfeiertag
            dTempDatum += 2
            dTempDatum := Samstag_Sonntag(dTempDatum)
         case left(dtoc(dTempDatum), 5) == "26.12" // 2. Weihnachtsfeiertag
            dTempDatum ++
            dTempDatum := Samstag_Sonntag(dTempDatum)
      endcase
   enddo
   if dAusfDatum < dTempDatum // liegt das Ausführungsdatum in der Zukunft nach der Frist, wird kein Wochenende oder Feiertag mehr geprüft!
      dAusfDatum := dTempDatum // Datum kann nicht in der Vergangenheit liegen und Frist wird hier beachtet
   endif

return dAusfDatum


static function Samstag_Sonntag(dAusfDatum)  // prüft auf Samstag/Sonntag und überspringt diese
if dow(dAusfDatum) == 7  // Samstag
  dAusfDatum += 2
elseif dow(dAusfDatum) == 1 // Sonntag
  dAusfDatum ++
endif
return dAusfDatum

************************** nullen vorfügen *****************************
function gn(stellen, zahl)
local string

string := ltrim(str(zahl, stellen, 0))
string := replicate("0", stellen-len(string))+string

return string
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: TARGET-Tage SEPA

Beitrag von Tom »

Ich habe die (meine) interne Feiertagsverwaltung einfach um eine entsprechende Markierung ergänzt (die Feiertage werden automatisch und bundeslandbezogen ermittelt). Die interne Funktion "IstEinFeiertag(dDatum)" ist schlicht um einen Parameter "lFuerSepa" ergänzt. Bei der automatischen Erhebung der Feiertage für ein Jahr, für das es noch keinen Feiertagskalender gibt, wird die Markierung natürlich auch entsprechend gesetzt.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: TARGET-Tage SEPA

Beitrag von Werner_Bayern »

Servus Tom,

mit dieser Ostersonntags-Berechnung kannst Du für jedes Jahr die entsprechenden Feiertage berechnen, brauchst also keine statischen Tage zu hinterlegen.

Zitat aus meiner Internet-Quelle:
Palmsonntag (-7), Gründonnerstag (-3), Karfreitag (–2), Ostermontag (+1), Himmelfahrt / Vatertag (+39), Pfingsten (+49) und Fronleichnam (+60) sind ebenfalls bewegliche Feiertage, weil sie an das Osterdatum gekoppelt sind
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten