sepa-xml-creator-php icon indicating copy to clipboard operation
sepa-xml-creator-php copied to clipboard

Prüfung auf Feiertage (inkl. Code)

Open Heart1010 opened this issue 11 years ago • 2 comments

Bezugnehmend auf den Kommentar https://github.com/tschiffler/sepa-xml-creator-php/commit/cccc5d416b15a87f677029b517eba20d81f7335f#commitcomment-4841687

Für SEPA Transaktionen gilt der TARGET Kalender (Trans-European Automated Realtime Gross Settlement Express Transfer System). Er bestimmt die einheitlichen Bankarbeitstage im SEPA Raum.

Arbeitsfreie Tage nach TARGET sind lediglich:

  • die Wochenenden
  • Neujahr
  • Karfreitag
  • Ostermontag
    1. Mai
    1. Weihnachtsfeiertag
    1. Weihnachtsfeiertag

Bis auf die zwei variablen Osterfeiertage sind alle anderen zu einem festen Datum/Termin. Und selbst für die Osterfeiertage hat PHP ja mittlerweile eine eigene Funktion.

Deshalb hier zwei Funktionen, die denke ich recht nützlich sind. Man übergibt der naechsterArbeitstag Funktion das Fälligkeitsdatum und erhält automatisch den nächsten Arbeitstag zurückgeliefert. Ich hab mal nicht nur die offiziellen TARGET Tage als Feiertag eingetragen, sondern auch die deutschen Feiertage mit dazu genommen.

(Beispiel: naechsterArbeitstag("2013-12-25") würde dann "2013-12-27" als Ergebnis liefern.)

function naechsterArbeitstag($datum, $format = "Y-m-d")
{

    $startTime = strtotime($datum);
    $d = 0;
    $sd = "";
    do
    {
        $jahr = date('Y', strtotime('+' . $d . ' day', $startTime));
        $monat = date('m', strtotime('+' . $d . ' day', $startTime));
        $tag = date('d', strtotime('+' . $d . ' day', $startTime));

        $b = pruefeFeiertag($tag, $monat, $jahr);

        $sd = date($format, strtotime('+' . $d . ' day', $startTime));

        ++$d;

    } while ($b);

    return $sd;
}

function pruefeFeiertag($tag, $monat, $jahr)
{

    // Parameter in richtiges Format bringen
    if (strlen($tag) == 1)
    {
        $tag = "0$tag";
    }
    if (strlen($monat) == 1)
    {
        $monat = "0$monat";
    }

    // Wochentag berechnen
    $datum = getdate(mktime(0, 0, 0, $monat, $tag, $jahr));
    $wochentag = $datum['wday'];

    // Prüfen, ob Wochenende
    if ($wochentag == 0 || $wochentag == 6)
    {
        return true;
    }

    // Feste Feiertage werden nach dem Schema ddmm eingetragen
    $feiertage[] = "0101"; // Neujahrstag
    $feiertage[] = "0105"; // Tag der Arbeit
    $feiertage[] = "0310"; // Tag der Deutschen Einheit
    $feiertage[] = "2512"; // Erster Weihnachtsfeiertag
    $feiertage[] = "2612"; // Zweiter Weihnachtsfeiertag

    // Bewegliche Feiertage ermitteln
    $ostersonntag = easter_days($jahr);

    $datum = new DateTime("$jahr-03-21");
    $ostermontag = $ostersonntag + 1;
    $ostermontag = $datum->add(new DateInterval("P{$ostermontag}D"));
    $feiertage[] = $ostermontag->format('dm');

    $datum = new DateTime("$jahr-03-21");
    $karfreitag = $ostersonntag - 2;
    $karfreitag = $datum->add(new DateInterval("P{$karfreitag}D"));
    $feiertage[] = $karfreitag->format('dm');

    $datum = new DateTime("$jahr-03-21");
    $himmelfahrt = $ostersonntag + 39;
    $himmelfahrt = $datum->add(new DateInterval("P{$himmelfahrt}D"));
    $feiertage[] = $himmelfahrt->format('dm');

    $datum = new DateTime("$jahr-03-21");
    $pfingstmontag = $ostersonntag + 50;
    $pfingstmontag = $datum->add(new DateInterval("P{$pfingstmontag}D"));
    $feiertage[] = $pfingstmontag->format('dm');

    // Prüfen, ob Feiertag
    $code = $tag . $monat;
    if (in_array($code, $feiertage))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Heart1010 avatar Dec 12 '13 12:12 Heart1010

Danke, ich schaue mir das mal an, komme da aber diese Woche nicht mehr zu

tschiffler avatar Dec 12 '13 12:12 tschiffler

Das calendar Erweiterungsmodul von PHP muss hierzu natürlich aktiv/installiert sein (was bei jedem besseren Hoster wohl der Fall sein wird).

Sollte das auf dem Server nicht der Fall sein, genügt i.d.R. ein "sudo apt-get install php5-calendar" (Debian/Ubuntu) bzw. "sudo zypper in php5-calendar" (openSUSE), sollte man selber seinen Server verwalten!

Evtl. macht es Sinn noch eine Prüfung dessen einzubauen, dass diese automatische Berechnung des nächsten Arbeitstages nur dann gemacht wird, wenn es die Funktion gibt (und das in der Readme irgendwo ergänzen)...

if (function_exists('easter_days')) {
...

Heart1010 avatar Dec 12 '13 14:12 Heart1010