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