import { useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import { ClipboardList, ExternalLink, Plus } from "lucide-react"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { fechamentoCompetenciasService, type CompetenciaItem } from "@/services/fechamento/competencias"; const meses = [ "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro", ]; function formatCompetenciaMes(mes: number, ano: number): string { return `${meses[mes - 1] ?? `Mês ${mes}`} / ${ano}`; } export default function Fechamentos() { const navigate = useNavigate(); const currentYear = new Date().getFullYear(); const [allCompetencias, setAllCompetencias] = useState([]); const [loading, setLoading] = useState(true); const [anoSelecionado, setAnoSelecionado] = useState(""); const [modalAberto, setModalAberto] = useState(false); const [mesSelecionado, setMesSelecionado] = useState(""); const [anoNovo, setAnoNovo] = useState(""); const [criando, setCriando] = useState(false); const anosDisponiveis = useMemo(() => { const anosUnicos = [...new Set(allCompetencias.map((c) => c.ano))]; if (!anosUnicos.includes(currentYear)) { anosUnicos.push(currentYear); } return anosUnicos.sort((a, b) => b - a).map(String); }, [allCompetencias, currentYear]); const competenciasFiltradas = useMemo(() => { if (!anoSelecionado) return []; return allCompetencias .filter((c) => c.ano === Number(anoSelecionado)) .slice() .sort((a, b) => a.mes - b.mes); }, [allCompetencias, anoSelecionado]); useEffect(() => { let cancelled = false; const loadCompetencias = async () => { try { setLoading(true); const data = await fechamentoCompetenciasService.listarCompetencias({}); if (!cancelled) { setAllCompetencias(data); } } catch (error) { if (!cancelled) { const message = error instanceof Error ? error.message : "Erro ao carregar competências."; toast.error(message); setAllCompetencias([]); } } finally { if (!cancelled) { setLoading(false); } } }; void loadCompetencias(); return () => { cancelled = true; }; }, []); useEffect(() => { if (anosDisponiveis.length > 0 && !anoSelecionado) { const defaultAno = anosDisponiveis.includes(String(currentYear)) ? String(currentYear) : anosDisponiveis[0]; setAnoSelecionado(defaultAno); } }, [anosDisponiveis, anoSelecionado, currentYear]); const handleCriarCompetencia = async () => { const mes = Number(mesSelecionado); const ano = Number(anoNovo); if (!mes || !ano) { toast.error("Selecione mês e ano."); return; } setCriando(true); try { const nova = await fechamentoCompetenciasService.criarCompetencia({ mes, ano }); setAllCompetencias((prev) => [...prev, nova]); setModalAberto(false); setMesSelecionado(""); setAnoNovo(""); toast.success("Competência criada com sucesso."); setAnoSelecionado(String(ano)); } catch (error) { const message = error instanceof Error ? error.message : "Erro ao criar competência."; toast.error(message); } finally { setCriando(false); } }; return (

Fechamentos

Nova Competência
Ano:
{!loading && competenciasFiltradas.length === 0 ? ( Nenhuma competência encontrada Não há competências cadastradas para o ano selecionado. ) : (
Mês Quantidade de Fechamentos Status Acessar {loading ? ( Carregando competências... ) : ( competenciasFiltradas.map((competencia) => ( {formatCompetenciaMes(competencia.mes, competencia.ano)} {competencia.quantidadeFechamentos} {competencia.status === "concluido" ? "Concluída" : "Em aberto"}
)) )}
)}
); }