+
+ {(
+ [
+ [t.summary.owesMe, data.totals.owesMeMinor, "text-income"],
+ [t.summary.iOwe, data.totals.iOweMinor, "text-expense"],
+ [t.summary.net, data.totals.owesMeMinor - data.totals.iOweMinor, ""],
+ ] as const
+ ).map(([label, value, tone]) => (
+
+
+ {label}
+
+ {formatMoney(value)}
+
+
+
+ ))}
+
+ {canWrite ? (
+
+
+
+ ) : null}
+ {active.length === 0 ? (
+
+
+ {t.empty}
+
+
+ ) : (
+
+ )}
+ {archived.length ? (
+
+
+
+
+
+
+
+
+ ) : null}
+
!o && setForm(null)}
+ />
+ setEntry(null)} />
+
+ );
+}
diff --git a/src/features/contacts/components/due-banner.tsx b/src/features/contacts/components/due-banner.tsx
new file mode 100644
index 0000000..6a79cf3
--- /dev/null
+++ b/src/features/contacts/components/due-banner.tsx
@@ -0,0 +1,29 @@
+import { HandCoins } from "lucide-react";
+import Link from "next/link";
+import { Button } from "@/components/ui/button";
+import { tr } from "@/i18n/tr";
+import { countDueContacts } from "../service";
+
+/** Dashboard: vadesi geçmiş veya yaklaşan cari borç/alacak uyarısı (Faz 8 kararı: uygulama içi). */
+export async function ContactsDueBanner({
+ userId,
+ householdId,
+}: {
+ userId: string;
+ householdId: string;
+}) {
+ const n = await countDueContacts(userId, householdId);
+ if (!n) return null;
+ return (
+