+
+
+
Steuer & Kosten
+
+ {role === 'tenant'
+ ? 'Umlegbare und nicht umlegbare Kosten Ihrer Wohnung'
+ : 'Umlegbare und nicht umlegbare Kosten nach Haus und Wohnung – Grundlage für die Nebenkostenabrechnung'}
+
+
+ {role === 'admin' &&
}
+
+
+
+
+
+ Umlegbar (Filterauswahl)
+
+
{fmtEUR.format(summeUmlegbar)}
+
{filtered.filter((k) => k.umlegbar).length} Positionen
+
+
+
+
Nicht umlegbar (Eigentümer)
+
+
{fmtEUR.format(summeNicht)}
+
{filtered.filter((k) => !k.umlegbar).length} Positionen
+
+
+
+ Gesamt
+
+
{fmtEUR.format(summeUmlegbar + summeNicht)}
+
{filtered.length} Positionen gesamt
+
+
+
+
+
+ {(['alle', 'umlegbar', 'nicht'] as const).map((a) => (
+ setArtFilter(a)}
+ className={`rounded-full px-4 py-1.5 text-sm font-medium transition ${
+ artFilter === a
+ ? 'bg-teal-600 text-white'
+ : 'bg-white text-slate-600 ring-1 ring-slate-200 hover:ring-teal-400'
+ }`}
+ >
+ {a === 'alle' ? 'Alle' : a === 'umlegbar' ? 'Umlegbar' : 'Nicht umlegbar'}
+
+ ))}
+
+ {role === 'admin' && (
+ <>
+
+
+
+
+
+ Alle Jahre
+ {jahre.map((j) => (
+
+ {j}
+
+ ))}
+
+
+
+
+
+
+
+ Alle Häuser
+ {buildings.map((b) => (
+
+ {b.name}
+
+ ))}
+
+
+ >
+ )}
+
+
+
+ {filtered.length === 0 ? (
+
+
+ Keine Kostenpositionen gefunden.
+
+ ) : (
+
+
+
+ Kostenart
+ {role === 'admin' && Haus }
+ Wohnung
+ Jahr
+ Umlegbarkeit
+ Betrag
+ {role === 'admin' && Aktion }
+
+
+
+ {filtered.map((k) => (
+
+
+
+
+
+ {k.kostenart}
+ {k.notiz &&
{k.notiz}
}
+
+
+
+ {role === 'admin' && {k.building} }
+ {einheitLabel(k)}
+ {k.jahr}
+
+
+ {k.umlegbar ? 'Umlegbar' : 'Nicht umlegbar'}
+
+
+ {fmtEUR.format(k.betrag)}
+ {role === 'admin' && (
+
+
+
+ loeschen(k)}>
+ Löschen
+
+
+
+ )}
+
+ ))}
+
+
+ )}
+
+
+
+ Umlegbare Kosten werden nach den Vorgaben der Betriebskostenverordnung auf die Mieter
+ umgelegt; nicht umlegbare Positionen trägt die Eigentümerseite. Erfasst von der
+ Verwaltung, Grundlage der jährlichen Nebenkostenabrechnung.
+
+
+ )
+}
diff --git a/src/store/store.tsx b/src/store/store.tsx
index ea9f0e6..fae9300 100644
--- a/src/store/store.tsx
+++ b/src/store/store.tsx
@@ -32,6 +32,7 @@ import type {
Meter,
ZaehlerArt,
Building,
+ KostenItem,
} from '../types'
import { apiGet, apiPost, apiPatch, apiDelete, ApiFehler } from '../lib/api'
import { sha256, DEMO_PASSWORT } from '../lib/auth'
@@ -51,6 +52,7 @@ interface Bootstrap {
codes: RegistrierungsCode[]
meters: Meter[]
buildings: Building[]
+ kosten: KostenItem[]
}
const LEER: Bootstrap = {
@@ -64,6 +66,7 @@ const LEER: Bootstrap = {
codes: [],
meters: [],
buildings: [],
+ kosten: [],
}
interface Store extends Bootstrap {
@@ -139,6 +142,21 @@ interface Store extends Bootstrap {
deleteDokument: (id: string) => Promise