commit 37f22574cd32a15e1d3d1403085badaccbbfad42 Author: Dominik Höfling Date: Sat Jan 31 08:59:11 2026 +0100 Kivitendo Einheiten-Migration für ZUGFeRD (m² und m³) diff --git a/README.md b/README.md new file mode 100644 index 0000000..f2aea92 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# Kivitendo Einheiten-Migration für ZUGFeRD + +## Zweck +Diese Skripte ändern Einheiten in Kivitendo von Text-Format zu Unicode-Hochzahlen für ZUGFeRD-Kompatibilität. + +## Hintergrund +Kivitendo erkennt beim ZUGFeRD-Export nur bestimmte Einheiten als valide. +Die korrekten Formate sind: +- `m²` (mit hochgestellter 2) statt `m2` oder `MTK` +- `m³` (mit hochgestellter 3) statt `m3` oder `MTQ` + +## Dateien +- `change_m3_to_m_hoch_3.sql` - Ändert m3 → m³ + +## Anwendung + +### Voraussetzungen +- PostgreSQL Zugriff +- Backup der Datenbank (empfohlen!) + +### Backup erstellen +```bash +sudo -u postgres pg_dumpall > /root/postgres_backup_$(date +%Y%m%d_%H%M%S).sql +``` + +### Skript ausführen +```bash +sudo -u postgres psql -d -f change_m3_to_m_hoch_3.sql +``` + +**Beispiel für Datenbank "hemi":** +```bash +cp change_m3_to_m_hoch_3.sql /tmp/ +chmod 644 /tmp/change_m3_to_m_hoch_3.sql +sudo -u postgres psql -d hemi -f /tmp/change_m3_to_m_hoch_3.sql +``` + +## Was wird geändert? + +Das Skript führt folgende Schritte aus: +1. Entfernt temporär Foreign Key Constraints +2. Aktualisiert Einheit in folgenden Tabellen: + - `units` (Einheiten-Stammdaten) + - `parts` (Artikel) + - `invoice` (Rechnungspositionen) + - `orderitems` (Auftragspositionen) + - `delivery_order_items` (Lieferscheinpositionen) + - `units_language` (Einheiten-Übersetzungen) +3. Stellt Foreign Key Constraints wieder her +4. Zeigt Statistik der geänderten Datensätze + +## Sicherheit + +✅ **Transaction-basiert:** Bei Fehler wird automatisch zurückgerollt (ROLLBACK) +✅ **Alle referenzierten Tabellen werden aktualisiert** +⚠️ **Historische Daten werden ebenfalls geändert** (Foreign Keys erzwingen das) + +## Beispiel-Ausgabe +``` +Fertig! m3 -> m³ geändert + tabelle | anzahl +-------------+-------- + Artikel: | 31 + Rechnungen: | 194 + Aufträge: | 162 +``` + +## Erstellt am +2026-01-31 + +## Version +1.0 diff --git a/change_m3_to_m_hoch_3.sql b/change_m3_to_m_hoch_3.sql new file mode 100644 index 0000000..6bdfa73 --- /dev/null +++ b/change_m3_to_m_hoch_3.sql @@ -0,0 +1,48 @@ +-- ============================================================================ +-- Kivitendo: m3 -> m³ ändern (für ZUGFeRD-Kompatibilität) +-- ============================================================================ + +BEGIN; + +-- Constraints temporär entfernen +ALTER TABLE assortment_items DROP CONSTRAINT IF EXISTS assortment_items_unit_fkey; +ALTER TABLE delivery_order_items DROP CONSTRAINT IF EXISTS delivery_order_items_unit_fkey; +ALTER TABLE invoice DROP CONSTRAINT IF EXISTS invoice_unit_fkey; +ALTER TABLE orderitems DROP CONSTRAINT IF EXISTS orderitems_unit_fkey; +ALTER TABLE parts DROP CONSTRAINT IF EXISTS parts_unit_fkey; +ALTER TABLE units_language DROP CONSTRAINT IF EXISTS units_language_unit_fkey; + +-- ALLE Tabellen updaten: m3 -> m³ +UPDATE units SET name = 'm³' WHERE name = 'm3'; +UPDATE parts SET unit = 'm³' WHERE unit = 'm3'; +UPDATE invoice SET unit = 'm³' WHERE unit = 'm3'; +UPDATE orderitems SET unit = 'm³' WHERE unit = 'm3'; +UPDATE delivery_order_items SET unit = 'm³' WHERE unit = 'm3'; +UPDATE units_language SET unit = 'm³' WHERE unit = 'm3'; + +-- Constraints wieder hinzufügen +ALTER TABLE assortment_items ADD CONSTRAINT assortment_items_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); +ALTER TABLE delivery_order_items ADD CONSTRAINT delivery_order_items_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); +ALTER TABLE invoice ADD CONSTRAINT invoice_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); +ALTER TABLE orderitems ADD CONSTRAINT orderitems_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); +ALTER TABLE parts ADD CONSTRAINT parts_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); +ALTER TABLE units_language ADD CONSTRAINT units_language_unit_fkey + FOREIGN KEY (unit) REFERENCES units(name); + +-- Ergebnis anzeigen +SELECT 'Fertig! m3 -> m³ geändert' as status; +SELECT 'Artikel:' as tabelle, COUNT(*) as anzahl FROM parts WHERE unit = 'm³' +UNION ALL +SELECT 'Rechnungen:', COUNT(*) FROM invoice WHERE unit = 'm³' +UNION ALL +SELECT 'Aufträge:', COUNT(*) FROM orderitems WHERE unit = 'm³'; + +SELECT 'Alle Einheiten:' as info; +SELECT name FROM units ORDER BY sortkey; + +COMMIT;