Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prüfung auf Feiertage (inkl. Code) #3

Open
Heart1010 opened this issue Dec 12, 2013 · 2 comments
Open

Prüfung auf Feiertage (inkl. Code) #3

Heart1010 opened this issue Dec 12, 2013 · 2 comments

Comments

@Heart1010
Copy link

Bezugnehmend auf den Kommentar cccc5d4#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 referenced this issue Dec 12, 2013
Testfile zur generierung einer SEPA Basislastschrift XML mit 2 Lastschrifteinträgen
@tschiffler
Copy link
Owner

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

@Heart1010
Copy link
Author

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')) {
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants