import { and, eq } from 'drizzle-orm'; import { db } from '@/db/client'; import { incomes } from '@/db/schema'; import type { CreateIncomeInput, UpdateIncomeInput } from './incomes.schema'; export async function findIncomesByUser( userId: number, filters?: { month?: number; year?: number }, ) { const conditions = [eq(incomes.user_id, userId)]; if (filters?.month !== undefined) { conditions.push(eq(incomes.reference_month, filters.month)); } if (filters?.year !== undefined) { conditions.push(eq(incomes.reference_year, filters.year)); } return db .select() .from(incomes) .where(and(...conditions)) .orderBy(incomes.reference_year, incomes.reference_month); } export async function findIncomeById(userId: number, id: number) { const result = await db .select() .from(incomes) .where(and(eq(incomes.user_id, userId), eq(incomes.id, id))) .limit(1); return result[0] ?? null; } export async function createIncome(userId: number, data: CreateIncomeInput) { const [created] = await db .insert(incomes) .values({ user_id: userId, gross_salary: data.gross_salary, calculated_net_salary: data.calculated_net_salary, effective_net_salary: data.effective_net_salary, reference_month: data.reference_month, reference_year: data.reference_year, description: data.description ?? null, }) .returning(); return created; } export async function updateIncome( userId: number, id: number, data: UpdateIncomeInput, ) { const now = new Date().toISOString(); const [updated] = await db .update(incomes) .set({ ...(data.gross_salary !== undefined && { gross_salary: data.gross_salary }), ...(data.calculated_net_salary !== undefined && { calculated_net_salary: data.calculated_net_salary, }), ...(data.effective_net_salary !== undefined && { effective_net_salary: data.effective_net_salary, }), ...(data.description !== undefined && { description: data.description }), updated_at: now, }) .where(and(eq(incomes.user_id, userId), eq(incomes.id, id))) .returning(); return updated ?? null; } export async function deleteIncome(userId: number, id: number) { const [deleted] = await db .delete(incomes) .where(and(eq(incomes.user_id, userId), eq(incomes.id, id))) .returning(); return deleted ?? null; }