PDF Export von Abwesenheiten für OrangeHRM Starter

Spread the info
PDF Export von Abwesenheiten für OrangeHRM Starter

Ein PDF Export von Abwesenheiten ist eine wichtige Funktion für Unternehmen, deren Angestellten und HR Manager. Sie ermöglicht eine übersichtliche Verwaltung der Urlaubszeiten von Mitarbeitern. Mit OrangeHRM, einer Open-Source-HR-Software, können Abwesenheitsanträge eingebracht, vom Vorgesetzten genehmigt und die Daten direkt aus der Datenbank abgerufen werden. Eine externe Webseite hilft dabei, diese Informationen für jeden Mitarbeiter in ein PDF zu exportieren. Der hier gezeigte Ansatz basiert auf PHP und der FPDF-Bibliothek. Er zeigt, wie Daten angezeigt und in ein PDF-Dokument exportiert werden.

Überblick zum Code: index.php

Das Skript index.php erstellt eine Benutzeroberfläche. Diese ermöglicht es, einen Mitarbeiter auszuwählen und den Zeitraum einzugeben. Das Formular ruft die Mitarbeiterdaten aus der Tabelle hs_hr_employee ab und zeigt sie in einer select-Box an.

Wichtige Merkmale:

  • PDO-Datenbankverbindung: Sorgt für eine sichere Verbindung zur Datenbank. Zudem schützt sie vor SQL-Injection.
  • Dynamische Mitarbeiterliste: Mitarbeiterdaten werden nach Nachname und Vorname sortiert. Die Anzeige erfolgt in der select-Box.
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Urlaubs Abfrage und PDF-Export</title>
</head>
<body>
<a href="https://domain.tld">Zurück zu domain.tld</a><p>
    <form method="post" action="generate_pdf.php">
        <label for="employee_id">Mitarbeiter auswählen:</label>
        <select id="employee_id" name="employee_id" required>
            <?php
            // Verbindung zur Datenbank herstellen
            $host = 'localhost';
            $dbname = 'orangehrm';
            $username = 'orangehrm';
            $password = '';

            try {
                $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // Mitarbeiterdaten abrufen
                $stmt = $pdo->query("SELECT employee_id, emp_firstname, emp_lastname FROM hs_hr_employee ORDER BY emp_lastname, emp_firstname");
                $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

                if ($rows) {
                    foreach ($rows as $row) {
                        echo '<option value="' . htmlspecialchars($row['employee_id']) . '">' .
                             htmlspecialchars($row['emp_lastname']) . ', ' .
                             htmlspecialchars($row['emp_firstname']) . ' (' .
                             htmlspecialchars($row['employee_id']) . ')</option>';
                    }
                } else {
                    echo '<option value="">Keine Mitarbeiter gefunden</option>';
                }
            } catch (PDOException $e) {
                echo '<option value="">Fehler bei der Datenbankverbindung: ' . htmlspecialchars($e->getMessage()) . '</option>';
            }
            ?>
        </select>
        <br><br>
        <label for="start_date">Startdatum:</label>
        <input type="date" id="start_date" name="start_date" value="<?php echo date('Y') . '-01-01'; ?>" required>
        <br><br>
        <label for="end_date">Enddatum:</label>
        <input type="date" id="end_date" name="end_date" value="<?php echo (date('Y') + 1) . '-02-01'; ?>" required>
        <br><br>
        <button type="submit">PDF erstellen</button>
    </form>
</body>
</html>

Erklärung des PDF-Skripts: generate_pdf.php

Das Skript generate_pdf.php verarbeitet die Formulardaten. Eine SQL-Abfrage ermittelt die Abwesenheiten des ausgewählten Mitarbeiters. Der Zeitraum basiert auf den Formulardaten. Mithilfe von CTEs werden zusammenhängende Urlaubszeiträume analysiert. Das Ergebnis ist eine klare Darstellung der Daten im PDF.

Hauptpunkte des Codes:

  • Datenverarbeitung: CTEs gruppieren und analysieren Daten. Das sorgt für eine klare Struktur.
  • PDF-Erstellung: Die FPDF-Bibliothek erstellt eine PDF-Datei. Sie enthält eine Tabelle mit Namen, Urlaubszeiten, Urlaubsanspruch und der verbleibende Anzahl der Tage.
  • Logo-Integration: Ein Firmenlogo wird optional eingefügt. Dadurch wirkt das PDF professioneller. Der Dateiname muss logo.png lauten.
<?php
require('fpdf.php');

// Verbindung zur Datenbank herstellen
$host = 'localhost';
$dbname = 'orangehrm';
$username = 'orangehrm';
$password = '';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Datenbankverbindung fehlgeschlagen: " . $e->getMessage());
}

