Steuerkram/migrations/090_invoice_zahlstatus.sql

32 lines
1.5 KiB
SQL

-- 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');