mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-06-10 07:16:01 +00:00
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:
@@ -6,7 +6,7 @@ import { toast } from "sonner";
|
||||
import {
|
||||
ALLOWED_MIME_TYPES,
|
||||
DEFAULT_MAX_FILE_SIZE_MB,
|
||||
} from "@/features/transactions/attachments-config";
|
||||
} from "@/features/transactions/lib/attachments-config";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
|
||||
interface AttachmentFilePickerProps {
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
import {
|
||||
ALLOWED_MIME_TYPES,
|
||||
DEFAULT_MAX_FILE_SIZE_MB,
|
||||
} from "@/features/transactions/attachments-config";
|
||||
} from "@/features/transactions/lib/attachments-config";
|
||||
|
||||
interface AttachmentUploadProps {
|
||||
transactionId: string;
|
||||
|
||||
@@ -7,7 +7,7 @@ import { CategoryIcon } from "@/features/categories/components/category-icon";
|
||||
import {
|
||||
createInstallmentAnticipationAction,
|
||||
getEligibleInstallmentsAction,
|
||||
} from "@/features/transactions/anticipation-actions";
|
||||
} from "@/features/transactions/actions/anticipation";
|
||||
import MoneyValues from "@/shared/components/money-values";
|
||||
import { PeriodPicker } from "@/shared/components/period-picker";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { useMemo, useState, useTransition } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { createTransactionAction } from "@/features/transactions/actions";
|
||||
import { groupAndSortCategories } from "@/features/transactions/category-helpers";
|
||||
import { groupAndSortCategories } from "@/features/transactions/lib/category-helpers";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import {
|
||||
Dialog,
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
import { RiAddLine, RiDeleteBinLine } from "@remixicon/react";
|
||||
import { useMemo, useState } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { groupAndSortCategories } from "@/features/transactions/category-helpers";
|
||||
import { groupAndSortCategories } from "@/features/transactions/lib/category-helpers";
|
||||
import {
|
||||
PAYMENT_METHODS,
|
||||
type TRANSACTION_TYPES,
|
||||
} from "@/features/transactions/constants";
|
||||
} from "@/features/transactions/lib/constants";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import { CurrencyInput } from "@/shared/components/ui/currency-input";
|
||||
import { DatePicker } from "@/shared/components/ui/date-picker";
|
||||
@@ -51,7 +51,7 @@ import {
|
||||
PaymentMethodSelectContent,
|
||||
TransactionTypeSelectContent,
|
||||
} from "../select-items";
|
||||
import { EstabelecimentoInput } from "../shared/establishment-input";
|
||||
import { EstablishmentInput } from "../shared/establishment-input";
|
||||
import type { SelectOption } from "../types";
|
||||
|
||||
/** Payment methods sem Boleto para este modal */
|
||||
@@ -490,7 +490,7 @@ export function MassAddDialog({
|
||||
>
|
||||
Estabelecimento {index + 1}
|
||||
</Label>
|
||||
<EstabelecimentoInput
|
||||
<EstablishmentInput
|
||||
id={`name-${transaction.id}`}
|
||||
placeholder="Local"
|
||||
value={transaction.name}
|
||||
|
||||
@@ -4,8 +4,8 @@ import { useRouter } from "next/navigation";
|
||||
import { useEffect, useMemo, useState, useTransition } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { refundTransactionAction } from "@/features/transactions/actions/refund-action";
|
||||
import { deriveCreditCardPeriod } from "@/features/transactions/form-helpers";
|
||||
import { formatDate } from "@/features/transactions/formatting-helpers";
|
||||
import { deriveCreditCardPeriod } from "@/features/transactions/lib/form-helpers";
|
||||
import { formatDate } from "@/features/transactions/lib/formatting-helpers";
|
||||
import { PeriodPicker } from "@/shared/components/period-picker";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import { DatePicker } from "@/shared/components/ui/date-picker";
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
formatCondition,
|
||||
formatDate,
|
||||
formatPeriod,
|
||||
} from "@/features/transactions/formatting-helpers";
|
||||
} from "@/features/transactions/lib/formatting-helpers";
|
||||
import { TransactionTypeBadge } from "@/shared/components/transaction-type-badge";
|
||||
import {
|
||||
Avatar,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { CalculatorDialogButton } from "@/shared/components/calculator/calculato
|
||||
import { CurrencyInput } from "@/shared/components/ui/currency-input";
|
||||
import { DatePicker } from "@/shared/components/ui/date-picker";
|
||||
import { Label } from "@/shared/components/ui/label";
|
||||
import { EstabelecimentoInput } from "../../shared/establishment-input";
|
||||
import { EstablishmentInput } from "../../shared/establishment-input";
|
||||
import type { BasicFieldsSectionProps } from "./transaction-dialog-types";
|
||||
|
||||
export function BasicFieldsSection({
|
||||
@@ -17,7 +17,7 @@ export function BasicFieldsSection({
|
||||
<div className="space-y-3">
|
||||
<div className="space-y-1">
|
||||
<Label htmlFor="name">Descrição</Label>
|
||||
<EstabelecimentoInput
|
||||
<EstablishmentInput
|
||||
id="name"
|
||||
value={formState.name}
|
||||
onChange={(value) => onFieldChange("name", value)}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { TRANSACTION_TYPES } from "@/features/transactions/constants";
|
||||
import { TRANSACTION_TYPES } from "@/features/transactions/lib/constants";
|
||||
import { Label } from "@/shared/components/ui/label";
|
||||
import {
|
||||
Select,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { TRANSACTION_CONDITIONS } from "@/features/transactions/constants";
|
||||
import { TRANSACTION_CONDITIONS } from "@/features/transactions/lib/constants";
|
||||
import { Label } from "@/shared/components/ui/label";
|
||||
import {
|
||||
Select,
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
RiCheckboxCircleFill,
|
||||
} from "@remixicon/react";
|
||||
import { useState } from "react";
|
||||
import { PAYMENT_METHODS } from "@/features/transactions/constants";
|
||||
import { PAYMENT_METHODS } from "@/features/transactions/lib/constants";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import { Label } from "@/shared/components/ui/label";
|
||||
import { MonthPicker } from "@/shared/components/ui/month-picker";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { TransactionFormState } from "@/features/transactions/form-helpers";
|
||||
import type { TransactionFormState } from "@/features/transactions/lib/form-helpers";
|
||||
import type { SelectOption, TransactionItem } from "../../types";
|
||||
|
||||
export type FormState = TransactionFormState;
|
||||
@@ -71,7 +71,7 @@ export interface TransactionDialogProps {
|
||||
}) => void;
|
||||
}
|
||||
|
||||
export interface BaseFieldSectionProps {
|
||||
interface BaseFieldSectionProps {
|
||||
formState: FormState;
|
||||
onFieldChange: <Key extends keyof FormState>(
|
||||
key: Key,
|
||||
|
||||
@@ -14,12 +14,12 @@ import {
|
||||
import {
|
||||
filterSecondaryPayerOptions,
|
||||
groupAndSortCategories,
|
||||
} from "@/features/transactions/category-helpers";
|
||||
} from "@/features/transactions/lib/category-helpers";
|
||||
import {
|
||||
applyFieldDependencies,
|
||||
buildTransactionInitialState,
|
||||
deriveCreditCardPeriod,
|
||||
} from "@/features/transactions/form-helpers";
|
||||
} from "@/features/transactions/lib/form-helpers";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import {
|
||||
Collapsible,
|
||||
|
||||
@@ -19,7 +19,7 @@ import {
|
||||
SelectValue,
|
||||
} from "@/shared/components/ui/select";
|
||||
|
||||
export type AccountCardValue = `card:${string}` | `account:${string}`;
|
||||
type AccountCardValue = `card:${string}` | `account:${string}`;
|
||||
|
||||
export function encodeAccountCard(
|
||||
type: "card" | "account",
|
||||
|
||||
@@ -21,7 +21,7 @@ import { ConfirmActionDialog } from "@/shared/components/confirm-action-dialog";
|
||||
import type {
|
||||
TransactionsExportContext,
|
||||
TransactionsPaginationState,
|
||||
} from "../../export-types";
|
||||
} from "../../lib/export-types";
|
||||
import { AnticipateInstallmentsDialog } from "../dialogs/anticipate-installments-dialog/anticipate-installments-dialog";
|
||||
import { AnticipationHistoryDialog } from "../dialogs/anticipate-installments-dialog/anticipation-history-dialog";
|
||||
import {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { RiBankCard2Line, RiBankLine } from "@remixicon/react";
|
||||
import Image from "next/image";
|
||||
import { CategoryIcon } from "@/features/categories/components/category-icon";
|
||||
import StatusDot from "@/shared/components/status-dot";
|
||||
import StatusDot from "@/shared/components/feedback/status-dot";
|
||||
import {
|
||||
Avatar,
|
||||
AvatarFallback,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { format } from "date-fns";
|
||||
import { ptBR } from "date-fns/locale";
|
||||
import { useTransition } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { cancelInstallmentAnticipationAction } from "@/features/transactions/anticipation-actions";
|
||||
import { cancelInstallmentAnticipationAction } from "@/features/transactions/actions/anticipation";
|
||||
import type { InstallmentAnticipationListItem } from "@/features/transactions/hooks/use-installment-anticipations";
|
||||
import { ConfirmActionDialog } from "@/shared/components/confirm-action-dialog";
|
||||
import MoneyValues from "@/shared/components/money-values";
|
||||
|
||||
@@ -17,7 +17,7 @@ import {
|
||||
PopoverTrigger,
|
||||
} from "@/shared/components/ui/popover";
|
||||
|
||||
export interface EstabelecimentoInputProps {
|
||||
interface EstablishmentInputProps {
|
||||
id?: string;
|
||||
value: string;
|
||||
onChange: (value: string) => void;
|
||||
@@ -27,7 +27,7 @@ export interface EstabelecimentoInputProps {
|
||||
maxLength?: number;
|
||||
}
|
||||
|
||||
export function EstabelecimentoInput({
|
||||
export function EstablishmentInput({
|
||||
id,
|
||||
value,
|
||||
onChange,
|
||||
@@ -35,7 +35,7 @@ export function EstabelecimentoInput({
|
||||
placeholder = "Ex.: Padaria, Transferência, Saldo inicial",
|
||||
required = false,
|
||||
maxLength = 20,
|
||||
}: EstabelecimentoInputProps) {
|
||||
}: EstablishmentInputProps) {
|
||||
const [open, setOpen] = React.useState(false);
|
||||
const [searchValue, setSearchValue] = React.useState("");
|
||||
const [width, setWidth] = React.useState<number | undefined>();
|
||||
|
||||
@@ -18,11 +18,11 @@ import {
|
||||
import type { ColumnDef } from "@tanstack/react-table";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import { DEFAULT_LANCAMENTOS_COLUMN_ORDER } from "@/features/transactions/column-order";
|
||||
import { DEFAULT_TRANSACTIONS_COLUMN_ORDER } from "@/features/transactions/lib/column-order";
|
||||
import {
|
||||
CREDIT_CARD_PAYMENT_METHOD,
|
||||
SETTLEABLE_PAYMENT_METHODS,
|
||||
} from "@/features/transactions/constants";
|
||||
} from "@/features/transactions/lib/constants";
|
||||
import {
|
||||
CategoryIconBadge,
|
||||
EstablishmentLogo,
|
||||
@@ -58,7 +58,7 @@ import { getConditionIcon, getPaymentMethodIcon } from "@/shared/utils/icons";
|
||||
import { cn } from "@/shared/utils/ui";
|
||||
import type { TransactionItem } from "../types";
|
||||
|
||||
export type BuildColumnsArgs = {
|
||||
type BuildColumnsArgs = {
|
||||
currentUserId: string;
|
||||
noteAsColumn: boolean;
|
||||
onEdit?: (item: TransactionItem) => void;
|
||||
@@ -748,6 +748,6 @@ export function getTransactionColumns(
|
||||
const built = buildColumns(args);
|
||||
const order = args.columnOrder?.length
|
||||
? args.columnOrder
|
||||
: DEFAULT_LANCAMENTOS_COLUMN_ORDER;
|
||||
: DEFAULT_TRANSACTIONS_COLUMN_ORDER;
|
||||
return reorderColumnsByPreference(built, order);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ import {
|
||||
SETTLED_FILTER_VALUES,
|
||||
TRANSACTION_CONDITIONS,
|
||||
TRANSACTION_TYPES,
|
||||
} from "@/features/transactions/constants";
|
||||
} from "@/features/transactions/lib/constants";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import {
|
||||
Command,
|
||||
|
||||
@@ -20,8 +20,8 @@ import { useMemo, useState } from "react";
|
||||
import type {
|
||||
TransactionsExportContext,
|
||||
TransactionsPaginationState,
|
||||
} from "@/features/transactions/export-types";
|
||||
import { EmptyState } from "@/shared/components/empty-state";
|
||||
} from "@/features/transactions/lib/export-types";
|
||||
import { EmptyState } from "@/shared/components/feedback/empty-state";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import { Card, CardContent } from "@/shared/components/ui/card";
|
||||
import {
|
||||
@@ -50,7 +50,7 @@ import { getTransactionColumns } from "./transactions-columns";
|
||||
import { TransactionsFilters } from "./transactions-filters";
|
||||
import { TransactionsPagination } from "./transactions-pagination";
|
||||
|
||||
type LancamentosTableProps = {
|
||||
type TransactionsTableProps = {
|
||||
data: TransactionItem[];
|
||||
currentUserId: string;
|
||||
noteAsColumn?: boolean;
|
||||
@@ -106,7 +106,7 @@ export function TransactionsTable({
|
||||
isSettlementLoading,
|
||||
showActions = true,
|
||||
showFilters = true,
|
||||
}: LancamentosTableProps) {
|
||||
}: TransactionsTableProps) {
|
||||
const router = useRouter();
|
||||
const pathname = usePathname();
|
||||
const searchParams = useSearchParams();
|
||||
|
||||
@@ -9,8 +9,8 @@ import {
|
||||
import { useState } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { exportTransactionsDataAction } from "@/features/transactions/actions";
|
||||
import type { TransactionsExportContext } from "@/features/transactions/export-types";
|
||||
import { formatCurrency } from "@/features/transactions/formatting-helpers";
|
||||
import type { TransactionsExportContext } from "@/features/transactions/lib/export-types";
|
||||
import { formatCurrency } from "@/features/transactions/lib/formatting-helpers";
|
||||
import { Button } from "@/shared/components/ui/button";
|
||||
import {
|
||||
DropdownMenu,
|
||||
@@ -26,7 +26,7 @@ import {
|
||||
import { displayPeriod } from "@/shared/utils/period";
|
||||
import type { TransactionItem } from "./types";
|
||||
|
||||
interface LancamentosExportProps {
|
||||
interface TransactionsExportProps {
|
||||
lancamentos: TransactionItem[];
|
||||
period: string;
|
||||
exportContext?: TransactionsExportContext;
|
||||
@@ -47,7 +47,7 @@ export function TransactionsExport({
|
||||
lancamentos,
|
||||
period,
|
||||
exportContext,
|
||||
}: LancamentosExportProps) {
|
||||
}: TransactionsExportProps) {
|
||||
const [isExporting, setIsExporting] = useState(false);
|
||||
|
||||
const getFileName = (extension: string) => {
|
||||
|
||||
Reference in New Issue
Block a user