import { NextResponse } from "next/server" import { and, eq } from "drizzle-orm" import { db } from "@/lib/db" import { leases, rent_payments } from "@/lib/db/schema" import { getSessionUser } from "@/lib/session" export async function POST(request: Request) { const user = await getSessionUser() if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }) const { year, month } = await request.json() as { year: number; month: number } if (!year || month === undefined) return NextResponse.json({ error: "year and month required" }, { status: 400 }) // Get all active leases with rent amount const activeLeases = await db .select({ id: leases.id, tenant_id: leases.tenant_id, property_id: leases.property_id, unit_id: leases.unit_id, rent_amount: leases.rent_amount, }) .from(leases) .where(and(eq(leases.user_id, user.id), eq(leases.status, "active"))) if (!activeLeases.length) return NextResponse.json({ created: 0, skipped: 0 }) // Build due date: first of selected month const pad = (n: number) => String(n).padStart(2, "0") const due_date = `${year}-${pad(month + 1)}-01` // Check which already exist for this month const existing = await db .select({ tenant_id: rent_payments.tenant_id }) .from(rent_payments) .where(and(eq(rent_payments.user_id, user.id), eq(rent_payments.due_date, due_date))) const existingTenantIds = new Set(existing.map((p) => p.tenant_id)) const toInsert = activeLeases .filter((l) => !existingTenantIds.has(l.tenant_id)) .map((l) => ({ user_id: user.id, tenant_id: l.tenant_id, property_id: l.property_id, unit_id: l.unit_id ?? null, amount: l.rent_amount, due_date, status: "pending" as const, })) if (toInsert.length === 0) { return NextResponse.json({ created: 0, skipped: activeLeases.length, message: "All payments already exist for this month." }) } await db.insert(rent_payments).values(toInsert) return NextResponse.json({ created: toInsert.length, skipped: existingTenantIds.size, message: `Created ${toInsert.length} payment${toInsert.length !== 1 ? "s" : ""} for ${due_date.slice(0, 7)}.`, }) }