// Prüfen, ob die employee_id und die Datumsangaben übergeben wurden
if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['employee_id']) && !empty($_POST['start_date']) && !empty($_POST['end_date'])) {
    $employee_id = $_POST['employee_id'];
    $start_date = $_POST['start_date'];
    $end_date = $_POST['end_date'];

    // SQL-Abfrage ausführen
    $sql = "WITH ordered_dates AS (
            ...
        SELECT
            emp_number,
            emp_number_employee,
            employee_id,
            DATE_FORMAT(MIN(event_date), '%d.%m.%Y') AS start_date,
            DATE_FORMAT(MAX(event_date), '%d.%m.%Y') AS end_date,
            firstname,
            lastname,
            MAX(consumed_days) AS total_days,
            FLOOR((SELECT SUM(no_of_days) FROM ohrm_leave_entitlement WHERE emp_number = fg.emp_number)) AS total_entitlement
        FROM
            working_days fg
        GROUP BY
            emp_number, emp_number_employee, employee_id, group_identifier, firstname, lastname
        ORDER BY
            MIN(fg.event_date);
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':employee_id', $employee_id, PDO::PARAM_STR);
    $stmt->bindParam(':start_date', $start_date, PDO::PARAM_STR);
    $stmt->bindParam(':end_date', $end_date, PDO::PARAM_STR);
    $stmt->execute();

    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if ($results) {
        $pdf = new FPDF();
        $pdf->AddPage();
        $pdf->Image('logo.png', 10, 6, 30);
        $pdf->SetFont('Arial', 'B', 14);
        $pdf->Ln(10);
        $pdf->Cell(0, 10, utf8_decode('Urlaube für Mitarbeiter: ' . $employee_id), 0, 1, 'C');
        $pdf->Ln(5);

        // Tabellenkopf
        $pdf->SetFont('Arial', 'B', 12);
        $pdf->Cell(30, 10, utf8_decode('Nachname'), 1);
        $pdf->Cell(30, 10, utf8_decode('Vorname'), 1);
        $pdf->Cell(40, 10, utf8_decode('Beginn'), 1);
        $pdf->Cell(40, 10, utf8_decode('Ende'), 1);
        $pdf->Cell(30, 10, utf8_decode('Tage'), 1);
        $pdf->Ln();

        // Datenzeilen
        $pdf->SetFont('Arial', '', 12);
        $total_sum = 0;
        $total_entitlement = 0;
        foreach ($results as $row) {
            $formatted_days = $row['total_days'] == floor($row['total_days']) ? (int)$row['total_days'] : $row['total_days'];
            $pdf->Cell(30, 10, utf8_decode($row['lastname']), 1);
            $pdf->Cell(30, 10, utf8_decode($row['firstname']), 1);
            $pdf->Cell(40, 10, utf8_decode($row['start_date']), 1);
            $pdf->Cell(40, 10, utf8_decode($row['end_date']), 1);
            $pdf->Cell(30, 10, utf8_decode($formatted_days), 1);
            $pdf->Ln();
            $total_sum += $row['total_days'];
            $total_entitlement = $row['total_entitlement'];
        }

        // Zusammenfassung
        $formatted_total_sum = $total_sum == floor($total_sum) ? (int)$total_sum : $total_sum;
        $available_days = $total_entitlement - $total_sum;
        $formatted_available_days = $available_days == floor($available_days) ? (int)$available_days : $available_days;

        $pdf->SetFont('Arial', 'B', 12);
        $pdf->Cell(140, 10, 'Summe der gebuchten Tage', 1);
        $pdf->Cell(30, 10, utf8_decode($formatted_total_sum), 1);
        $pdf->Ln();
        $pdf->Cell(140, 10, 'Urlaubsanspruch', 1);
        $pdf->Cell(30, 10, utf8_decode((int)$total_entitlement), 1);
        $pdf->Ln();
        $pdf->Cell(140, 10, utf8_decode('Verfügbare Tage'), 1);
        $pdf->Cell(30, 10, utf8_decode($formatted_available_days), 1);
        $pdf->Ln();

        $outputFileName = 'result.pdf';
        $pdf->Output($outputFileName, 'F');

        echo "PDF wurde erstellt: <a href='$outputFileName'>Hier herunterladen</a>";
    } else {
        echo "Keine Ergebnisse für Employee ID: " . htmlspecialchars($employee_id);
    }
} else {
    echo "Bitte geben Sie eine Employee ID und einen Zeitraum ein.";
}
?>

Funktionen des PDF-Exports

Das Skript zeigt die Mitarbeiterdaten tabellarisch. Es enthält Namen, Start- und Enddatum der Abwesenheit sowie die Urlaubstage. Eine Zusammenfassung berechnet die genutzten und verbleibenden Tage. Diese PDF-Datei ist für HR-Abteilungen und Mitarbeiter hilfreich. Sie bietet eine einfache Übersicht und kann intern genutzt werden. So kann man aus OrangeHRM Starter für kleine Unternehmen mit überschaubarer Anzahl an Mitarbeitern noch etwas mehr herausholen ohne auf die Advaned Version upgraden zu müssen.

Beispiel eines PDF (anonymisiert)

Beispiel eines PDF Exports von Urlauben eine MA

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert