32 lines
1.5 KiB
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');
|