- Adicionados ícones SVG para ChatGPT, Claude, Gemini e OpenRouter - Implementados ícones para modos claro e escuro do ChatGPT - Criado script de inicialização para PostgreSQL com extensão pgcrypto - Adicionado script de configuração de ambiente que faz backup do .env - Configurado tsconfig.json para TypeScript com opções de compilação
96 lines
2.5 KiB
TypeScript
96 lines
2.5 KiB
TypeScript
import { contas, lancamentos, pagadores } from "@/db/schema";
|
|
import { INITIAL_BALANCE_NOTE } from "@/lib/accounts/constants";
|
|
import { db } from "@/lib/db";
|
|
import { loadLogoOptions } from "@/lib/logo/options";
|
|
import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants";
|
|
import { and, eq, sql } from "drizzle-orm";
|
|
|
|
export type AccountData = {
|
|
id: string;
|
|
name: string;
|
|
accountType: string;
|
|
status: string;
|
|
note: string | null;
|
|
logo: string | null;
|
|
initialBalance: number;
|
|
balance: number;
|
|
excludeFromBalance: boolean;
|
|
};
|
|
|
|
export async function fetchAccountsForUser(
|
|
userId: string,
|
|
currentPeriod: string
|
|
): Promise<{ accounts: AccountData[]; logoOptions: LogoOption[] }> {
|
|
const [accountRows, logoOptions] = await Promise.all([
|
|
db
|
|
.select({
|
|
id: contas.id,
|
|
name: contas.name,
|
|
accountType: contas.accountType,
|
|
status: contas.status,
|
|
note: contas.note,
|
|
logo: contas.logo,
|
|
initialBalance: contas.initialBalance,
|
|
excludeFromBalance: contas.excludeFromBalance,
|
|
balanceMovements: sql<number>`
|
|
coalesce(
|
|
sum(
|
|
case
|
|
when ${lancamentos.note} = ${INITIAL_BALANCE_NOTE} then 0
|
|
else ${lancamentos.amount}
|
|
end
|
|
),
|
|
0
|
|
)
|
|
`,
|
|
})
|
|
.from(contas)
|
|
.leftJoin(
|
|
lancamentos,
|
|
and(
|
|
eq(lancamentos.contaId, contas.id),
|
|
eq(lancamentos.userId, userId),
|
|
eq(lancamentos.period, currentPeriod),
|
|
eq(lancamentos.isSettled, true)
|
|
)
|
|
)
|
|
.leftJoin(
|
|
pagadores,
|
|
eq(lancamentos.pagadorId, pagadores.id)
|
|
)
|
|
.where(
|
|
and(
|
|
eq(contas.userId, userId),
|
|
sql`(${lancamentos.id} IS NULL OR ${pagadores.role} = ${PAGADOR_ROLE_ADMIN})`
|
|
)
|
|
)
|
|
.groupBy(
|
|
contas.id,
|
|
contas.name,
|
|
contas.accountType,
|
|
contas.status,
|
|
contas.note,
|
|
contas.logo,
|
|
contas.initialBalance,
|
|
contas.excludeFromBalance
|
|
),
|
|
loadLogoOptions(),
|
|
]);
|
|
|
|
const accounts = accountRows.map((account) => ({
|
|
id: account.id,
|
|
name: account.name,
|
|
accountType: account.accountType,
|
|
status: account.status,
|
|
note: account.note,
|
|
logo: account.logo,
|
|
initialBalance: Number(account.initialBalance ?? 0),
|
|
balance:
|
|
Number(account.initialBalance ?? 0) +
|
|
Number(account.balanceMovements ?? 0),
|
|
excludeFromBalance: account.excludeFromBalance,
|
|
}));
|
|
|
|
return { accounts, logoOptions };
|
|
}
|