Roadmap — Hausverwaltungs-Software
Status: ✅ fertig · 🚧 teilweise · 🔜 offen. Reihenfolge grob nach Nutzen/Aufwand.
✅ Fundament (steht)
- Stammdaten — Liegenschaften, Gebäude, Einheiten, Eigentümer, Gesellschafter, Mieter, Mietverträge (Filament-Panel
/admin). - Zahlungen — Mietzahlungen + Miet-Checkliste (monatlich manuell abhaken, Teilzahlung, Fortschritt).
- Betriebs-/Nebenkosten — Erfassung + Abrechnungs-Datensätze (Stammdaten via Seeder).
- Instandhaltung — Wartungen und Ticketsystem (Aufgaben, Prioritäten, Reminder-Command, Wiederholung, Sofort-Notification bei Zuweisung).
- Dokumente — polymorph; Grundriss-Upload (Stufe 1) je Liegenschaft/Einheit + Beispiel-Seed.
- Exposé-Export (PDF) — Einzelobjekt + Portfolio, Renditekennzahlen, Logo + Objektbilder (Dummy).
- Nutzer & Rechte — UserResource, Ticket-Zuweisung, Rollen via Filament Shield.
🚧 Angefangen / lückenhaft
- Echte E-Mail — Reminder/Notifications brauchen konfiguriertes
MAIL_*(sonst nur In-App). - Scheduler —
tickets:erinnerungennur live mit laufendem Cron /schedule:work. - Nebenkostenabrechnung — Datensätze ja, aber keine echte Berechnung/Verteilung auf Einheiten + Mieter-PDF.
- Dokument-Resource — globaler
DokumentResourcehat noch Stub-Felder (rohe Textfelder, kein FileUpload); nur der Grundriss-Tab nutzt echten Upload. - Grundriss — nur Upload; kein Editor, keine 3D-Begehung (Matterport-Einbettung = kleiner nächster Schritt).
- Bilder/Logo im Exposé — Platzhalter; echte Objektfotos/Firmenlogo noch nicht angebunden.
🔜 Empfohlen als Nächstes (hoher Nutzen)
- Mahnwesen — offene/überfällige Mietzahlungen → Mahnstufen + Mahnschreiben-PDF. Baut direkt auf Miet-Checkliste auf.
- Echte Nebenkostenabrechnung — Umlageschlüssel (Fläche/Personen/Verbrauch), Verteilung, Mieter-PDF, Nachzahlung/Guthaben.
- Dashboard-Widgets — KPIs: Leerstand, offene Forderungen, fällige Tickets/Wartungen, Vertragsende-Fristen.
🔜 Mietverwaltung-Ausbau
- Vertragsfristen — Kündigung/Befristung → automatische Erinnerungen (analog Ticket-Reminder).
- Mietanpassungen — Staffel-/Indexmiete, Mieterhöhung mit Historie.
- Kautionsverwaltung — Konto, Verzinsung, Rückzahlung.
- Zahlungsabgleich — SEPA-Lastschrift-Export + Bank-Import (CAMT/MT940) statt rein manuell.
🔜 Instandhaltung / Tickets
- Foto-Anhänge an Tickets (Dokument-morph existiert schon).
- Handwerker-Stammdaten + Angebote/Aufträge, Kostenverfolgung.
- Wartungspläne — wiederkehrende Pflichtprüfungen zentral (Rauchmelder, Heizung, Aufzug); Ticket-Wiederholung als Basis vorhanden.
🔜 Dokumente & Kommunikation
- Serienbrief/Vorlagen — Mietvertrag, Kündigung, Mahnung als PDF generieren (Exposé-Engine wiederverwendbar).
- Grundriss Stufe 2/3 — Matterport-/Pano-Link je Einheit (klein) bzw. 2D-Editor (groß).
- Verbrauchserfassung — Zählerstände (Strom/Wasser/Heizung) für verbrauchsbasierte Umlage.
🔜 Plattform / Technik
- Mieter-/Eigentümer-Portal — zweites Filament-Panel, eingeschränkte Sicht (Zahlungen, Dokumente, Tickets melden).
- Audit-Log — Aktivitätsverlauf wer/was/wann.
- Buchhaltungs-Export — DATEV / CSV.
- CI + Test-Coverage ausbauen.
⚠️ Tech-Debt (sollte mitlaufen)
- Auto-generierte Resource-Bugs beheben:
DokumentForm/WartungFormtitel->tel(),MietzahlungsTablezeigtmietvertrag.idstatt sinnvoller Labels,dokumentierbarals rohe Textfelder. - Smoke-Test rot — seit Shield liefern Resources 403 (Test-User ohne Rolle); Test auf Shield-Setup anpassen.
- Shield-Rollen feinschleifen (Sachbearbeiter vs. Admin, Grundriss-/Exposé-Permissions).
Hausverwaltungs-Software
Verwaltungssoftware für eine hausverwaltende Gesellschaft. Bildet Liegenschaften, Gebäude, Einheiten, Mieter, Mietverträge, Zahlungen, Betriebs- und Nebenkosten, Wartungen, Tickets und Dokumente ab.
Reine interne Admin-Anwendung über ein einziges Filament-Panel unter /admin — kein öffentliches Frontend, keine API.
Tech-Stack
- PHP 8.4 · Laravel 13
- Filament 5 (Admin-Panel, Livewire 4 / Alpine.js / Tailwind 4)
- Autorisierung: Filament Shield (
bezhansalleh/filament-shield) +spatie/laravel-permission - PDF:
barryvdh/laravel-dompdf(Exposés, Abrechnungen) - Build: Vite 8 · Tests: PHPUnit 12
- DB: standardmäßig SQLite (
.envanpassbar)
Setup
composer run setup # composer install, .env, key:generate, migrate, npm build
php artisan migrate:fresh --seed # DB neu aufbauen inkl. Demo-Bestand
Anwendung wird lokal über Laravel Herd unter https://hausverwaltungs-software.test ausgeliefert.
Entwicklung
composer run dev # Server + Queue + Pail-Logs + Vite parallel
npm run build # Frontend-Assets (bei „Vite manifest"-Fehler)
Tests
php artisan test --compact # alle Tests
php artisan test --compact tests/Feature/AdminPanelSmokeTest.php # eine Datei
php artisan test --compact --filter=test_login_page_loads # ein Test
AdminPanelSmokeTest iteriert alle registrierten Filament-Resources und prüft, dass Index- und Create-Seiten HTTP 200 liefern. Nach Anlegen/Ändern einer Resource zuerst laufen lassen.
Codestil
vendor/bin/pint --dirty --format agent # Formatierung geänderter PHP-Dateien (vor Abschluss pflicht)
Domänenmodell
Tabellen, Models und Beziehungen sind durchgängig deutsch benannt. Jedes Model setzt explizit protected $table (z. B. liegenschaften, gebaeude, einheiten, mietvertraege).
Hierarchie:
- Liegenschaft (Grundstück) → Gebäude, Einheiten, Betriebskosten, Wartungen
- Gebaeude → gehört zu Liegenschaft, hat Einheiten
- Einheit (Wohnung/Gewerbe) → gehört zu Liegenschaft, Gebäude, Eigentümer; hat Mietverträge
- Mietvertrag → gehört zu Einheit; viele Mieter (Pivot
mieter_mietvertrag); Mietzahlungen, Nebenkostenabrechnungen - Mieter → viele Mietverträge
- Eigentuemer → viele Einheiten
- Gesellschafter → Anteilseigner der Verwaltung (eigenständige Stammdaten)
- Betriebskosten → gehört zu Liegenschaft + Betriebskostenart
- Nebenkostenabrechnung → gehört zu Mietvertrag
- Wartung, Ticket → operative Vorgänge je Liegenschaft/Einheit
- Dokument → polymorph an Liegenschaft, Einheit, Mietvertrag, Mieter
Status (z. B. Vertrag 'aktiv') wird als String gespeichert — keine Enums.
Rollen & Rechte
Vier Rollen via RoleSeeder, Permissions im Schema Aktion:Entity (z. B. Create:Liegenschaft):
| Rolle | Rechte |
|---|---|
| Administrator | super_admin, Gate-Bypass über alles |
| Verwalter | volle Domain-CRUD, kein User-/Rollen-Management |
| Buchhaltung | Finanzdaten voll, Rest lesend |
| Nur-Lesen | nur View |
Rollenverwaltung unter /admin/shield/roles. Nach neuer Resource php artisan shield:generate --all ausführen.
Projektstruktur
- Resources folgen dem Filament-v5-Split:
Resource.php+Schemas/<Name>Form.php+Tables/<Name>Table.php+Pages/ - Panel-Konfiguration:
app/Providers/Filament/AdminPanelProvider.php - Policies:
app/Policies/ - Seeder:
DatabaseSeeder→BetriebskostenartSeeder(Referenzdaten) +DemoDataSeeder(Demo-Bestand)