forked from git.gladyson/openmonetis
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:
@@ -67,42 +67,45 @@ export function InstallmentGroupCard({
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="min-w-0 flex-1">
|
<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">
|
<div className="min-w-0 flex-1">
|
||||||
<p className="text-sm font-bold">{group.name}</p>
|
<div className="flex gap-1 items-center">
|
||||||
{group.cartaoName && (
|
{group.cartaoLogo && (
|
||||||
<div className="mt-0.5 flex items-center gap-1">
|
<img
|
||||||
{group.cartaoLogo && (
|
src={`/logos/${group.cartaoLogo}`}
|
||||||
<img
|
alt={group.cartaoName}
|
||||||
src={`/logos/${group.cartaoLogo}`}
|
className="h-6 w-auto object-contain rounded"
|
||||||
alt={group.cartaoName}
|
/>
|
||||||
className="h-5 w-auto object-contain rounded"
|
)}
|
||||||
/>
|
<span className="font-medium">{group.name}</span>|
|
||||||
)}
|
<span className="text-xs text-muted-foreground">
|
||||||
<span className="text-xs text-muted-foreground">
|
{group.cartaoName}
|
||||||
{group.cartaoName}
|
</span>
|
||||||
</span>
|
</div>
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</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
|
<MoneyValues
|
||||||
amount={group.totalPendingAmount}
|
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 && (
|
{selectedInstallments.size > 0 && (
|
||||||
<MoneyValues
|
<MoneyValues
|
||||||
amount={selectedAmount}
|
amount={selectedAmount}
|
||||||
className="text-xs text-primary"
|
className="text-base text-primary"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Progress bar */}
|
{/* Progress bar */}
|
||||||
<div className="mt-2">
|
<div className="mt-3">
|
||||||
<div className="mb-1 flex items-center justify-between text-xs text-muted-foreground">
|
<div className="mb-2 flex items-center px-1 justify-between text-xs text-muted-foreground">
|
||||||
<span>
|
<span>
|
||||||
{group.paidInstallments} de {group.totalInstallments} pagas
|
{group.paidInstallments} de {group.totalInstallments} pagas
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import { cartoes, lancamentos } from "@/db/schema";
|
import { cartoes, lancamentos, pagadores } from "@/db/schema";
|
||||||
import {
|
import {
|
||||||
ACCOUNT_AUTO_INVOICE_NOTE_PREFIX,
|
ACCOUNT_AUTO_INVOICE_NOTE_PREFIX,
|
||||||
INITIAL_BALANCE_NOTE,
|
INITIAL_BALANCE_NOTE,
|
||||||
} from "@/lib/accounts/constants";
|
} from "@/lib/accounts/constants";
|
||||||
import { db } from "@/lib/db";
|
import { db } from "@/lib/db";
|
||||||
import { toNumber } from "@/lib/dashboard/common";
|
import { toNumber } from "@/lib/dashboard/common";
|
||||||
|
import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants";
|
||||||
import { and, eq, isNotNull, isNull, or, sql } from "drizzle-orm";
|
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
|
// 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(
|
export async function fetchInstallmentAnalysis(
|
||||||
userId: string
|
userId: string
|
||||||
): Promise<InstallmentAnalysisData> {
|
): 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
|
const installmentRows = await db
|
||||||
.select({
|
.select({
|
||||||
id: lancamentos.id,
|
id: lancamentos.id,
|
||||||
@@ -80,6 +81,7 @@ export async function fetchInstallmentAnalysis(
|
|||||||
})
|
})
|
||||||
.from(lancamentos)
|
.from(lancamentos)
|
||||||
.leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id))
|
.leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id))
|
||||||
|
.leftJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id))
|
||||||
.where(
|
.where(
|
||||||
and(
|
and(
|
||||||
eq(lancamentos.userId, userId),
|
eq(lancamentos.userId, userId),
|
||||||
@@ -87,6 +89,7 @@ export async function fetchInstallmentAnalysis(
|
|||||||
eq(lancamentos.condition, "Parcelado"),
|
eq(lancamentos.condition, "Parcelado"),
|
||||||
eq(lancamentos.isAnticipated, false),
|
eq(lancamentos.isAnticipated, false),
|
||||||
isNotNull(lancamentos.seriesId),
|
isNotNull(lancamentos.seriesId),
|
||||||
|
eq(pagadores.role, PAGADOR_ROLE_ADMIN),
|
||||||
or(
|
or(
|
||||||
isNull(lancamentos.note),
|
isNull(lancamentos.note),
|
||||||
and(
|
and(
|
||||||
|
|||||||
Reference in New Issue
Block a user