diff options
Diffstat (limited to 'api/src/modules/incomes/incomes.service.ts')
| -rw-r--r-- | api/src/modules/incomes/incomes.service.ts | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/api/src/modules/incomes/incomes.service.ts b/api/src/modules/incomes/incomes.service.ts new file mode 100644 index 0000000..0a9ea84 --- /dev/null +++ b/api/src/modules/incomes/incomes.service.ts @@ -0,0 +1,83 @@ +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; +} |