WordPress: Rechnungsprüfung automatisieren – Eingangsrechnungen über ein WordPress-Portal verwalten

Warum WordPress als Portal für Eingangsrechnungen?

Wenn Du jeden Monat PDF-Rechnungen manuell prüfen und weiterleiten musst, verlierst Du Zeit.
Und oft auch den Überblick.

Mit einem WordPress-Portal kannst Du:

  • Rechnungen zentral hochladen
  • Status und Prüfung digital abbilden
  • Freigaben dokumentieren
  • Zugriffe steuern (Lieferant, Buchhaltung, GF)

Ohne neues System.
Mit PHP und Benutzerrollen.

Struktur: CPT für Rechnung + Metadaten

function ds_register_rechnungen() {
    register_post_type('eingangsrechnung', [
        'label'        => 'Eingangsrechnungen',
        'public'       => false,
        'show_ui'      => true,
        'supports'     => ['title', 'custom-fields'],
        'capability_type' => 'post',
        'menu_icon'    => 'dashicons-media-document',
    ]);
}
add_action('init', 'ds_register_rechnungen');

Wichtige Metafelder

  • lieferant_name
  • rechnungsnummer
  • betrag_netto
  • steuerbetrag
  • pruefer_id
  • status (offen, geprüft, freigegeben, abgelehnt)
  • rechnungsdatum
  • fällig_am

Formular für Upload im Backend oder Frontend

<form method="POST" enctype="multipart/form-data" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
  <input type="hidden" name="action" value="ds_rechnung_upload">
  <input type="text" name="lieferant" placeholder="Lieferant" required>
  <input type="text" name="nummer" placeholder="Rechnungsnummer" required>
  <input type="number" name="betrag" placeholder="Nettobetrag" required>
  <input type="file" name="beleg" accept="application/pdf" required>
  <button type="submit">Rechnung hochladen</button>
</form>

Upload-Verarbeitung und Post-Anlage

add_action('admin_post_ds_rechnung_upload', 'ds_rechnung_upload');

function ds_rechnung_upload() {
    $user = wp_get_current_user();
    $beleg_id = media_handle_upload('beleg', 0);

    if (is_wp_error($beleg_id)) wp_die('Fehler beim Upload');

    $post_id = wp_insert_post([
        'post_type'   => 'eingangsrechnung',
        'post_title'  => 'Rechnung ' . sanitize_text_field($_POST['nummer']),
        'post_status' => 'publish',
    ]);

    update_post_meta($post_id, 'lieferant_name', sanitize_text_field($_POST['lieferant']));
    update_post_meta($post_id, 'rechnungsnummer', sanitize_text_field($_POST['nummer']));
    update_post_meta($post_id, 'betrag_netto', floatval($_POST['betrag']));
    update_post_meta($post_id, 'beleg_id', $beleg_id);
    update_post_meta($post_id, 'status', 'offen');
    update_post_meta($post_id, 'pruefer_id', $user->ID);

    wp_redirect(home_url('/danke'));
    exit;
}

Status-Workflow mit Benutzerrolle

RolleFunktion
LieferantRechnung hochladen
PrüferStatus ändern, Kommentar
BuchhaltungFreigegebene Rechnungen exportieren
function ds_status_aendern($post_id, $status) {
    $erlaubt = ['offen', 'geprüft', 'freigegeben', 'abgelehnt'];
    if (in_array($status, $erlaubt)) {
        update_post_meta($post_id, 'status', $status);
    }
}

Anzeige: Rechnungen nach Status

function ds_get_rechnungen($status = 'offen') {
    $args = [
        'post_type'  => 'eingangsrechnung',
        'meta_query' => [
            [
                'key'   => 'status',
                'value' => $status
            ]
        ],
        'posts_per_page' => -1
    ];
    return get_posts($args);
}

Rechnungsfreigabe protokollieren

function ds_rechnung_loggen($post_id, $aktion, $benutzer_id) {
    $log = get_post_meta($post_id, 'freigabelog', true) ?: [];
    $log[] = [
        'zeit' => current_time('mysql'),
        'user' => $benutzer_id,
        'aktion' => $aktion
    ];
    update_post_meta($post_id, 'freigabelog', $log);
}

CSV-Export geprüfter Rechnungen

function ds_rechnungen_exportieren() {
    $rechnungen = ds_get_rechnungen('freigegeben');

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="freigegebene_rechnungen.csv"');

    $output = fopen('php://output', 'w');
    fputcsv($output, ['Lieferant', 'Nummer', 'Netto', 'Datum']);

    foreach ($rechnungen as $r) {
        fputcsv($output, [
            get_post_meta($r->ID, 'lieferant_name', true),
            get_post_meta($r->ID, 'rechnungsnummer', true),
            get_post_meta($r->ID, 'betrag_netto', true),
            get_the_date('Y-m-d', $r->ID)
        ]);
    }

    fclose($output);
    exit;
}

Mein Fazit

Du brauchst kein SAP, um Rechnungen zu prüfen.
Mit WordPress, CPT und ein bisschen PHP baust Du Dir ein Portal, das genau das tut, was Du brauchst.

Wenn Du willst, setz ich Dir das Grundgerüst auf.
Dann kannst Du Rechnungen nicht nur empfangen – sondern auch beherrschen.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

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