aboutsummaryrefslogtreecommitdiff
path: root/api/src/modules/incomes/incomes.service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/modules/incomes/incomes.service.ts')
-rw-r--r--api/src/modules/incomes/incomes.service.ts83
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;
+}