import "server-only"; import { listAccounts } from "@/features/accounts/service"; import { listAssets } from "@/features/assets/service"; import { listContacts } from "@/features/contacts/service"; import { listInKind } from "@/features/in-kind/service"; /** * Net varlık (Bölüm 6.6): hesap bakiyeleri (kart borçları eksi) + varlıkların güncel değeri * (alış) + cari alacaklar − cari borçlar + aynî alacaklar (alış) − aynî borçlar (satış). * Görünürlük kaynak listelerin kurallarını izler (gizli varlık/cari sayılmaz; gizli hesap * bakiyeleri hane ayarına göre toplama girer). */ export type NetWorth = { accountsMinor: number; cardDebtMinor: number; assetsMinor: number; contactReceivableMinor: number; contactPayableMinor: number; inKindReceivableMinor: number; inKindPayableMinor: number; totalMinor: number; /** Fiyatı olmadığı için katılmayan varlık + aynî kayıt sayısı. */ missingPrice: number; /** Başkasının gizli hesabının bakiyesi toplama dahil (hane ayarı). */ includesHidden: boolean; }; export async function getNetWorth(userId: string, householdId: string): Promise { const [accounts, assets, contacts, inKind] = await Promise.all([ listAccounts(userId, householdId), listAssets(userId, householdId), listContacts(userId, householdId), listInKind(userId, householdId), ]); if (!accounts || !assets || !contacts || !inKind) return null; let inKindReceivableMinor = 0; let inKindPayableMinor = 0; let missingPrice = assets.totals.missingPrice; for (const v of inKind) { if (v.closedAt || v.progress.remainingQuantity === 0) continue; const value = v.progress.currentValueMinor; if (value === null) { missingPrice++; continue; } if (v.direction === "debt") inKindPayableMinor += value; else inKindReceivableMinor += value; } const r = { accountsMinor: accounts.totals.assetsMinor, cardDebtMinor: -accounts.totals.cardDebtMinor, assetsMinor: assets.totals.valueMinor, contactReceivableMinor: contacts.totals.owesMeMinor, contactPayableMinor: contacts.totals.iOweMinor, inKindReceivableMinor, inKindPayableMinor, }; return { ...r, totalMinor: r.accountsMinor - r.cardDebtMinor + r.assetsMinor + r.contactReceivableMinor - r.contactPayableMinor + r.inKindReceivableMinor - r.inKindPayableMinor, missingPrice, includesHidden: accounts.totals.includesHidden, }; }