diff --git a/dist.zip b/dist.zip new file mode 100644 index 0000000..020ae17 Binary files /dev/null and b/dist.zip differ diff --git a/src/modules/intelligence-score/pages/BancoPontosExtrato.tsx b/src/modules/intelligence-score/pages/BancoPontosExtrato.tsx index 3adb508..1bae68a 100644 --- a/src/modules/intelligence-score/pages/BancoPontosExtrato.tsx +++ b/src/modules/intelligence-score/pages/BancoPontosExtrato.tsx @@ -8,12 +8,26 @@ import { ExternalLink, Landmark, Loader2, + Trash2, Wallet, } from "lucide-react"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { Textarea } from "@/components/ui/textarea"; +import { Label } from "@/components/ui/label"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui/alert-dialog"; +import { useAuthAccess } from "@/contexts/AuthAccessContext"; import { fechamentoBancoPontosService, type BancoPontosExtratoItem, @@ -59,6 +73,8 @@ function nomeExibicaoParceiro(p: BancoPontosParceiroExtrato): string { export default function BancoPontosExtrato() { const navigate = useNavigate(); const location = useLocation(); + const { me } = useAuthAccess(); + const podeExcluirTransacao = me?.capabilities.bancoPontos.excluirTransacao ?? false; const { parceiroId = "" } = useParams(); const nomeDoState = (location.state as ExtratoLocationState | null)?.nomeExibicao?.trim(); const [loading, setLoading] = useState(true); @@ -67,6 +83,9 @@ export default function BancoPontosExtrato() { const [linhas, setLinhas] = useState([]); const [meta, setMeta] = useState({ total: 0, paginaAtual: 1, totalPaginas: 1 }); const [page, setPage] = useState(1); + const [linhaParaExcluir, setLinhaParaExcluir] = useState(null); + const [motivoExclusao, setMotivoExclusao] = useState(""); + const [excluindo, setExcluindo] = useState(false); const load = useCallback(async () => { if (!parceiroId) return; @@ -125,6 +144,28 @@ export default function BancoPontosExtrato() { return `Mostrando ${inicio}–${fim} de ${meta.total}`; })(); + const handleExcluirTransacao = async () => { + if (!linhaParaExcluir) return; + const motivo = motivoExclusao.trim(); + if (motivo.length < 3) { + toast.error("Informe o motivo da exclusão (mínimo 3 caracteres)."); + return; + } + try { + setExcluindo(true); + await fechamentoBancoPontosService.excluirTransacao(linhaParaExcluir.id, motivo); + toast.success("Lançamento excluído do extrato."); + setLinhaParaExcluir(null); + setMotivoExclusao(""); + await load(); + } catch (e) { + const msg = e instanceof Error ? e.message : "Erro ao excluir lançamento."; + toast.error(msg); + } finally { + setExcluindo(false); + } + }; + const handleExportarXlsx = async () => { if (!parceiroId) return; try { @@ -220,19 +261,28 @@ export default function BancoPontosExtrato() { Tipo Valor (Pontos) Fechamento + {podeExcluirTransacao ? ( + Ações + ) : null} {loading ? ( - + Carregando extrato... ) : linhasOrdenadas.length === 0 ? ( - + Nenhuma movimentação registrada para este parceiro. @@ -287,6 +337,23 @@ export default function BancoPontosExtrato() { )} + {podeExcluirTransacao ? ( + + + + ) : null} ); }) @@ -330,6 +397,50 @@ export default function BancoPontosExtrato() { + + { + if (!open) { + setLinhaParaExcluir(null); + setMotivoExclusao(""); + } + }} + > + + + Excluir lançamento + + O lançamento será removido do extrato e do saldo, mas permanece registrado no banco com motivo e + auditoria. Esta ação não pode ser desfeita pela interface. + + +
+ +