-- Zahlungsstatus für Ausgangsrechnungen: Teilzahlung / Überzahlt ALTER TABLE invoices MODIFY COLUMN status ENUM('Entwurf','Finalisiert','Gesendet','Teilzahlung','Bezahlt','Überzahlt','Storniert') NOT NULL DEFAULT 'Entwurf'; -- Versandzeitpunkt, damit beim Zurücksetzen des Zahlungsstatus -- zwischen 'Finalisiert' und 'Gesendet' unterschieden werden kann ALTER TABLE invoices ADD COLUMN IF NOT EXISTS sent_at DATETIME NULL DEFAULT NULL AFTER status; UPDATE invoices SET sent_at = COALESCE(updated_at, created_at) WHERE sent_at IS NULL AND status IN ('Gesendet','Bezahlt'); -- Bestandsdaten: Status aus den bereits zugeordneten Buchungen ableiten. -- Manuell auf 'Bezahlt' gesetzte sowie stornierte Rechnungen bleiben unangetastet. UPDATE invoices i JOIN (SELECT beleg_id, SUM(betrag_brutto) AS gezahlt FROM bookings WHERE buchungstyp = 'Einnahme' AND is_reversal = 0 AND parent_booking_id IS NULL AND reversed_by IS NULL GROUP BY beleg_id) b ON b.beleg_id = i.beleg_id SET i.status = CASE WHEN ROUND(i.betrag_brutto - b.gezahlt, 2) = 0 THEN 'Bezahlt' WHEN (i.betrag_brutto > 0 AND b.gezahlt > i.betrag_brutto) OR (i.betrag_brutto < 0 AND b.gezahlt < i.betrag_brutto) THEN 'Überzahlt' WHEN (i.betrag_brutto > 0 AND b.gezahlt > 0) OR (i.betrag_brutto < 0 AND b.gezahlt < 0) THEN 'Teilzahlung' ELSE i.status END WHERE i.status IN ('Finalisiert','Gesendet');