From 36687debf27b37f2c96bb48d747f3eef69a95dd3 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Tue, 17 Mar 2026 17:07:34 +0000 Subject: [PATCH] fix(dashboard): usa pagador admin cacheado nas consultas --- src/features/dashboard/accounts-queries.ts | 17 ++++++++--------- .../categories/category-history-queries.ts | 18 ++++++++++++++---- .../expenses/installment-analysis-queries.ts | 13 +++++++++---- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/features/dashboard/accounts-queries.ts b/src/features/dashboard/accounts-queries.ts index bf50fcc..f9bb28e 100644 --- a/src/features/dashboard/accounts-queries.ts +++ b/src/features/dashboard/accounts-queries.ts @@ -1,8 +1,8 @@ import { and, eq, sql } from "drizzle-orm"; -import { financialAccounts, payers, transactions } from "@/db/schema"; +import { financialAccounts, transactions } from "@/db/schema"; import { INITIAL_BALANCE_NOTE } from "@/shared/lib/accounts/constants"; import { db } from "@/shared/lib/db"; -import { PAYER_ROLE_ADMIN } from "@/shared/lib/payers/constants"; +import { getAdminPayerId } from "@/shared/lib/payers/get-admin-id"; import { safeToNumber as toNumber } from "@/shared/utils/number"; type RawDashboardAccount = { @@ -34,6 +34,8 @@ export type DashboardAccountsSnapshot = { export async function fetchDashboardAccounts( userId: string, ): Promise { + const adminPayerId = await getAdminPayerId(userId); + const rows = await db .select({ id: financialAccounts.id, @@ -62,15 +64,12 @@ export async function fetchDashboardAccounts( eq(transactions.accountId, financialAccounts.id), eq(transactions.userId, userId), eq(transactions.isSettled, true), + adminPayerId + ? eq(transactions.payerId, adminPayerId) + : sql`false`, ), ) - .leftJoin(payers, eq(transactions.payerId, payers.id)) - .where( - and( - eq(financialAccounts.userId, userId), - sql`(${transactions.id} IS NULL OR ${payers.role} = ${PAYER_ROLE_ADMIN})`, - ), - ) + .where(eq(financialAccounts.userId, userId)) .groupBy( financialAccounts.id, financialAccounts.name, diff --git a/src/features/dashboard/categories/category-history-queries.ts b/src/features/dashboard/categories/category-history-queries.ts index 507ec33..a7b89d4 100644 --- a/src/features/dashboard/categories/category-history-queries.ts +++ b/src/features/dashboard/categories/category-history-queries.ts @@ -1,8 +1,8 @@ import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; -import { categories, payers, transactions } from "@/db/schema"; +import { categories, transactions } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/shared/lib/accounts/constants"; import { db } from "@/shared/lib/db"; -import { PAYER_ROLE_ADMIN } from "@/shared/lib/payers/constants"; +import { getAdminPayerId } from "@/shared/lib/payers/get-admin-id"; import { CATEGORY_COLORS } from "@/shared/utils/category-colors"; import { safeToNumber as toNumber } from "@/shared/utils/number"; import { @@ -85,6 +85,17 @@ export async function fetchCategoryHistory( // Fetch all categories for the selector const allCategories = await fetchAllCategories(userId); + const adminPayerId = await getAdminPayerId(userId); + + if (!adminPayerId) { + return { + months: monthLabels, + categories: [], + chartData: monthLabels.map((month) => ({ month })), + allCategories, + }; + } + // Fetch monthly data for ALL categories with transactions const monthlyDataQuery = (await db .select({ @@ -98,13 +109,12 @@ export async function fetchCategoryHistory( }) .from(transactions) .innerJoin(categories, eq(transactions.categoryId, categories.id)) - .innerJoin(payers, eq(transactions.payerId, payers.id)) .where( and( eq(transactions.userId, userId), eq(categories.userId, userId), inArray(transactions.period, periods), - eq(payers.role, PAYER_ROLE_ADMIN), + eq(transactions.payerId, adminPayerId), or( isNull(transactions.note), sql`${ diff --git a/src/features/dashboard/expenses/installment-analysis-queries.ts b/src/features/dashboard/expenses/installment-analysis-queries.ts index 7a2102e..f565ff7 100644 --- a/src/features/dashboard/expenses/installment-analysis-queries.ts +++ b/src/features/dashboard/expenses/installment-analysis-queries.ts @@ -1,11 +1,11 @@ import { and, eq, isNotNull, isNull, or, sql } from "drizzle-orm"; -import { cards, payers, transactions } from "@/db/schema"; +import { cards, transactions } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/shared/lib/accounts/constants"; import { db } from "@/shared/lib/db"; -import { PAYER_ROLE_ADMIN } from "@/shared/lib/payers/constants"; +import { getAdminPayerId } from "@/shared/lib/payers/get-admin-id"; import { buildDateOnlyStringFromPeriodDay, parseLocalDateString, @@ -65,6 +65,12 @@ export type InstallmentAnalysisData = { export async function fetchInstallmentAnalysis( userId: string, ): Promise { + const adminPayerId = await getAdminPayerId(userId); + + if (!adminPayerId) { + return { installmentGroups: [], totalPendingInstallments: 0 }; + } + // 1. Buscar todos os lançamentos parcelados nĂ£o antecipados do pagador admin const installmentRows = await db .select({ @@ -87,15 +93,14 @@ export async function fetchInstallmentAnalysis( }) .from(transactions) .leftJoin(cards, eq(transactions.cardId, cards.id)) - .leftJoin(payers, eq(transactions.payerId, payers.id)) .where( and( eq(transactions.userId, userId), + eq(transactions.payerId, adminPayerId), eq(transactions.transactionType, "Despesa"), eq(transactions.condition, "Parcelado"), eq(transactions.isAnticipated, false), isNotNull(transactions.seriesId), - eq(payers.role, PAYER_ROLE_ADMIN), or( isNull(transactions.note), and(