Skip to content

Bug: API-Trackingnummern erscheinen nicht im UI (versand vs versandpakete Tabellen-Mismatch) #247

@Avatarsia

Description

@Avatarsia

Bug: API-Trackingnummern erscheinen nicht im UI (schreibt in falsche Tabelle)

Problem

Wenn Trackingnummern über die REST v1 API (POST /v1/trackingnummern) erstellt werden, erscheinen sie nicht im OpenXE UI unter Lieferschein → Pakete. Die Tracking-Daten werden in die alte versand-Tabelle geschrieben, aber das UI liest ausschließlich aus der neuen versandpakete-Tabelle.

Reproduktion

  1. Trackingnummer via API erstellen:
curl -X POST "http://localhost/api/index.php/v1/trackingnummern" \
  --digest -u "user:pass" \
  -H "Content-Type: application/json" \
  -d '{"tracking":"TEST-123","lieferschein":"300000","gewicht":"2.5","anzahlpakete":"1","versendet_am":"2026-04-01"}'

→ API antwortet mit Success, Tracking wird in versand-Tabelle erstellt.

  1. Im UI: Lieferschein 300000 → Tab "Pakete"
    Leer — keine Pakete/Tracking sichtbar.

  2. Pakete über UI erstellen → erscheint sofort im Tab.

Root Cause

API schreibt in versand (alte Tabelle)

TrackingNumberController::createAction() verwendet TrackingNumberResource mit TABLE_NAME = 'versand':

// classes/Modules/Api/Resource/TrackingNumberResource.php
const TABLE_NAME = 'versand';

// TrackingNumberController::createAction()
// INSERT INTO versand (tracking, lieferschein, gewicht, ...)

UI liest aus versandpakete (neue Tabelle)

lieferschein.php (Zeile 1132-1157) — der alte versand-Query ist auskommentiert:

-- ALT (auskommentiert):
-- SELECT ... FROM versand WHERE lieferschein = {$id}

-- NEU (aktiv):
SELECT v.id, v.tracking, v.tracking_link
FROM versandpakete v
LEFT JOIN versandpaket_lieferschein_position vlp ON v.id = vlp.versandpaket
LEFT JOIN lieferschein_position lp ON lp.id = vlp.lieferschein_position
LEFT JOIN lieferschein l ON lp.lieferschein = l.id
WHERE l.id = {$id} OR v.lieferschein_ohne_pos = {$id}
GROUP BY v.id

UI schreibt in versandpakete

versandpakete.php (Zeile 924):

INSERT INTO versandpakete (status, lieferschein_ohne_pos, versender) VALUES ('neu', {$lieferschein}, '{username}')

Zusätzlich setzt die UI lieferschein.versand_status = 1.

Betroffene Tabellen

Tabelle Zweck API schreibt UI liest UI schreibt
versand Legacy-Tracking Ja Nein (auskommentiert) Nein
versandpakete Neues Pakete-System Nein Ja Ja
versandpaket_lieferschein_position Paket-Positionen-Verknüpfung Nein Ja Ja

Vorgeschlagener Fix

In TrackingNumberController::createAction() nach dem bestehenden versand-INSERT zusätzlich in versandpakete schreiben:

// Nach dem bestehenden INSERT INTO versand:
$versandId = $resource->insert($bindValues);

// NEU: Auch in versandpakete schreiben (fuer UI-Sichtbarkeit)
$lieferscheinId = $DB->Select(
    "SELECT id FROM lieferschein WHERE belegnr = '" . $DB->real_escape_string($input['lieferschein']) . "' LIMIT 1"
);
if ($lieferscheinId > 0) {
    $DB->Insert("INSERT INTO versandpakete 
        (tracking, tracking_link, gewicht, status, lieferschein_ohne_pos, versandart, versender) 
        VALUES (
            '" . $DB->real_escape_string($input['tracking']) . "',
            '',
            '" . $DB->real_escape_string($input['gewicht']) . "',
            'versendet',
            '" . (int)$lieferscheinId . "',
            '" . $DB->real_escape_string($versandart) . "',
            'API'
        )"
    );
    // Versand-Status auf dem Lieferschein setzen
    $DB->Update("UPDATE lieferschein SET versand_status = 1 WHERE id = '" . (int)$lieferscheinId . "'");
}

Alternativ (langfristig)

Die TrackingNumberResource komplett auf versandpakete umstellen und die versand-Tabelle nur noch für Backward-Compatibility beschreiben.

Betroffene Dateien

Datei Zeile Beschreibung
classes/Modules/Api/Controller/Version1/TrackingNumberController.php createAction Schreibt nur in versand
classes/Modules/Api/Resource/TrackingNumberResource.php TABLE_NAME Zeigt auf versand statt versandpakete
www/pages/lieferschein.php 1132-1157 Pakete-Tab liest aus versandpakete
www/pages/versandpakete.php 924 UI schreibt in versandpakete

Umgebung

  • OpenXE v1.12 (master)
  • Gefunden durch MCP-Server Live-Tests

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions