refactor: faxina arquitetural — código morto, identificadores em inglês e estrutura padronizada

Refatoração estrutural sem mudanças funcionais. Saldo líquido: −428 linhas.

Removido:
- 14 funções/constantes mortas verificadas via grep no repo todo: validateCategoriaOwnership,
  getInstallmentAnticipationsAction, getAnticipationDetailsAction, formatDecimalForDb,
  currencyFormatterNoCents, optionalDecimalSchema, formatMonthLabel,
  getGoalProgressStatusColorClass, MONTH_PERIOD_PARAM, calculateRemainingInstallments,
  e 5 funções fetch* não usadas em inbox/queries.ts.
- 1 tipo morto (ImportRow) + 2 órfãos consequentes (InstallmentAnticipationWithRelations,
  GoalProgressStatus convertido em interno).
- ~30 export keywords desnecessários (símbolos usados apenas no próprio arquivo).
- Re-exports mortos em barrels: EstablishmentLogoPicker, CategoryReportSkeleton,
  WidgetSkeleton, toNameKey.
- Arquivo features/reports/types.ts (barrel inteiro era órfão).

Padronizado (PT-BR→EN em identificadores expostos):
- 4 constantes globais (LANCAMENTOS_* → TRANSACTIONS_*).
- 12 tipos/interfaces (Lancamento*/Pagador*/Estabelecimento* → equivalentes EN).
- 13 funções/components exportados (fetchPagador*, EstabelecimentoInput, PagadorInfoCard, etc.).
- 5 props cross-file (preLancamentosCount → inboxPendingCount, pagadorAvatarUrl → payerAvatarUrl, etc.).
- Mantidas em PT-BR conforme exceção do CLAUDE.md: variáveis locais (pagador, categoria,
  lancamento), accessor key pagadorName (persistida em preferências), strings de UI.

Reorganizado:
- transactions/: 14 helpers soltos na raiz movidos para lib/; barrel actions.ts reduzido
  de 76 linhas de wrappers para 14 linhas de re-exports puros; anticipation-actions.ts
  movido para actions/anticipation.ts.
- dashboard/: 8 helpers soltos consolidados em dashboard/lib/.
- reports/: 5 query files na raiz consolidados em reports/lib/.
- payers/: detail-actions.ts (21KB) e detail-queries.ts movidos para payers/lib/.
- shared/components/: 9 dos 16 componentes soltos agrupados em brand/, widgets/, feedback/.
- shared/lib/fetch-json.ts movido para shared/utils/fetch-json.ts.

Validação: pnpm exec tsc --noEmit (0 erros), biome check (0 issues), knip (sem unused).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-05-06 18:42:54 +00:00
parent b9b843b9db
commit 7d0781b035
229 changed files with 415 additions and 872 deletions

View File

@@ -2,16 +2,16 @@ import { RiBankCard2Line } from "@remixicon/react";
import Image from "next/image";
import MoneyValues from "@/shared/components/money-values";
import { CardContent } from "@/shared/components/ui/card";
import { WidgetEmptyState } from "@/shared/components/widget-empty-state";
import { WidgetEmptyState } from "@/shared/components/widgets/widget-empty-state";
import { resolveLogoSrc } from "@/shared/lib/logo";
import type { PayerCardUsageItem } from "@/shared/lib/payers/details";
import { buildInitials } from "@/shared/utils/initials";
type PagadorCardUsageCardProps = {
type PayerCardUsageCardProps = {
items: PayerCardUsageItem[];
};
export function PayerCardUsageCard({ items }: PagadorCardUsageCardProps) {
export function PayerCardUsageCard({ items }: PayerCardUsageCardProps) {
if (items.length === 0) {
return (
<CardContent className="px-0">

View File

@@ -13,7 +13,7 @@ import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState, useTransition } from "react";
import { toast } from "sonner";
import { sendPayerSummaryAction } from "@/features/payers/detail-actions";
import { sendPayerSummaryAction } from "@/features/payers/lib/detail-actions";
import { Badge } from "@/shared/components/ui/badge";
import { Button } from "@/shared/components/ui/button";
import {

View File

@@ -20,7 +20,7 @@ import {
ChartTooltip,
ChartTooltipContent,
} from "@/shared/components/ui/chart";
import { WidgetEmptyState } from "@/shared/components/widget-empty-state";
import { WidgetEmptyState } from "@/shared/components/widgets/widget-empty-state";
import type { PayerHistoryPoint } from "@/shared/lib/payers/details";
import { currencyFormatter } from "@/shared/utils/currency";
@@ -31,7 +31,7 @@ const chartConfig = {
},
};
type PagadorHistoryCardProps = {
type PayerHistoryCardProps = {
data: PayerHistoryPoint[];
};
@@ -57,7 +57,7 @@ const ValueLabel = (props: LabelProps) => {
);
};
export function PayerHistoryCard({ data }: PagadorHistoryCardProps) {
export function PayerHistoryCard({ data }: PayerHistoryCardProps) {
const hasData = data.length > 0;
return (

View File

@@ -17,7 +17,7 @@ type PayerInfoCardProps = {
payer: PayerInfo;
};
export function PagadorInfoCard({ payer }: PayerInfoCardProps) {
export function PayerInfoCard({ payer }: PayerInfoCardProps) {
const showSensitiveDetails = payer.canEdit;
const getStatusBadgeVariant = (status: string): "success" | "outline" => {

View File

@@ -14,7 +14,7 @@ import {
} from "@/shared/components/ui/card";
import { formatDateTime } from "@/shared/utils/date";
interface PagadorLeaveShareCardProps {
interface PayerLeaveShareCardProps {
shareId: string;
pagadorName: string;
createdAt: string;
@@ -24,7 +24,7 @@ export function PayerLeaveShareCard({
shareId,
pagadorName,
createdAt,
}: PagadorLeaveShareCardProps) {
}: PayerLeaveShareCardProps) {
const router = useRouter();
const [isPending, startTransition] = useTransition();
const [showConfirm, setShowConfirm] = useState(false);

View File

@@ -24,7 +24,7 @@ const segmentConfig = {
},
} as const;
type PagadorMonthlySummaryCardProps = {
type PayerMonthlySummaryCardProps = {
periodLabel: string;
breakdown: PayerMonthlyBreakdown;
};
@@ -32,7 +32,7 @@ type PagadorMonthlySummaryCardProps = {
export function PayerMonthlySummaryCard({
periodLabel,
breakdown,
}: PagadorMonthlySummaryCardProps) {
}: PayerMonthlySummaryCardProps) {
const splittableEntries = (
Object.keys(segmentConfig) as Array<keyof typeof segmentConfig>
).map((key) => ({

View File

@@ -10,7 +10,7 @@ import MoneyValues from "@/shared/components/money-values";
import { CardContent } from "@/shared/components/ui/card";
import { Progress } from "@/shared/components/ui/progress";
import { Separator } from "@/shared/components/ui/separator";
import { WidgetEmptyState } from "@/shared/components/widget-empty-state";
import { WidgetEmptyState } from "@/shared/components/widgets/widget-empty-state";
import type {
PayerBoletoItem,
PayerPaymentStatusData,
@@ -19,11 +19,11 @@ import { cn } from "@/shared/utils/ui";
// --- PayerBoletoCard ---
type PagadorBoletoCardProps = {
type PayerBoletoCardProps = {
items: PayerBoletoItem[];
};
export function PayerBoletoCard({ items }: PagadorBoletoCardProps) {
export function PayerBoletoCard({ items }: PayerBoletoCardProps) {
if (items.length === 0) {
return (
<CardContent className="px-0">
@@ -72,13 +72,11 @@ export function PayerBoletoCard({ items }: PagadorBoletoCardProps) {
// --- PayerPaymentStatusCard ---
type PagadorPaymentStatusCardProps = {
type PayerPaymentStatusCardProps = {
data: PayerPaymentStatusData;
};
export function PayerPaymentStatusCard({
data,
}: PagadorPaymentStatusCardProps) {
export function PayerPaymentStatusCard({ data }: PayerPaymentStatusCardProps) {
const { paidAmount, paidCount, pendingAmount, pendingCount, totalAmount } =
data;

View File

@@ -16,7 +16,7 @@ import {
CardTitle,
} from "@/shared/components/ui/card";
type PagadorShare = {
type PayerShare = {
id: string;
userId: string;
name: string;
@@ -24,17 +24,17 @@ type PagadorShare = {
createdAt: string;
};
interface PagadorSharingCardProps {
interface PayerSharingCardProps {
payerId: string;
shareCode: string;
shares: PagadorShare[];
shares: PayerShare[];
}
export function PayerSharingCard({
payerId,
shareCode,
shares,
}: PagadorSharingCardProps) {
}: PayerSharingCardProps) {
const router = useRouter();
const [currentCode, setCurrentCode] = useState(shareCode);
const [regeneratePending, startRegenerate] = useTransition();

View File

@@ -1,6 +1,6 @@
"use client";
import StatusDot from "@/shared/components/status-dot";
import StatusDot from "@/shared/components/feedback/status-dot";
export function StatusSelectContent({ label }: { label: string }) {
const isActive = label === "Ativo";