From 9b9f8b9454e2ef070ff4fd5a34e3c4f3b8733898 Mon Sep 17 00:00:00 2001 From: keven Date: Fri, 24 Oct 2025 10:52:34 -0300 Subject: [PATCH] [MVPTN-119] feat(CRUD): Cria cruds para manipular GEmolumento e GSeloGrupo --- .../financeiro/emolumentos/page.tsx | 9 + .../administrativo/selos/grupos/page.tsx | 9 + src/components/app-sidebar.tsx | 8 + .../GEmolumento/GEmolumentoColumns.tsx | 78 ++++ .../GEmolumento/GEmolumentoForm.tsx | 367 ++++++++++++++++++ .../GEmolumento/GEmolumentoIndex.tsx | 161 ++++++++ .../GEmolumento/GEmolumentoTable.tsx | 23 ++ .../GSeloGrupo/GSeloGrupoColumns.tsx | 78 ++++ .../components/GSeloGrupo/GSeloGrupoForm.tsx | 301 ++++++++++++++ .../components/GSeloGrupo/GSeloGrupoIndex.tsx | 161 ++++++++ .../GSeloGrupo/GSeloGrupoSelect.tsx | 115 ++++++ .../components/GSeloGrupo/GSeloGrupoTable.tsx | 23 ++ .../components/TImovel/TImovelForm.tsx | 4 +- .../data/GEmolumento/GEmolumentoDeleteData.ts | 16 + .../data/GEmolumento/GEmolumentoIndexData.ts | 15 + .../data/GEmolumento/GEmolumentoSaveData.ts | 23 ++ .../data/GSeloGrupo/GSeloGrupoDeleteData.ts | 17 + .../data/GSeloGrupo/GSeloGrupoIndexData.ts | 15 + .../data/GSeloGrupo/GSeloGrupoSaveData.ts | 23 ++ .../GEmolumento/useGEmolumentoDeleteHook.ts | 21 + .../GEmolumento/useGEmolumentoFormHook.ts | 14 + .../GEmolumento/useGEmolumentoIndexHook.ts | 27 ++ .../GEmolumento/useGEmolumentoSaveHook.ts | 35 ++ .../GSeloGrupo/useGSeloGrupoDeleteHook.ts | 21 + .../hooks/GSeloGrupo/useGSeloGrupoFormHook.ts | 14 + .../GSeloGrupo/useGSeloGrupoIndexHook.ts | 27 ++ .../hooks/GSeloGrupo/useGSeloGrupoSaveHook.ts | 35 ++ .../GEmolumento/GEmolumentoFormInterface.ts | 9 + .../GEmolumento/GEmolumentoInterface.ts | 19 + .../GEmolumento/GEmolumentoTableInterface.ts | 7 + .../GSeloGrupo/GSeloGrupoFormInterface.ts | 9 + .../GSeloGrupo/GSeloGrupoInterface.ts | 24 ++ .../GSeloGrupo/GSeloGrupoSelectInterace.ts | 6 + .../GSeloGrupo/GSeloGrupoTableInterface.ts | 7 + .../schemas/GEmolumento/GEmolumentoSchema.ts | 23 ++ .../schemas/GSeloGrupo/GSeloGrupoSchema.ts | 28 ++ .../GEmolumento/GEmolumentoDeleteService.ts | 14 + .../GEmolumento/GEmolumentoIndexService.ts | 11 + .../GEmolumento/GEmolumentoSaveService.ts | 12 + .../GSeloGrupo/GSeloGrupoDeleteService.ts | 10 + .../GSeloGrupo/GSeloGrupoIndexService.ts | 11 + .../GSeloGrupo/GSeloGrupoSaveService.ts | 12 + .../components/sistemas/SistemasSelect.tsx | 82 ++++ .../tipoCartorio/TipoCartorioSelect.tsx | 73 ++++ .../tipoEmolumento/TipoAtoAnteriorSelect.tsx | 73 ++++ src/shared/enums/SistemasEnum.ts | 8 + src/shared/enums/TipoCartorioEnum.ts | 7 + src/shared/enums/TipoEmolumentoEnum.ts | 6 + 48 files changed, 2089 insertions(+), 2 deletions(-) create mode 100644 src/app/(protected)/(administrativo)/administrativo/financeiro/emolumentos/page.tsx create mode 100644 src/app/(protected)/(administrativo)/administrativo/selos/grupos/page.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoColumns.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoForm.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoIndex.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoTable.tsx create mode 100644 src/packages/administrativo/components/GSeloGrupo/GSeloGrupoColumns.tsx create mode 100644 src/packages/administrativo/components/GSeloGrupo/GSeloGrupoForm.tsx create mode 100644 src/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex.tsx create mode 100644 src/packages/administrativo/components/GSeloGrupo/GSeloGrupoSelect.tsx create mode 100644 src/packages/administrativo/components/GSeloGrupo/GSeloGrupoTable.tsx create mode 100644 src/packages/administrativo/data/GEmolumento/GEmolumentoDeleteData.ts create mode 100644 src/packages/administrativo/data/GEmolumento/GEmolumentoIndexData.ts create mode 100644 src/packages/administrativo/data/GEmolumento/GEmolumentoSaveData.ts create mode 100644 src/packages/administrativo/data/GSeloGrupo/GSeloGrupoDeleteData.ts create mode 100644 src/packages/administrativo/data/GSeloGrupo/GSeloGrupoIndexData.ts create mode 100644 src/packages/administrativo/data/GSeloGrupo/GSeloGrupoSaveData.ts create mode 100644 src/packages/administrativo/hooks/GEmolumento/useGEmolumentoDeleteHook.ts create mode 100644 src/packages/administrativo/hooks/GEmolumento/useGEmolumentoFormHook.ts create mode 100644 src/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook.ts create mode 100644 src/packages/administrativo/hooks/GEmolumento/useGEmolumentoSaveHook.ts create mode 100644 src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoDeleteHook.ts create mode 100644 src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoFormHook.ts create mode 100644 src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook.ts create mode 100644 src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoSaveHook.ts create mode 100644 src/packages/administrativo/interfaces/GEmolumento/GEmolumentoFormInterface.ts create mode 100644 src/packages/administrativo/interfaces/GEmolumento/GEmolumentoInterface.ts create mode 100644 src/packages/administrativo/interfaces/GEmolumento/GEmolumentoTableInterface.ts create mode 100644 src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoFormInterface.ts create mode 100644 src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoInterface.ts create mode 100644 src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoSelectInterace.ts create mode 100644 src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoTableInterface.ts create mode 100644 src/packages/administrativo/schemas/GEmolumento/GEmolumentoSchema.ts create mode 100644 src/packages/administrativo/schemas/GSeloGrupo/GSeloGrupoSchema.ts create mode 100644 src/packages/administrativo/services/GEmolumento/GEmolumentoDeleteService.ts create mode 100644 src/packages/administrativo/services/GEmolumento/GEmolumentoIndexService.ts create mode 100644 src/packages/administrativo/services/GEmolumento/GEmolumentoSaveService.ts create mode 100644 src/packages/administrativo/services/GSeloGrupo/GSeloGrupoDeleteService.ts create mode 100644 src/packages/administrativo/services/GSeloGrupo/GSeloGrupoIndexService.ts create mode 100644 src/packages/administrativo/services/GSeloGrupo/GSeloGrupoSaveService.ts create mode 100644 src/shared/components/sistemas/SistemasSelect.tsx create mode 100644 src/shared/components/tipoCartorio/TipoCartorioSelect.tsx create mode 100644 src/shared/components/tipoEmolumento/TipoAtoAnteriorSelect.tsx create mode 100644 src/shared/enums/SistemasEnum.ts create mode 100644 src/shared/enums/TipoCartorioEnum.ts create mode 100644 src/shared/enums/TipoEmolumentoEnum.ts diff --git a/src/app/(protected)/(administrativo)/administrativo/financeiro/emolumentos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/financeiro/emolumentos/page.tsx new file mode 100644 index 0000000..6f93b1d --- /dev/null +++ b/src/app/(protected)/(administrativo)/administrativo/financeiro/emolumentos/page.tsx @@ -0,0 +1,9 @@ +import GEmolumentoIndex from "@/packages/administrativo/components/GEmolumento/GEmolumentoIndex"; + +export default function GEmolumentoPeriodoPage() { + + return ( + + ); + +} \ No newline at end of file diff --git a/src/app/(protected)/(administrativo)/administrativo/selos/grupos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/selos/grupos/page.tsx new file mode 100644 index 0000000..a3b664f --- /dev/null +++ b/src/app/(protected)/(administrativo)/administrativo/selos/grupos/page.tsx @@ -0,0 +1,9 @@ +import GSeloGrupoIndex from "@/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex"; + +export default function GSeloGrupoPage() { + + return ( + + ); + +} \ No newline at end of file diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index 82ee6ed..1a23482 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -164,6 +164,14 @@ const data = { { title: "Financeiro/Periodo", url: "/administrativo/financeiro/periodos", + }, + { + title: "Financeiro/Emolumentos", + url: "/administrativo/financeiro/emolumentos", + }, + { + title: "Selos/Grupos", + url: "/administrativo/selos/grupos", } ], diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoColumns.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoColumns.tsx new file mode 100644 index 0000000..cb7094e --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoColumns.tsx @@ -0,0 +1,78 @@ +import { ColumnDef } from '@tanstack/react-table'; +import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { SortableHeader } from '@/shared/components/dataTable/SortableHeader'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; + +export default function GEmolumentoColumns( + onEdit: (item: GEmolumentoInterface, isEditingFormStatus: boolean) => void, + onDelete: (item: GEmolumentoInterface, isEditingFormStatus: boolean) => void, +): ColumnDef[] { + return [ + // ID + { + accessorKey: 'emolumento_id', + header: ({ column }) => SortableHeader('ID', column), + cell: ({ row }) => Number(row.getValue('emolumento_id')), + enableSorting: true, + }, + + // Descrição + { + accessorKey: 'descricao', + header: ({ column }) => SortableHeader('Descrição', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('descricao') || '')), + }, + + // Ações + { + id: 'actions', + header: 'Ações', + cell: ({ row }) => { + const natureza = row.original; + + return ( + + + + + + + + onEdit(natureza, true)}> + + Editar + + + + + onDelete(natureza, true)} + > + + Remover + + + + + ); + }, + enableSorting: false, + enableHiding: false, + }, + ]; +} diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoForm.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoForm.tsx new file mode 100644 index 0000000..327fe8b --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoForm.tsx @@ -0,0 +1,367 @@ +'use client'; + +import { HouseIcon, IdCardIcon } from 'lucide-react'; +import { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; +import SistemasSelect from '@/shared/components/sistemas/SistemasSelect'; +import SituacoesSelect from '@/shared/components/situacoes/SituacoesSelect'; +import TipoEmolumentoSelect from '@/shared/components/tipoEmolumento/TipoAtoAnteriorSelect'; + +import { useGEmolumentoFormHook } from '../../hooks/GEmolumento/useGEmolumentoFormHook'; +import { GEmolumentoFormInterface } from '../../interfaces/GEmolumento/GEmolumentoFormInterface'; +import GSeloGrupoSelect from '../GSeloGrupo/GSeloGrupoSelect'; + +/** + * Formulário de cadastro/edição de Natureza + * Baseado nos campos da tabela G_NATUREZA + */ +export default function GEmolumentoForm({ + isOpen, + data, + onClose, + onSave, + buttonIsLoading, +}: GEmolumentoFormInterface) { + const form = useGEmolumentoFormHook({}); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + ResetFormIfData(form, data); + }, [data, form]); + + function onError(error: any) { + console.log('Erro no formulário:', error); + } + + return ( + { + if (!open) onClose(null, false); + }} + > + + + Emolumento + + Formulário de Emolumento + + + {/* Formulário principal */} +
+ + + + + + Geral + + + + Registro de Imóveis + + + + {/* GRID MOBILE FIRST */} +
+ {/* Descrição */} +
+ ( + + Descrição + + + + + + )} + /> +
+ + {/* Tipo */} +
+ ( + + Tipo + + + + )} + /> +
+ + {/* Sistema ID */} +
+ ( + + Serventia + field.onChange(parseNumberInput(e))} + /> + + + )} + /> +
+ + {/* Selo Grupo ID */} +
+ ( + + Selo Grupo + + + + )} + /> +
+ + {/* Registro/Averbação */} +
+ ( + + Registro/Averbação + + + + )} + /> +
+ + {/* Situação */} +
+ ( + + Situação + + + + )} + /> +
+ + {/* Tipo Objetivo */} +
+ ( + + Tipo Objetivo + + + + )} + /> +
+ + {/* Modelo Tag */} +
+ ( + + Modelo Tag + + + + )} + /> +
+ + {/* Código Nota ID */} +
+ ( + + Código Nota + + field.onChange(parseNumberInput(e))} + /> + + + + )} + /> +
+
+
+ + {/* Pré-Definido */} +
+ ( + + Pré-Definido + + + + )} + /> +
+ {/* Motivo Redução */} +
+ ( + + Motivo da Redução + + + + + + )} + /> +
+ {/* Valor Máximo Certidão */} +
+ ( + + Valor Máximo Certidão + + field.onChange(parseNumberInput(e))} + /> + + + + )} + /> +
+ {/* Com Redução */} +
+ ( + + Com Redução + + + + )} + /> +
+
+ {/* Item DF */} +
+ ( + + Item DF + + + + )} + /> +
+ {/* Convênio CODHAB */} +
+ ( + + Convênio CODHAB + + + + )} + /> +
+ {/* Situação RI */} +
+ ( + + Situação RI + + + + )} + /> +
+
+
+
+ {/* Rodapé */} + + + + + + +
+ +
+
+ ); +} diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoIndex.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoIndex.tsx new file mode 100644 index 0000000..721433a --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoIndex.tsx @@ -0,0 +1,161 @@ +'use client'; + +import { useEffect, useState, useCallback } from 'react'; + + +import { useGEmolumentoDeleteHook } from '@/packages/administrativo/hooks/GEmolumento/useGEmolumentoDeleteHook'; +import { useGEmolumentoIndexHook } from '@/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook'; +import { useGEmolumentoSaveHook } from '@/packages/administrativo/hooks/GEmolumento/useGEmolumentoSaveHook'; +import GEmolumentoInterface from '@/packages/administrativo/interfaces/GEmolumento/GEmolumentoInterface'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; +import Header from '@/shared/components/structure/Header'; + +import GEmolumentoForm from './GEmolumentoForm'; +import GEmolumentoTable from './GEmolumentoTable'; + +export default function GEmolumentoIndex() { + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Hooks para leitura e salvamento + const { gGramatica, indexGEmolumento } = useGEmolumentoIndexHook(); + const { saveGEmolumento } = useGEmolumentoSaveHook(); + const { deleteGEmolumento } = useGEmolumentoDeleteHook(); + + // Estados + const [selectedData, setSelectedData] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + + // Estado para saber qual item será deletado + const [itemToDelete, setItemToDelete] = useState(null); + + /** + * Hook do modal de confirmação + */ + const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: GEmolumentoInterface | null) => { + setSelectedData(data); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o andamento selecionado + */ + const handleCloseForm = useCallback(() => { + setSelectedData(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: GEmolumentoInterface) => { + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Aguarda salvar o registro + await saveGEmolumento(formData); + + // Remove o botão em estado de loading + setButtonIsLoading(false); + + // Atualiza a lista de dados + indexGEmolumento(); + }, + [saveGEmolumento, indexGEmolumento, handleCloseForm], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: GEmolumentoInterface) => { + // Define o item atual para remoção + setItemToDelete(item); + // Abre o modal de confirmação + openConfirmDialog(); + }, + [openConfirmDialog], + ); + + /** + * Executa a exclusão de fato quando o usuário confirma + */ + const handleDelete = useCallback(async () => { + // Protege contra null + if (!itemToDelete) return; + + // Executa o Hook de remoção + await deleteGEmolumento(itemToDelete); + + // Atualiza a lista + await indexGEmolumento(); + + // Limpa o item selecionado + setItemToDelete(null); + + // Fecha o modal + handleCancel(); + }, [itemToDelete, indexGEmolumento, handleCancel]); + + /** + * Busca inicial dos dados + */ + useEffect(() => { + indexGEmolumento(); + }, []); + + /** + * Tela de loading enquanto carrega os dados + */ + if (gGramatica?.length == 0) { + return ; + } + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela de andamentos */} + + {/* Modal de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário de criação/edição */} + {isFormOpen && ( + + )} +
+ ); +} diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoTable.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoTable.tsx new file mode 100644 index 0000000..3ffd5a0 --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoTable.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { DataTable } from '@/shared/components/dataTable/DataTable'; + +import GEmolumentoColumns from './GEmolumentoColumns'; +import GEmolumentoTableInterface from '../../interfaces/GEmolumento/GEmolumentoTableInterface'; + +/** + * Componente principal da tabela de Naturezas + */ +export default function GEmolumentoTable({ data, onEdit, onDelete }: GEmolumentoTableInterface) { + const columns = GEmolumentoColumns(onEdit, onDelete); + return ( +
+ +
+ ); +} diff --git a/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoColumns.tsx b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoColumns.tsx new file mode 100644 index 0000000..b06fdd8 --- /dev/null +++ b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoColumns.tsx @@ -0,0 +1,78 @@ +import { ColumnDef } from '@tanstack/react-table'; +import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { SortableHeader } from '@/shared/components/dataTable/SortableHeader'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; + +export default function GSeloGrupoColumns( + onEdit: (item: GSeloGrupoInterface, isEditingFormStatus: boolean) => void, + onDelete: (item: GSeloGrupoInterface, isEditingFormStatus: boolean) => void, +): ColumnDef[] { + return [ + // ID + { + accessorKey: 'selo_grupo_id', + header: ({ column }) => SortableHeader('ID', column), + cell: ({ row }) => Number(row.getValue('selo_grupo_id')), + enableSorting: true, + }, + + // Descrição + { + accessorKey: 'descricao', + header: ({ column }) => SortableHeader('descricao', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('descricao') || '')), + }, + + // Ações + { + id: 'actions', + header: 'Ações', + cell: ({ row }) => { + const natureza = row.original; + + return ( + + + + + + + + onEdit(natureza, true)}> + + Editar + + + + + onDelete(natureza, true)} + > + + Remover + + + + + ); + }, + enableSorting: false, + enableHiding: false, + }, + ]; +} diff --git a/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoForm.tsx b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoForm.tsx new file mode 100644 index 0000000..5e7e10d --- /dev/null +++ b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoForm.tsx @@ -0,0 +1,301 @@ +'use client'; + +import React, { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; + +import { useGSeloGrupoFormHook } from '../../hooks/GSeloGrupo/useGSeloGrupoFormHook'; +import { GSeloGrupoFormInterface } from '../../interfaces/GSeloGrupo/GSeloGrupoFormInterface'; +import SituacoesSelect from '@/shared/components/situacoes/SituacoesSelect'; +import ConfirmacaoSelect from '@/shared/components/confirmacao/ConfirmacaoSelect'; +import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; +import TipoCartorioSelect from '@/shared/components/tipoCartorio/TipoCartorioSelect'; + +/** + * Formulário de cadastro/edição de Natureza + * Baseado nos campos da tabela G_NATUREZA + */ +export default function GSeloGrupoForm({ + isOpen, + data, + onClose, + onSave, + buttonIsLoading, +}: GSeloGrupoFormInterface) { + const form = useGSeloGrupoFormHook({}); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + ResetFormIfData(form, data); + }, [data, form]); + + function onError(error: any) { + console.log('Erro no formulário:', error); + } + + return ( + { + if (!open) onClose(null, false); + }} + > + + + Formulário de Gramática + + Formulário de Gramática + + + {/* Formulário principal */} +
+ + {/* GRID MOBILE FIRST */} +
+ {/* Código */} +
+ ( + + Código + + + + + + )} + /> +
+ {/* Agrupador */} +
+ ( + + Agrupador + + + + )} + /> +
+ {/* Descrição */} +
+ ( + + Descrição + + + + + + )} + /> +
+ {/* Descrição Completa */} +
+ ( + + Descrição Completa + + + + + + )} + /> +
+ {/* Controle Automático */} +
+ ( + + Controle Automático + + + + )} + /> +
+ {/* Código Conta */} +
+ ( + + Código Conta + + field.onChange(parseNumberInput(e))} + /> + + + + )} + /> +
+ {/* Selo Principal Inicial */} +
+ ( + + Selo Principal Inicial + + field.onChange(parseNumberInput(e))} + /> + + + + )} + /> +
+ {/* Selo Principal Final */} +
+ ( + + Selo Principal Final + + field.onChange(parseNumberInput(e))} + /> + + + + )} + /> +
+ {/* Grupos Principal */} +
+ ( + + Grupos Principal + + + + + + )} + /> +
+ {/* Um por protocolo */} +
+ ( + + Um por Protocolo + + + + )} + /> +
+ {/* Tipo Cartório */} +
+ ( + + Tipo Cartório + + + + )} + /> +
+ {/* Situação */} +
+ ( + + Situação + + + + )} + /> +
+
+ {/* Rodapé */} + + + + + + +
+ +
+
+ ); +} diff --git a/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex.tsx b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex.tsx new file mode 100644 index 0000000..039e593 --- /dev/null +++ b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex.tsx @@ -0,0 +1,161 @@ +'use client'; + +import { useEffect, useState, useCallback } from 'react'; + + +import { useGSeloGrupoDeleteHook } from '@/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoDeleteHook'; +import { useGSeloGrupoIndexHook } from '@/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook'; +import { useGSeloGrupoSaveHook } from '@/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoSaveHook'; +import GSeloGrupoInterface from '@/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoInterface'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; +import Header from '@/shared/components/structure/Header'; + +import GSeloGrupoForm from './GSeloGrupoForm'; +import GSeloGrupoTable from './GSeloGrupoTable'; + +export default function GSeloGrupoIndex() { + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Hooks para leitura e salvamento + const { gSeloGrupo, indexGSeloGrupo } = useGSeloGrupoIndexHook(); + const { saveGSeloGrupo } = useGSeloGrupoSaveHook(); + const { deleteGSeloGrupo } = useGSeloGrupoDeleteHook(); + + // Estados + const [selectedData, setSelectedData] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + + // Estado para saber qual item será deletado + const [itemToDelete, setItemToDelete] = useState(null); + + /** + * Hook do modal de confirmação + */ + const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: GSeloGrupoInterface | null) => { + setSelectedData(data); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o andamento selecionado + */ + const handleCloseForm = useCallback(() => { + setSelectedData(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: GSeloGrupoInterface) => { + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Aguarda salvar o registro + await saveGSeloGrupo(formData); + + // Remove o botão em estado de loading + setButtonIsLoading(false); + + // Atualiza a lista de dados + indexGSeloGrupo(); + }, + [saveGSeloGrupo, indexGSeloGrupo, handleCloseForm], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: GSeloGrupoInterface) => { + // Define o item atual para remoção + setItemToDelete(item); + // Abre o modal de confirmação + openConfirmDialog(); + }, + [openConfirmDialog], + ); + + /** + * Executa a exclusão de fato quando o usuário confirma + */ + const handleDelete = useCallback(async () => { + // Protege contra null + if (!itemToDelete) return; + + // Executa o Hook de remoção + await deleteGSeloGrupo(itemToDelete); + + // Atualiza a lista + await indexGSeloGrupo(); + + // Limpa o item selecionado + setItemToDelete(null); + + // Fecha o modal + handleCancel(); + }, [itemToDelete, indexGSeloGrupo, handleCancel]); + + /** + * Busca inicial dos dados + */ + useEffect(() => { + indexGSeloGrupo(); + }, []); + + /** + * Tela de loading enquanto carrega os dados + */ + if (gSeloGrupo?.length == 0) { + return ; + } + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela de andamentos */} + + {/* Modal de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário de criação/edição */} + {isFormOpen && ( + + )} +
+ ); +} diff --git a/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoSelect.tsx b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoSelect.tsx new file mode 100644 index 0000000..417da03 --- /dev/null +++ b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoSelect.tsx @@ -0,0 +1,115 @@ +'use client'; + +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import React, { useState, useEffect, useCallback, useMemo } from 'react'; + +import { Button } from '@/components/ui/button'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command'; +import { FormControl } from '@/components/ui/form'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { useGSeloGrupoIndexHook } from '@/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; + +import GTBairroSelectInterface from '../../interfaces/GSeloGrupo/GSeloGrupoSelectInterace'; + +export default function GSeloGrupoSelect({ field }: GTBairroSelectInterface) { + const [open, setOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const { gSeloGrupo = [], indexGSeloGrupo } = useGSeloGrupoIndexHook(); + + /** + * Efeito para buscar os dados apenas uma vez. + * useCallback evita recriação desnecessária da função. + */ + const loadData = useCallback(async () => { + if (gSeloGrupo.length) return; + setIsLoading(true); + await indexGSeloGrupo(); + setIsLoading(false); + }, [gSeloGrupo.length, indexGSeloGrupo]); + + useEffect(() => { + loadData(); + }, [loadData]); + + /** + * Memoriza o bairro selecionado para evitar reprocessamentos. + */ + const selected = useMemo( + () => gSeloGrupo.find((b) => String(b.selo_grupo_id) === String(field?.value ?? '')), + [gSeloGrupo, field?.value], + ); + + /** + * Manipulador de seleção com verificação segura. + */ + const handleSelect = useCallback( + (bairroId: string | number) => { + if (!field?.onChange) return; + field.onChange(bairroId); + setOpen(false); + }, + [field], + ); + + return ( + + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + {gSeloGrupo.map((item) => ( + handleSelect(item.selo_grupo_id)} + > + + {GetCapitalize(item.descricao ?? '')} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoTable.tsx b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoTable.tsx new file mode 100644 index 0000000..8f863c7 --- /dev/null +++ b/src/packages/administrativo/components/GSeloGrupo/GSeloGrupoTable.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { DataTable } from '@/shared/components/dataTable/DataTable'; + +import GSeloGrupoColumns from './GSeloGrupoColumns'; +import GSeloGrupoTableInterface from '../../interfaces/GSeloGrupo/GSeloGrupoTableInterface'; + +/** + * Componente principal da tabela de Naturezas + */ +export default function GSeloGrupoTable({ data, onEdit, onDelete }: GSeloGrupoTableInterface) { + const columns = GSeloGrupoColumns(onEdit, onDelete); + return ( +
+ +
+ ); +} diff --git a/src/packages/administrativo/components/TImovel/TImovelForm.tsx b/src/packages/administrativo/components/TImovel/TImovelForm.tsx index 4e45508..f98728c 100644 --- a/src/packages/administrativo/components/TImovel/TImovelForm.tsx +++ b/src/packages/administrativo/components/TImovel/TImovelForm.tsx @@ -1,7 +1,7 @@ 'use client'; import { HouseIcon, IdCardIcon } from 'lucide-react'; -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { @@ -27,12 +27,12 @@ import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; -import TImovelTipoRegistroSelect from './TImovelTipoRegistroSelect'; import { useTImovelFormHook } from '../../hooks/TImovel/useTImovelFormHook'; import { TImovelFormInterface } from '../../interfaces/TImovel/TImovelFormInterface'; import GTBBairroSelect from '../GTBBairro/GTBBairroSelect'; import TImovelUnidadeRuralIndex from '../TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex'; import TImovelUnidadeUrbanoPage from '../TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex'; +import TImovelTipoRegistroSelect from './TImovelTipoRegistroSelect'; diff --git a/src/packages/administrativo/data/GEmolumento/GEmolumentoDeleteData.ts b/src/packages/administrativo/data/GEmolumento/GEmolumentoDeleteData.ts new file mode 100644 index 0000000..08b7cb8 --- /dev/null +++ b/src/packages/administrativo/data/GEmolumento/GEmolumentoDeleteData.ts @@ -0,0 +1,16 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; + +async function executeGEmolumentoDeleteData(data: GEmolumentoInterface): Promise { + const api = new API(); + + return api.send({ + method: Methods.DELETE, + endpoint: `administrativo/g_emolumento/${data.emolumento_id}`, + }); +} + +export const GEmolumentoDeleteData = withClientErrorHandler(executeGEmolumentoDeleteData); diff --git a/src/packages/administrativo/data/GEmolumento/GEmolumentoIndexData.ts b/src/packages/administrativo/data/GEmolumento/GEmolumentoIndexData.ts new file mode 100644 index 0000000..9c02154 --- /dev/null +++ b/src/packages/administrativo/data/GEmolumento/GEmolumentoIndexData.ts @@ -0,0 +1,15 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + +async function executeGEmolumentoIndexData(): Promise { + const api = new API(); + + return api.send({ + method: Methods.GET, + endpoint: `administrativo/g_emolumento/`, + }); +} + +export const GEmolumentoIndexData = withClientErrorHandler(executeGEmolumentoIndexData); diff --git a/src/packages/administrativo/data/GEmolumento/GEmolumentoSaveData.ts b/src/packages/administrativo/data/GEmolumento/GEmolumentoSaveData.ts new file mode 100644 index 0000000..15039a7 --- /dev/null +++ b/src/packages/administrativo/data/GEmolumento/GEmolumentoSaveData.ts @@ -0,0 +1,23 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; + +async function executeGEmolumentoSaveData(data: GEmolumentoInterface): Promise { + // Verifica se existe ID para decidir se é atualização (PUT) ou criação (POST) + const isUpdate = Boolean(data.emolumento_id); + + // Instancia o cliente da API + const api = new API(); + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/g_emolumento/${data.emolumento_id || ''}`, // endpoint dinâmico + body: data, // payload enviado para a API + }); +} + +export const GEmolumentoSaveData = withClientErrorHandler(executeGEmolumentoSaveData); diff --git a/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoDeleteData.ts b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoDeleteData.ts new file mode 100644 index 0000000..91dd758 --- /dev/null +++ b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoDeleteData.ts @@ -0,0 +1,17 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; + +async function executeGSeloGrupoDeleteData(data: GSeloGrupoInterface): Promise { + const api = new API(); + + return api.send({ + method: Methods.DELETE, + endpoint: `administrativo/_selo_grupo/${data.selo_grupo_id}`, + }); +} + +export const GSeloGrupoDeleteData = withClientErrorHandler(executeGSeloGrupoDeleteData); diff --git a/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoIndexData.ts b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoIndexData.ts new file mode 100644 index 0000000..7dcefd5 --- /dev/null +++ b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoIndexData.ts @@ -0,0 +1,15 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + +async function executeGSeloGrupoIndexData(): Promise { + const api = new API(); + + return api.send({ + method: Methods.GET, + endpoint: `administrativo/g_selo_grupo/`, + }); +} + +export const GSeloGrupoIndexData = withClientErrorHandler(executeGSeloGrupoIndexData); diff --git a/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoSaveData.ts b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoSaveData.ts new file mode 100644 index 0000000..a863112 --- /dev/null +++ b/src/packages/administrativo/data/GSeloGrupo/GSeloGrupoSaveData.ts @@ -0,0 +1,23 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; + +async function executeGSeloGrupoSaveData(data: GSeloGrupoInterface): Promise { + // Verifica se existe ID para decidir se é atualização (PUT) ou criação (POST) + const isUpdate = Boolean(data.selo_grupo_id); + + // Instancia o cliente da API + const api = new API(); + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/g_selo_grupo/${data.selo_grupo_id || ''}`, // endpoint dinâmico + body: data, // payload enviado para a API + }); +} + +export const GSeloGrupoSaveData = withClientErrorHandler(executeGSeloGrupoSaveData); diff --git a/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoDeleteHook.ts b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoDeleteHook.ts new file mode 100644 index 0000000..507d10d --- /dev/null +++ b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoDeleteHook.ts @@ -0,0 +1,21 @@ +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; +import { GEmolumentoDeleteService } from '../../services/GEmolumento/GEmolumentoDeleteService'; + +export const useGEmolumentoDeleteHook = () => { + const { setResponse } = useResponse(); + + const [gGramatica, setGEmolumento] = useState(); + + const deleteGEmolumento = async (data: GEmolumentoInterface) => { + const response = await GEmolumentoDeleteService(data); + + setGEmolumento(data); + setResponse(response); + }; + + return { gGramatica, deleteGEmolumento }; +}; diff --git a/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoFormHook.ts b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoFormHook.ts new file mode 100644 index 0000000..a85eeed --- /dev/null +++ b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoFormHook.ts @@ -0,0 +1,14 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; + +import { GEmolumentoFormValues, GEmolumentoSchema } from '../../schemas/GEmolumento/GEmolumentoSchema'; + +export function useGEmolumentoFormHook(defaults?: Partial) { + return useForm({ + resolver: zodResolver(GEmolumentoSchema), + defaultValues: { + emolumento_id: 0, + ...defaults, + }, + }); +} diff --git a/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook.ts b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook.ts new file mode 100644 index 0000000..6eebcda --- /dev/null +++ b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook.ts @@ -0,0 +1,27 @@ +'use client'; + +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; +import { GEmolumentoIndexService } from '../../services/GEmolumento/GEmolumentoIndexService'; + +export const useGEmolumentoIndexHook = () => { + const { setResponse } = useResponse(); + + const [gGramatica, setGEmolumento] = useState([]); + + const indexGEmolumento = async () => { + const response = await GEmolumentoIndexService(); + // Armazena os dados consultados + setGEmolumento(response.data); + // Define a resposta (toast, modal, feedback, etc.) + setResponse(response); + }; + + return { + gGramatica, + indexGEmolumento, + }; +}; diff --git a/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoSaveHook.ts b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoSaveHook.ts new file mode 100644 index 0000000..f805c2a --- /dev/null +++ b/src/packages/administrativo/hooks/GEmolumento/useGEmolumentoSaveHook.ts @@ -0,0 +1,35 @@ +'use client'; + +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; +import { GEmolumentoSaveService } from '../../services/GEmolumento/GEmolumentoSaveService'; + +export const useGEmolumentoSaveHook = () => { + const { setResponse } = useResponse(); + + const [gGramatica, setGEmolumento] = useState(null); + + // controla se o formulário está aberto ou fechado + const [isOpen, setIsOpen] = useState(false); + + const saveGEmolumento = async (data: GEmolumentoInterface) => { + const response = await GEmolumentoSaveService(data); + + // Armazena os dados da resposta + setGEmolumento(response.data); + + // Define os dados da resposta (toast, modal, etc.) + setResponse(response); + + // Fecha o formulário automaticamente após salvar + setIsOpen(false); + + // Retorna os valores de forma imediata + return response.data; + }; + + return { gGramatica, saveGEmolumento, isOpen, setIsOpen }; +}; diff --git a/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoDeleteHook.ts b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoDeleteHook.ts new file mode 100644 index 0000000..9a92365 --- /dev/null +++ b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoDeleteHook.ts @@ -0,0 +1,21 @@ +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; +import { GSeloGrupoDeleteService } from '../../services/GSeloGrupo/GSeloGrupoDeleteService'; + +export const useGSeloGrupoDeleteHook = () => { + const { setResponse } = useResponse(); + + const [gSeloGrupo, setGSeloGrupo] = useState(); + + const deleteGSeloGrupo = async (data: GSeloGrupoInterface) => { + const response = await GSeloGrupoDeleteService(data); + + setGSeloGrupo(data); + setResponse(response); + }; + + return { gSeloGrupo, deleteGSeloGrupo }; +}; diff --git a/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoFormHook.ts b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoFormHook.ts new file mode 100644 index 0000000..cfeb0f1 --- /dev/null +++ b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoFormHook.ts @@ -0,0 +1,14 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; + +import { GSeloGrupoFormValues, GSeloGrupoSchema } from '../../schemas/GSeloGrupo/GSeloGrupoSchema'; + +export function useGSeloGrupoFormHook(defaults?: Partial) { + return useForm({ + resolver: zodResolver(GSeloGrupoSchema), + defaultValues: { + selo_grupo_id: 0, + ...defaults, + }, + }); +} diff --git a/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook.ts b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook.ts new file mode 100644 index 0000000..a74ce08 --- /dev/null +++ b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoIndexHook.ts @@ -0,0 +1,27 @@ +'use client'; + +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; +import { GSeloGrupoIndexService } from '../../services/GSeloGrupo/GSeloGrupoIndexService'; + +export const useGSeloGrupoIndexHook = () => { + const { setResponse } = useResponse(); + + const [gSeloGrupo, setGSeloGrupo] = useState([]); + + const indexGSeloGrupo = async () => { + const response = await GSeloGrupoIndexService(); + // Armazena os dados consultados + setGSeloGrupo(response.data); + // Define a resposta (toast, modal, feedback, etc.) + setResponse(response); + }; + + return { + gSeloGrupo, + indexGSeloGrupo, + }; +}; diff --git a/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoSaveHook.ts b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoSaveHook.ts new file mode 100644 index 0000000..f9311d3 --- /dev/null +++ b/src/packages/administrativo/hooks/GSeloGrupo/useGSeloGrupoSaveHook.ts @@ -0,0 +1,35 @@ +'use client'; + +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; +import { GSeloGrupoSaveService } from '../../services/GSeloGrupo/GSeloGrupoSaveService'; + +export const useGSeloGrupoSaveHook = () => { + const { setResponse } = useResponse(); + + const [gSeloGrupo, setGSeloGrupo] = useState(null); + + // controla se o formulário está aberto ou fechado + const [isOpen, setIsOpen] = useState(false); + + const saveGSeloGrupo = async (data: GSeloGrupoInterface) => { + const response = await GSeloGrupoSaveService(data); + + // Armazena os dados da resposta + setGSeloGrupo(response.data); + + // Define os dados da resposta (toast, modal, etc.) + setResponse(response); + + // Fecha o formulário automaticamente após salvar + setIsOpen(false); + + // Retorna os valores de forma imediata + return response.data; + }; + + return { gSeloGrupo, saveGSeloGrupo, isOpen, setIsOpen }; +}; diff --git a/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoFormInterface.ts b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoFormInterface.ts new file mode 100644 index 0000000..cfe3710 --- /dev/null +++ b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoFormInterface.ts @@ -0,0 +1,9 @@ +import { GEmolumentoFormValues } from '../../schemas/GEmolumento/GEmolumentoSchema'; + +export interface GEmolumentoFormInterface { + isOpen: boolean; + data: GEmolumentoFormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: GEmolumentoFormValues) => void; + buttonIsLoading: boolean; +} diff --git a/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoInterface.ts b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoInterface.ts new file mode 100644 index 0000000..94a8629 --- /dev/null +++ b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoInterface.ts @@ -0,0 +1,19 @@ +export default interface GEmolumentoInterface { + emolumento_id?: number; + descricao?: string; + tipo?: string; + sistema_id?: number; + selo_grupo_id?: number; + reg_averb?: string; + pre_definido?: string; + situacao?: string; + situacao_ri?: string; + com_reducao?: string; + motivo_reducao?: string; + valor_maximo_certidao?: number; + tipo_objetivo?: string; + modelo_tag?: string; + codigo_nota_id?: number; + convenio_codhab?: string; + item_df?: string; +} \ No newline at end of file diff --git a/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoTableInterface.ts b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoTableInterface.ts new file mode 100644 index 0000000..aa9e7a6 --- /dev/null +++ b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoTableInterface.ts @@ -0,0 +1,7 @@ +import GEmolumentoInterface from './GEmolumentoInterface'; + +export default interface GEmolumentoTableInterface { + data?: GEmolumentoInterface[]; + onEdit: (item: GEmolumentoInterface, isEditingFormStatus: boolean) => void; + onDelete: (item: GEmolumentoInterface, isEditingFormStatus: boolean) => void; +} diff --git a/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoFormInterface.ts b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoFormInterface.ts new file mode 100644 index 0000000..944402e --- /dev/null +++ b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoFormInterface.ts @@ -0,0 +1,9 @@ +import { GSeloGrupoFormValues } from '../../schemas/GSeloGrupo/GSeloGrupoSchema'; + +export interface GSeloGrupoFormInterface { + isOpen: boolean; + data: GSeloGrupoFormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: GSeloGrupoFormValues) => void; + buttonIsLoading: boolean; +} diff --git a/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoInterface.ts b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoInterface.ts new file mode 100644 index 0000000..eef891f --- /dev/null +++ b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoInterface.ts @@ -0,0 +1,24 @@ +export default interface GSeloGrupoInterface { + selo_grupo_id?: number; + descricao?: string; + numero?: number; + situacao?: string; + controle_automatico?: string; + sistema_id?: number; + valor?: number; + tipo_cartorio?: string; + descricao_completa?: string; + agrupador?: string; + um_por_protocolo?: string; + numero_principal_ini?: number; + numero_principal_fim?: number; + selo_grupo_id_principal?: number; + envio_automatico?: string; + selo_grupo_id_agrupador?: number; + codigo_conta?: number; + id_tipo_ato_antigo?: number; + grupos_principal?: string; + sigla?: string; + tipo_selo?: string; + natureza?: number; +} diff --git a/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoSelectInterace.ts b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoSelectInterace.ts new file mode 100644 index 0000000..3ae1b19 --- /dev/null +++ b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoSelectInterace.ts @@ -0,0 +1,6 @@ +export default interface GSeloGrupoSelectInterace { + field?: { + value?: number | string; + onChange?: (value: string | number) => void; + }; +} diff --git a/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoTableInterface.ts b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoTableInterface.ts new file mode 100644 index 0000000..44a9149 --- /dev/null +++ b/src/packages/administrativo/interfaces/GSeloGrupo/GSeloGrupoTableInterface.ts @@ -0,0 +1,7 @@ +import GSeloGrupoInterface from './GSeloGrupoInterface'; + +export default interface GSeloGrupoTableInterface { + data?: GSeloGrupoInterface[]; + onEdit: (item: GSeloGrupoInterface, isEditingFormStatus: boolean) => void; + onDelete: (item: GSeloGrupoInterface, isEditingFormStatus: boolean) => void; +} diff --git a/src/packages/administrativo/schemas/GEmolumento/GEmolumentoSchema.ts b/src/packages/administrativo/schemas/GEmolumento/GEmolumentoSchema.ts new file mode 100644 index 0000000..8e6def6 --- /dev/null +++ b/src/packages/administrativo/schemas/GEmolumento/GEmolumentoSchema.ts @@ -0,0 +1,23 @@ +import z from "zod"; + +export const GEmolumentoSchema = z.object({ + emolumento_id: z.number().optional(), + descricao: z.string().optional(), + tipo: z.string().optional(), + sistema_id: z.number().optional(), + selo_grupo_id: z.number().optional(), + reg_averb: z.string().optional(), + pre_definido: z.string().optional(), + situacao: z.string().optional(), + situacao_ri: z.string().optional(), + com_reducao: z.string().optional(), + motivo_reducao: z.string().optional(), + valor_maximo_certidao: z.number().optional(), + tipo_objetivo: z.string().optional(), + modelo_tag: z.string().optional(), + codigo_nota_id: z.number().optional(), + convenio_codhab: z.string().optional(), + item_df: z.string().optional(), +}); + +export type GEmolumentoFormValues = z.infer; \ No newline at end of file diff --git a/src/packages/administrativo/schemas/GSeloGrupo/GSeloGrupoSchema.ts b/src/packages/administrativo/schemas/GSeloGrupo/GSeloGrupoSchema.ts new file mode 100644 index 0000000..5fc837c --- /dev/null +++ b/src/packages/administrativo/schemas/GSeloGrupo/GSeloGrupoSchema.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; + +export const GSeloGrupoSchema = z.object({ + selo_grupo_id: z.number().optional(), + descricao: z.string().optional(), + numero: z.number().optional(), + situacao: z.string().optional(), + controle_automatico: z.string().optional(), + sistema_id: z.number().optional(), + valor: z.number().optional(), + tipo_cartorio: z.string().optional(), + descricao_completa: z.string().optional(), + agrupador: z.string().optional(), + um_por_protocolo: z.string().optional(), + numero_principal_ini: z.number().optional(), + numero_principal_fim: z.number().optional(), + selo_grupo_id_principal: z.number().optional(), + envio_automatico: z.string().optional(), + selo_grupo_id_agrupador: z.number().optional(), + codigo_conta: z.number().optional(), + id_tipo_ato_antigo: z.number().optional(), + grupos_principal: z.string().optional(), + sigla: z.string().optional(), + tipo_selo: z.string().optional(), + natureza: z.number().optional(), +}); + +export type GSeloGrupoFormValues = z.infer; diff --git a/src/packages/administrativo/services/GEmolumento/GEmolumentoDeleteService.ts b/src/packages/administrativo/services/GEmolumento/GEmolumentoDeleteService.ts new file mode 100644 index 0000000..640307d --- /dev/null +++ b/src/packages/administrativo/services/GEmolumento/GEmolumentoDeleteService.ts @@ -0,0 +1,14 @@ + +import { GEmolumentoDeleteData } from '../../data/GEmolumento/GEmolumentoDeleteData'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; + + +async function executeGEmolumentoDeleteService(data: GEmolumentoInterface) { + const response = await GEmolumentoDeleteData(data); + + return response; +} + +export const GEmolumentoDeleteService = withClientErrorHandler(executeGEmolumentoDeleteService); diff --git a/src/packages/administrativo/services/GEmolumento/GEmolumentoIndexService.ts b/src/packages/administrativo/services/GEmolumento/GEmolumentoIndexService.ts new file mode 100644 index 0000000..3d0fec9 --- /dev/null +++ b/src/packages/administrativo/services/GEmolumento/GEmolumentoIndexService.ts @@ -0,0 +1,11 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +import { GEmolumentoIndexData } from '../../data/GEmolumento/GEmolumentoIndexData'; + +export default async function executeGEmolumentoIndexService() { + const response = await GEmolumentoIndexData(); + + return response; +} + +export const GEmolumentoIndexService = withClientErrorHandler(executeGEmolumentoIndexService); diff --git a/src/packages/administrativo/services/GEmolumento/GEmolumentoSaveService.ts b/src/packages/administrativo/services/GEmolumento/GEmolumentoSaveService.ts new file mode 100644 index 0000000..4da77a2 --- /dev/null +++ b/src/packages/administrativo/services/GEmolumento/GEmolumentoSaveService.ts @@ -0,0 +1,12 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +import { GEmolumentoSaveData } from '../../data/GEmolumento/GEmolumentoSaveData'; +import GEmolumentoInterface from '../../interfaces/GEmolumento/GEmolumentoInterface'; + +async function executeGEmolumentoSaveService(data: GEmolumentoInterface) { + const response = await GEmolumentoSaveData(data); + + return response; +} + +export const GEmolumentoSaveService = withClientErrorHandler(executeGEmolumentoSaveService); diff --git a/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoDeleteService.ts b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoDeleteService.ts new file mode 100644 index 0000000..e7031cb --- /dev/null +++ b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoDeleteService.ts @@ -0,0 +1,10 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import { GSeloGrupoDeleteData } from '../../data/GSeloGrupo/GSeloGrupoDeleteData'; +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; + +async function executeGSeloGrupoDeleteService(data: GSeloGrupoInterface) { + const response = await GSeloGrupoDeleteData(data); + return response; +} + +export const GSeloGrupoDeleteService = withClientErrorHandler(executeGSeloGrupoDeleteService); diff --git a/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoIndexService.ts b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoIndexService.ts new file mode 100644 index 0000000..2a62ba2 --- /dev/null +++ b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoIndexService.ts @@ -0,0 +1,11 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +import { GSeloGrupoIndexData } from '../../data/GSeloGrupo/GSeloGrupoIndexData'; + +export default async function executeGSeloGrupoIndexService() { + const response = await GSeloGrupoIndexData(); + + return response; +} + +export const GSeloGrupoIndexService = withClientErrorHandler(executeGSeloGrupoIndexService); diff --git a/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoSaveService.ts b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoSaveService.ts new file mode 100644 index 0000000..64acb37 --- /dev/null +++ b/src/packages/administrativo/services/GSeloGrupo/GSeloGrupoSaveService.ts @@ -0,0 +1,12 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +import { GSeloGrupoSaveData } from '../../data/GSeloGrupo/GSeloGrupoSaveData'; +import GSeloGrupoInterface from '../../interfaces/GSeloGrupo/GSeloGrupoInterface'; + +async function executeGSeloGrupoSaveService(data: GSeloGrupoInterface) { + const response = await GSeloGrupoSaveData(data); + + return response; +} + +export const GSeloGrupoSaveService = withClientErrorHandler(executeGSeloGrupoSaveService); diff --git a/src/shared/components/sistemas/SistemasSelect.tsx b/src/shared/components/sistemas/SistemasSelect.tsx new file mode 100644 index 0000000..2cff4ed --- /dev/null +++ b/src/shared/components/sistemas/SistemasSelect.tsx @@ -0,0 +1,82 @@ +import { Command } from 'cmdk'; +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import React from 'react'; +import { ControllerRenderProps } from 'react-hook-form'; + +import { Button } from '@/components/ui/button'; +import { + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command'; +import { FormControl } from '@/components/ui/form'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { SistemasEnum } from '@/shared/enums/SistemasEnum'; + +interface SistemasSelectProps { + field: ControllerRenderProps; +} + +const SistemasSelect: React.FC = ({ field }) => { + const [open, setOpen] = React.useState(false); + + const options = Object.entries(SistemasEnum).map(([key, label]) => ({ + value: Number(key), + label, + })); + + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(Number(item.value)); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +}; + +export default SistemasSelect; diff --git a/src/shared/components/tipoCartorio/TipoCartorioSelect.tsx b/src/shared/components/tipoCartorio/TipoCartorioSelect.tsx new file mode 100644 index 0000000..382ac26 --- /dev/null +++ b/src/shared/components/tipoCartorio/TipoCartorioSelect.tsx @@ -0,0 +1,73 @@ +import { Command } from 'cmdk'; +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import React from 'react'; + +import { Button } from '@/components/ui/button'; +import { + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command'; +import { FormControl } from '@/components/ui/form'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { TipoCartorioEnum } from '@/shared/enums/TipoCartorioEnum'; + +export default function TipoCartorioSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + + const options = Object.entries(TipoCartorioEnum).map(([value, label]) => ({ + value, + label, + })); + + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/shared/components/tipoEmolumento/TipoAtoAnteriorSelect.tsx b/src/shared/components/tipoEmolumento/TipoAtoAnteriorSelect.tsx new file mode 100644 index 0000000..f952dcf --- /dev/null +++ b/src/shared/components/tipoEmolumento/TipoAtoAnteriorSelect.tsx @@ -0,0 +1,73 @@ +import { Command } from 'cmdk'; +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import React from 'react'; + +import { Button } from '@/components/ui/button'; +import { + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command'; +import { FormControl } from '@/components/ui/form'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { TipoEmolumento } from '@/shared/enums/TipoEmolumentoEnum'; + +export default function TipoEmolumentoSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + + const options = Object.entries(TipoEmolumento).map(([value, label]) => ({ + value, + label, + })); + + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/shared/enums/SistemasEnum.ts b/src/shared/enums/SistemasEnum.ts new file mode 100644 index 0000000..cfb2dc8 --- /dev/null +++ b/src/shared/enums/SistemasEnum.ts @@ -0,0 +1,8 @@ +export const SistemasEnum = { + 1: 'Registro de Imóveis', + 2: 'Tabelionato de Notas', + 5: 'Caixa', + 7: 'Registro de Títulos e Documentos', + 12: 'Registro Civil', + 13: 'Protesto de Títulos e Documentos', +} as const; diff --git a/src/shared/enums/TipoCartorioEnum.ts b/src/shared/enums/TipoCartorioEnum.ts new file mode 100644 index 0000000..7c80404 --- /dev/null +++ b/src/shared/enums/TipoCartorioEnum.ts @@ -0,0 +1,7 @@ +export const TipoCartorioEnum = { + 1: 'Tabelionato de Notas', + 2: 'Registro de Imóveis', + 3: 'Registro Civil', + 4: 'RTD', + 5: 'Tabelionato de Protesto', +} as const; diff --git a/src/shared/enums/TipoEmolumentoEnum.ts b/src/shared/enums/TipoEmolumentoEnum.ts new file mode 100644 index 0000000..4e9fc54 --- /dev/null +++ b/src/shared/enums/TipoEmolumentoEnum.ts @@ -0,0 +1,6 @@ +export const TipoEmolumento = { + C: 'Certidões', + T: 'Títulos', + P: 'Personalizado', + B: 'Balcão', +} as const;