Kriterien vom Auftraggeber (12.06.2026): Quelle der Aktiv-Erkennung ist
ausschliesslich das read-only Rechnungsarchiv legacy_invoices (D-12).
Legacy-Rechnungen bleiben Archiv; neue manuelle Rechnungen entstehen im
MAN-Rechnungskreis.
- Aktiv-Regel: juengste Rechnung pro (Portal, Legacy-Vereinbarung) mit
payment_option.type=recurring und user_payment_option.status=active;
next_due_date max. --grace-months (Default 12) ueberfaellig, sonst
stale -> bleibt reines Archiv. Einmal-Kaeufe werden nie uebernommen.
- Uebernahme als grandfathered in user_payment_options:
current_period_end = next_due_date, Betraege/Intervall der letzten
Legacy-Rechnung in legacy_conditions -> der taegliche MAN-Lauf
(billing:generate-manual-invoices) fakturiert zum gewohnten
jaehrlichen Rhythmus weiter. Versteckte Katalog-Platzhalter
LEGACY-{PE|BP}-{Artikel} in payment_options.
- Replay-faehig (D-18): Re-Runs aktualisieren anhand der Legacy-IDs in
legacy_conditions statt zu duplizieren — die Kern-Migration laeuft
kurz vor dem Relaunch erneut.
- Optionen: --dry-run, --as-of, --grace-months, --no-report; JSON-Report
nach storage/app/migration/. Dry-Run gegen Test-Snapshot: 22 aktive
jaehrliche Vereinbarungen, davon 4 sofort faellig, 0 stale.
- Doku: MIGRATION-STEPS.md (Runbook-Reihenfolge nach archive-invoices),
05-DATABASE-MERGE §5.6, 12-NAECHSTE-SCHRITTE 6.6, 08-PROGRESS,
PHASE-9-Plan + Checkliste.
Tests: GrandfatherLegacySubscriptionsTest (7, inkl. End-to-End
Migration -> MAN-Rechnung mit Legacy-Betraegen). Suite: 475 passed,
4 skipped. Pint clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
80 lines
No EOL
3.3 KiB
Markdown
80 lines
No EOL
3.3 KiB
Markdown
# Migration Steps – aktuelles Runbook
|
||
|
||
Stand: 2026-06-12. Dieses Kurz-Runbook spiegelt den aktuell implementierten Command-Stand. Details und Go-Live-Kontext stehen in `05-DATABASE-MERGE.md` und `08-PROGRESS.md`.
|
||
|
||
## Dry-Run
|
||
|
||
```bash
|
||
php artisan legacy:import --source=all --dry-run
|
||
php artisan legacy:archive-invoices --dry-run
|
||
php artisan legacy:grandfather-subscriptions --dry-run
|
||
php artisan legacy:verify --no-report
|
||
php artisan legacy:migrate-media --portal=all --type=all --base-path=dev/migration --dry-run
|
||
|
||
```
|
||
|
||
Hinweis: `legacy:archive-invoices` importiert die Legacy-Rechnungen vollständig in `legacy_invoices`, inkl. Status/User-Zuordnung, `raw_snapshot`, `pdf_payload` und Report. Die PDF-Erzeugung erfolgt im Customer-Bereich bei Abruf aus diesen Archivdaten.
|
||
|
||
## Vollimport in korrekter Reihenfolge
|
||
|
||
```bash
|
||
php artisan legacy:import --source=presseecho --step=categories --force
|
||
php artisan legacy:import --source=all --step=users --force
|
||
php artisan legacy:import --source=presseecho --step=companies --force
|
||
php artisan legacy:import --source=businessportal24 --step=companies --force
|
||
php artisan legacy:import --source=presseecho --step=contacts --force
|
||
php artisan legacy:import --source=businessportal24 --step=contacts --force
|
||
php artisan legacy:import --source=presseecho --step=press-releases --force
|
||
php artisan legacy:import --source=businessportal24 --step=press-releases --force
|
||
php artisan legacy:import --step=link-associations --force
|
||
php artisan legacy:archive-invoices
|
||
php artisan legacy:grandfather-subscriptions
|
||
php artisan legacy:fix-timestamps
|
||
php artisan legacy:verify
|
||
```
|
||
|
||
Hinweis: `legacy:grandfather-subscriptions` läuft **nach** `legacy:archive-invoices`,
|
||
weil es die aktiven, jährlich wiederkehrenden Zahlungsvereinbarungen aus dem
|
||
Rechnungsarchiv ableitet (jüngste Rechnung pro Vereinbarung mit
|
||
`payment_option.type = recurring` und `user_payment_option.status = active`)
|
||
und als `grandfathered` in `user_payment_options` schreibt. Die nächste
|
||
Rechnung stellt danach der tägliche MAN-Kreis-Lauf
|
||
(`billing:generate-manual-invoices`) zum gewohnten Rhythmus aus. Re-Runs
|
||
aktualisieren bestehende Einträge (Replay-fähig für den Lauf kurz vor dem
|
||
Relaunch). Optionen: `--dry-run`, `--as-of=`, `--grace-months=12` (älter
|
||
überfällige Vereinbarungen gelten als stale und bleiben reines Archiv).
|
||
|
||
Hinweis: Der Schritt `--step=users` importiert nicht nur `sf_guard_user`, sondern auch die direkt verknüpften Daten aus `sf_guard_user_profile` in die neue Tabelle `profiles`.
|
||
|
||
## Alternativer Komplettlauf
|
||
|
||
```bash
|
||
php artisan legacy:import --source=all --force
|
||
php artisan legacy:archive-invoices
|
||
php artisan legacy:grandfather-subscriptions
|
||
php artisan legacy:fix-timestamps
|
||
php artisan legacy:verify
|
||
php artisan legacy:migrate-media --portal=all --type=all --base-path=dev/migration
|
||
```
|
||
|
||
## Noch nicht im Runbook finalisiert
|
||
|
||
- Medien-/Bilddateien-Transfer: Scope und finaler Command noch offen.
|
||
- Staging-Rehearsal mit aktuellem Produktiv-Snapshot bleibt Pflicht vor Go-Live.
|
||
|
||
## Legacy-Rechnungsreport
|
||
|
||
`legacy:archive-invoices` schreibt standardmäßig:
|
||
|
||
```bash
|
||
storage/app/private/migration/legacy-invoices-*.json
|
||
```
|
||
|
||
Der Report enthält pro Portal:
|
||
|
||
- Source-Count
|
||
- importierte/übersprungene/fehlerhafte Rechnungen
|
||
- Summe in Cent
|
||
- Statusverteilung
|
||
- Anzahl unzugeordneter Legacy-User
|
||
- Anzahl erzeugter PDF-Payloads |