Steuerkram/migrations/045_vorsteuerkonten_buchungszeilen.sql
fds2610-bot d3a6c379c9 Feature: Vorsteuerkonten 1571/1576 aktivieren, VSt-Buchungszeilen einführen
- Migration 044: Konten 1574 (VSt i.g.E. 19%) und 1774 (USt i.g.E. 19%) anlegen
- Migration 045: Konten 1571/1576 anlegen, ustva_kz='61'/'62' setzen,
  altes DATEV-Routing (ustva_kz '61'/'62' auf Betriebsausgabe-Konten) entfernen,
  parent_booking_id-Spalte, VSt-Buchungszeilen für Bestandsbuchungen migrieren
- Booking::create(): automatisch VSt-Zeile auf 1576/1571 für Ausgaben mit 7/19 %
- Booking::reverse(): VSt-Zeilen beim Storno mitaufheben (reversed_by setzen)
- BookingController::destroy(): VSt-Kindzeilen beim Löschen (Testmodus) mit löschen
- UstvaCalculator: Kz 61/62 jetzt kontobasiert via 1576/1571 (betrag_netto),
  Step 2 (buchungsbasiert via ust_satz) entfernt
- Beleg::all/find: betrag_brutto-Aggregation und Suche schließen VSt-Zeilen aus
- Tests 12, 18 angepasst; Test 28 neu
2026-05-10 14:45:16 +02:00

78 lines
3.5 KiB
SQL

-- Migration 045: Vorsteuerkonten aktivieren und VSt-Buchungszeilen einführen
--
-- Hintergrund: Bisher wurden Vorsteuerbeträge direkt in betrag_ust der Ausgabe-Buchung
-- geführt. Ab jetzt erhält jede Ausgabe-Buchung mit ust_satz 7/19 (steuerart=normal)
-- eine eigene VSt-Buchungszeile auf Konto 1571 (7%) bzw. 1576 (19%).
--
-- Änderungen:
-- 1. Konten 1571 und 1576 anlegen (nach Reset in Migration 013 nicht mehr vorhanden)
-- 2. ustva_kz: 1576→'61', 1571→'62' (bisher '66' Sammelkennzahl)
-- 3. ustva_kz von Betriebsausgabe-Konten mit '61'/'62' leeren (DATEV-Altmapping)
-- 4. Neue Spalte parent_booking_id in bookings (VSt-Zeile → Hauptbuchung)
-- 5. VSt-Buchungszeilen für alle bestehenden qualifizierten Ausgabe-Buchungen
-- ── 1. Konten anlegen ────────────────────────────────────────────────────────
INSERT INTO accounts (kontonummer, bezeichnung, kontenart, steuercode, ustva_kz, euer_zeile, is_system, aktiv) VALUES
('1571', 'Abziehbare Vorsteuer 7 %', 'Zahlungskonto', 'VSt7', '62', NULL, 1, 1),
('1576', 'Abziehbare Vorsteuer 19 % (Eingangsrechnungen)', 'Zahlungskonto', 'VSt19', '61', NULL, 1, 1)
ON DUPLICATE KEY UPDATE ustva_kz = VALUES(ustva_kz), aktiv = 1;
-- ── 3. Altes DATEV-Routing von Betriebsausgabe-Konten entfernen ─────────────────
-- Diese Konten hatten historisch ustva_kz='61'/'62' für direkte Kz-Zuordnung.
-- Kz 61/62 werden ab jetzt ausschließlich über VSt-Buchungszeilen auf 1571/1576 befüllt.
UPDATE accounts
SET ustva_kz = NULL
WHERE kontenart = 'Betriebsausgabe' AND ustva_kz IN ('61', '62');
-- ── 2. ustva_kz für 1574 auf '67' setzen (Vorsteuer ig. Erwerb, für späteres RC) ─
UPDATE accounts SET ustva_kz = '67' WHERE kontonummer = '1574' AND (ustva_kz IS NULL OR ustva_kz = '');
-- ── 3. Spalte parent_booking_id ──────────────────────────────────────────────
ALTER TABLE bookings
ADD COLUMN IF NOT EXISTS parent_booking_id INT UNSIGNED NULL COMMENT 'ID der Hauptbuchung (für VSt-Buchungszeilen)' AFTER beleg_id;
-- ── 4. VSt-Buchungszeilen für Bestandsbuchungen ──────────────────────────────
-- Kriterien: buchungstyp=Ausgabe, 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('VST-M-', LPAD(b.id, 8, '0')),
b.beleg_id,
b.id,
b.buchungs_datum,
'Ausgabe',
a_vst.id,
b.zahlungskonto_id,
b.betrag_ust,
0.00,
'normal',
0.00,
b.betrag_ust,
CONCAT('Vorsteuer zu ', b.buchungs_nr),
b.is_reversal,
b.fiscal_year_id
FROM bookings b
JOIN accounts a_vst ON (
(ROUND(b.ust_satz) = 19 AND a_vst.kontonummer = '1576')
OR
(ROUND(b.ust_satz) = 7 AND a_vst.kontonummer = '1571')
)
WHERE b.buchungstyp = 'Ausgabe'
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 vst
WHERE vst.parent_booking_id = b.id
);