Was Du brauchst

Du willst Bestellungen digital bereitstellen.
Lieferanten sollen Termine zurückmelden.
Und Dein Einkauf will endlich alles an einem Ort sehen.
Geht mit WordPress. Ohne große ERP-Integration. Aber mit Verstand.

Datenbasis: Bestellung, Position, Teillieferung

Wir brauchen 3 Ebenen:

  • Bestellung (z. B. 4711)
  • Position (z. B. Pos. 10: 50 Bretter, 20 mm Fichte)
  • Teillieferung (z. B. 30 Bretter am 10.05., 20 am 17.05.)

Die kannst Du als eigene Tabellen modellieren – oder als CPTs mit Meta-Feldern.
Ich zeig’s hier per Custom Tables.

Tabelle anlegen (einmalig)

function ds_lieferantenportal_tabellen() {
    global $wpdb;

    $sqls = [];

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_bestellungen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        bestellnr VARCHAR(50),
        lieferant_id BIGINT,
        erstellt DATETIME DEFAULT CURRENT_TIMESTAMP
    )";

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_positionen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        bestellung_id BIGINT,
        artikel VARCHAR(255),
        menge INT,
        einheit VARCHAR(10)
    )";

    $sqls[] = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}lp_teillieferungen (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        position_id BIGINT,
        menge INT,
        lieferdatum DATE
    )";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    foreach ($sqls as $sql) {
        dbDelta($sql);
    }
}
register_activation_hook(__FILE__, 'ds_lieferantenportal_tabellen');

Rollen: Lieferant vs. Mitarbeiter

Du brauchst zwei Benutzerrollen:

  • Lieferant: darf eigene Liefertermine erfassen
  • Mitarbeiter: sieht alles, kann kommentieren, verwalten
function ds_lieferantenrollen() {
    add_role('lieferant', 'Lieferant', [
        'read' => true,
    ]);

    add_role('mitarbeiter', 'Mitarbeiter', [
        'read' => true,
        'edit_posts' => true,
    ]);
}
register_activation_hook(__FILE__, 'ds_lieferantenrollen');

Dashboard-Ansicht für Lieferanten

Zeig jedem Lieferanten nur seine Bestellungen.

function ds_bestellungen_liste($user_id) {
    global $wpdb;

    $bestellungen = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}lp_bestellungen WHERE lieferant_id = %d",
        $user_id
    ));

    foreach ($bestellungen as $b) {
        echo '<h3>Bestellung: ' . esc_html($b->bestellnr) . '</h3>';
        ds_positionen_liste($b->id);
    }
}

function ds_positionen_liste($bestellung_id) {
    global $wpdb;

    $positionen = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}lp_positionen WHERE bestellung_id = %d",
        $bestellung_id
    ));

    echo '<ul>';
    foreach ($positionen as $p) {
        echo '<li>' . esc_html($p->artikel) . ' – ' . esc_html($p->menge) . ' ' . esc_html($p->einheit);
        echo '<br>Teillieferung erfassen: <input type="date" name="datum_' . $p->id . '"> <input type="number" name="menge_' . $p->id . '">';
        echo '</li>';
    }
    echo '</ul>';
}

Termin speichern

Einfaches Beispiel für ein Formular-Handling.

function ds_teillieferung_speichern() {
    global $wpdb;
    $positionen = $_POST['positionen'] ?? [];

    foreach ($positionen as $pos_id => $daten) {
        if (!empty($daten['datum']) && !empty($daten['menge'])) {
            $wpdb->insert($wpdb->prefix . 'lp_teillieferungen', [
                'position_id' => intval($pos_id),
                'lieferdatum' => sanitize_text_field($daten['datum']),
                'menge'       => intval($daten['menge']),
            ]);
        }
    }
}
add_action('admin_post_ds_lieferung', 'ds_teillieferung_speichern');

Kommunikation: Kommentar pro Position

Du willst Rückfragen oder Hinweise.
Funktioniert mit einer einfachen Kommentartabelle – oder Du verwendest comments mit comment_type = 'lieferkommentar'.

wp_insert_comment([
    'comment_post_ID' => 0,
    'comment_author'  => 'Lieferant Mustermann',
    'comment_content' => 'Kann erst nächste Woche liefern.',
    'comment_type'    => 'lieferkommentar',
    'user_id'         => get_current_user_id(),
]);

Automatische Benachrichtigung an Mitarbeiter

Wenn ein Liefertermin eingeht, willst Du eine Info-Mail.

function ds_benachrichtigung_mail($text) {
    $admins = get_users(['role' => 'mitarbeiter']);

    foreach ($admins as $a) {
        wp_mail($a->user_email, 'Neue Teillieferung eingetragen', $text);
    }
}

Einfach aufrufen nach dem Eintrag.

Fazit: Lieferantenportal in WordPress? Geht.

FeatureStatus
Bestellungen anzeigen
Teillieferung melden
Termin speichern
Kommentare möglich
Rollen und Rechte

Kein fremdes System. Keine monatlichen Kosten.
Du baust’s einmal – und nutzt es jeden Tag.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

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