diff --git a/Changes.md b/Changes.md index c42af07..5ef0494 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,14 @@ --- +## 2026-04-12 – Anlagevermögen: Anzeige-Fix und Daten-Backfill + +### Fix +- Buchungstabellen (Beleg-Detail, Journal, UStVA-Drill-down, EÜR-Drill-down): Anlage-Spalte zeigt jetzt auch die Bezeichnung als Fallback, wenn `anlage_nr` leer ist +- `migrations/032_anlage_nr_backfill.sql`: Anlage-Nummern für bestehende Anlagegüter ohne `anlage_nr` werden nachgeneriert + +--- + ## 2026-04-12 – Anlagevermögen (Wirtschaftsgüter) ### Neu diff --git a/README.md b/README.md index 63cbf1f..e4eb7d1 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Self-hosted Buchhaltungs- und Steueranwendung für deutsche Freiberufler und Kle - **Ausgangsrechnungen** – DIN 5008 Layout, PDF-Export via mPDF - **UStVA** – Kennzahlen-Berechnung aus Buchungen, ELSTER XML-Export - **EÜR** – Jahresauswertung mit PDF-Export -- **Einstellungen** – Firmendaten, Logo, ELSTER-Steuernummer +- **Anlagevermögen** – Anlagenspiegel für Wirtschaftsgüter: automatische Anlagen-Nummerierung (konfiguriertes Präfix + Jahrgang + laufende Nummer), Verknüpfung mit Anlagevermögenskonten des SKR03; beim Buchen auf ein Anlagevermögenskonto öffnet sich automatisch ein Dialog zur Auswahl (neues Wirtschaftsgut anlegen oder bestehendes verknüpfen); Anlagennummer wird in allen Buchungsübersichten (Beleg-Detail, Journal, UStVA-Drill-down, EÜR-Drill-down) als direkter Link zur Bearbeitungsmaske des Anlageguts angezeigt +- **Einstellungen** – Firmendaten, Logo, ELSTER-Steuernummer, Nummernkreis-Präfixe (Belege, Rechnungen, Anlagen) - **Benutzerverwaltung** – Benutzer anlegen, bearbeiten, deaktivieren und löschen; session-basierte Authentifizierung mit 24 h Timeout ## Tech Stack @@ -178,11 +179,37 @@ docker compose exec web php scripts/nextcloud-import.php ### Automatisch per Cron (auf dem Host) +Für den automatischen Abruf muss ein Cron-Eintrag auf dem Host angelegt werden. Dabei gibt es zwei Varianten: + +**Option 1: Root-Crontab** (`sudo crontab -e`) + ```cron */15 * * * * docker compose -f /opt/steuerkram/docker-compose.yml exec -T web \ php scripts/nextcloud-import.php >> /var/log/steuerkram-import.log 2>&1 ``` +Kein `sudo` im Befehl nötig. Nachteil: Root-Crons sind schwerer zu überblicken. + +**Option 2: User-Crontab** (`crontab -e`) – empfohlen + +Damit `docker compose exec` ohne `sudo` funktioniert, muss der User in der Docker-Gruppe sein: + +```bash +sudo usermod -aG docker $USER +# Danach neu einloggen +``` + +Anschließend in der User-Crontab (ohne `sudo`): + +```cron +*/15 * * * * docker compose -f /home/fds/projects/Steuerkram/docker-compose.yml exec -T web \ + php scripts/nextcloud-import.php >> /var/log/steuerkram-import.log 2>&1 +``` + +> **Hinweis:** Das `-T`-Flag ist bei Cron zwingend erforderlich – ohne TTY schlägt `docker compose exec` sonst still fehl. +> +> **Empfehlung:** User-Crontab + Docker-Gruppe. Das ist konsistent mit dem bestehenden Setup (alle anderen Jobs laufen ebenfalls in der User-Crontab). + Das Skript gibt beim Start eine Zusammenfassung aus (importiert / übersprungen / Fehler) und beendet sich mit Exit-Code 1 bei Fehlern. ## Datenpersistenz diff --git a/migrations/032_anlage_nr_backfill.sql b/migrations/032_anlage_nr_backfill.sql new file mode 100644 index 0000000..4a6d555 --- /dev/null +++ b/migrations/032_anlage_nr_backfill.sql @@ -0,0 +1,23 @@ +-- Migration 032: Anlage-Nummern für bestehende Anlagegüter ohne Nummer nachgenerieren +-- Weist assets mit leerem anlage_nr Nummern im konfigurierten Format zu. + +CREATE TEMPORARY TABLE IF NOT EXISTS _anlage_backfill_tmp AS +SELECT + a.id, + YEAR(COALESCE(a.anschaffungsdatum, NOW())) AS asset_year, + cs.anlage_nr_prefix AS prefix, + cs.anlage_nr_next + (ROW_NUMBER() OVER (ORDER BY a.id) - 1) AS seq_nr +FROM assets a +CROSS JOIN company_settings cs +WHERE a.anlage_nr = '' AND cs.id = 1; + +UPDATE assets a +JOIN _anlage_backfill_tmp t ON a.id = t.id +SET a.anlage_nr = CONCAT(t.prefix, '-', t.asset_year, '-', LPAD(t.seq_nr, 4, '0')) +WHERE a.anlage_nr = ''; + +UPDATE company_settings +SET anlage_nr_next = anlage_nr_next + (SELECT COUNT(*) FROM _anlage_backfill_tmp) +WHERE id = 1 AND (SELECT COUNT(*) FROM _anlage_backfill_tmp) > 0; + +DROP TEMPORARY TABLE IF EXISTS _anlage_backfill_tmp; diff --git a/src/Services/EuerCalculator.php b/src/Services/EuerCalculator.php index 2afee89..7dbf1af 100644 --- a/src/Services/EuerCalculator.php +++ b/src/Services/EuerCalculator.php @@ -80,7 +80,7 @@ class EuerCalculator return Database::fetchAll( 'SELECT bk.id, bk.buchungs_datum, bk.buchungstyp, bk.ust_satz, bk.betrag_netto, bk.betrag_ust, bk.betrag_brutto, bk.buchungstext, - bk.is_reversal, bk.beleg_id, bl.beleg_nr, + bk.is_reversal, bk.beleg_id, bk.asset_id, bl.beleg_nr, k.kontonummer AS kategorie_nr, k.bezeichnung AS kategorie_name, z.kontonummer AS zahlungs_nr, z.bezeichnung AS zahlungs_name, a.anlage_nr, a.bezeichnung AS anlage_bezeichnung diff --git a/src/Services/UstvaCalculator.php b/src/Services/UstvaCalculator.php index 9d7b919..6349af8 100644 --- a/src/Services/UstvaCalculator.php +++ b/src/Services/UstvaCalculator.php @@ -198,7 +198,7 @@ class UstvaCalculator $select = 'SELECT bk.id, bk.buchungs_datum, bk.buchungstyp, bk.steuerart, bk.ust_satz, bk.betrag_netto, bk.betrag_ust, bk.betrag_brutto, bk.buchungstext, - bk.is_reversal, bk.beleg_id, bl.beleg_nr, + bk.is_reversal, bk.beleg_id, bk.asset_id, bl.beleg_nr, k.kontonummer AS kategorie_nr, k.bezeichnung AS kategorie_name, z.kontonummer AS zahlungs_nr, z.bezeichnung AS zahlungs_name, a.anlage_nr, a.bezeichnung AS anlage_bezeichnung diff --git a/src/Views/belege/detail.php b/src/Views/belege/detail.php index 1603b87..11dd39c 100644 --- a/src/Views/belege/detail.php +++ b/src/Views/belege/detail.php @@ -225,7 +225,9 @@ $suppliers = $suppliers ?? []; - + + + – diff --git a/src/Views/bookings/journal.php b/src/Views/bookings/journal.php index 3723e88..47673f5 100644 --- a/src/Views/bookings/journal.php +++ b/src/Views/bookings/journal.php @@ -87,7 +87,9 @@ - + + + – diff --git a/src/Views/tax/euer_konto_bookings.php b/src/Views/tax/euer_konto_bookings.php index 7950497..3c6e296 100644 --- a/src/Views/tax/euer_konto_bookings.php +++ b/src/Views/tax/euer_konto_bookings.php @@ -65,7 +65,9 @@ $fmt = fn($v) => number_format((float)$v, 2, ',', '.') . ' €'; - + + + – diff --git a/src/Views/tax/ustva_kz_bookings.php b/src/Views/tax/ustva_kz_bookings.php index 9a5f485..fa386d5 100644 --- a/src/Views/tax/ustva_kz_bookings.php +++ b/src/Views/tax/ustva_kz_bookings.php @@ -84,7 +84,9 @@ $signedBetrag = fn(array $b, string $field): float => - + + + –