d8f442c1aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
1.8 KiB
TypeScript
44 lines
1.8 KiB
TypeScript
import type { Metadata } from "next";
|
||
import { notFound } from "next/navigation";
|
||
import { PageHeader } from "@/components/page-header";
|
||
import { BudgetView } from "@/features/budgets/components/budget-view";
|
||
import { IncomePlanSection } from "@/features/budgets/components/income-plan";
|
||
import { getIncomePlan } from "@/features/budgets/plan";
|
||
import { getBudget } from "@/features/budgets/service";
|
||
import { tr } from "@/i18n/tr";
|
||
import { requireActiveHousehold } from "@/lib/dal";
|
||
import { budgetMonthSchema } from "@/shared/schemas/budget";
|
||
|
||
export const metadata: Metadata = { title: tr.budget.title };
|
||
|
||
/** /butce?ay=YYYY-MM — aylık bütçe (varsayılan: içinde bulunulan bütçe ayı). */
|
||
export default async function BudgetPage({ searchParams }: PageProps<"/butce">) {
|
||
const { user, household } = await requireActiveHousehold("viewer");
|
||
const ay = budgetMonthSchema.safeParse((await searchParams).ay);
|
||
const data = await getBudget(user.id, household.id, ay.success ? ay.data : undefined);
|
||
if (!data) notFound();
|
||
const income = await getIncomePlan(user.id, household.id, data.month);
|
||
if (!income) notFound();
|
||
const monthLabel = new Intl.DateTimeFormat("tr-TR", {
|
||
month: "long",
|
||
year: "numeric",
|
||
timeZone: "Europe/Istanbul",
|
||
}).format(new Date(`${data.month}-15T12:00:00+03:00`));
|
||
return (
|
||
<>
|
||
<PageHeader title={tr.budget.title} description={tr.budget.description} />
|
||
<BudgetView key={data.month} data={data} />
|
||
<IncomePlanSection
|
||
key={`income-${data.month}`}
|
||
month={data.month}
|
||
monthLabel={monthLabel}
|
||
income={income}
|
||
limitMinor={data.totals.limitMinor}
|
||
forecastMinor={data.totals.forecastMinor}
|
||
hasBudget={data.hasBudget}
|
||
canWrite={data.canWrite}
|
||
/>
|
||
</>
|
||
);
|
||
}
|