Repository navigation
Releases
Releases · Elocaro/elocaro
Elocaro 0.7.0
- Release-Notes aus den Commits erzeugen statt CHANGELOG.md zu pflegen
- Architektur: Obergrenze für @code-Blöcke, Doku nach den aufgelösten Zyklen und neuen Regeln (#184)
- Architekturtests für interaktive Seiten (InteractiveUiRulesTests), Doku in ui.md (#184)
- Blazor-Analyzer BL0016 wieder aktiv: JS-Interop über Hilfsklasse JsInterop gegen getrennte Circuits abgesichert (#184)
- Blazor-Analyzer BL0013 wieder aktiv: Authentifizierungszustand über CascadingParameter statt AuthenticationStateProvider (#184)
- Blazor-Analyzer BL0012 wieder aktiv: überflüssige StateHasChanged-Aufrufe entfernt (#184)
- Heizkosten: Zyklen Heating ↔ OperatingCosts und Heating ↔ Receipts aufgelöst (#184)
- Zähler: Zyklus Metering ↔ OperatingCosts aufgelöst (#184)
- Wiederherstellung bei der Ersteinrichtung: kein Fehler mehr bei langsamer Datenbank (#184)
- Rücksicherung: Pfade im Restic-Ziel auch unter Windows richtig bilden (#184)
- ADR 0008: Anwendungsdienste in der Infrastructure, Application als Vertragsschicht (#184)
- Zeilenenden: alle Textdateien mit LF auschecken (#184)
- Doku: Architektur auf den tatsächlichen Stand gebracht (#184)
- Architekturtests: Modulregeln je Schicht, Zugriff auf Endpunkte, Erweiterungspunkte (#184)
- Zähler: Änderungshistorie zeigt wieder Einträge, deutsche Typ-Aliase entfernt (#184)
- E-Rechnung: ungenutzte Hilfsklasse EInvoiceProbe entfernt (#172)
- E-Rechnung: ZUGFeRD-/Factur-X-PDFs ohne KI auslesen, auch im Posteingang (#172)
- Girocode (EPC-QR) auf Mahnschreiben und Abrechnungen mit Nachzahlung (#175)
- Vorlagen für Konfliktfälle: Abmahnung, Kündigung (Zahlungsverzug, Eigenbedarf), Erinnerung Nachzahlung (#176)
- Datenimport: Spalten selbst zuordnen, wenn die Überschriften nicht erkannt werden (#180)
- Aktivität: Lesezugriffe sind keine Aktionen und blockieren Rückgängig nicht (#183)
- MCP: schreibende Werkzeuge für Stammdaten mit Schreib-Bereich und Rückgängig (#183)
- Rückgängig für Stammdaten über die Aktivität (#183)
- Aktivität: Operationen mit Weg und Konto im Audit-Protokoll (#183)
- ADR 0007: MCP mit Schreibzugriff, Aktivitätsprotokoll und Rückgängig (#180)
- Datenimport: Excel-Dateien (.xlsx) direkt einlesen
- Fernablese-Check: Zähler nach HeizkostenV mit Aufgabe, Frist und Abrechnungshinweis
- Neuigkeiten: Button „Jetzt prüfen“ für die Versionsprüfung
Elocaro 0.6.0
Geändert
- Neuigkeiten besser zu finden und übersichtlicher: Das Benutzermenü hat den Eintrag Neuigkeiten (mit Punkt, wenn eine neue Version da ist). Die Seite zeigt Version und Status als Karte, den Update-Befehl zum Kopieren und alle veröffentlichten Versionen.
- Neuigkeiten und Updates zeigt die Änderungen als gegliederten Text: Markdown (Fett, Kursiv, Code, verschachtelte Listen) wird dargestellt, Aufzählungen und Abschnitte sind abgesetzt und der Text hat eine lesbare Zeilenbreite.
Behoben
- Betriebskosten: Ein Vorwegabzug als Jahresbetrag wird bei einem Abrechnungszeitraum unter einem Jahr tagesanteilig gekürzt (bisher voll abgezogen) und bei direkt zugeordneten Kosten mehrerer Einheiten nur einmal abgezogen (bisher je Einheit).
- Betriebskosten: Ein Abrechnungszeitraum vom 29.2. bis zum 28.2. des Folgejahres wird als 12 Monate angenommen.
- Vorschlag für die neue Vorauszahlung: Bei einem Abrechnungszeitraum unter 12 Monaten werden die Kosten auf ein Jahr hochgerechnet (bisher fiel der Vorschlag entsprechend zu niedrig aus).
- CO₂-Kostenaufteilung: Der Ausstoß je m² wird vor der Einstufung auf eine Nachkommastelle gerundet (§ 5 Abs. 1 Satz 3 CO2KostAufG); bei Zeiträumen unter einem Jahr werden die Stufengrenzen anteilig gekürzt. Zeiträume, die vor dem 1.1.2023 begonnen haben, erhalten keine Aufteilung mehr, auch wenn sie 2023 enden (§ 11 Abs. 2).
- Mieterhöhung: Erhöhungen nach Modernisierung (§ 559 BGB) setzen Wartefrist und Sperrjahr (§ 558, § 557b BGB) nicht mehr zurück. Das gilt im Assistenten, bei den Vertragsdetails, bei der Indexanpassung, in der Aufgabenliste und im Fristenkalender.
- Verzugszinsen: Bei teilweise bezahlten Posten läuft der Zins auf den bezahlten Teil bis zum Zahlungstag, danach nur auf den Rest.
Elocaro 0.5.0
Hinzugefügt
- Sicherungen als Datei: In Vorhandene Sicherungen lässt sich jeder Stand mit Herunterladen als
.tarspeichern.- Die Datei ist ein eigenständiges restic-Repository mit diesem einen Stand, verschlüsselt mit dem Passwort der Sicherung; der Download steht im Audit-Log. Er startet nach dem Packen von selbst, die Datei wird nach dem Senden gelöscht.
- Aus Datei wiederherstellen öffnet so eine Datei mit dem Passwort, zeigt Datum und Größe und spielt sie nach Bestätigung ein, auch auf einem anderen Server. Die Ersteinrichtung bietet auf einem neuen Server neben „Aus einem Ziel“ auch „Aus einer Datei“.
- Der Vollexport steht jetzt eingeklappt unter „Weitere Optionen“.
- Die Seite Datensicherung erscheint sofort; die Liste der Sicherungen wird danach Ziel für Ziel geladen („Sicherungen werden geladen …“). Das Lesen der Liste braucht nur noch einen restic-Aufruf je Ziel. Verweise auf die Dokumentation sind echte Links.
- Vorhandene Sicherungen zeigen die Größe der gesicherten Daten und lassen sich löschen.
- Die Größe gibt es für Sicherungen, die restic 0.17 oder neuer angelegt hat; ältere zeigen einen Strich.
- Das Löschen verlangt eine Bestätigung und gibt den Speicherplatz frei, den nur diese Sicherung belegte.
- Zeilen in den Tabellen sind vertikal zentriert, die Knöpfe brechen nicht mehr um.
- Fortschritt bei laufender Sicherung und Wiederherstellung: ein Balken mit „Schritt 3 von 5: Dateien übertragen (2,1 GB von 3,6 GB), insgesamt 55 %“.
- Sicherung: Repository prüfen, Datenbank sichern, Dateien übertragen, Alte Sicherungen aufräumen, Sicherung prüfen.
- Wiederherstellung: Repository prüfen, Stand herunterladen, Datenbank ersetzen, Dateien ersetzen.
- Die Seite erkennt auch Sicherungen, die von selbst oder von jemand anderem gestartet wurden (Abfrage alle 10 Sekunden, während des Laufs alle 2).
Geändert
- Die Seite „Keine Verbindung“ der installierten Web-App (offline) ist im Design der App: Logo, Karte, Symbol, Hell und Dunkel, mit Hinweis „Nächster Versuch in n s“ und dem Knopf „Jetzt erneut versuchen“. Sie ist in sich geschlossen (Farben, Logo und Schrift kommen aus dem Zwischenspeicher des Service Workers,
elocaro-offline-v3). - Dialog für Sicherungsziele neu gestaltet.
- Der Speicherort wird über Karten gewählt (Google Drive, S3, Azure, SFTP/NAS, dieser Server); darunter stehen nur die Angaben, die der gewählte Ort braucht, getrennt nach Zugang, Verschlüsselung und Name. Neue Ziele starten bei Google Drive, der Name folgt der Auswahl.
- „Automatisch sichern“ ist ein Schalter; erst wenn er an ist, erscheinen Wie oft, Uhrzeit und Aufbewahrung. Die Uhrzeit hat die Uhr-Auswahl (neues Eingabefeld
AppTimeField). - „Speichern“ und „Verbindung testen“ bleiben ausgegraut, bis alles Nötige eingetragen ist; der Dialog nennt, was noch fehlt. „Mit Google anmelden“ ist ausgegraut, wenn Google Drive auf dem Server nicht eingerichtet ist.
- Wöchentliche Sicherungen haben einen Wochentag (Migration
BackupWeekday); bestehende wöchentliche Ziele zählen weiter sieben Tage ab der letzten Sicherung, bis man einen Wochentag wählt.
- Eingabefelder (Text, Auswahl, Zahl, Uhrzeit, Datei) haben 12 px statt 4 px Rundung (
--shape-field), passend zu Karten und Dialogen. - Die Seite Datensicherung ohne Ziel zeigt „Noch keine Sicherung eingerichtet“ mit dem Knopf Ziel hinzufügen, statt der Meldung zur Überwachung oder dem Hinweis auf die Server-Konfiguration. Nach einer Wiederherstellung bleibt die Seite nicht mehr stehen, wenn die Datenbank gerade ersetzt wird.
Elocaro 0.4.0
Geändert
- Datensicherung deutlich einfacher:
- Vorhandene Sicherungen listet alle Stände aller Ziele ohne Klick; jeder Eintrag hat Wiederherstellen … (mit Bestätigung, die App startet danach neu).
- Die Zielliste zeigt je Ziel Ort, Zeitplan, Aufbewahrung und Stand.
- Ziele werden in einem Dialog angelegt, geändert und entfernt, nicht mehr inline auf der Seite.
- Läuft die Sicherung noch nach der
.env, erscheint das Ziel als Zeile Server-Konfiguration (Ort ohne Passwort, Uhrzeit, Aufbewahrung, Stand) mit Jetzt sichern, der Liste und Wiederherstellen …; Bearbeiten übernimmt es in die App. - Die Anmeldung bei Google ist ein einziger Schritt („Mit Google anmelden“, Code bestätigen). Der Abschnitt mit Client-ID und „Eigenen Client verwenden“ ist aus der Oberfläche entfernt; ein eigener Client wird nur noch in der
.enveingetragen (docs/betrieb.md). - Die Liste liest das Repository nicht, solange eine Sicherung oder Wiederherstellung läuft.
Elocaro 0.3.0
Hinzugefügt
- Hinweis auf neue Versionen: Einstellungen → System → Neuigkeiten zeigt die laufende Version, ob eine neuere veröffentlicht wurde, was sich geändert hat und den Befehl
deploy/update.sh <Version>; auf der Übersicht erscheint für Administratoren eine Aufgabe. Zweimal täglich fragt die App bei GitHub nach den Releases (UpdateCheck__Enabled=falseschaltet das ab); sie installiert nie selbst etwas. Der Release-Workflow legt dafür zu jedem Tag ein GitHub-Release mit dem Abschnitt aus dem Changelog an.
Geändert
- Neues Logo (Haus mit E) und neue App-Symbole (PWA, Apple-Touch, maskierbar, einfarbig für Android); das Zeichen im Kopf der Anwendung ist jetzt eine abgerundete Kachel statt eines Kreises.
Elocaro 0.2.0
Hinzugefügt
Hinzugefügt
- Datensicherung in der App (Verwaltung → System → Datensicherung): mehrere Ziele (S3, Azure Blob, SFTP, Google Drive, lokal), je Ziel eigener Zeitplan (täglich oder wöchentlich), Aufbewahrung und Status; Zugangsdaten und Passwort verschlüsselt in der Datenbank, Verbindungstest, „Jetzt sichern“, Liste der Sicherungen und Wiederherstellung per Klick (mit Bestätigung, die App startet danach neu). Google Drive wird über „Mit Google verbinden“ (Geräte-Code, nur Zugriff auf selbst angelegte Dateien) eingerichtet; den dafür nötigen OAuth-Client bringen die veröffentlichten Images mit (Release-Secrets, als BuildKit-Secret eingebaut, nicht im Quelltext); beim selbst gebauten Image trägt man ihn in der App oder der
.envein (Anleitung indocs/betrieb.md). Die Ersteinrichtung bietet „Aus einer Datensicherung wiederherstellen“ für einen neuen Server. Die Sicherung nachdeploy/.envläuft ohne gespeicherte Einstellungen unverändert weiter (Refs #162). - MCP-Schnittstelle (
/mcp, nur lesend, standardmäßig aus mitMcp__Enabled=true): KI-Assistenten wie Claude, GitHub Copilot und Cursor können Objekte, Verträge, Mieterkonten, offene Posten, Belege, Umsätze, Zähler, Dokumente, Aufgaben und Fristen abfragen. Anmeldung über neue persönliche Zugriffstoken (Konto & Sicherheit → Zugriffstoken): nur der Hash wird gespeichert, mit Ablauf, widerrufbar, auf die Bereiche Stammdaten und Finanzen beschränkbar. Ein Token gibt nie mehr her als das Konto selbst: die Rechte werden bei jeder Anfrage neu bestimmt, Sperren, Rollenwechsel und entzogene Rechte gelten sofort; nur Administrator und Verwalter mit eingerichteter Zwei-Faktor-Anmeldung. Jeder Aufruf steht im Audit-Protokoll. Anleitungen für Claude, VS Code/Copilot, Cursor und ChatGPT indocs/mcp.md. - Verbrauchsinformation (Mieterportal und Mail): Der Heizverbrauch wird zusätzlich witterungsbereinigt mit dem Vorjahresmonat verglichen (Verbrauch je Gradtag der gewählten Wetterstation). So lässt sich prüfen, ob der Verbrauch unabhängig vom Wetter gestiegen ist. Nur zur Anzeige. Im Mieterportal zeigt ein Säulendiagramm je Zählerart den Verbrauch der letzten Monate gegen den Vorjahresmonat, bei der Heizung mit der witterungsbereinigten Änderung als Pfeil.
- Heizkosten beim Mieterwechsel ohne Zwischenablesung: Statt der Platzhaltertabelle verteilt Elocaro den Heizverbrauch nach den Monatsgradtagen (VDI 3807) einer Wetterstation des Deutschen Wetterdienstes. Die Werte werden automatisch abgerufen (
DegreeDays__Enabled), die Station wählt man je Objekt in den Heizungseinstellungen. Ohne Station gilt weiter der Platzhalter.
Geändert
- Umgestellt auf .NET 11 (EF Core und Npgsql auf RC.3, die Laufzeit kommt aus dem
aspnet:11.0-Image). - Updates laufen über die veröffentlichten Images:
deploy/update.sh <Version>sichert, lädt die Images aus GHCR und startet neu, ohne Bau auf dem Server (docs/betrieb.md, Abschnitt Update). - Der Backup-Container ist jetzt eine kleine ASP.NET-Core-API (
src/Elocaro.Backup) statt eines Shell-Skripts: gleiche Befehle auf der Konsole (run --rm backup backup|snapshots|restore|verify), gleiche Statusdatei, zusätzlich eine interne API mit Token für die App. Bestehende Installationen:BACKUP_API_TOKENindeploy/.enveintragen; Image und Build-Kontext haben sich geändert (docker compose … up -d --build backup). - Konto-Seiten überarbeitet: Übersicht mit Profil und Navigationszeilen, Zurück-Link oben, Logo führt zur App. Zugriffstoken werden in einem Dialog erstellt; das neue Token lässt sich mit einer Schaltfläche kopieren, die Liste zeigt Karten statt einer Tabelle.
Sicherheit
- Die Zwei-Faktor-Pflicht galt nicht für Adressen mit Dateiendung: Ein Konto ohne eingerichtete Zwei-Faktor-Anmeldung konnte CSV-, DATEV-, Anlage-V- und PDF-Exporte abrufen. Ausgenommen sind jetzt nur noch echte statische Dateien.
- Benutzerverwaltung: Wer kein Administrator ist, kann sich und anderen nicht mehr die Rolle Administrator geben, niemanden als Administrator einladen, Administratorkonten weder ändern noch sperren oder entsperren, die eigene Rolle und die eigenen Rechte nicht ändern und keine Rechte vergeben, die er selbst nicht hat. Das prüft der Server, die Oberfläche bietet es nicht mehr an.
- Änderungen an Rolle oder Rechten melden das betroffene Konto ab, auch in offenen Seiten. Die neuen Rechte gelten ab der nächsten Anmeldung. Bisher galten entzogene Rollen in offenen Seiten weiter.
- Bilder über 50 Megapixel (
FileStore__MaxImageMegapixels) werden beim Hochladen abgelehnt. Eine kleine Datei mit riesigen Bildmaßen konnte sonst den Speicher des Servers füllen. Dazu Speicherlimits fürappundgotenbergindeploy/docker-compose.yml(APP_MEM_LIMIT,GOTENBERG_MEM_LIMIT). - Ersteinrichtung nur noch mit Einrichtungscode: Bisher wurde Administrator, wer eine neue Installation zuerst aufrief.
deploy/install.sherzeugt den Code (ELOCARO_SETUP_CODEindeploy/.env) und zeigt ihn an; ist keiner eingetragen, schreibt die App beim Start einen ins Protokoll, solange es kein Konto gibt. Bestehende Installationen mit Konten sind nicht betroffen. Gleichzeitige Anfragen legen nicht mehr mehrere Administratoren an. - Ausgehende Mails: Der Text von Einladungen, Anmelde-, Passwort- und Signatur-Links wird nach der Zustellung oder dem endgültigen Fehlschlag entfernt, auch rückwirkend; Empfänger, Betreff, Zeitpunkt und Status bleiben als Nachweis. Solche Mails lassen sich nicht erneut senden, Einladung oder Link werden neu ausgelöst.
- Der Vollexport enthält den Text ausgehender Mails nicht mehr, denn darin standen gültige Anmeldelinks. Der Versandnachweis bleibt im Export.
- Ausgehende Mails werden nach 3 Jahren gelöscht (
Mail__RetentionDays), solche zu Abrechnungen und Mahnungen nur geleert. Das Anonymisieren einer Person bereinigt auch ihre Mails, die Auskunft nennt sie. - Container:
no-new-privilegesundcap_drop: ALLfür alle Dienste vondeploy/docker-compose.yml; nur Postgres, Backup und Caddy behalten die Capabilities, die sie brauchen. /healthnennt öffentlich nur noch den Gesamtstatus. Den Zustand einzelner Prüfungen (u. a. Datensicherung) sehen nur noch angemeldete Konten mit dem Recht System.- Antiforgery-, Zwei-Faktor- und Status-Cookie sind jetzt
Secure. - Neue Aktion Konto & Sicherheit → Auf allen Geräten abmelden: beendet alle Sitzungen des Kontos und macht „Dieses Gerät merken“ ungültig.
- Das eigene Konto lässt sich auch serverseitig nicht mehr sperren, bisher verhinderte das nur die Oberfläche.
- Offene Seiten prüfen die Sitzung jede Minute statt alle 5 Minuten.
- Optional lassen sich neue Data-Protection-Schlüssel mit einem Zertifikat außerhalb der Datenbank verschlüsseln (
DataProtection__CertificatePath, siehedocs/betrieb.md). Das Zertifikat muss getrennt gesichert werden. - GitHub Actions sind auf Commit-Hashes festgelegt.
- Anonymisierte Mails erscheinen im Dashboard nicht mehr als „nicht zustellbar“.
Geändert
- Paket-Updates: Quartz.NET 4.7 (neue Migration
UpgradeQuartzSchemaTo47ergänzt die Spaltefixed_delay, ohne sie startet der Planer nicht), MudBlazor 9.12, Scriban 7.6, SkiaSharp 4.155; Test-Pakete bunit 2.14 und xunit.v3 4.0.3. - Statische Analyse: Meziantou.Analyzer und Banned-API-Prüfung (
DateTime.Nowu. a. verboten, Zeit überTimeProvider), NuGetAudit für alle Pakete und ein CI-Schritt für anfällige Pakete. Details indocs/entwicklung.md. - Einstellungen → Module: Die Auswahl innerhalb der Bereiche (z. B. Staffelmiete, DATEV-Export) steht jetzt direkt in der Kachel des Moduls statt auf einem zweiten Reiter.
- Heizkosten-Einstellungen für Laien: Oben steht eine Zusammenfassung („Aktuell gilt …“), die Fragen sind in einfacher Sprache gestellt (Energieträger, „Erzeugt dieselbe Anlage auch das Warmwasser?“, Anteil nach Verbrauch mit Schnellwahl 70/60/50 %), Selteneres (Energieinhalt, Emissionsfaktor, Wetterstation) steht aufklappbar darunter, und eine kurze Erklärung nennt, was für die Heizkosten gebraucht wird.
- Heizkosten: Die Wetterstation für die Gradtage wird nach der Postleitzahl des Objekts vorgeschlagen (nächste Station vorausgewählt, Liste nach Entfernung sortiert, mit Kilometerangabe). Die Positionen der Postleitzahlen liegen als Tabelle bei (GeoNames, CC BY 4.0), es wird nichts abgerufen.
- Einrichtungsassistent: Die Frage nach den Standardvorlagen entfällt, sie werden ohnehin beim Start angelegt.
- Darlehen, Wartung, Hausmeister-Aufgaben und CSV-Profile: „anlegen“ ist eine Schaltfläche im Seitenkopf mit Dialog; das Formular unter der Liste entfällt. Ebenso „Stand erfassen“ auf der Zählerseite (Dialog
ReadingEntryDialogstatt Formular auf der Seite, mit Foto und Bestätigung bei Auffälligkeiten). - Umlageschlüssel (Festlegen und Beenden je Zeile), AfA-Anschaffung (Button im Seitenkopf, Zusammenfassung statt Formular) und Zählerliste („Stand eintragen“ je Zähler, ohne Ablese-Runde) arbeiten mit Dialogen.
- Vorlagen: Die Standardvorlagen werden beim Start automatisch angelegt (was fehlt, auch neue nach einem Update; bewusst Gelöschtes bleibt gelöscht). Die Schaltfläche „Standardvorlagen anlegen“ in der Vorlagenliste entfällt.
- Beispieldaten: Die Mietverträge beginnen am 1. Januar des vorletzten Jahres. Die Demo-Instanz zeigt im Mieterportal versendete Abrechnungen mit Rechenweg, Vorjahresvergleich und freigegebenen Beispielbelegen.
Behoben
- Dashboard: Gemeldete Zählerstände von Mietern erschienen nicht als Hinweis, weil die Quelle (
ReadingReportTodos) nie registriert war. Ein Architekturtest prüft jetzt, dass jedeITodoSourceregistriert ist. - Abrechnung im Mieterportal auf dem Handy: Der Rechenweg steht als linksbündiger Block über die volle Breite der Karte, statt in schmale Spalten gequetscht zu werden. Die Summenzeile des Vorjahresvergleichs bricht um und lässt die Seite nicht mehr seitlich überstehen.
- Datenimport: Eine leerstehende Wohnung bekommt ihre Fläche ab dem frühesten Mietbeginn des Hause...