diff --git a/CHANGELOG.md b/CHANGELOG.md index 510fd40..2f11bfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ Todas as mudanças notáveis deste projeto serão documentadas neste arquivo. O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/), e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR/). +## [1.7.4] - 2026-02-28 + +### Alterado + +- Card de análise de parcelas (`/dashboard/analise-parcelas`): layout empilhado no mobile — nome/cartão e valores Total/Pendente em linhas separadas ao invés de lado-a-lado, evitando truncamento +- Página de top estabelecimentos (`/top-estabelecimentos`): cards "Top Estabelecimentos por Frequência" e "Principais Categorias" empilhados verticalmente no mobile (`grid-cols-1 lg:grid-cols-2`) +- Padding da lista de parcelas expandida reduzido no mobile (`px-2 sm:px-8`) +- Ajustes gerais de responsividade em navbar, filtros, skeletons, widgets e dialogs (26 componentes) + ## [1.7.3] - 2026-02-27 ### Adicionado diff --git a/app/(dashboard)/cartoes/data.ts b/app/(dashboard)/cartoes/data.ts index e9d55ce..3ede582 100644 --- a/app/(dashboard)/cartoes/data.ts +++ b/app/(dashboard)/cartoes/data.ts @@ -1,4 +1,4 @@ -import { and, eq, ilike, isNull, not, or, sql } from "drizzle-orm"; +import { and, eq, ilike, isNull, ne, not, or, sql } from "drizzle-orm"; import { cartoes, contas, lancamentos } from "@/db/schema"; import { db } from "@/lib/db"; import { loadLogoOptions } from "@/lib/logo/options"; @@ -72,6 +72,11 @@ export async function fetchCardsForUser(userId: string): Promise<{ and( eq(lancamentos.userId, userId), or(isNull(lancamentos.isSettled), eq(lancamentos.isSettled, false)), + // Recorrente no cartão: só consome limite quando a data da ocorrência já passou + or( + ne(lancamentos.condition, "Recorrente"), + sql`${lancamentos.purchaseDate} <= current_date`, + ), ), ) .groupBy(lancamentos.cartaoId), @@ -164,6 +169,11 @@ export async function fetchInativosForUser(userId: string): Promise<{ and( eq(lancamentos.userId, userId), or(isNull(lancamentos.isSettled), eq(lancamentos.isSettled, false)), + // Recorrente no cartão: só consome limite quando a data da ocorrência já passou + or( + ne(lancamentos.condition, "Recorrente"), + sql`${lancamentos.purchaseDate} <= current_date`, + ), ), ) .groupBy(lancamentos.cartaoId), diff --git a/components/lancamentos/page/lancamentos-page.tsx b/components/lancamentos/page/lancamentos-page.tsx index 6cf615f..41e123b 100644 --- a/components/lancamentos/page/lancamentos-page.tsx +++ b/components/lancamentos/page/lancamentos-page.tsx @@ -296,6 +296,17 @@ export function LancamentosPage({ }, []); const handleMultipleBulkDelete = useCallback((items: LancamentoItem[]) => { + // Se todos os selecionados são da mesma série (parcelado/recorrente), abrir dialog de escopo + const withSeries = items.filter((i) => i.seriesId); + const sameSeries = + withSeries.length > 0 && + withSeries.length === items.length && + withSeries.every((i) => i.seriesId === withSeries[0]?.seriesId); + if (sameSeries && withSeries[0]) { + setPendingDeleteData(withSeries[0]); + setBulkDeleteOpen(true); + return; + } setPendingMultipleDeleteData(items); setMultipleBulkDeleteOpen(true); }, []); diff --git a/lib/relatorios/cartoes-report.ts b/lib/relatorios/cartoes-report.ts index efdf114..329e6cd 100644 --- a/lib/relatorios/cartoes-report.ts +++ b/lib/relatorios/cartoes-report.ts @@ -1,4 +1,16 @@ -import { and, eq, gte, ilike, inArray, lte, not, sum } from "drizzle-orm"; +import { + and, + eq, + gte, + ilike, + inArray, + lte, + ne, + not, + or, + sql, + sum, +} from "drizzle-orm"; import { cartoes, categorias, @@ -97,7 +109,7 @@ export async function fetchCartoesReportData( const cardIds = allCards.map((c) => c.id); - // Fetch current period usage by card + // Fetch current period usage by card (recorrente só conta quando a data da ocorrência já passou) const currentUsageData = await db .select({ cartaoId: lancamentos.cartaoId, @@ -112,6 +124,10 @@ export async function fetchCartoesReportData( eq(pagadores.role, PAGADOR_ROLE_ADMIN), eq(lancamentos.transactionType, DESPESA), inArray(lancamentos.cartaoId, cardIds), + or( + ne(lancamentos.condition, "Recorrente"), + sql`${lancamentos.purchaseDate} <= current_date`, + ), ), ) .groupBy(lancamentos.cartaoId); diff --git a/package.json b/package.json index eac2655..0920c34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmonetis", - "version": "1.7.3", + "version": "1.7.4", "private": true, "scripts": { "dev": "next dev --turbopack",