Warenwirtschaft: AP-38 dokumentiert — Plan-Abschnitt + Connector-README (Cron)

Shop-Diagnose 28.08. (SSH): Warteliste leer ([]), alles abgearbeitet, Ampel grün.
- Plan V7.0: eigener AP-38-Abschnitt (Diagnose/Ursache/Behebung); Statustabelle
  auf „alle APs erledigt" aktualisiert (nur noch Connector-Rollout v1.6.0 offen).
- Neu: dev/partnercenter-api/README.md — Status-Ampel, Cron einrichten/prüfen
  (wp cron event list/schedule/run), Fehlersuche (Auth/curl), v1.6.0-Änderungen,
  Rollout-Checkliste.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-08-28 11:14:53 +00:00
parent b6ca33288c
commit 7da49e2027
2 changed files with 154 additions and 2 deletions

View file

@ -0,0 +1,136 @@
# PARTNERCENTER API Connector
Verbindet den WooCommerce-Shop (`gruene-seele.bio`) mit dem PARTNERCENTER-/ERP-System
(`https://api.gruene-seele.bio/`): leitet Bestellungen weiter, überträgt DHL-Labels und
gleicht den Versandstatus („Ampel" in der Bestellliste) ab.
- **Aktuelle Version:** 1.6.0
- **API-Basis-URL:** `https://api.gruene-seele.bio/` (fest im Code, `public/partnercenter-api/partnercenter-api.php`)
- **Zugangsdaten:** als Konstanten in der `wp-config.php` des Shops:
```php
define('PARTNERCENTER_API_EMAIL', '…');
define('PARTNERCENTER_API_PASSWORD', '…');
define('PARTNERCENTER_API_DEV', false); // true = Testmodus
```
---
## Die Status-Ampel (WICHTIG)
In der WooCommerce-Bestellliste (Spalte „PARTNERCENTER Status") zeigt ein farbiger Punkt
den Fulfilment-Status aus dem ERP:
| ERP-Status | Bedeutung | Anzeige im Shop |
|------------|--------------------|-----------------|
| `open` | offen | 🟠 orange |
| `process` | in Bearbeitung / Wartestellung | 🟠 orange |
| `sent` | versendet | 🟢 grün |
| `close` | abgeschlossen | 🟢 grün |
| `pick_up` | Abholung (erfüllt) | 🟢 grün |
| `cancel` | storniert | 🔴 rot |
| *(leer/unbekannt)* | — | ⚠️ |
### So funktioniert der Abgleich
1. Beim Weiterleiten einer Bestellung setzt der Connector das Meta
`_partnercenter_api_order_status = open` und merkt sich die Bestell-ID in der Option
`_partnercenter_api_unclear_order_ids`.
2. Der **stündliche WP-Cron-Event `partnercenter_api_fetch_orders_status`** fragt für alle
„unklaren" Bestellungen `POST /api/wp/status` ab und schreibt den neuen Status ins Meta.
3. Erreicht eine Bestellung einen Endzustand (`sent`, `close`, `pick_up`, `cancel`),
fällt sie aus der Warteliste.
> **Merksatz:** Läuft dieser Cron nicht (oder scheitert die API-Anmeldung), bleibt **jede**
> Bestellung auf ihrem Initialwert `open` = **orange** — egal wie korrekt das ERP antwortet.
> Genau das war die Ursache des „Ampel bleibt orange"-Fehlers (Testphase 08/2026, AP-38).
---
## Cron einrichten & prüfen
Der Shop läuft mit `DISABLE_WP_CRON = true`; WP-Cron wird über einen **System-Crontab**
angestoßen (empfohlen, verlässlicher als der Request-basierte WP-Cron):
```cron
*/5 * * * * wget --delete-after --timeout=50 --tries=1 https://www.gruene-seele.bio/wp-cron.php > /dev/null 2>&1
```
### Ist der Status-Event eingeplant?
```bash
wp cron event list | grep -i partnercenter
```
- **Zeile mit `partnercenter_api_fetch_orders_status` (recurrence `1 hour`)** → alles gut.
- **Keine Ausgabe** → der Event fehlt (Hauptursache des Ampel-Bugs). Nachplanen:
```bash
wp cron event schedule partnercenter_api_fetch_orders_status now hourly
```
> **Seit v1.6.0 selbstheilend:** `partnercenter_api_ensure_cron()` (Hook `init`) plant den
> Event bei jedem Request automatisch nach, falls er fehlt. Ein manuelles Nachplanen ist
> danach im Normalfall nicht mehr nötig — der obige Check bleibt aber das Diagnosemittel Nr. 1.
### Abgleich manuell auslösen und prüfen
```bash
# Wie viele Bestellungen warten aktuell auf einen Status?
wp option get _partnercenter_api_unclear_order_ids --format=json
# ( [] = nichts offen / alles abgearbeitet )
# Abgleich sofort ausführen …
wp cron event run partnercenter_api_fetch_orders_status
# … und an einer bekannten, versendeten Bestellung prüfen:
wp post meta get <ORDER_ID> _partnercenter_api_order_status
# erwartet: sent (→ grün)
```
---
## Fehlersuche: Ampel bleibt orange
1. **Event eingeplant?** → `wp cron event list | grep partnercenter` (siehe oben). Fehlt er,
nachplanen bzw. Plugin einmal deaktivieren/reaktivieren.
2. **Nach `wp cron event run` bleibt der Status `open`?** → Dann scheitert die **API-Anmeldung**.
Konstanten prüfen und Login direkt testen:
```bash
wp config get PARTNERCENTER_API_EMAIL
wp config get PARTNERCENTER_API_PASSWORD
# Login (Werte einsetzen) — es muss ein access_token zurückkommen:
curl -s -X POST https://api.gruene-seele.bio/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"<EMAIL>","password":"<PASS>","remember_me":true}'
# Status mit dem Token abfragen — erwartet "status":"sent":
curl -s -X POST https://api.gruene-seele.bio/wp/status \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{"wp_order_numbers":[<ORDER_ID>]}'
```
3. **Login schlägt fehl (kein Token / 401)** → Zugangsdaten in `wp-config.php` falsch/abgelaufen.
4. **`api.gruene-seele.bio` aus dem Shop nicht erreichbar** → Firewall/DNS:
```bash
curl -sI https://api.gruene-seele.bio/ | head -1
```
5. **Status ist `free` oder ⚠️** → veraltete Connector-/ERP-Version. Ab v1.6.0 ist das
Status-Mapping vollständig (Wartestellung `process`, `pick_up`, `cancel`).
---
## Änderungen in v1.6.0
- **AP-34 — Varianten-Artikelnummer:** `compose_cart_content()` sendet jetzt die **eigene
SKU der Variation** (`$order_item->get_product()->get_sku()`, Fallback Eltern-SKU) statt
der Eltern-SKU. **Vorbedingung:** jede Variation braucht im Shop eine eigene, gepflegte
Artikel-Nr. (SKU) = die `wp_number` des jeweiligen ERP-Produkts.
- **AP-38 — Status-Ampel:**
- `partnercenter_api_ensure_cron()` (Hook `init`) plant den Status-Cron selbstheilend nach.
- Ampel-Mapping ergänzt: `pick_up` → grün, `cancel` → rot (vorher beide ⚠️).
- Endzustände `pick_up`/`cancel` fallen aus der stündlichen Warteliste.
## Rollout
1. Plugin-Ordner `partnercenter-api/` in `wp-content/plugins/` austauschen.
2. Einmal **deaktivieren + reaktivieren** (oder mind. eine Seite aufrufen, damit
`partnercenter_api_ensure_cron()` greift).
3. `wp cron event list | grep partnercenter` → Event muss vorhanden sein.
4. `wp cron event run partnercenter_api_fetch_orders_status` und an einer versendeten
Bestellung `sent`/grün prüfen.