feat: aprimora a exibição do cartão de parcelas e ajusta a lógica de busca

- Melhora a apresentação do nome do grupo e do cartão no componente
  InstallmentGroupCard, utilizando um layout mais compacto.
- Altera a lógica de busca na função fetchInstallmentAnalysis para incluir
  lançamentos parcelados apenas do pagador com a função de admin.
This commit is contained in:
Felipe Coutinho
2025-11-23 14:52:22 -03:00
parent e8a343a6dd
commit a34d92f3bd
2 changed files with 29 additions and 23 deletions

View File

@@ -67,42 +67,45 @@ export function InstallmentGroupCard({
/>
<div className="min-w-0 flex-1">
<div className="flex items-start justify-between gap-3">
<div className="flex items-start justify-between">
<div className="min-w-0 flex-1">
<p className="text-sm font-bold">{group.name}</p>
{group.cartaoName && (
<div className="mt-0.5 flex items-center gap-1">
{group.cartaoLogo && (
<img
src={`/logos/${group.cartaoLogo}`}
alt={group.cartaoName}
className="h-5 w-auto object-contain rounded"
/>
)}
<span className="text-xs text-muted-foreground">
{group.cartaoName}
</span>
</div>
)}
<div className="flex gap-1 items-center">
{group.cartaoLogo && (
<img
src={`/logos/${group.cartaoLogo}`}
alt={group.cartaoName}
className="h-6 w-auto object-contain rounded"
/>
)}
<span className="font-medium">{group.name}</span>|
<span className="text-xs text-muted-foreground">
{group.cartaoName}
</span>
</div>
</div>
<div className="flex shrink-0 flex-col items-end gap-0.5">
<div className="shrink-0 flex items-center gap-0.5">
<MoneyValues
amount={group.totalPendingAmount}
className="text-sm font-semibold"
className="text-base font-bold"
/>
{selectedInstallments.size > 0 && (
<span className="mx-1 text-muted-foreground">|</span>
)}
{selectedInstallments.size > 0 && (
<MoneyValues
amount={selectedAmount}
className="text-xs text-primary"
className="text-base text-primary"
/>
)}
</div>
</div>
{/* Progress bar */}
<div className="mt-2">
<div className="mb-1 flex items-center justify-between text-xs text-muted-foreground">
<div className="mt-3">
<div className="mb-2 flex items-center px-1 justify-between text-xs text-muted-foreground">
<span>
{group.paidInstallments} de {group.totalInstallments} pagas
</span>

View File

@@ -1,10 +1,11 @@
import { cartoes, lancamentos } from "@/db/schema";
import { cartoes, lancamentos, pagadores } from "@/db/schema";
import {
ACCOUNT_AUTO_INVOICE_NOTE_PREFIX,
INITIAL_BALANCE_NOTE,
} from "@/lib/accounts/constants";
import { db } from "@/lib/db";
import { toNumber } from "@/lib/dashboard/common";
import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants";
import { and, eq, isNotNull, isNull, or, sql } from "drizzle-orm";
// Calcula a data de vencimento baseada no período e dia de vencimento do cartão
@@ -58,7 +59,7 @@ export type InstallmentAnalysisData = {
export async function fetchInstallmentAnalysis(
userId: string
): Promise<InstallmentAnalysisData> {
// 1. Buscar todos os lançamentos parcelados não antecipados
// 1. Buscar todos os lançamentos parcelados não antecipados do pagador admin
const installmentRows = await db
.select({
id: lancamentos.id,
@@ -80,6 +81,7 @@ export async function fetchInstallmentAnalysis(
})
.from(lancamentos)
.leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id))
.leftJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id))
.where(
and(
eq(lancamentos.userId, userId),
@@ -87,6 +89,7 @@ export async function fetchInstallmentAnalysis(
eq(lancamentos.condition, "Parcelado"),
eq(lancamentos.isAnticipated, false),
isNotNull(lancamentos.seriesId),
eq(pagadores.role, PAGADOR_ROLE_ADMIN),
or(
isNull(lancamentos.note),
and(