refactor: migrate from ESLint to Biome and extract SQL queries to data.ts

- Replace ESLint with Biome for linting and formatting
- Configure Biome with tabs, double quotes, and organized imports
- Move all SQL/Drizzle queries from page.tsx files to data.ts files
- Create new data.ts files for: ajustes, dashboard, relatorios/categorias
- Update existing data.ts files: extrato, fatura (add lancamentos queries)
- Remove all drizzle-orm imports from page.tsx files
- Update README.md with new tooling info

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-01-27 13:15:37 +00:00
parent 8ffe61c59b
commit a7f63fb77a
442 changed files with 66141 additions and 69292 deletions

View File

@@ -1,113 +1,113 @@
"use client";
import { RiBankCard2Fill } from "@remixicon/react";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import type { CardDetailData } from "@/lib/relatorios/cartoes-report";
import { title_font } from "@/public/fonts/font_index";
import { RiBankCard2Fill } from "@remixicon/react";
type CardInvoiceStatusProps = {
data: CardDetailData["invoiceStatus"];
data: CardDetailData["invoiceStatus"];
};
const monthLabels = [
"Jan",
"Fev",
"Mar",
"Abr",
"Mai",
"Jun",
"Jul",
"Ago",
"Set",
"Out",
"Nov",
"Dez",
"Jan",
"Fev",
"Mar",
"Abr",
"Mai",
"Jun",
"Jul",
"Ago",
"Set",
"Out",
"Nov",
"Dez",
];
export function CardInvoiceStatus({ data }: CardInvoiceStatusProps) {
const formatCurrency = (value: number) => {
return new Intl.NumberFormat("pt-BR", {
style: "currency",
currency: "BRL",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
};
const formatCurrency = (value: number) => {
return new Intl.NumberFormat("pt-BR", {
style: "currency",
currency: "BRL",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
};
const getStatusBadge = (status: string | null) => {
switch (status) {
case "pago":
return (
<Badge
variant="outline"
className="bg-green-50 text-green-700 border-green-200 dark:bg-green-950 dark:text-green-400 dark:border-green-900"
>
Pago
</Badge>
);
case "pendente":
return (
<Badge
variant="outline"
className="bg-yellow-50 text-yellow-700 border-yellow-200 dark:bg-yellow-950 dark:text-yellow-400 dark:border-yellow-900"
>
Pendente
</Badge>
);
case "atrasado":
return (
<Badge
variant="outline"
className="bg-red-50 text-red-700 border-red-200 dark:bg-red-950 dark:text-red-400 dark:border-red-900"
>
Atrasado
</Badge>
);
default:
return (
<Badge variant="outline" className="text-muted-foreground">
</Badge>
);
}
};
const getStatusBadge = (status: string | null) => {
switch (status) {
case "pago":
return (
<Badge
variant="outline"
className="bg-green-50 text-green-700 border-green-200 dark:bg-green-950 dark:text-green-400 dark:border-green-900"
>
Pago
</Badge>
);
case "pendente":
return (
<Badge
variant="outline"
className="bg-yellow-50 text-yellow-700 border-yellow-200 dark:bg-yellow-950 dark:text-yellow-400 dark:border-yellow-900"
>
Pendente
</Badge>
);
case "atrasado":
return (
<Badge
variant="outline"
className="bg-red-50 text-red-700 border-red-200 dark:bg-red-950 dark:text-red-400 dark:border-red-900"
>
Atrasado
</Badge>
);
default:
return (
<Badge variant="outline" className="text-muted-foreground">
</Badge>
);
}
};
const formatPeriod = (period: string) => {
const [year, month] = period.split("-");
return `${monthLabels[parseInt(month, 10) - 1]}/${year.slice(2)}`;
};
const formatPeriod = (period: string) => {
const [year, month] = period.split("-");
return `${monthLabels[parseInt(month, 10) - 1]}/${year.slice(2)}`;
};
return (
<Card>
<CardHeader className="pb-2">
<CardTitle
className={`${title_font.className} flex items-center gap-1.5 text-base`}
>
<RiBankCard2Fill className="size-4 text-primary" />
Status das Faturas
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
{[...data].reverse().map((invoice) => (
<div
key={invoice.period}
className="flex items-center justify-between py-2 border-b last:border-b-0"
>
<div className="flex items-center gap-3">
<span className="text-sm font-medium w-16">
{formatPeriod(invoice.period)}
</span>
{getStatusBadge(invoice.status)}
</div>
<span className="text-sm font-bold">
{formatCurrency(invoice.amount)}
</span>
</div>
))}
</div>
</CardContent>
</Card>
);
return (
<Card>
<CardHeader className="pb-2">
<CardTitle
className={`${title_font.className} flex items-center gap-1.5 text-base`}
>
<RiBankCard2Fill className="size-4 text-primary" />
Status das Faturas
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
{[...data].reverse().map((invoice) => (
<div
key={invoice.period}
className="flex items-center justify-between py-2 border-b last:border-b-0"
>
<div className="flex items-center gap-3">
<span className="text-sm font-medium w-16">
{formatPeriod(invoice.period)}
</span>
{getStatusBadge(invoice.status)}
</div>
<span className="text-sm font-bold">
{formatCurrency(invoice.amount)}
</span>
</div>
))}
</div>
</CardContent>
</Card>
);
}