From 1e0c93fb6c79451becbbf74bb67268531d5fc08c Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Wed, 25 Mar 2026 00:29:36 +0000 Subject: [PATCH] fix(finance): preserve visibility and settlement updates --- src/features/dashboard/categories/category-breakdown.ts | 5 +++-- .../dashboard/categories/category-details-queries.ts | 1 + src/features/dashboard/transaction-filters.ts | 1 + src/features/reports/establishments/queries.ts | 1 + src/features/transactions/actions/bulk-actions.ts | 1 + src/features/transactions/actions/core.ts | 1 + .../dialogs/transaction-dialog/transaction-dialog-types.ts | 1 + .../dialogs/transaction-dialog/transaction-dialog.tsx | 4 ++++ .../transactions/components/page/transactions-page.tsx | 5 ++++- src/features/transactions/queries.ts | 1 + 10 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/features/dashboard/categories/category-breakdown.ts b/src/features/dashboard/categories/category-breakdown.ts index d9c441d..a24a5dc 100644 --- a/src/features/dashboard/categories/category-breakdown.ts +++ b/src/features/dashboard/categories/category-breakdown.ts @@ -111,10 +111,11 @@ export function buildCategoryBreakdownData({ }); } - categories.sort((a, b) => b.currentAmount - a.currentAmount); + const filtered = categories.filter((c) => c.currentAmount > 0); + filtered.sort((a, b) => b.currentAmount - a.currentAmount); return { - categories, + categories: filtered, currentTotal, previousTotal, }; diff --git a/src/features/dashboard/categories/category-details-queries.ts b/src/features/dashboard/categories/category-details-queries.ts index dcca7d8..aac5c75 100644 --- a/src/features/dashboard/categories/category-details-queries.ts +++ b/src/features/dashboard/categories/category-details-queries.ts @@ -111,6 +111,7 @@ export async function fetchCategoryDetails( sanitizedNote, eq(transactions.period, previousPeriod), or( + isNull(transactions.note), ne(transactions.note, INITIAL_BALANCE_NOTE), isNull(financialAccounts.excludeInitialBalanceFromIncome), eq(financialAccounts.excludeInitialBalanceFromIncome, false), diff --git a/src/features/dashboard/transaction-filters.ts b/src/features/dashboard/transaction-filters.ts index 808b819..9e072c7 100644 --- a/src/features/dashboard/transaction-filters.ts +++ b/src/features/dashboard/transaction-filters.ts @@ -50,6 +50,7 @@ export const excludeAutoGeneratedEntryNotes = () => export const excludeInitialBalanceWhenConfigured = () => or( + isNull(transactions.note), ne(transactions.note, INITIAL_BALANCE_NOTE), isNull(financialAccounts.excludeInitialBalanceFromIncome), eq(financialAccounts.excludeInitialBalanceFromIncome, false), diff --git a/src/features/reports/establishments/queries.ts b/src/features/reports/establishments/queries.ts index 7b6ff32..157bc68 100644 --- a/src/features/reports/establishments/queries.ts +++ b/src/features/reports/establishments/queries.ts @@ -113,6 +113,7 @@ export async function fetchTopEstablishmentsData( not(ilike(transactions.note, `${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`)), ), or( + isNull(transactions.note), ne(transactions.note, INITIAL_BALANCE_NOTE), isNull(financialAccounts.excludeInitialBalanceFromIncome), eq(financialAccounts.excludeInitialBalanceFromIncome, false), diff --git a/src/features/transactions/actions/bulk-actions.ts b/src/features/transactions/actions/bulk-actions.ts index ed2ac2a..75cb916 100644 --- a/src/features/transactions/actions/bulk-actions.ts +++ b/src/features/transactions/actions/bulk-actions.ts @@ -172,6 +172,7 @@ export async function updateTransactionBulkAction( payerId: data.payerId ?? null, accountId: data.accountId ?? null, cardId: data.cardId ?? null, + ...(data.isSettled !== undefined && { isSettled: data.isSettled }), }; if (data.amount !== undefined) { diff --git a/src/features/transactions/actions/core.ts b/src/features/transactions/actions/core.ts index e160b41..d144fc1 100644 --- a/src/features/transactions/actions/core.ts +++ b/src/features/transactions/actions/core.ts @@ -705,6 +705,7 @@ export const updateBulkSchema = z.object({ }) .optional() .nullable(), + isSettled: z.boolean().nullable().optional(), }); export type UpdateBulkInput = z.infer; diff --git a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog-types.ts b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog-types.ts index caf43d9..d3cea2c 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog-types.ts +++ b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog-types.ts @@ -41,6 +41,7 @@ export interface TransactionDialogProps { amount: number; dueDate: string | null; boletoPaymentDate: string | null; + isSettled: boolean | null; }) => void; } diff --git a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx index 3d34ada..a9bf316 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx @@ -346,6 +346,10 @@ export function TransactionDialog({ mode === "update" && formState.paymentMethod === "Boleto" ? formState.boletoPaymentDate || null : null, + isSettled: + formState.paymentMethod === "Cartão de crédito" + ? null + : Boolean(formState.isSettled), }); return; } diff --git a/src/features/transactions/components/page/transactions-page.tsx b/src/features/transactions/components/page/transactions-page.tsx index 5b89852..ff084f2 100644 --- a/src/features/transactions/components/page/transactions-page.tsx +++ b/src/features/transactions/components/page/transactions-page.tsx @@ -129,6 +129,7 @@ export function TransactionsPage({ amount: number; dueDate: string | null; boletoPaymentDate: string | null; + isSettled: boolean | null; transaction: TransactionItem; } | null>(null); const [pendingDeleteData, setPendingDeleteData] = @@ -182,7 +183,7 @@ export function TransactionsPage({ toast.success( nextValue ? `"${item.name}" marcado como pago` - : `"${item.name}" desmarcado`, + : `"${item.name}" marcado como não pago`, ); } catch (error) { const message = @@ -244,6 +245,7 @@ export function TransactionsPage({ amount: number; dueDate: string | null; boletoPaymentDate: string | null; + isSettled: boolean | null; }) => { if (!selectedTransaction) { return; @@ -274,6 +276,7 @@ export function TransactionsPage({ amount: pendingEditData.amount, dueDate: pendingEditData.dueDate, boletoPaymentDate: pendingEditData.boletoPaymentDate, + isSettled: pendingEditData.isSettled ?? undefined, }); if (!result.success) { diff --git a/src/features/transactions/queries.ts b/src/features/transactions/queries.ts index 43849f1..c9a5a65 100644 --- a/src/features/transactions/queries.ts +++ b/src/features/transactions/queries.ts @@ -43,6 +43,7 @@ const DEFAULT_EXCLUDE_INITIAL_BALANCE = true; const buildInitialBalanceVisibilityFilter = () => or( + isNull(transactions.note), ne(transactions.note, INITIAL_BALANCE_NOTE), isNull(financialAccounts.excludeInitialBalanceFromIncome), eq(financialAccounts.excludeInitialBalanceFromIncome, false),