Steuerkram/migrations/046_ust_buchungszeilen.sql
fds2610-bot 55c02b54de Feature: USt-Buchungszeilen für Ausgangsrechnungen einführen
- Migration 046: ustva_kz='83'/'84' für Konten 1776/1771, Bestandsmigration für Einnahme-Buchungen
- Booking::create(): USt-Kindzeile auf 1771/1776 für Einnahmen mit 7/19 % (analog VSt)
- UstvaCalculator: Kz 83/84 kontobasiert via 1771/1776, KZ_ACCOUNT_MAP aktualisiert
- Invoice::cancel(): nur Hauptbuchungen direkt stornieren (parent_booking_id IS NULL)
- Tests 10, 27 angepasst; Test 29 neu
2026-05-10 15:11:00 +02:00

54 lines
2 KiB
SQL

-- Migration 046: USt-Buchungszeilen für Ausgangsrechnungen einführen
--
-- Hintergrund: Bisher wurde Umsatzsteuer für Einnahmen implizit über betrag_ust
-- der Hauptbuchung und ustva_kz des Kategorie-Kontos (81/86) ermittelt.
-- Ab jetzt erhält jede Einnahme-Buchung mit 7 % oder 19 % USt eine explizite
-- USt-Buchungszeile auf Konto 1771 (7 %) bzw. 1776 (19 %).
-- Kz 83/84 werden danach kontobasiert via 1771/1776 (betrag_netto) befüllt.
-- ── 1. ustva_kz für 1771 und 1776 setzen ─────────────────────────────────────
UPDATE accounts SET ustva_kz = '84' WHERE kontonummer = '1771';
UPDATE accounts SET ustva_kz = '83' WHERE kontonummer = '1776';
-- ── 2. USt-Buchungszeilen für Bestandsbuchungen ───────────────────────────────
-- Kriterien: buchungstyp=Einnahme, ust_satz IN (7,19), steuerart=normal, betrag_ust!=0
-- Idempotenz: WHERE NOT EXISTS verhindert Doppel-Einfügung
INSERT INTO bookings (
buchungs_nr, beleg_id, parent_booking_id, buchungs_datum, buchungstyp,
kategorie_konto_id, zahlungskonto_id,
betrag_netto, ust_satz, steuerart, betrag_ust, betrag_brutto,
buchungstext, is_reversal, fiscal_year_id
)
SELECT
CONCAT('UST-M-', LPAD(b.id, 8, '0')),
b.beleg_id,
b.id,
b.buchungs_datum,
'Einnahme',
a_ust.id,
b.zahlungskonto_id,
b.betrag_ust,
0.00,
'normal',
0.00,
b.betrag_ust,
CONCAT('USt zu ', b.buchungs_nr),
b.is_reversal,
b.fiscal_year_id
FROM bookings b
JOIN accounts a_ust ON (
(ROUND(b.ust_satz) = 19 AND a_ust.kontonummer = '1776')
OR
(ROUND(b.ust_satz) = 7 AND a_ust.kontonummer = '1771')
)
WHERE b.buchungstyp = 'Einnahme'
AND b.betrag_ust != 0
AND b.steuerart = 'normal'
AND ROUND(b.ust_satz) IN (7, 19)
AND b.parent_booking_id IS NULL
AND NOT EXISTS (
SELECT 1 FROM bookings ust
WHERE ust.parent_booking_id = b.id
);