48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { and, desc, eq, isNull, ne, or, type SQL } from "drizzle-orm";
|
|
import {
|
|
cartoes,
|
|
categorias,
|
|
contas,
|
|
lancamentos,
|
|
pagadores,
|
|
} from "@/db/schema";
|
|
import { INITIAL_BALANCE_NOTE } from "@/lib/contas/constants";
|
|
import { db } from "@/lib/db";
|
|
|
|
export async function fetchLancamentos(filters: SQL[]) {
|
|
const lancamentoRows = await db
|
|
.select({
|
|
lancamento: lancamentos,
|
|
pagador: pagadores,
|
|
conta: contas,
|
|
cartao: cartoes,
|
|
categoria: categorias,
|
|
})
|
|
.from(lancamentos)
|
|
.leftJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id))
|
|
.leftJoin(contas, eq(lancamentos.contaId, contas.id))
|
|
.leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id))
|
|
.leftJoin(categorias, eq(lancamentos.categoriaId, categorias.id))
|
|
.where(
|
|
and(
|
|
...filters,
|
|
// Excluir saldos iniciais de contas que têm excludeInitialBalanceFromIncome = true
|
|
or(
|
|
ne(lancamentos.note, INITIAL_BALANCE_NOTE),
|
|
isNull(contas.excludeInitialBalanceFromIncome),
|
|
eq(contas.excludeInitialBalanceFromIncome, false),
|
|
),
|
|
),
|
|
)
|
|
.orderBy(desc(lancamentos.purchaseDate), desc(lancamentos.createdAt));
|
|
|
|
// Transformar resultado para o formato esperado
|
|
return lancamentoRows.map((row) => ({
|
|
...row.lancamento,
|
|
pagador: row.pagador,
|
|
conta: row.conta,
|
|
cartao: row.cartao,
|
|
categoria: row.categoria,
|
|
}));
|
|
}
|