presseportale/dev/migration 2026/MIGRATION-STEPS.md
Kevin Adametz 1cd4d8e33a P6.6: legacy:grandfather-subscriptions — aktive Legacy-Abos aus dem Rechnungsarchiv migrieren
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>
2026-06-12 10:35:48 +00:00

3.3 KiB
Raw Blame History

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

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

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

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:

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