9a60085d14
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
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<NetWorth | null> {
|
||
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,
|
||
};
|
||
}
|