From 9e37520615a4686666c4ed464d9f64f4db85a1cc Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Fri, 10 Oct 2025 09:01:52 -0300 Subject: [PATCH 1/7] =?UTF-8?q?[MVPTN-86]=20feat(CRUD):=20Crud=20completo?= =?UTF-8?q?=20configura=C3=A7=C3=A3o=20de=20servi=C3=A7o=20de=20balc=C3=A3?= =?UTF-8?q?o=201=C2=AA=20parte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(t_servico_tipo)/servicos-tipo/page.tsx | 166 ++++++++++++++++++ .../t_servico_tipo/TServicoTipoForm.tsx | 134 ++++++++++++++ .../t_servico_tipo/TServicoTipoTable.tsx | 100 +++++++++++ .../TServicoTipo/TServicoTipoIndexData.ts | 24 +++ .../TServicoTipo/TServicoTipoRemoveData.ts | 27 +++ .../TServicoTipo/TServicoTipoSaveData.ts | 31 ++++ .../t_servico_tipo/useTServicoTipoReadHook.ts | 35 ++++ .../useTServicoTipoRemoveHook.ts | 25 +++ .../t_servico_tipo/useTServicoTipoSaveHook.ts | 33 ++++ .../_interfaces/TServicoTipoInterface.ts | 37 ++++ .../cadastros/_schemas/TServicoTipoSchema.ts | 122 +++++++++++++ .../TServicoTipoIndexService.ts | 17 ++ .../TServicoTipoRemoveService.ts | 20 +++ .../t_servico_tipo/TServicoTipoSaveService.ts | 20 +++ src/components/app-sidebar.tsx | 4 +- 15 files changed, 793 insertions(+), 2 deletions(-) create mode 100644 src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx new file mode 100644 index 0000000..c1749cb --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx @@ -0,0 +1,166 @@ +'use client'; + +import { useEffect, useState, useCallback } from 'react'; +import { Card, CardContent } from '@/components/ui/card'; + +import Loading from '@/app/_components/loading/loading'; + +// Componentes específicos para TServicoTipo +import TServicoTipoTable from '../../_components/t_servico_tipo/TServicoTipoTable'; +import TServicoTipoForm from '../../_components/t_servico_tipo/TServicoTipoForm'; + +// Hooks específicos para TServicoTipo +import { useTServicoTipoReadHook } from '../../_hooks/t_servico_tipo/useTServicoTipoReadHook'; +import { useTServicoTipoSaveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoSaveHook'; +import { useTServicoTipoRemoveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoRemoveHook'; + +import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; +import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; + +// Interface específica para TServicoTipo +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; +import Header from '@/app/_components/structure/Header'; + +export default function TServicoTipoPage() { + // Hooks para leitura, salvamento e remoção + const { tServicoTipo, fetchTServicoTipo } = useTServicoTipoReadHook(); + const { saveTServicoTipo } = useTServicoTipoSaveHook(); + const { removeTServicoTipo } = useTServicoTipoRemoveHook(); + + // Estados + const [selectedServicoTipo, setSelectedServicoTipo] = 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, + // handleConfirm, // Não usado diretamente aqui, mas pode ser útil em outros contextos + handleCancel, + } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: TServicoTipoInterface | null) => { + setSelectedServicoTipo(data); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o item selecionado + */ + const handleCloseForm = useCallback((_: null, __: boolean) => { + setSelectedServicoTipo(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback(async (formData: TServicoTipoInterface) => { + + // Aguarda salvar o registro + await saveTServicoTipo(formData); + + // Atualiza a lista de dados + fetchTServicoTipo(); + }, + [saveTServicoTipo, fetchTServicoTipo], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: TServicoTipoInterface) => { + // 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 removeTServicoTipo(itemToDelete); + + // Atualiza a lista + await fetchTServicoTipo(); + + // Limpa o item selecionado + setItemToDelete(null); + + // Fecha o modal + handleCancel(); + }, [itemToDelete, removeTServicoTipo, fetchTServicoTipo, handleCancel]); + + /** + * Busca inicial dos dados + */ + useEffect(() => { + fetchTServicoTipo(); + }, []); + + /** + * Tela de loading enquanto carrega os dados + */ + if (!tServicoTipo) { + return ; + } + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + + {/* Tabela de Tipos de Serviço */} + + + + + + + {/* Modal de confirmação */} + + + {/* Formulário de criação/edição */} + +
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx new file mode 100644 index 0000000..e8acbb8 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -0,0 +1,134 @@ +'use client'; + +import z from 'zod'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; + +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 { TServicoTipoSchema } from '../../_schemas/TServicoTipoSchema'; // Novo Schema +import { useEffect } from 'react'; + +// Define o tipo do formulário com base no novo schema Zod +type FormValues = z.infer; + +// Propriedades esperadas pelo componente +interface Props { + isOpen: boolean; // controla se o Dialog está aberto + data: FormValues | null; // dados para edição (se existirem) + onClose: (item: null, isFormStatus: boolean) => void; // callback para fechar + onSave: (data: FormValues) => void; // callback para salvar +} + +// Componente principal do formulário +export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Props) { + + // Inicializa o react-hook-form integrado ao Zod para validação + const form = useForm({ + resolver: zodResolver(TServicoTipoSchema), + defaultValues: { + servico_tipo_id: 0, // Assumindo 'servico_tipo_id' como o ID + descricao: '', // Assumindo 'descricao' como o campo de nome + }, + }); + + // Quando recebe dados para edição, atualiza os valores do formulário + useEffect(() => { + + if (data) { + // Se for edição, carrega os dados recebidos + form.reset({ + servico_tipo_id: data.servico_tipo_id, + descricao: data.descricao ?? '', + // Adicione outros campos específicos de TServicoTipo aqui + }); + } else { + // Se for novo cadastro, limpa o formulário com valores padrão + form.reset({ + servico_tipo_id: 0, + descricao: '', + // Adicione outros campos específicos de TServicoTipo aqui + }); + } + + }, [data, form]); // Não há dependência de fetchGUf, pois foi removido. + + return ( + { + if (!open) onClose(null, false); + }} + > + + {/* Cabeçalho do diálogo */} + + Tipos de Serviço + Controle de Tipos de Serviço + + + {/* Estrutura do formulário */} +
+ + {/* Campo: Nome do Tipo de Serviço (descricao) */} + ( + + Descrição do Tipo + + + + + + )} + /> + + {/* Rodapé do diálogo com botões */} + + {/* Botão de cancelar */} + + + + + {/* Botão de salvar */} + + + + {/* Campo oculto: ID do Tipo de Serviço */} + + + +
+
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx new file mode 100644 index 0000000..722e255 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx @@ -0,0 +1,100 @@ +'use client'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table'; + +import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react'; +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Import alterado + +// Tipagem das props do componente da tabela +interface TServicoTipoTableProps { // Nome da interface alterado + data: TServicoTipoInterface[]; // lista de tipos de serviço + onEdit: (item: TServicoTipoInterface, isEditingFormStatus: boolean) => void; // callback para edição + onDelete: (item: TServicoTipoInterface, isEditingFormStatus: boolean) => void; // callback para exclusão +} + +/** + * Componente principal da tabela de Tipos de Serviço + */ +export default function TServicoTipoTable({ data, onEdit, onDelete }: TServicoTipoTableProps) { + return ( + + {/* Cabeçalho da tabela */} + + + # + {/* As colunas IBGE e UF foram removidas */} + Descrição + + + + + {/* Corpo da tabela */} + + {data.map((item) => ( + // Assumindo que o ID do Tipo de Serviço é 'servico_tipo_id' + + {/* ID do Tipo de Serviço */} + {item.servico_tipo_id} + + {/* Nome/descrição do Tipo de Serviço (descricao) */} + {item.descricao} + {/* As células de IBGE e UF foram removidas */} + + {/* Ações (menu dropdown) */} + + + {/* Botão de disparo do menu */} + + + + + {/* Conteúdo do menu */} + + + {/* Opção editar */} + onEdit(item, true)} + > + + Editar + + + + + {/* Opção remover */} + onDelete(item, true)} + > + + Remover + + + + + + + ))} + +
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts new file mode 100644 index 0000000..18d9356 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts @@ -0,0 +1,24 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; // + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de buscar todos os tipos de serviço (GET) +async function executeTServicoTipoIndexData() { + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e o endpoint da tabela t_servico_tipo + return await api.send({ + method: Methods.GET, // GET listar todos os itens + endpoint: `administrativo/t_servico_tipo/` // Endpoint atualizado + }); +} + +// Exporta a função de listar tipos de serviço já encapsulada com tratamento de erros +export const TServicoTipoIndexData = withClientErrorHandler(executeTServicoTipoIndexData); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts new file mode 100644 index 0000000..aff2161 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts @@ -0,0 +1,27 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Alterado de GCidadeInterface + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de remover um tipo de serviço +async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { // Nome da função alterado + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia o ID no endpoint + return await api.send({ + method: Methods.DELETE, // Verbo DELETE para exclusão + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados de g_cidade/cidade_id + }); +} + +// Exporta a função de remover tipo de serviço já encapsulada com tratamento de erros +export const TServicoTipoRemoveData = withClientErrorHandler(executeTServicoTipoRemoveData); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts new file mode 100644 index 0000000..8914acc --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts @@ -0,0 +1,31 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Interface alterada + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço +async function executeTServicoTipoSaveData(data: TServicoTipoInterface) { // Nome da função alterado + + // Verifica se existe ID do tipo de serviço para decidir se é atualização (PUT) ou criação (POST) + const isUpdate = Boolean(data.servico_tipo_id); // Campo de ID alterado de 'cidade_id' para 'servico_tipo_id' + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id || ''}`, // Endpoint e ID alterados + body: data, // payload enviado para a API + }); +} + +// Exporta a função de salvar tipo de serviço já encapsulada com tratamento de erros +export const TServicoTipoSaveData = withClientErrorHandler(executeTServicoTipoSaveData); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts new file mode 100644 index 0000000..e149fb2 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts @@ -0,0 +1,35 @@ +import { useResponse } from '@/app/_response/ResponseContext'; // Contexto global para gerenciar respostas da API +import { useState } from 'react'; + +// Serviço que busca a lista de tipos de serviço (TServicoTipoIndexService) +import { TServicoTipoIndexService } from '../../_services/t_servico_tipo/TServicoTipoIndexService'; + +// Interface tipada do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; + +// Hook customizado para leitura de dados de tipos de serviço +export const useTServicoTipoReadHook = () => { + // Hook do contexto de resposta para feedback global (alertas, mensagens etc.) + const { setResponse } = useResponse(); + + // Estado local que armazena a lista de tipos de serviço retornada da API + const [tServicoTipo, setTServicoTipo] = useState([]); + + // Função assíncrona que busca os dados dos tipos de serviço + const fetchTServicoTipo = async () => { + // Chama o serviço responsável por consultar a API + const response = await TServicoTipoIndexService(); + + // Atualiza o estado local com os dados retornados + setTServicoTipo(response.data); + + // Atualiza o contexto global de resposta + setResponse(response); + + // Retorna a resposta para quem chamou o hook + return response; + }; + + // Retorna os dados e a função de busca para serem usados no componente + return { tServicoTipo, fetchTServicoTipo }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts new file mode 100644 index 0000000..b8102cd --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts @@ -0,0 +1,25 @@ +import { useResponse } from "@/app/_response/ResponseContext"; // Contexto global para gerenciar respostas da API + +// Interface tipada do tipo de serviço +import TServicoTipoInterface from "../../_interfaces/TServicoTipoInterface"; + +// Função que remove o tipo de serviço via API +import { TServicoTipoRemoveData } from "../../_data/TServicoTipo/TServicoTipoRemoveData"; + +// Hook customizado para remoção de tipos de serviço +export const useTServicoTipoRemoveHook = () => { + // Hook do contexto de resposta para feedback global (alertas, mensagens etc.) + const { setResponse } = useResponse(); + + // Função assíncrona que remove um tipo de serviço + const removeTServicoTipo = async (data: TServicoTipoInterface) => { + // Chama a função de remoção passando os dados do tipo de serviço + const response = await TServicoTipoRemoveData(data); + + // Atualiza o contexto global com a resposta da API + setResponse(response); + }; + + // Retorna a função de remoção para ser usada no componente + return { removeTServicoTipo }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts new file mode 100644 index 0000000..30308f0 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts @@ -0,0 +1,33 @@ +import { useState } from 'react'; +import { useResponse } from '@/app/_response/ResponseContext'; + +// Interface tipada do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; + +// Serviço que salva os dados do tipo de serviço +import { TServicoTipoSaveService } from '../../_services/t_servico_tipo/TServicoTipoSaveService'; + +export const useTServicoTipoSaveHook = () => { + const { setResponse } = useResponse(); + + // Estado local para armazenar os dados do tipo de serviço salvos + const [tServicoTipo, setTServicoTipo] = useState(null); + + /** + * Função que executa o salvamento de um tipo de serviço. + * @param data Os dados do tipo de serviço a serem salvos. + */ + const saveTServicoTipo = async (data: TServicoTipoInterface) => { + // Chama o serviço de salvamento + const response = await TServicoTipoSaveService(data); + + // Guardar os dados localizados + setTServicoTipo(response.data); + + // Manda a resposta para o verificador de resposta global + setResponse(response); + } + + // Retorna o estado e a função de salvamento para uso no componente + return { tServicoTipo, saveTServicoTipo }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts new file mode 100644 index 0000000..96a05f1 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts @@ -0,0 +1,37 @@ +export default interface TServicoTipoInterface { + servico_tipo_id?: number; // SERVICO_TIPO_ID NUMERIC(10,2) NOT NULL (PK) + descricao: string; // DESCRICAO VARCHAR(60) + valor?: number; // VALOR NUMERIC(14,3) + tipo_item?: string; // TIPO_ITEM VARCHAR(1) + requer_autorizacao?: string; // REQUER_AUTORIZACAO VARCHAR(1) + requer_biometria?: string; // REQUER_BIOMETRIA VARCHAR(1) + tipo_pessoa?: string; // TIPO_PESSOA VARCHAR(1) + tb_reconhecimentotipo_id?: number; // TB_RECONHECIMENTOTIPO_ID NUMERIC(10,2) (FK) + tipo_permissao_cpf?: string; // TIPO_PERMISSAO_CPF VARCHAR(1) + requer_abonador?: string; // REQUER_ABONADOR VARCHAR(1) + requer_representante?: string; // REQUER_REPRESENTANTE VARCHAR(1) + situacao?: string; // SITUACAO VARCHAR(1) + requer_cpf?: string; // REQUER_CPF VARCHAR(1) + servico_padrao?: string; // SERVICO_PADRAO VARCHAR(1) + maximo_pessoa?: number; // MAXIMO_PESSOA NUMERIC(10,2) + alterar_valor?: string; // ALTERAR_VALOR VARCHAR(1) + servico_caixa_id?: number; // SERVICO_CAIXA_ID NUMERIC(10,2) + lancar_taxa?: string; // LANCAR_TAXA VARCHAR(1) + lancar_fundesp?: string; // LANCAR_FUNDESP VARCHAR(1) + liberar_desconto?: string; // LIBERAR_DESCONTO VARCHAR(1) + fundesp_automatica?: string; // FUNDESP_AUTOMATICA VARCHAR(1) + lancar_valor_documento?: string; // LANCAR_VALOR_DOCUMENTO VARCHAR(1) + valor_fixo?: string; // VALOR_FIXO VARCHAR(1) + emolumento_id?: number; // EMOLUMENTO_ID NUMERIC(10,2) (FK) + ato_praticado?: string; // ATO_PRATICADO VARCHAR(1) + selar?: string; // SELAR VARCHAR(1) + frenteverso?: string; // FRENTEVERSO VARCHAR(1) + pagina_acrescida?: string; // PAGINA_ACRESCIDA VARCHAR(1) + emolumento_obrigatorio?: number; // EMOLUMENTO_OBRIGATORIO NUMERIC(10,2) + apresentante_selo?: string; // APRESENTANTE_SELO VARCHAR(1) + renovacao_cartao?: string; // RENOVACAO_CARTAO VARCHAR(1) + etiqueta_unica?: string; // ETIQUETA_UNICA VARCHAR(1) + transferencia_veiculo?: string; // TRANSFERENCIA_VEICULO VARCHAR(1) + usar_a4?: string; // USAR_A4 VARCHAR(1) + averbacao?: string; // AVERBACAO VARCHAR(1) +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts new file mode 100644 index 0000000..8276189 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts @@ -0,0 +1,122 @@ +import z from 'zod'; + +// Define um esquema para campos de 1 caractere (sim/não ou tipo) +// Poderia ser um z.enum(['S', 'N']) mais restritivo dependendo da regra de negócio, +// mas seguindo o padrão da DDL (VARCHAR(1)), o string.max(1) é mais flexível. +const OneCharString = z.string().max(1, 'Deve ter no máximo 1 caractere').optional(); + +// Define um esquema para campos string obrigatórios +const RequiredString = z.string().min(1, 'O campo é obrigatório'); + +// Define um esquema para campos numéricos opcionais, baseados em NUMERIC(10,2) ou similar +const OptionalNumber = z.number().optional(); + +// Define um esquema para campos numéricos obrigatórios +const RequiredNumber = z.number(); + +export const TServicoTipoSchema = z.object({ + // Chave primária: NOT NULL na DDL + servico_tipo_id: RequiredNumber.describe('ID do Tipo de Serviço').optional(), // Mantido optional seguindo o padrão de GCidadeSchema para chaves ID + + // VARCHAR(60) + descricao: z.string().max(60, 'A descrição deve ter no máximo 60 caracteres').optional(), + + // NUMERIC(14,3) + valor: z.number().optional(), + + // VARCHAR(1) + tipo_item: OneCharString, + + // VARCHAR(1) + requer_autorizacao: OneCharString, + + // VARCHAR(1) + requer_biometria: OneCharString, + + // VARCHAR(1) + tipo_pessoa: OneCharString, + + // NUMERIC(10,2) - Chave estrangeira + tb_reconhecimentotipo_id: OptionalNumber, + + // VARCHAR(1) + tipo_permissao_cpf: OneCharString, + + // VARCHAR(1) + requer_abonador: OneCharString, + + // VARCHAR(1) + requer_representante: OneCharString, + + // VARCHAR(1) + situacao: OneCharString, + + // VARCHAR(1) + requer_cpf: OneCharString, + + // VARCHAR(1) + servico_padrao: OneCharString, + + // NUMERIC(10,2) + maximo_pessoa: OptionalNumber, + + // VARCHAR(1) + alterar_valor: OneCharString, + + // NUMERIC(10,2) + servico_caixa_id: OptionalNumber, + + // VARCHAR(1) + lancar_taxa: OneCharString, + + // VARCHAR(1) + lancar_fundesp: OneCharString, + + // VARCHAR(1) + liberar_desconto: OneCharString, + + // VARCHAR(1) + fundesp_automatica: OneCharString, + + // VARCHAR(1) + lancar_valor_documento: OneCharString, + + // VARCHAR(1) + valor_fixo: OneCharString, + + // NUMERIC(10,2) - Chave estrangeira + emolumento_id: OptionalNumber, + + // VARCHAR(1) + ato_praticado: OneCharString, + + // VARCHAR(1) + selar: OneCharString, + + // VARCHAR(1) + frenteverso: OneCharString, + + // VARCHAR(1) + pagina_acrescida: OneCharString, + + // NUMERIC(10,2) + emolumento_obrigatorio: OptionalNumber, + + // VARCHAR(1) + apresentante_selo: OneCharString, + + // VARCHAR(1) + renovacao_cartao: OneCharString, + + // VARCHAR(1) + etiqueta_unica: OneCharString, + + // VARCHAR(1) + transferencia_veiculo: OneCharString, + + // VARCHAR(1) + usar_a4: OneCharString, + + // VARCHAR(1) + averbacao: OneCharString, +}); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts new file mode 100644 index 0000000..89aaa7b --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts @@ -0,0 +1,17 @@ +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente + +import { TServicoTipoIndexData } from '../../_data/TServicoTipo/TServicoTipoIndexData'; +// Função que retorna os dados da lista de tipos de serviço (chamada à API ou mock) + +// Função assíncrona que executa a chamada para buscar os dados dos tipos de serviço +async function executeTServicoTipoIndexService() { + // Chama a função que retorna os dados dos tipos de serviço + const response = await TServicoTipoIndexData(); + + // Retorna a resposta para o chamador + return response; +} + +// Exporta o serviço de índice de tipos de serviço já encapsulado com tratamento de erros +export const TServicoTipoIndexService = withClientErrorHandler(executeTServicoTipoIndexService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts new file mode 100644 index 0000000..f7ff3f8 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts @@ -0,0 +1,20 @@ +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente + +import { TServicoTipoRemoveData } from '../../_data/TServicoTipo/TServicoTipoRemoveData'; +// Função que remove os dados do tipo de serviço via API + +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; +// Interface tipada do tipo de serviço + +// Função assíncrona que executa a remoção de um tipo de serviço +async function executeTServicoTipoRemoveService(data: TServicoTipoInterface) { + // Chama a função que remove os dados do tipo de serviço + const response = await TServicoTipoRemoveData(data); + + // Retorna a resposta da remoção + return response; +} + +// Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros +export const TServicoTipoRemoveService = withClientErrorHandler(executeTServicoTipoRemoveService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts new file mode 100644 index 0000000..1a8ff4b --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts @@ -0,0 +1,20 @@ +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; + +// Função que salva os dados do tipo de serviço via API (ou mock) +import { TServicoTipoSaveData } from '../../_data/TServicoTipo/TServicoTipoSaveData'; + +// Interface tipada do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; + +// Função assíncrona que executa o salvamento de um tipo de serviço +async function executeTServicoTipoSaveService(data: TServicoTipoInterface) { + // Chama a função que salva os dados do tipo de serviço + const response = await TServicoTipoSaveData(data); + + // Retorna a resposta do salvamento + return response; +} + +// Exporta o serviço de salvamento de tipo de serviço já encapsulado com tratamento de erros +export const TServicoTipoSaveService = withClientErrorHandler(executeTServicoTipoSaveService); \ No newline at end of file diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index c2ec53c..eb9a168 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -158,8 +158,8 @@ const data = { url: "/cadastros/censec-tipoato" }, { - title: "Regimes/Comunhão", - url: "/cadastros/regime-comunhao/", + title: "Serviços/Tipos", + url: "/cadastros/servicos-tipo/", }, { title: 'Censec/Centrais', From a26fc881b2db21f7593489a5661ee1782c4632b8 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Mon, 13 Oct 2025 13:51:42 -0300 Subject: [PATCH 2/7] =?UTF-8?q?[MVPTN-86]=20feat(CRUD):=20Cria=C3=A7=C3=A3?= =?UTF-8?q?o=20do=20CRUD=20configura=C3=A7=C3=A3o=20de=20servi=C3=A7os=20d?= =?UTF-8?q?e=20balc=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../t_servico_tipo/TServicoTipoForm.tsx | 564 ++++++++++++++++-- .../components/t_imovel/TImovelForm.tsx | 5 + 2 files changed, 510 insertions(+), 59 deletions(-) diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index e8acbb8..03c0127 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -14,6 +14,8 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { DollarSign, Settings, SquarePen } from 'lucide-react'; import { Form, FormControl, @@ -23,63 +25,65 @@ import { FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; +import { Checkbox } from '@/components/ui/checkbox'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; -import { TServicoTipoSchema } from '../../_schemas/TServicoTipoSchema'; // Novo Schema +import { TServicoTipoSchema } from '../../_schemas/TServicoTipoSchema'; import { useEffect } from 'react'; -// Define o tipo do formulário com base no novo schema Zod +// Tipo inferido a partir do schema Zod type FormValues = z.infer; // Propriedades esperadas pelo componente interface Props { - isOpen: boolean; // controla se o Dialog está aberto - data: FormValues | null; // dados para edição (se existirem) - onClose: (item: null, isFormStatus: boolean) => void; // callback para fechar - onSave: (data: FormValues) => void; // callback para salvar + isOpen: boolean; + data: FormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: FormValues) => void; } // Componente principal do formulário export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Props) { - - // Inicializa o react-hook-form integrado ao Zod para validação + + // Inicializa o react-hook-form com validação via Zod const form = useForm({ resolver: zodResolver(TServicoTipoSchema), defaultValues: { - servico_tipo_id: 0, // Assumindo 'servico_tipo_id' como o ID - descricao: '', // Assumindo 'descricao' como o campo de nome + servico_tipo_id: 0, + descricao: '', + categoria: '', + servico_padrao: '', + servico_caixa: '', + averbacao: false, + transferencia_veiculo: false, + usar_a4: false, + etiqueta_unica: '', }, }); - // Quando recebe dados para edição, atualiza os valores do formulário + // Atualiza os valores quando há dados para edição useEffect(() => { - if (data) { - // Se for edição, carrega os dados recebidos - form.reset({ - servico_tipo_id: data.servico_tipo_id, - descricao: data.descricao ?? '', - // Adicione outros campos específicos de TServicoTipo aqui - }); + form.reset(data); } else { - // Se for novo cadastro, limpa o formulário com valores padrão - form.reset({ - servico_tipo_id: 0, - descricao: '', - // Adicione outros campos específicos de TServicoTipo aqui - }); + form.reset(); } - - }, [data, form]); // Não há dependência de fetchGUf, pois foi removido. + }, [data, form]); return ( { if (!open) onClose(null, false); }} > - + {/* Cabeçalho do diálogo */} Tipos de Serviço @@ -89,46 +93,488 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Estrutura do formulário */}
- {/* Campo: Nome do Tipo de Serviço (descricao) */} - ( - - Descrição do Tipo - - - - - - )} - /> - {/* Rodapé do diálogo com botões */} + + + {/* Abas principais */} + + + + Dados do Tipo de Serviço + + + + Configurações + + + + Valores + + + + {/* Aba: Dados do Tipo de Serviço */} + + +
+ + {/* Campo: Descrição */} +
+ ( + + Descrição do Tipo + + + + + + )} + /> +
+ + {/* Campo: Categoria (Select) */} +
+ ( + + Categoria + + + + )} + /> +
+ + {/* Campo: Serviço Padrão (Select) */} +
+ ( + + Serviço Padrão + + + + )} + /> +
+ + {/* Campo: Serviço Caixa (Select) */} +
+ ( + + Serviço Caixa + + + + )} + /> +
+ + {/* Campo: Averbação (Checkbox) */} +
+ ( + + + + + Averbação + + )} + /> +
+ + {/* Campo: Transferência de Veículo (Checkbox) */} +
+ ( + + + + + Transferência Veículo + + )} + /> +
+ + {/* Campo: Usar A4 (Checkbox) */} +
+ ( + + + + + Usar A4 + + )} + /> +
+ + {/* Campo: Etiqueta Única (Texto normal) */} +
+ ( + + + + + Etiqueta Única + + )} + /> +
+
+
+ + {/* Outras abas */} + + +
+ + {/* Campo: Serviço tipo (Select) */} +
+ ( + + Tipo + + + + )} + /> +
+ + + {/* Campo: Pessoa (Select) */} +
+ ( + + Pessoa + + + + )} + /> +
+ + + {/* Campo: Quantidade de pessoas */} +
+ ( + + {/* Rótulo do campo */} + Quantidade de pessoas + + + { + const apenasNumeros = e.target.value.replace(/[^0-9]/g, ''); + field.onChange(apenasNumeros); + }} + /> + + + {/* Exibe mensagens de erro do React Hook Form */} + + + )} + /> +
+ +
Requerer
+ + {/* Campo: Biometria (Select) */} +
+ ( + + Biometria + + + + )} + /> +
+ + {/* Campo: CPF/CNPJ (Select) */} +
+ ( + + CPF/CNPJ + + + + )} + /> +
+ + + {/* Campo: autorização (Select) */} +
+ ( + + Autorização + + + + )} + /> +
+ + + {/* Campo: abonador (Select) */} +
+ ( + + Abonador + + + + )} + /> +
+ + + {/* Campo: etiquetas/carimbos (Select) */} +
+ ( + + Abonador + + + + )} + /> +
+ +
+ +
+ + 003 + + + {/* Campo oculto: ID */} + +
+ + {/* Rodapé do diálogo */} - {/* Botão de cancelar */} - - - {/* Botão de salvar */} - + - - {/* Campo oculto: ID do Tipo de Serviço */} -
); -} \ No newline at end of file +} diff --git a/src/packages/administrativo/components/t_imovel/TImovelForm.tsx b/src/packages/administrativo/components/t_imovel/TImovelForm.tsx index 0638319..0cb347b 100644 --- a/src/packages/administrativo/components/t_imovel/TImovelForm.tsx +++ b/src/packages/administrativo/components/t_imovel/TImovelForm.tsx @@ -77,6 +77,7 @@ export default function TImovelForm({ isOpen, data, onClose, onSave, buttonIsLoa }} > + Imóvel Urbano @@ -85,10 +86,13 @@ export default function TImovelForm({ isOpen, data, onClose, onSave, buttonIsLoa Cadastro de imóvel urbano +
{/* Tabs */} + + @@ -99,6 +103,7 @@ export default function TImovelForm({ isOpen, data, onClose, onSave, buttonIsLoa Unidades + {/* Dados do Imóvel */}
From 6c7967587a1d87259ece211e10c3016945d45cd8 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Mon, 13 Oct 2025 17:00:01 -0300 Subject: [PATCH 3/7] =?UTF-8?q?[MVPTN-86]=20feat(endpoint):=20Foi=20criado?= =?UTF-8?q?=20o=20acesso=20ao=20endpoint=20respons=C3=A1vel=20em=20trazer?= =?UTF-8?q?=20g=5Fmarcacao=5Ftipo=20com=20filtro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(t_servico_tipo)/servicos-tipo/page.tsx | 8 +- .../t_servico_tipo/TServicoTipoForm.tsx | 23 ++--- .../GMarcacaoTipo/GMarcacaoTipoIndexData.ts | 33 +++++++ .../TServicoTipo/TServicoTipoIndexData.ts | 6 +- .../TServicoTipo/TServicoTipoRemoveData.ts | 6 +- .../TServicoTipo/TServicoTipoSaveData.ts | 6 +- .../useGMarcacaoTipoReadHook.ts | 37 +++++++ .../t_servico_tipo/useTServicoTipoReadHook.ts | 2 +- .../useTServicoTipoRemoveHook.ts | 2 +- .../t_servico_tipo/useTServicoTipoSaveHook.ts | 2 +- .../_interfaces/GMarcacaoTipoInterface.ts | 20 ++++ .../_interfaces/GMarcacaoTipoReadInterface.ts | 5 + .../GMarcacaoTipoIndexService.ts | 20 ++++ .../TServicoTipoIndexService.ts | 2 +- .../TServicoTipoRemoveService.ts | 2 +- .../t_servico_tipo/TServicoTipoSaveService.ts | 2 +- .../GMarcacaoTipo/GMarcacaoTipoSelect.tsx | 97 +++++++++++++++++++ src/shared/actions/api/buildQueryString.ts | 14 +++ 18 files changed, 253 insertions(+), 34 deletions(-) create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/GMarcacaoTipo/GMarcacaoTipoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts create mode 100644 src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx create mode 100644 src/shared/actions/api/buildQueryString.ts diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx index c1749cb..c216953 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; // Componentes específicos para TServicoTipo import TServicoTipoTable from '../../_components/t_servico_tipo/TServicoTipoTable'; @@ -14,12 +14,12 @@ import { useTServicoTipoReadHook } from '../../_hooks/t_servico_tipo/useTServico import { useTServicoTipoSaveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoSaveHook'; import { useTServicoTipoRemoveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoRemoveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; // Interface específica para TServicoTipo import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TServicoTipoPage() { // Hooks para leitura, salvamento e remoção diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index 03c0127..9c03c25 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -36,6 +36,7 @@ import { import { TServicoTipoSchema } from '../../_schemas/TServicoTipoSchema'; import { useEffect } from 'react'; +import GMarcacaoTipoSelect from '@/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect'; // Tipo inferido a partir do schema Zod type FormValues = z.infer; @@ -531,21 +532,13 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop name="etiquetas_carimbos" render={({ field }) => ( - Abonador - + Etiquetas/Carimbos + )} diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GMarcacaoTipo/GMarcacaoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GMarcacaoTipo/GMarcacaoTipoIndexData.ts new file mode 100644 index 0000000..4914f59 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GMarcacaoTipo/GMarcacaoTipoIndexData.ts @@ -0,0 +1,33 @@ +// Importa o utilitário responsável por tratar erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a classe de serviço que gerencia requisições HTTP para a API +import API from '@/shared/services/api/Api'; + +// Importa o enum que define os métodos HTTP disponíveis (GET, POST, PUT, DELETE, etc.) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import { GMarcacaoTipoReadInterface } from '../../_interfaces/GMarcacaoTipoReadInterface'; + +// Importa a função genérica que monta a query string dinamicamente +import { buildQueryString } from '@/shared/actions/api/buildQueryString'; + +// Função assíncrona responsável por executar a requisição para listar os tipos de marcação +async function executeGMarcacaoTipoIndexData(data: GMarcacaoTipoReadInterface) { + // Cria uma nova instância da classe API para enviar a requisição + const api = new API(); + + // Monta a query string reutilizando a função genérica + const queryString = buildQueryString(data); + + // Concatena o endpoint com a query string (caso existam parâmetros) + const endpoint = `administrativo/g_marcacao_tipo/grupo${queryString}`; + + // Envia uma requisição GET para o endpoint 'administrativo/g_marcacao_tipo/' + return await api.send({ + method: Methods.GET, + endpoint: endpoint, + }); +} + +// Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GMarcacaoTipoIndexData = withClientErrorHandler(executeGMarcacaoTipoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts index 18d9356..36533f8 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts @@ -1,11 +1,11 @@ // Importa o serviço de API que será utilizado para realizar requisições HTTP -import API from '@/services/api/Api'; // +import API from '@/shared/services/api/Api'; // // Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) -import { Methods } from '@/services/api/enums/ApiMethodEnum'; // +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // // Importa função que encapsula chamadas assíncronas e trata erros automaticamente -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de buscar todos os tipos de serviço (GET) async function executeTServicoTipoIndexData() { diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts index aff2161..5b91bb5 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts @@ -1,14 +1,14 @@ // Importa o serviço de API que será utilizado para realizar requisições HTTP -import API from '@/services/api/Api'; // +import API from '@/shared/services/api/Api'; // // Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) -import { Methods } from '@/services/api/enums/ApiMethodEnum'; // +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // // Importa a interface tipada que define a estrutura dos dados do tipo de serviço import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Alterado de GCidadeInterface // Importa função que encapsula chamadas assíncronas e trata erros automaticamente -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de remover um tipo de serviço async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { // Nome da função alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts index 8914acc..47942ce 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts @@ -1,14 +1,14 @@ // Importa o serviço de API que será utilizado para realizar requisições HTTP -import API from '@/services/api/Api'; // +import API from '@/shared/services/api/Api'; // // Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) -import { Methods } from '@/services/api/enums/ApiMethodEnum'; // +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // // Importa a interface tipada que define a estrutura dos dados do tipo de serviço import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Interface alterada // Importa função que encapsula chamadas assíncronas e trata erros automaticamente -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; // +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço async function executeTServicoTipoSaveData(data: TServicoTipoInterface) { // Nome da função alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts new file mode 100644 index 0000000..2f1cfb7 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts @@ -0,0 +1,37 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useMemo, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "GMarcacaoTipo" +import { GMarcacaoTipoReadInterface } from '../../_interfaces/GMarcacaoTipoReadInterface'; + +// Importa o serviço responsável por buscar os dados de "GMarcacaoTipo" na API +import { GMarcacaoTipoIndexService } from '../../_services/g_marcacao_tipo/GMarcacaoTipoIndexService'; +import { GMarcacaoTipoInterface } from '../../_interfaces/GMarcacaoTipoInterface'; + + +// Hook personalizado para leitura (consulta) dos tipos de marcação +export const useGMarcacaoTipoReadHook = () => { + // Obtém a função que atualiza a resposta global do sistema + const { setResponse } = useResponse(); + + // Define o estado local que armazenará a lista de tipos de marcação + const [gMarcacaoTipo, setGMarcacaoTipo] = useState([]); + + // Função responsável por buscar os dados da API e atualizar o estado + const fetchGMarcacaoTipo = async (data: GMarcacaoTipoReadInterface) => { + // Executa o serviço que faz a requisição à API + const response = await GMarcacaoTipoIndexService(data); + + // Atualiza o estado local com os dados retornados + setGMarcacaoTipo(response.data); + + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + }; + + // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias + return useMemo(() => ({ gMarcacaoTipo, fetchGMarcacaoTipo }), [gMarcacaoTipo, fetchGMarcacaoTipo]); +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts index e149fb2..cdb3acd 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts @@ -1,4 +1,4 @@ -import { useResponse } from '@/app/_response/ResponseContext'; // Contexto global para gerenciar respostas da API +import { useResponse } from '@/shared/components/response/ResponseContext'; // Contexto global para gerenciar respostas da API import { useState } from 'react'; // Serviço que busca a lista de tipos de serviço (TServicoTipoIndexService) diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts index b8102cd..7c7c8f4 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts @@ -1,4 +1,4 @@ -import { useResponse } from "@/app/_response/ResponseContext"; // Contexto global para gerenciar respostas da API +import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API // Interface tipada do tipo de serviço import TServicoTipoInterface from "../../_interfaces/TServicoTipoInterface"; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts index 30308f0..1ed50de 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; // Interface tipada do tipo de serviço import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts new file mode 100644 index 0000000..7e3be09 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts @@ -0,0 +1,20 @@ +export interface GMarcacaoTipoInterface { + marcacao_tipo_id?: number; + descricao?: string; + texto?: string; // Mapeamento para BLOB SUB_TYPE BINARY + nome?: string; + grupo?: string; + situacao?: string; + sistema_id?: number; + grupo_tipo?: string; + tipo_qualificacao?: string; + condicao_sql?: string; + separador_1?: string; + separador_2?: string; + separador_3?: string; + tipo_valor?: string; + atualizar?: string; + protegida?: string; + ativar_separador?: string; + sql_completo?: string; +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts new file mode 100644 index 0000000..9c95bb0 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts @@ -0,0 +1,5 @@ +export interface GMarcacaoTipoReadInterface { + grupo?: string; + sistema_id?: number; + situacao?: string; +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts new file mode 100644 index 0000000..cf886af --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts @@ -0,0 +1,20 @@ +// Importa o utilitário responsável por lidar com erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a função que realiza a requisição de listagem dos tipos de marcação +import { GMarcacaoTipoIndexData } from '../../_data/GMarcacaoTipo/GMarcacaoTipoIndexData'; +import { GMarcacaoTipoReadInterface } from '../../_interfaces/GMarcacaoTipoReadInterface'; + +// Função assíncrona responsável por executar o serviço de listagem de tipos de marcação +async function executeGMarcacaoTipoIndexService(data: GMarcacaoTipoReadInterface) { + // Chama a função que realiza a requisição à API e aguarda a resposta + const response = await GMarcacaoTipoIndexData(data); + + // Retorna a resposta obtida da requisição + return response; +} + +// Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GMarcacaoTipoIndexService = withClientErrorHandler( + executeGMarcacaoTipoIndexService, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts index 89aaa7b..da0f6be 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts @@ -1,4 +1,4 @@ -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente import { TServicoTipoIndexData } from '../../_data/TServicoTipo/TServicoTipoIndexData'; diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts index f7ff3f8..346a859 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts @@ -1,4 +1,4 @@ -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente import { TServicoTipoRemoveData } from '../../_data/TServicoTipo/TServicoTipoRemoveData'; diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts index 1a8ff4b..7a4ff82 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts @@ -1,5 +1,5 @@ // Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente -import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // Função que salva os dados do tipo de serviço via API (ou mock) import { TServicoTipoSaveData } from '../../_data/TServicoTipo/TServicoTipoSaveData'; diff --git a/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx new file mode 100644 index 0000000..3946b66 --- /dev/null +++ b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx @@ -0,0 +1,97 @@ +'use client'; + +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import GetCapitalize from "@/shared/actions/text/GetCapitalize"; +import { useGMarcacaoTipoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook"; +import { GMarcacaoTipoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface"; + +export default function GMarcacaoTipoSelect({ grupo, sistema_id, situacao, field }: any) { + + const gMarcacaoTipoReadParams: GMarcacaoTipoReadInterface = { grupo, sistema_id, situacao }; + + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { gMarcacaoTipo, fetchGMarcacaoTipo } = useGMarcacaoTipoReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!gMarcacaoTipo.length) { + setIsLoading(true); + await fetchGMarcacaoTipo(gMarcacaoTipoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = gMarcacaoTipo?.find( + (item) => String(item.marcacao_tipo_id) === String(field.value) + ); + return ( + + + + + + + + + + + + {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} + + + {gMarcacaoTipo?.map((item) => ( + { + field.onChange(Number(item.marcacao_tipo_id)); + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); +} diff --git a/src/shared/actions/api/buildQueryString.ts b/src/shared/actions/api/buildQueryString.ts new file mode 100644 index 0000000..37293fe --- /dev/null +++ b/src/shared/actions/api/buildQueryString.ts @@ -0,0 +1,14 @@ +/** + * 🔧 Função genérica responsável por montar uma query string + * Recebe um objeto qualquer e converte os campos preenchidos em parâmetros de URL. + * Exemplo: { grupo: 'A', sistema_id: 2 } → "?grupo=A&sistema_id=2" + */ +export function buildQueryString(params: Record): string { + // Retorna uma string no formato ?chave=valor&chave2=valor2 (ou string vazia se não houver parâmetros) + const query = Object.entries(params || {}) + .filter(([_, value]) => value !== undefined && value !== null && value !== '') + .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) + .join('&'); + + return query ? `?${query}` : ''; +} \ No newline at end of file From 56bca3ba41d989034fec48651791b8bec93aa5f3 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Fri, 17 Oct 2025 18:21:30 -0300 Subject: [PATCH 4/7] =?UTF-8?q?[MVPTN-86]=20feat(CRUD):=20Adicionado=20rec?= =?UTF-8?q?ursos=20din=C3=A2micos=20de=20select?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../t_servico_tipo/TServicoTipoForm.tsx | 572 +++++++++++++++--- .../CCaixaServico/CCaixaServicoIndexData.ts | 27 + .../_data/GEmolumento/GEmolumentoIndexData.ts | 27 + .../GEmolumentoItemValorData.ts | 27 + .../useCCaixaServicoReadHook.ts | 37 ++ .../g_emolumento/useGEmolumentoReadHook.ts | 37 ++ .../useGEmolumentoItemReadHook.ts | 46 ++ .../_interfaces/CCaixaServicoInterface.ts | 17 + .../_interfaces/CCaixaServicoReadInterface.ts | 3 + .../_interfaces/GEmolumentoInterface.ts | 20 + .../_interfaces/GEmolumentoItemInterface.ts | 32 + .../GEmolumentoItemReadInterface.ts | 4 + .../_interfaces/GEmolumentoReadInterface.ts | 3 + .../cadastros/_schemas/TServicoTipoSchema.ts | 182 +++--- .../CCaixaServicoIndexService.ts | 20 + .../g_emolumento/GEmolumentoIndexService.ts | 20 + .../GEmolumentoItemValorService.ts | 20 + src/components/ui/table.tsx | 86 ++- .../CCaixaServico/CCaixaServicoSelect.tsx | 102 ++++ .../GEmolumento/GEmolumentoSelect.tsx | 152 +++++ .../GMarcacaoTipo/GMarcacaoTipoSelect.tsx | 13 +- .../CategoriaServicoSelect.tsx | 87 +++ src/shared/enums/CategoriaServicoEnum.ts | 7 + 23 files changed, 1306 insertions(+), 235 deletions(-) create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/CCaixaServico/CCaixaServicoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/GEmolumento/GEmolumentoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/GEmolumentoItem/GEmolumentoItemValorData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts create mode 100644 src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx create mode 100644 src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx create mode 100644 src/shared/enums/CategoriaServicoEnum.ts diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index 9c03c25..30b4e1a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -1,9 +1,10 @@ 'use client'; +import React from "react"; import z from 'zod'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; - +import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -15,7 +16,7 @@ import { DialogTitle, } from '@/components/ui/dialog'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { DollarSign, Settings, SquarePen } from 'lucide-react'; +import { CirclePlus, DollarSign, Settings, SquarePen, Trash } from 'lucide-react'; import { Form, FormControl, @@ -33,49 +34,143 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select'; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" -import { TServicoTipoSchema } from '../../_schemas/TServicoTipoSchema'; +import { TServicoTipoSchema, TServicoTipoFormValues } from '../../_schemas/TServicoTipoSchema'; import { useEffect } from 'react'; import GMarcacaoTipoSelect from '@/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect'; - -// Tipo inferido a partir do schema Zod -type FormValues = z.infer; +import GEmolumentoSelect from '@/packages/administrativo/components/GEmolumento/GEmolumentoSelect'; +import { useGEmolumentoItemReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook"; +import { GEmolumentoItemReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface"; +import CategoriaServicoSelect from "@/shared/components/categoriaServicoSelect/CategoriaServicoSelect"; +import CCaixaServicoSelect from "@/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect"; // Propriedades esperadas pelo componente interface Props { isOpen: boolean; - data: FormValues | null; + data: TServicoTipoFormValues | null; onClose: (item: null, isFormStatus: boolean) => void; - onSave: (data: FormValues) => void; + onSave: (data: TServicoTipoFormValues) => void; } // Componente principal do formulário export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Props) { + // Estado para gerenciar os itens da tabela de etiquetas/carimbos + const [itensTabela, setItensTabela] = useState<{ marcacao_tipo_id: string; descricao: string }[]>([]); + + // Função para adicionar um novo item à tabela + const handleAddEtiquetaCarimbo = () => { + const valorSelecionado = form.getValues('etiquetas_carimbos'); + + if (!valorSelecionado) return; + + // Aqui você pode buscar o texto/descrição com base no seu componente GMarcacaoTipoSelect + // Exemplo: supondo que o valor seja um objeto { id, descricao } + const item = { + + marcacao_tipo_id: valorSelecionado.key ?? valorSelecionado, // ou ajusta conforme a estrutura do seu componente + descricao: valorSelecionado.value ?? 'Sem descrição', + }; + + // Evita duplicatas + setItensTabela((prev) => { + if (prev.some((p) => p.marcacao_tipo_id === item.marcacao_tipo_id)) return prev; + return [...prev, item]; + }); + }; + + const handleRemoveItem = (marcacao_tipo_id: string) => { + setItensTabela((prev) => prev.filter((p) => p.marcacao_tipo_id !== marcacao_tipo_id)); + }; + + + // Parâmetros para o hook de leitura de emolumento_item + // Inicializa com valores padrão (0) para evitar uso de propriedades não declaradas. + const gEmolumentoItemReadParams: GEmolumentoItemReadInterface = { emolumento_id: 0, valor: 0 }; + + // Estados locais + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + + // Hook que realiza a leitura do emolumento_item + const { gGEmolumentoItem, fetchGEmolumentoItem } = useGEmolumentoItemReadHook(); + + // Busca os dados ao montar o componente (somente se houver ID válido) + React.useEffect(() => { + const loadData = async () => { + // Validação: só executa se houver emolumento_id informado e válido + if ( + !gEmolumentoItemReadParams?.emolumento_id || // se não existir o campo + isNaN(Number(gEmolumentoItemReadParams.emolumento_id)) || // se não for número + Number(gEmolumentoItemReadParams.emolumento_id) <= 0 // se for zero ou negativo + ) { + return; // encerra sem executar a busca + } + + // Executa a busca apenas se ainda não houver dados carregados + if (!gGEmolumentoItem.length) { + setIsLoading(true); + await fetchGEmolumentoItem(gEmolumentoItemReadParams); + setIsLoading(false); + } + }; + + loadData(); + }, [gEmolumentoItemReadParams.emolumento_id]); + + // Inicializa o react-hook-form com validação via Zod - const form = useForm({ - resolver: zodResolver(TServicoTipoSchema), - defaultValues: { - servico_tipo_id: 0, - descricao: '', - categoria: '', - servico_padrao: '', - servico_caixa: '', - averbacao: false, - transferencia_veiculo: false, - usar_a4: false, - etiqueta_unica: '', - }, - }); +const form = useForm({ + resolver: zodResolver(TServicoTipoSchema), + defaultValues: { + servico_tipo_id: 0, + descricao: "", + categoria: "", + frenteverso: "N", + averbacao: "N", + transferencia_veiculo: "N", + usar_a4: "N", + etiqueta_unica: "N", + situacao: "A", + selar: "N", + valor_emolumento: 0, + valor_taxa_judiciaria: 0, + fundesp_valor: 0, + valor_total: 0, + }, +}); + + // Captura o ID do serviço para uso local + const servicoTipoId = Number(form.watch("servico_tipo_id") || data?.servico_tipo_id || 0); // Atualiza os valores quando há dados para edição useEffect(() => { - if (data) { + + if (data && Number(data.servico_tipo_id) > 0) { + + //Carrega os valores no form form.reset(data); } else { - form.reset(); + + // Se não houver dados, reseta o + // formulário para os valores iniciais + // Modo novo cadastro → zera o ID manualmente + form.reset({ + ...form.getValues(), // mantém outros valores default + servico_tipo_id: 0, + descricao: '', + }); } - }, [data, form]); + }, [data, form]); return ( Dados do Tipo de Serviço - + Configurações - + Valores @@ -141,25 +244,11 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop control={form.control} name="categoria" render={({ field }) => ( - + Categoria - + )} @@ -198,27 +287,14 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop
( Serviço Caixa - + )} @@ -233,9 +309,10 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( - field.onChange(checked ? "S" : "N")} // salva "S" ou "N" /> Averbação @@ -252,9 +329,10 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( - field.onChange(checked ? "S" : "N")} // salva "S" ou "N" /> Transferência Veículo @@ -271,9 +349,10 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( - field.onChange(checked ? "S" : "N")} // grava "S" ou "N" /> Usar A4 @@ -290,9 +369,10 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( - field.onChange(checked ? "S" : "N")} // grava "S" ou "N" /> Etiqueta Única @@ -300,6 +380,63 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop )} />
+ + + {/* Campo: Frente/Verso (Texto normal) */} +
+ { + const categoriaSelecionada = form.watch("categoria"); + const isEnabled = categoriaSelecionada === "A"; + + return ( + + + field.onChange(checked ? "S" : "N")} // grava "S" ou "N" + disabled={!isEnabled} + /> + + Frente/Verso + + ); + }} + /> +
+ + + {/* Campo: Etiqueta Única (Texto normal) */} +
+ { + // Considera "A" ou vazio como marcado + const isChecked = field.value === "A" || !field.value; + + return ( + + + { + field.onChange(checked ? "A" : "I"); // grava "A" ou "I" no form + }} + /> + + Ativo + + ); + }} + /> +
+ +
@@ -408,7 +545,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop /> -
Requerer
+
Requerer:
{/* Campo: Biometria (Select) */}
@@ -526,30 +663,283 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Campo: etiquetas/carimbos (Select) */} -
+
( Etiquetas/Carimbos - + )} /> -
+
+ + + {/* Campo: etiquetas/carimbos botão adicionar */} +
+ +   + + +
+ + + {/* Campo: etiquetas/carimbos (Select) */} +
+ + + + # + Descrição + + + + + {itensTabela.map((item, index) => ( + + + {String(index + 1).padStart(3, '0')} + + {item.descricao} + + + + + ))} + + {itensTabela.length === 0 && ( + + + Nenhum item adicionado + + + )} + +
+
+
- 003 + +
+ + {/* Campo: Biometria (Select) */} +
+ ( + + Selar + + + + )} + /> +
+ + + {/* Campo: emolumentos (Select) */} +
+ ( + + Emolumento + { + // Extrai o ID do emolumento selecionado + const emolumentoId = Number(selected?.key); + + // Se o ID for inválido, encerra sem fazer a requisição + if (!emolumentoId || isNaN(emolumentoId) || emolumentoId <= 0) return; + + setIsLoading(true); + + try { + // Faz a requisição para buscar o item do emolumento + const response = await fetchGEmolumentoItem({ + emolumento_id: emolumentoId, + valor: 0, + }); + + // Extrai o primeiro item do array "data" + const item = response?.data?.[0]; + + // Se existir item, atualiza os campos do formulário + if (item) { + form.setValue("valor_emolumento", item.valor_emolumento ?? 0); + form.setValue("valor_taxa_judiciaria", item.valor_taxa_judiciaria ?? 0); + // form.setValue("fundesp_valor", item.valor_outra_taxa1 ?? 0); + // form.setValue("valor_pagina_extra", item.valor_pagina_extra ?? 0); + // form.setValue("emolumento_item_id", item.emolumento_item_id ?? 0); + + // (💡 opcional) Atualiza o total automaticamente + const total = + (item.valor_emolumento ?? 0) + + (item.valor_taxa_judiciaria ?? 0) + + (item.valor_outra_taxa1 ?? 0); + + form.setValue("valor_total", total); + } + } catch (error) { + console.error("Erro ao buscar item de emolumento:", error); + } finally { + setIsLoading(false); + } + }} + /> + + + + )} + /> + +
+ + + {/* Campo: emolumentos adicional (Select) */} +
+ ( + + Emolumento Adicional (Mesma etiqueta) + + + + )} + /> +
+ + + {/* Campo: Quantidade de pessoas */} +
+ ( + + Emolumento R$ + + + + + + )} + /> +
+ + {/* Campo: Quantidade de pessoas */} +
+ ( + + Taxa Judiciária R$ + + + + + + )} + /> +
+ + {/* Campo: Quantidade de pessoas */} +
+ ( + + Fundesp R$ + + + + + + )} + /> +
+ + {/* Campo: Quantidade de pessoas */} +
+ ( + + Total R$ + + + + + + )} + /> +
+ + +
+
{/* Campo oculto: ID */} @@ -559,11 +949,19 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Rodapé do diálogo */} - - + diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/CCaixaServico/CCaixaServicoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/CCaixaServico/CCaixaServicoIndexData.ts new file mode 100644 index 0000000..09372dc --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/CCaixaServico/CCaixaServicoIndexData.ts @@ -0,0 +1,27 @@ +// Importa o utilitário responsável por tratar erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a classe de serviço que gerencia requisições HTTP para a API +import API from '@/shared/services/api/Api'; + +// Importa o enum que define os métodos HTTP disponíveis (GET, POST, PUT, DELETE, etc.) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import { CCaixaServicoReadInterface } from '../../_interfaces/CCaixaServicoReadInterface'; + +// Função assíncrona responsável por executar a requisição para listar os tipos de marcação +async function executeCCaixaServicoIndexData(data: CCaixaServicoReadInterface) { + // Cria uma nova instância da classe API para enviar a requisição + const api = new API(); + + // Concatena o endpoint com a query string (caso existam parâmetros) + const endpoint = `administrativo/c_caixa_servico/sistema/${data.sistema_id}`; + + // Envia uma requisição GET para o endpoint 'administrativo/g_marcacao_tipo/' + return await api.send({ + method: Methods.GET, + endpoint: endpoint, + }); +} + +// Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const CCaixaServicoIndexData = withClientErrorHandler(executeCCaixaServicoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumento/GEmolumentoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumento/GEmolumentoIndexData.ts new file mode 100644 index 0000000..422fb54 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumento/GEmolumentoIndexData.ts @@ -0,0 +1,27 @@ +// Importa o utilitário responsável por tratar erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a classe de serviço que gerencia requisições HTTP para a API +import API from '@/shared/services/api/Api'; + +// Importa o enum que define os métodos HTTP disponíveis (GET, POST, PUT, DELETE, etc.) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import { GEmolumentoReadInterface } from '../../_interfaces/GEmolumentoReadInterface'; + +// Função assíncrona responsável por executar a requisição para listar os tipos de marcação +async function executeGEmolumentoIndexData(data: GEmolumentoReadInterface) { + // Cria uma nova instância da classe API para enviar a requisição + const api = new API(); + + // Concatena o endpoint com a query string (caso existam parâmetros) + const endpoint = `administrativo/g_emolumento/${data.sistema_id}`; + + // Envia uma requisição GET para o endpoint 'administrativo/g_marcacao_tipo/' + return await api.send({ + method: Methods.GET, + endpoint: endpoint, + }); +} + +// Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GEmolumentoIndexData = withClientErrorHandler(executeGEmolumentoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumentoItem/GEmolumentoItemValorData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumentoItem/GEmolumentoItemValorData.ts new file mode 100644 index 0000000..96da087 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GEmolumentoItem/GEmolumentoItemValorData.ts @@ -0,0 +1,27 @@ +// Importa o utilitário responsável por tratar erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a classe de serviço que gerencia requisições HTTP para a API +import API from '@/shared/services/api/Api'; + +// Importa o enum que define os métodos HTTP disponíveis (GET, POST, PUT, DELETE, etc.) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import { GEmolumentoItemReadInterface } from '../../_interfaces/GEmolumentoItemReadInterface'; + +// Função assíncrona responsável por executar a requisição para listar os tipos de marcação +async function executeGEmolumentoItemValorData(data: GEmolumentoItemReadInterface) { + // Cria uma nova instância da classe API para enviar a requisição + const api = new API(); + + // Concatena o endpoint com a query string (caso existam parâmetros) + const endpoint = `administrativo/g_emolumento_item/faixa/${data.emolumento_id}/${data.valor}`; + + // Envia uma requisição GET para o endpoint 'administrativo/g_marcacao_tipo/' + return await api.send({ + method: Methods.GET, + endpoint: endpoint, + }); +} + +// Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GEmolumentoItemValorData = withClientErrorHandler(executeGEmolumentoItemValorData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts new file mode 100644 index 0000000..1a4b34d --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts @@ -0,0 +1,37 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useMemo, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "CCaixaServico" +import { CCaixaServicoReadInterface } from '../../_interfaces/CCaixaServicoReadInterface'; + +// Importa o serviço responsável por buscar os dados de "CCaixaServico" na API +import { CCaixaServicoIndexService } from '../../_services/c_caixa_servico/CCaixaServicoIndexService'; +import { CCaixaServicoInterface } from '../../_interfaces/CCaixaServicoInterface'; + + +// Hook personalizado para leitura (consulta) dos tipos de marcação +export const useCCaixaServicoReadHook = () => { + // Obtém a função que atualiza a resposta global do sistema + const { setResponse } = useResponse(); + + // Define o estado local que armazenará a lista de tipos de marcação + const [cCaixaServico, setCCaixaServico] = useState([]); + + // Função responsável por buscar os dados da API e atualizar o estado + const fetchCCaixaServico = async (data: CCaixaServicoReadInterface) => { + // Executa o serviço que faz a requisição à API + const response = await CCaixaServicoIndexService(data); + + // Atualiza o estado local com os dados retornados + setCCaixaServico(response.data); + + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + }; + + // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias + return useMemo(() => ({ cCaixaServico, fetchCCaixaServico }), [cCaixaServico, fetchCCaixaServico]); +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts new file mode 100644 index 0000000..d4bd9df --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts @@ -0,0 +1,37 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useMemo, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "GEmolumento" +import { GEmolumentoReadInterface } from '../../_interfaces/GEmolumentoReadInterface'; + +// Importa o serviço responsável por buscar os dados de "GEmolumento" na API +import { GEmolumentoIndexService } from '../../_services/g_emolumento/GEmolumentoIndexService'; +import { GEmolumentoInterface } from '../../_interfaces/GEmolumentoInterface'; + + +// Hook personalizado para leitura (consulta) dos emolumentos +export const useGEmolumentoReadHook = () => { + // Obtém a função que atualiza a resposta global do sistema + const { setResponse } = useResponse(); + + // Define o estado local que armazenará a lista de emolumentos + const [gEmolumento, setGEmolumento] = useState([]); + + // Função responsável por buscar os dados da API e atualizar o estado + const fetchGEmolumento = async (data: GEmolumentoReadInterface) => { + // Executa o serviço que faz a requisição à API + const response = await GEmolumentoIndexService(data); + + // Atualiza o estado local com os dados retornados + setGEmolumento(response.data); + + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + }; + + // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias + return useMemo(() => ({ gEmolumento, fetchGEmolumento }), [gEmolumento, fetchGEmolumento]); +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts new file mode 100644 index 0000000..a6ef557 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts @@ -0,0 +1,46 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useMemo, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "gEmolumentoItem" +import { GEmolumentoItemReadInterface } from '../../_interfaces/GEmolumentoItemReadInterface'; + +// Importa o serviço responsável por buscar os dados de "GEmolumentoItem" na API +import { GEmolumentoItemValorService } from '../../_services/g_emolumento_item/GEmolumentoItemValorService'; +import { GEmolumentoItemInterface } from '../../_interfaces/GEmolumentoItemInterface'; + + +// Hook personalizado para leitura (consulta) dos emolumentos +export const useGEmolumentoItemReadHook = () => { + const { setResponse } = useResponse(); + const [gGEmolumentoItem, setGEmolumentoItem] = useState([]); + + const fetchGEmolumentoItem = async (data: GEmolumentoItemReadInterface) => { + try { + const response = await GEmolumentoItemValorService(data); + + // Atualiza estado e contexto + setGEmolumentoItem(response.data); + setResponse(response); + + // Retorna a resposta completa (para uso externo) + return response; + + } catch (error) { + console.error("Erro ao buscar item de emolumento:", error); + setResponse({ + message: "Erro ao buscar item de emolumento", + error: error instanceof Error ? error.message : String(error), + }); + return null; // Retorna nulo para segurança + } + }; + + // Retorna função e dados memorizados + return useMemo( + () => ({ gGEmolumentoItem, fetchGEmolumentoItem }), + [gGEmolumentoItem] + ); +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts new file mode 100644 index 0000000..13fd319 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts @@ -0,0 +1,17 @@ +// Interface que representa a tabela C_CAIXA_SERVICO +export interface CCaixaServicoInterface { + interno_sistema?: string; // VARCHAR(1) + caixa_servico_id: number; // NUMERIC(10,2) NOT NULL - Chave primária + descricao?: string; // VARCHAR(60) + situacao?: string; // VARCHAR(1) + tipo_transacao?: string; // VARCHAR(1) + sistema_id?: number; // NUMERIC(14,3) + selo_grupo_id?: number; // NUMERIC(10,2) + emitir_relatorio?: string; // VARCHAR(1) + repasse?: string; // VARCHAR(1) + repetir_descricao?: string; // VARCHAR(1) + codigo_conta?: number; // NUMERIC(10,2) + tipo_conta_carneleao?: string; // VARCHAR(60) + centro_de_custa_id?: number; // NUMERIC(10,2) - Chave estrangeira + devolucao_juizo?: string; // VARCHAR(1) +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts new file mode 100644 index 0000000..b528407 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts @@ -0,0 +1,3 @@ +export interface CCaixaServicoReadInterface { + sistema_id?: number; +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts new file mode 100644 index 0000000..9998089 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts @@ -0,0 +1,20 @@ +// Interface que representa a tabela G_EMOLUMENTO +export interface GEmolumentoInterface { + emolumento_id?: number; // NUMERIC(10,2) - Chave primária + descricao?: string; // VARCHAR(260) + tipo?: string; // VARCHAR(1) + sistema_id?: number; // NUMERIC(10,2) + selo_grupo_id?: number; // NUMERIC(10,2) + reg_averb?: string; // VARCHAR(1) + pre_definido?: string; // VARCHAR(1) + situacao?: string; // VARCHAR(1) + situacao_ri?: string; // VARCHAR(1) + com_reducao?: string; // VARCHAR(1) + motivo_reducao?: string; // VARCHAR(120) + valor_maximo_certidao?: number; // NUMERIC(14,3) + tipo_objetivo?: string; // VARCHAR(3) + modelo_tag?: string; // VARCHAR(3) + codigo_nota_id?: number; // NUMERIC(10,2) + convenio_codhab?: string; // VARCHAR(1) + item_df?: string; // VARCHAR(10) +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts new file mode 100644 index 0000000..609426d --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts @@ -0,0 +1,32 @@ +// Interface que representa a tabela G_EMOLUMENTO_ITEM (inferido) +export interface GEmolumentoItemInterface { + valor_emolumento?: number; // NUMERIC(14,3) + emolumento_item_id: number; // NUMERIC(10,2) NOT NULL - Chave primária (assumida) + emolumento_id?: number; // NUMERIC(10,2) + valor_inicio?: number; // NUMERIC(14,3) + valor_fim?: number; // NUMERIC(14,3) + valor_taxa_judiciaria?: number; // NUMERIC(14,3) + emolumento_periodo_id?: number; // NUMERIC(10,2) + codigo?: number; // NUMERIC(10,2) + pagina_extra?: number; // NUMERIC(10,2) + valor_pagina_extra?: number; // NUMERIC(14,3) + valor_outra_taxa1?: number; // NUMERIC(14,3) + codigo_selo?: string; // VARCHAR(30) + valor_fundo_ri?: number; // NUMERIC(14,3) + codigo_tabela?: string; // VARCHAR(30) + selo_grupo_id?: number; // NUMERIC(10,2) + codigo_km?: string; // VARCHAR(30) + emolumento_acresce?: number; // NUMERIC(14,3) + taxa_acresce?: number; // NUMERIC(14,3) + funcivil_acresce?: number; // NUMERIC(14,3) + valor_fracao?: number; // NUMERIC(14,3) + valor_por_excedente_emol?: number; // NUMERIC(14,3) + valor_por_excedente_tj?: number; // NUMERIC(14,3) + valor_por_excedente_fundo?: number; // NUMERIC(14,3) + valor_limite_excedente_emol?: number; // NUMERIC(14,3) + valor_limite_excedente_tj?: number; // NUMERIC(14,3) + valor_limite_excedente_fundo?: number; // NUMERIC(14,3) + fundo_selo?: number; // NUMERIC(14,3) + distribuicao?: number; // NUMERIC(14,3) + vrc_ext?: number; // NUMERIC(10,2) - Renomeado de VRCEXT para vrc_ext (convenção) +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts new file mode 100644 index 0000000..1ba73db --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts @@ -0,0 +1,4 @@ +export interface GEmolumentoItemReadInterface { + emolumento_id?: number, + valor?: number +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts new file mode 100644 index 0000000..3e2f596 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts @@ -0,0 +1,3 @@ +export interface GEmolumentoReadInterface { + sistema_id?: number +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts index 8276189..84a6ed1 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts @@ -1,122 +1,78 @@ -import z from 'zod'; +import z from "zod"; -// Define um esquema para campos de 1 caractere (sim/não ou tipo) -// Poderia ser um z.enum(['S', 'N']) mais restritivo dependendo da regra de negócio, -// mas seguindo o padrão da DDL (VARCHAR(1)), o string.max(1) é mais flexível. -const OneCharString = z.string().max(1, 'Deve ter no máximo 1 caractere').optional(); - -// Define um esquema para campos string obrigatórios -const RequiredString = z.string().min(1, 'O campo é obrigatório'); - -// Define um esquema para campos numéricos opcionais, baseados em NUMERIC(10,2) ou similar +/** + * Tipos utilitários para campos simples + */ +const SN = z.enum(["S", "N"]).default("N"); // Campos do tipo Sim/Não +const AI = z.enum(["A", "I"]).default("A"); // Situação Ativo/Inativo +const OneCharString = z.string().max(1, "Deve ter no máximo 1 caractere").optional(); +const RequiredString = z.string().min(1, "O campo é obrigatório"); const OptionalNumber = z.number().optional(); - -// Define um esquema para campos numéricos obrigatórios const RequiredNumber = z.number(); +/** + * Schema principal baseado na DDL e adaptado ao formulário React + */ export const TServicoTipoSchema = z.object({ - // Chave primária: NOT NULL na DDL - servico_tipo_id: RequiredNumber.describe('ID do Tipo de Serviço').optional(), // Mantido optional seguindo o padrão de GCidadeSchema para chaves ID - - // VARCHAR(60) - descricao: z.string().max(60, 'A descrição deve ter no máximo 60 caracteres').optional(), - - // NUMERIC(14,3) - valor: z.number().optional(), - - // VARCHAR(1) - tipo_item: OneCharString, - - // VARCHAR(1) - requer_autorizacao: OneCharString, - - // VARCHAR(1) - requer_biometria: OneCharString, - - // VARCHAR(1) - tipo_pessoa: OneCharString, - - // NUMERIC(10,2) - Chave estrangeira - tb_reconhecimentotipo_id: OptionalNumber, - - // VARCHAR(1) - tipo_permissao_cpf: OneCharString, - - // VARCHAR(1) - requer_abonador: OneCharString, - - // VARCHAR(1) - requer_representante: OneCharString, - - // VARCHAR(1) - situacao: OneCharString, - - // VARCHAR(1) - requer_cpf: OneCharString, - - // VARCHAR(1) - servico_padrao: OneCharString, - - // NUMERIC(10,2) + // Identificador + servico_tipo_id: RequiredNumber.describe("ID do Tipo de Serviço").optional(), + + // Campos principais + descricao: z.string().max(60, "A descrição deve ter no máximo 60 caracteres").optional(), + categoria: z.string().optional(), + + // Controle de flags (S/N) + frenteverso: SN.optional(), + averbacao: SN.optional(), + transferencia_veiculo: SN.optional(), + usar_a4: SN.optional(), + etiqueta_unica: SN.optional(), + selar: SN.optional(), + servico_padrao: SN.optional(), + lancar_taxa: SN.optional(), + lancar_fundesp: SN.optional(), + liberar_desconto: SN.optional(), + fundesp_automatica: SN.optional(), + lancar_valor_documento: SN.optional(), + valor_fixo: SN.optional(), + ato_praticado: SN.optional(), + apresentante_selo: SN.optional(), + renovacao_cartao: SN.optional(), + + // Situação + situacao: AI, + + // Campos numéricos + valor: OptionalNumber, maximo_pessoa: OptionalNumber, - - // VARCHAR(1) - alterar_valor: OneCharString, - - // NUMERIC(10,2) servico_caixa_id: OptionalNumber, - - // VARCHAR(1) - lancar_taxa: OneCharString, - - // VARCHAR(1) - lancar_fundesp: OneCharString, - - // VARCHAR(1) - liberar_desconto: OneCharString, - - // VARCHAR(1) - fundesp_automatica: OneCharString, - - // VARCHAR(1) - lancar_valor_documento: OneCharString, - - // VARCHAR(1) - valor_fixo: OneCharString, - - // NUMERIC(10,2) - Chave estrangeira emolumento_id: OptionalNumber, - - // VARCHAR(1) - ato_praticado: OneCharString, - - // VARCHAR(1) - selar: OneCharString, - - // VARCHAR(1) - frenteverso: OneCharString, - - // VARCHAR(1) - pagina_acrescida: OneCharString, - - // NUMERIC(10,2) emolumento_obrigatorio: OptionalNumber, - - // VARCHAR(1) - apresentante_selo: OneCharString, - - // VARCHAR(1) - renovacao_cartao: OneCharString, - - // VARCHAR(1) - etiqueta_unica: OneCharString, - - // VARCHAR(1) - transferencia_veiculo: OneCharString, - - // VARCHAR(1) - usar_a4: OneCharString, - - // VARCHAR(1) - averbacao: OneCharString, -}); \ No newline at end of file + + // Relacionamentos e permissões + tipo_item: OneCharString, + requer_autorizacao: OneCharString, + requer_biometria: OneCharString, + tipo_pessoa: OneCharString, + tb_reconhecimentotipo_id: OptionalNumber, + tipo_permissao_cpf: OneCharString, + requer_abonador: OneCharString, + requer_representante: OneCharString, + requer_cpf: OneCharString, + alterar_valor: OneCharString, + pagina_acrescida: OneCharString, + + // Campos auxiliares usados apenas no formulário (não persistidos) + valor_emolumento: z.number().optional(), + valor_taxa_judiciaria: z.number().optional(), + fundesp_valor: z.number().optional(), + valor_total: z.number().optional(), + etiquetas_carimbos: z.any().optional(), + emolumento: z.any().optional(), + emolumento_auxiliar: z.any().optional(), +}); + +/** + * Tipo inferido do schema — usado diretamente no useForm + */ +export type TServicoTipoFormValues = z.infer; diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts new file mode 100644 index 0000000..1b7f368 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts @@ -0,0 +1,20 @@ +// Importa o utilitário responsável por lidar com erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a função que realiza a requisição de listagem dos tipos de marcação +import { CCaixaServicoIndexData } from '../../_data/CCaixaServico/CCaixaServicoIndexData'; +import { CCaixaServicoReadInterface } from '../../_interfaces/CCaixaServicoReadInterface'; + +// Função assíncrona responsável por executar o serviço de listagem de tipos de marcação +async function executeCCaixaServicoIndexService(data: CCaixaServicoReadInterface) { + // Chama a função que realiza a requisição à API e aguarda a resposta + const response = await CCaixaServicoIndexData(data); + + // Retorna a resposta obtida da requisição + return response; +} + +// Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const CCaixaServicoIndexService = withClientErrorHandler( + executeCCaixaServicoIndexService, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts new file mode 100644 index 0000000..beef86e --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts @@ -0,0 +1,20 @@ +// Importa o utilitário responsável por lidar com erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a função que realiza a requisição de listagem dos tipos de marcação +import { GEmolumentoIndexData } from '../../_data/GEmolumento/GEmolumentoIndexData'; +import { GEmolumentoReadInterface } from '../../_interfaces/GEmolumentoReadInterface'; + +// Função assíncrona responsável por executar o serviço de listagem de tipos de marcação +async function executeGEmolumentoIndexService(data: GEmolumentoReadInterface) { + // Chama a função que realiza a requisição à API e aguarda a resposta + const response = await GEmolumentoIndexData(data); + + // Retorna a resposta obtida da requisição + return response; +} + +// Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GEmolumentoIndexService = withClientErrorHandler( + executeGEmolumentoIndexService, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts new file mode 100644 index 0000000..6bb2963 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts @@ -0,0 +1,20 @@ +// Importa o utilitário responsável por lidar com erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a função que realiza a requisição de listagem dos tipos de marcação +import { GEmolumentoItemValorData } from '../../_data/GEmolumentoItem/GEmolumentoItemValorData'; +import { GEmolumentoItemReadInterface } from '../../_interfaces/GEmolumentoItemReadInterface'; + +// Função assíncrona responsável por executar o serviço de listagem de tipos de marcação +async function executeGEmolumentoItemValorService(data: GEmolumentoItemReadInterface) { + // Chama a função que realiza a requisição à API e aguarda a resposta + const response = await GEmolumentoItemValorData(data); + + // Retorna a resposta obtida da requisição + return response; +} + +// Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const GEmolumentoItemValorService = withClientErrorHandler( + executeGEmolumentoItemValorService, +); diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx index 418ebdd..51b74dd 100644 --- a/src/components/ui/table.tsx +++ b/src/components/ui/table.tsx @@ -1,92 +1,116 @@ -'use client'; +"use client" -import * as React from 'react'; +import * as React from "react" -import { cn } from '@/lib/utils'; +import { cn } from "@/lib/utils" -function Table({ className, ...props }: React.ComponentProps<'table'>) { +function Table({ className, ...props }: React.ComponentProps<"table">) { return ( -
+
- ); + ) } -function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) { - return ; +function TableHeader({ className, ...props }: React.ComponentProps<"thead">) { + return ( + + ) } -function TableBody({ className, ...props }: React.ComponentProps<'tbody'>) { +function TableBody({ className, ...props }: React.ComponentProps<"tbody">) { return ( - ); + ) } -function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) { +function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) { return ( tr]:last:border-b-0', className)} + className={cn( + "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0", + className + )} {...props} /> - ); + ) } -function TableRow({ className, ...props }: React.ComponentProps<'tr'>) { +function TableRow({ className, ...props }: React.ComponentProps<"tr">) { return ( - ); + ) } -function TableHead({ className, ...props }: React.ComponentProps<'th'>) { +function TableHead({ className, ...props }: React.ComponentProps<"th">) { return (
[role=checkbox]]:translate-y-[2px]', - className, + "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", + className )} {...props} /> - ); + ) } -function TableCell({ className, ...props }: React.ComponentProps<'td'>) { +function TableCell({ className, ...props }: React.ComponentProps<"td">) { return ( [role=checkbox]]:translate-y-[2px]', - className, + "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", + className )} {...props} /> - ); + ) } -function TableCaption({ className, ...props }: React.ComponentProps<'caption'>) { +function TableCaption({ + className, + ...props +}: React.ComponentProps<"caption">) { return (
- ); + ) } -export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }; +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx new file mode 100644 index 0000000..83761bf --- /dev/null +++ b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx @@ -0,0 +1,102 @@ +'use client'; + +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import GetCapitalize from "@/shared/actions/text/GetCapitalize"; +import { useCCaixaServicoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook"; +import { CCaixaServicoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface"; + +export default function CCaixaServicoSelect({ sistema_id, field }: any) { + + const cCaixaServicoReadParams: CCaixaServicoReadInterface = { sistema_id }; + + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { cCaixaServico, fetchCCaixaServico } = useCCaixaServicoReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!cCaixaServico.length) { + setIsLoading(true); + await fetchCCaixaServico(cCaixaServicoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = cCaixaServico?.find( + (item) => String(item.caixa_servico_id) === String(field.value) + ); + return ( + + + + + + + + + + + + {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} + + + {cCaixaServico?.map((item) => ( + { + field.onChange({ + key: Number(item.caixa_servico_id), + value: item.descricao, + }); + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx new file mode 100644 index 0000000..c22efd6 --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx @@ -0,0 +1,152 @@ +'use client'; // Garante execução no cliente (Next.js App Router) + +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import GetCapitalize from "@/shared/actions/text/GetCapitalize"; +import { useGEmolumentoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook"; +import { GEmolumentoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface"; + + +// Tipagem das props do componente +interface GEmolumentoSelectProps { + sistema_id: number; // ID do sistema usado para buscar os emolumentos + field: any; // Objeto de controle do react-hook-form + onSelectChange?: (emolumento: { key: number; value: string }) => void; // Função callback opcional para disparar eventos externos + className?: string; // Classe CSS opcional para customização +} + + +// Componente principal do select de emolumentos +export default function GEmolumentoSelect({ sistema_id, field, onSelectChange, className }: GEmolumentoSelectProps) { + + // Define parâmetros de leitura para o hook que busca os emolumentos + const gEmolumentoReadParams: GEmolumentoReadInterface = { sistema_id }; + + // Estados locais do componente + const [open, setOpen] = React.useState(false); // Controla abertura do popover + const [isLoading, setIsLoading] = React.useState(false); // Exibe “Carregando...” enquanto busca dados + + // Hook responsável por buscar emolumentos no backend + const { gEmolumento, fetchGEmolumento } = useGEmolumentoReadHook(); + + // Carrega os dados de emolumentos apenas uma vez ao montar o componente + React.useEffect(() => { + const loadData = async () => { + if (!gEmolumento.length) { + setIsLoading(true); + await fetchGEmolumento(gEmolumentoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); // ← executa apenas uma vez + + + // Obtém o item selecionado com base no valor atual do campo + const selected = gEmolumento?.find( + (item) => String(item.emolumento_id) === String(field.value?.key ?? field.value) + ); + + + // Estrutura visual do componente + return ( + + {/* === Botão principal (exibe valor selecionado) === */} + + + + + + + {/* === Conteúdo do Popover (lista de opções) === */} + + + {/* Campo de busca dentro do popover */} + + + + {/* Estado vazio ou carregando */} + + {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} + + + {/* Grupo de opções */} + + {gEmolumento?.map((item) => ( + { + // Cria objeto com ID e descrição + const selectedValue = { + key: Number(item.emolumento_id), + value: item.descricao, + }; + + // Atualiza o valor no react-hook-form + field.onChange(selectedValue); + + // Dispara callback externo, se existir (ex: fetchGEmolumentoItem) + if (onSelectChange) onSelectChange(selectedValue); + + // Fecha o popover + setOpen(false); + }} + > + {/* Ícone de seleção (check) */} + + {/* Nome formatado do emolumento */} + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx index 3946b66..e6c6058 100644 --- a/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx +++ b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx @@ -52,9 +52,11 @@ export default function GMarcacaoTipoSelect({ grupo, sistema_id, situacao, field > {isLoading ? "Carregando..." - : selected - ? GetCapitalize(selected.descricao) - : "Selecione..."} + : field.value && typeof field.value === 'object' && field.value.value + ? GetCapitalize(field.value.value) // Exibe a descrição do objeto + : field.value && typeof field.value !== 'object' + ? field.value // Se for um ID (valor antigo), exibe ele + : "Selecione a etiqueta/carimbo"} @@ -73,7 +75,10 @@ export default function GMarcacaoTipoSelect({ grupo, sistema_id, situacao, field key={item.marcacao_tipo_id} value={item.descricao?.toLowerCase() ?? ""} onSelect={() => { - field.onChange(Number(item.marcacao_tipo_id)); + field.onChange({ + key: Number(item.marcacao_tipo_id), + value: item.descricao, + }); setOpen(false); }} > diff --git a/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx b/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx new file mode 100644 index 0000000..47c3a0d --- /dev/null +++ b/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx @@ -0,0 +1,87 @@ +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 { CategoriaServicoEnum } from "@/shared/enums/CategoriaServicoEnum"; +import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import React from "react"; + +type CategoriaServicoSelectProps = { + field: { + value?: string | null; + onChange: (value: string) => void; + }; +}; + +export default function CategoriaServicoSelect({ field }: CategoriaServicoSelectProps) { + const [open, setOpen] = React.useState(false); + + // Cria as opções a partir do enum + const options = Object.entries(CategoriaServicoEnum).map(([key, label]) => ({ + value: String(key), + label, + })); + + const selectedLabel = + field.value != null + ? options.find((o) => o.value === String(field.value))?.label ?? "Selecione..." + : "Selecione..."; + + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); // envia número + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/shared/enums/CategoriaServicoEnum.ts b/src/shared/enums/CategoriaServicoEnum.ts new file mode 100644 index 0000000..224a0bf --- /dev/null +++ b/src/shared/enums/CategoriaServicoEnum.ts @@ -0,0 +1,7 @@ +export const CategoriaServicoEnum = { + A: 'Autenticação', + C: 'Certidão', + G: 'Serviços Gerais', + R: 'Reconhecimento', + B: 'Geral', +} as const; \ No newline at end of file From 2810abecf502583863c1b1cc5febe068bbb43f13 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Mon, 20 Oct 2025 09:13:00 -0300 Subject: [PATCH 5/7] =?UTF-8?q?[MVPTN-86]=20feat(form)=20:=20Ajustado=20se?= =?UTF-8?q?letct=20Categoria=20e=20Servi=C3=A7o=20Caixa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../t_servico_tipo/TServicoTipoForm.tsx | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index 30b4e1a..ac60e84 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -37,7 +37,6 @@ import { import { Table, TableBody, - TableCaption, TableCell, TableHead, TableHeader, @@ -52,6 +51,7 @@ import { useGEmolumentoItemReadHook } from "@/app/(protected)/(cadastros)/cadast import { GEmolumentoItemReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface"; import CategoriaServicoSelect from "@/shared/components/categoriaServicoSelect/CategoriaServicoSelect"; import CCaixaServicoSelect from "@/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect"; +import { TServicoTipoSaveData } from "../../_data/TServicoTipo/TServicoTipoSaveData"; // Propriedades esperadas pelo componente interface Props { @@ -172,6 +172,35 @@ const form = useForm({ } }, [data, form]); + + // Função chamada ao clicar em "Salvar" + const handleSave = async (formData: TServicoTipoFormValues) => { + try { + // Envia os dados para API + const response = await TServicoTipoSaveData(formData); + + // Se a resposta contiver um ID válido + if (response?.data?.servico_tipo_id) { + const novoId = response.data.servico_tipo_id; + + // Atualiza o hidden input no formulário + form.setValue("servico_tipo_id", novoId); + + // Atualiza todos os campos do formulário com o retorno da API + form.reset(response.data); + + // Exibe mensagem de sucesso + console.log(`Serviço salvo com sucesso (ID: ${novoId})`); + + } else { + console.log("Erro ao salvar o tipo de serviço."); + } + } catch (error) { + + console.log("Erro ao salvar:", error); + } + }; + return ( ({ {/* Estrutura do formulário */}
- + From 4b7afd6a8fcabd2b197caf061b6dc7969b3659ec Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Tue, 28 Oct 2025 15:40:08 -0300 Subject: [PATCH 6/7] =?UTF-8?q?[MVPTN-86]=20feat(crud):=20Conclus=C3=A3o?= =?UTF-8?q?=20do=20CRUD=20Tipos=20de=20Servi=C3=A7o=20-=20t=5Fservico=5Fti?= =?UTF-8?q?po?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(t_servico_tipo)/servicos-tipo/page.tsx | 41 +- .../t_servico_tipo/TServicoTipoForm.tsx | 561 ++++++++++-------- .../TServicoEtiquetaReadData.ts | 26 + .../TServicoEtiquetaRemoveData.ts | 27 + .../TServicoEtiquetaSaveData.ts | 39 ++ .../TServicoTipo/TServicoTipoEditData.ts | 26 + .../TServicoTipo/TServicoTipoRemoveData.ts | 2 +- .../TServicoTipo/TServicoTipoSaveData.ts | 36 +- .../TTBReconhecimentoTipoIndexData.ts | 27 + .../useGMarcacaoTipoReadHook.ts | 3 +- .../useTServicoEtiquetaReadHook.ts | 44 ++ .../useTServicoEtiquetaRemoveHook.ts | 25 + .../useTServicoEtiquetaSaveHook.ts | 37 ++ .../t_servico_tipo/useTServicoTipoEditHook.ts | 26 + .../useTTBReconhecimentoTipoReadHook.ts | 37 ++ .../_interfaces/TServicoEtiquetaInterface.ts | 7 + .../TServicoEtiquetaServicoIdReadInterface.ts | 3 + .../_interfaces/TServicoTipoInterface.ts | 62 +- .../TTBReconhecimentoTipoInterface.ts | 6 + .../TTBReconhecimentoTipoReadInterface.ts | 4 + .../_schemas/TServicoEtiquetaSchema.ts | 15 + .../cadastros/_schemas/TServicoTipoSchema.ts | 26 +- .../TServicoEtiquetaSaveService.ts | 21 + .../TServicoEtiquetaServicoIdService.ts | 20 + .../t_servico_tipo/TServicoTipoEditService.ts | 20 + .../TTBReconhecimentoTipoIndexService.ts | 20 + .../CCaixaServico/CCaixaServicoSelect.tsx | 15 +- .../GEmolumento/GEmolumentoSelect.tsx | 16 +- .../TTBReconhecimentoTipoSelect.tsx | 95 +++ .../confirmacao/ConfirmacaoCheckBox.tsx | 28 + .../confirmacao/ConfirmacaoSelect.tsx | 9 +- .../numericInputField/NumericInputField.tsx | 68 +++ .../tipoPessoa/tipoPessoaSelect.tsx | 66 +++ 33 files changed, 1126 insertions(+), 332 deletions(-) create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts create mode 100644 src/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect.tsx create mode 100644 src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx create mode 100644 src/shared/components/numericInputField/NumericInputField.tsx create mode 100644 src/shared/components/tipoPessoa/tipoPessoaSelect.tsx diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx index c216953..adb453a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx @@ -13,6 +13,7 @@ import TServicoTipoForm from '../../_components/t_servico_tipo/TServicoTipoForm' import { useTServicoTipoReadHook } from '../../_hooks/t_servico_tipo/useTServicoTipoReadHook'; import { useTServicoTipoSaveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoSaveHook'; import { useTServicoTipoRemoveHook } from '../../_hooks/t_servico_tipo/useTServicoTipoRemoveHook'; +import { useTServicoTipoEditHook } from '../../_hooks/t_servico_tipo/useTServicoTipoEditHook'; import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; @@ -26,6 +27,7 @@ export default function TServicoTipoPage() { const { tServicoTipo, fetchTServicoTipo } = useTServicoTipoReadHook(); const { saveTServicoTipo } = useTServicoTipoSaveHook(); const { removeTServicoTipo } = useTServicoTipoRemoveHook(); + const { editTServicoTipo } = useTServicoTipoEditHook(); // Estados const [selectedServicoTipo, setSelectedServicoTipo] = useState(null); @@ -47,10 +49,31 @@ export default function TServicoTipoPage() { /** * Abre o formulário no modo de edição ou criação */ - const handleOpenForm = useCallback((data: TServicoTipoInterface | null) => { + const handleOpenForm = useCallback(async (data: TServicoTipoInterface | null) => { + + // Fecha o formulário antes de reabrir (garante reset limpo) + setIsFormOpen(false); + + // Se nenhum dado for passado, abre o formulário em modo de criação + if (!data) { + setSelectedServicoTipo(null); + setIsFormOpen(true); + return; + } + + // Define o item selecionado para edição setSelectedServicoTipo(data); + + // Aguarda carregar/editar o registro (o hook espera o objeto TServicoTipoInterface) + await editTServicoTipo(data); + + // Atualiza a lista de dados + await fetchTServicoTipo(); + setIsFormOpen(true); - }, []); + + }, [editTServicoTipo, fetchTServicoTipo]); + /** * Fecha o formulário e limpa o item selecionado @@ -65,15 +88,20 @@ export default function TServicoTipoPage() { */ const handleSave = useCallback(async (formData: TServicoTipoInterface) => { - // Aguarda salvar o registro - await saveTServicoTipo(formData); + // Aguarda salvar o registro + await saveTServicoTipo(formData); // Atualiza a lista de dados fetchTServicoTipo(); }, [saveTServicoTipo, fetchTServicoTipo], + + + ); + + /** * Quando o usuário clica em "remover" na tabela */ @@ -88,6 +116,7 @@ export default function TServicoTipoPage() { [openConfirmDialog], ); + /** * Executa a exclusão de fato quando o usuário confirma */ @@ -108,6 +137,8 @@ export default function TServicoTipoPage() { handleCancel(); }, [itemToDelete, removeTServicoTipo, fetchTServicoTipo, handleCancel]); + + /** * Busca inicial dos dados */ @@ -147,7 +178,7 @@ export default function TServicoTipoPage() { title="Confirmar exclusão" description="Atenção" // Adaptação da mensagem para a interface TServicoTipo - message={`Deseja realmente excluir o tipo de serviço "${itemToDelete?.stipo_nome}"?`} + message={`Deseja realmente excluir o tipo de serviço "${itemToDelete?.descricao}"?`} confirmText="Sim, excluir" cancelText="Cancelar" onConfirm={handleDelete} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index ac60e84..fd274ee 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -52,6 +52,14 @@ import { GEmolumentoItemReadInterface } from "@/app/(protected)/(cadastros)/cada import CategoriaServicoSelect from "@/shared/components/categoriaServicoSelect/CategoriaServicoSelect"; import CCaixaServicoSelect from "@/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect"; import { TServicoTipoSaveData } from "../../_data/TServicoTipo/TServicoTipoSaveData"; +import TTBReconhecimentoTipoSelect from "@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect"; +import { ConfirmacaoCheckBox } from "@/shared/components/confirmacao/ConfirmacaoCheckBox"; +import ConfirmacaoSelect from "@/shared/components/confirmacao/ConfirmacaoSelect"; +import { TipoPessoaSelect } from "@/shared/components/tipoPessoa/tipoPessoaSelect"; +import { useTServicoEtiquetaReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook"; +import { useTServicoEtiquetaSaveHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook"; +import { useTServicoEtiquetaRemoveHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook"; + // Propriedades esperadas pelo componente interface Props { @@ -64,35 +72,179 @@ interface Props { // Componente principal do formulário export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Props) { + // Inicializa o react-hook-form com validação via Zod + const form = useForm({ + resolver: zodResolver(TServicoTipoSchema), + defaultValues: { + servico_tipo_id: 0, + emolumento_id: 0, + emolumento_obrigatorio: 0, + descricao: "", + maximo_pessoa: 0, + tipo_item: "", + frenteverso: "N", + averbacao: "N", + transferencia_veiculo: "N", + usar_a4: "N", + etiqueta_unica: "N", + situacao: "A", + selar: "N", + valor_emolumento: 0, + valor_taxa_judiciaria: 0, + fundesp_valor: 0, + valor_total: 0, + tipo_pessoa: "F", // ou "J" + } as unknown as TServicoTipoFormValues, + }); + + + // Carrega o ID caso esteja informado no form + const servico_tipo_id = form.getValues('servico_tipo_id') || 0; + + // Hook responsável por buscar emolumentos no backend + const { tServicoEtiqueta, fetchTServicoEtiqueta } = useTServicoEtiquetaReadHook(); + + // Hook responsável em salvar o a etiqueta selecionada + const { tServicoEtiquetaSave, fetchTServicoEtiquetaSave } = useTServicoEtiquetaSaveHook(); + + // Hook responsável em excluir a etiqueta selecionada + const { fetchTServicoEtiquetaRemove } = useTServicoEtiquetaRemoveHook(); + // Estado para gerenciar os itens da tabela de etiquetas/carimbos - const [itensTabela, setItensTabela] = useState<{ marcacao_tipo_id: string; descricao: string }[]>([]); + const [itensTabela, setItensTabela] = useState<{ servico_etiqueta_id: string | number; descricao: string }[]>([]); + - // Função para adicionar um novo item à tabela - const handleAddEtiquetaCarimbo = () => { - const valorSelecionado = form.getValues('etiquetas_carimbos'); + // Carrega os dados de emolumentos apenas uma vez ao montar o componente + React.useEffect(() => { - if (!valorSelecionado) return; + // Função para consumir o endpoint da api + const loadData = async () => { - // Aqui você pode buscar o texto/descrição com base no seu componente GMarcacaoTipoSelect - // Exemplo: supondo que o valor seja um objeto { id, descricao } - const item = { - - marcacao_tipo_id: valorSelecionado.key ?? valorSelecionado, // ou ajusta conforme a estrutura do seu componente - descricao: valorSelecionado.value ?? 'Sem descrição', + // Verifica se o ID do serviço tipo foi informado + if(servico_tipo_id > 0){ + + // Consumo o endpoint da api + await fetchTServicoEtiqueta({servico_tipo_id}); + } }; - // Evita duplicatas - setItensTabela((prev) => { - if (prev.some((p) => p.marcacao_tipo_id === item.marcacao_tipo_id)) return prev; - return [...prev, item]; - }); - }; + // Chama a função para consumir o endpoint da api + loadData(); + + }, [servico_tipo_id]); - const handleRemoveItem = (marcacao_tipo_id: string) => { - setItensTabela((prev) => prev.filter((p) => p.marcacao_tipo_id !== marcacao_tipo_id)); + + // Atualiza itensTabela sempre que tServicoEtiqueta for carregado + React.useEffect(() => { + + // Verifica se a consulta retornou os dados como objeto + if (Array.isArray(tServicoEtiqueta) && tServicoEtiqueta.length > 0) { + + // Lista os itens + const mapped = tServicoEtiqueta.map((item) => ({ + servico_etiqueta_id: Number(item.servico_etiqueta_id ?? 0), + descricao: String(item.descricao ?? 'Sem descrição'), + })); + + setItensTabela(mapped); + + } else { + setItensTabela([]); + } + }, [tServicoEtiqueta]); + + + // Função para adicionar um novo item à tabela Etiquetas/Carimbos + const handleAddEtiquetaCarimbo = async () => { + + // Captura o valor selecionado do formulário + const valorSelecionado = form.getValues("etiquetas_carimbos"); + + // Se não houver valor selecionado, não faz nada + if (!valorSelecionado) return; + + // Verifica se o item já se encontra na tabela + const alreadyExists = itensTabela.some( + (p) => String(p.descricao).trim() === String(valorSelecionado.value).trim() + ); + + // Caso o item já esteja na tabela, para o procedimento + if (alreadyExists) { + return; + } + + // --- Envio opcional para API --- + try { + + // Verifica se o ID do serviço tipo foi informado + if(servico_tipo_id > 0){ + + // Monta o objeto do item selecionado + const data = { + etiqueta_modelo_id: valorSelecionado.key, + servico_tipo_id: servico_tipo_id, + }; + + // Consumo o endpoint da api + const response = await fetchTServicoEtiquetaSave(data); + + // Verifica se tServicoEtiquetaSave é um objeto válido (não null e não array) + if (response && typeof response === 'object' && !Array.isArray(response)) { + + // Monta o objeto com um único item para a tabela + const item = { + servico_etiqueta_id: Number(response.servico_etiqueta_id) ?? 0, + descricao: String(valorSelecionado.value) ?? "Sem descrição", + }; + + // Adiciona o item na tabela + setItensTabela((prev) => { + const idAtual = String(response.servico_etiqueta_id ?? ''); + const exists = prev.some((p) => String(p.servico_etiqueta_id ?? '') === idAtual); + return exists ? prev : [...prev, item]; + }); + + } + + } + + // Se ocorrer erros, informo + } catch (error) { + + console.log("Erro ao enviar o serviço para a API: " + error) + } }; + // Função para remover um item da tabela + const handleRemoveItem = async (servico_etiqueta_id: number) => { + + try{ + + // Verifica se o ID da etiqueta tipo foi informado + if(servico_etiqueta_id > 0){ + + // Monta o objeto do item selecionado + const data = { + servico_etiqueta_id: servico_etiqueta_id, + }; + + // Consumo o endpoint da api + await fetchTServicoEtiquetaRemove(data); + + } + + // Atualiza a tabela no form + setItensTabela((prev) => prev.filter((p) => Number(p.servico_etiqueta_id) !== servico_etiqueta_id)); + + // Se ocorrer erros, informo + } catch (error) { + + console.log("Erro ao enviar o serviço para a API: " + error) + } + }; + + // Parâmetros para o hook de leitura de emolumento_item // Inicializa com valores padrão (0) para evitar uso de propriedades não declaradas. const gEmolumentoItemReadParams: GEmolumentoItemReadInterface = { emolumento_id: 0, valor: 0 }; @@ -128,86 +280,109 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop }, [gEmolumentoItemReadParams.emolumento_id]); - // Inicializa o react-hook-form com validação via Zod -const form = useForm({ - resolver: zodResolver(TServicoTipoSchema), - defaultValues: { - servico_tipo_id: 0, - descricao: "", - categoria: "", - frenteverso: "N", - averbacao: "N", - transferencia_veiculo: "N", - usar_a4: "N", - etiqueta_unica: "N", - situacao: "A", - selar: "N", - valor_emolumento: 0, - valor_taxa_judiciaria: 0, - fundesp_valor: 0, - valor_total: 0, - }, -}); - // Captura o ID do serviço para uso local const servicoTipoId = Number(form.watch("servico_tipo_id") || data?.servico_tipo_id || 0); - // Atualiza os valores quando há dados para edição - useEffect(() => { - - if (data && Number(data.servico_tipo_id) > 0) { - - //Carrega os valores no form - form.reset(data); - } else { - - // Se não houver dados, reseta o - // formulário para os valores iniciais - // Modo novo cadastro → zera o ID manualmente - form.reset({ - ...form.getValues(), // mantém outros valores default - servico_tipo_id: 0, - descricao: '', - }); - } - }, [data, form]); - - // Função chamada ao clicar em "Salvar" const handleSave = async (formData: TServicoTipoFormValues) => { + try { - // Envia os dados para API - const response = await TServicoTipoSaveData(formData); - // Se a resposta contiver um ID válido + // Se o form não trouxe o ID, tenta puxar de `data` + const servico_tipo_id = formData.servico_tipo_id || data?.servico_tipo_id || form.getValues('servico_tipo_id') || 0; + + // Atualiza o valor dentro do formData + formData.servico_tipo_id = Number(servico_tipo_id); + + // Intercepta e trata o valor de emolumento_id + const emolumentoId = Number(formData.emolumento_id ?? 0); + formData.emolumento_id = emolumentoId === 0 ? null : emolumentoId; + + // Intercepta e trata o valor de emolumento_obrigatorio + const emolumentoObrigatorio = Number(formData.emolumento_obrigatorio ?? 0); + formData.emolumento_obrigatorio = + emolumentoObrigatorio === 0 ? null : emolumentoObrigatorio; + + + // Detecta automaticamente se é edição + const isEditing = !!formData.servico_tipo_id && Number(formData.servico_tipo_id) > 0; + + + // Envia os dados para o módulo com o método correto + const response = await TServicoTipoSaveData({ + ...formData, + metodo: isEditing ? 'PUT' : 'POST', // 💡 Definição explícita do método + }); + + + // Atualiza o formulário apenas se o retorno for válido if (response?.data?.servico_tipo_id) { - const novoId = response.data.servico_tipo_id; + const novoId = response.data.servico_tipo_id; + form.setValue('servico_tipo_id', novoId); // mantém o ID atualizado - // Atualiza o hidden input no formulário - form.setValue("servico_tipo_id", novoId); - // Atualiza todos os campos do formulário com o retorno da API - form.reset(response.data); + // Merge dos dados para preservar valores locais + form.reset({ ...form.getValues(), ...response.data }); - // Exibe mensagem de sucesso - console.log(`Serviço salvo com sucesso (ID: ${novoId})`); + console.log(`Serviço ${isEditing ? 'atualizado' : 'criado'} com sucesso (ID: ${novoId})`); } else { - console.log("Erro ao salvar o tipo de serviço."); + console.log('Erro ao salvar o tipo de serviço.'); } } catch (error) { - - console.log("Erro ao salvar:", error); + console.log('Erro ao salvar:', error); } - }; + }; + + + // Carrega os dados apenas quando o modal + // abrir e houver um registro para editar + useEffect(() => { + + // Remove as etiquetas selecionadas + setItensTabela([]); + + if (isOpen && data && Number(data.servico_tipo_id ?? 0) > 0) { + /** Carrega os dados no formulário */ + form.reset(data); // edição + + } else if (isOpen && !data) { + + /** Reseta os campos do formulário */ + form.reset({ + servico_tipo_id: 0, + emolumento_id: 0, + emolumento_obrigatorio: 0, + descricao: "", + maximo_pessoa: 0, + tipo_item: "", + frenteverso: "N", + averbacao: "N", + transferencia_veiculo: "N", + usar_a4: "N", + etiqueta_unica: "N", + situacao: "A", + selar: "N", + valor_emolumento: 0, + valor_taxa_judiciaria: 0, + fundesp_valor: 0, + valor_total: 0, + tipo_pessoa: "F", + }); + } + }, [isOpen, data]); + + function onError(errors: any) { + console.log('Erros de validação:', errors); + } return ( - { - if (!open) onClose(null, false); - }} - > + { + if (!open) onClose(null, false); + }} + > {/* Cabeçalho do diálogo */} @@ -216,8 +391,8 @@ const form = useForm({ {/* Estrutura do formulário */} - - + + @@ -271,7 +446,7 @@ const form = useForm({
( Categoria @@ -292,20 +467,9 @@ const form = useForm({ render={({ field }) => ( Serviço Padrão - )} @@ -332,81 +496,37 @@ const form = useForm({ {/* Campo: Averbação (Checkbox) */}
- ( - - - field.onChange(checked ? "S" : "N")} // salva "S" ou "N" - /> - - Averbação - - )} + label="Averbação" + control={form.control} />
{/* Campo: Transferência de Veículo (Checkbox) */}
- ( - - - field.onChange(checked ? "S" : "N")} // salva "S" ou "N" - /> - - Transferência Veículo - - )} + label="Transferência de Veículo" + control={form.control} />
{/* Campo: Usar A4 (Checkbox) */}
- ( - - - field.onChange(checked ? "S" : "N")} // grava "S" ou "N" - /> - - Usar A4 - - )} + label="Usar A4" + control={form.control} />
{/* Campo: Etiqueta Única (Texto normal) */}
- ( - - - field.onChange(checked ? "S" : "N")} // grava "S" ou "N" - /> - - Etiqueta Única - - )} + label="Etiqueta Única" + control={form.control} />
@@ -417,7 +537,7 @@ const form = useForm({ control={form.control} name="frenteverso" render={({ field }) => { - const categoriaSelecionada = form.watch("categoria"); + const categoriaSelecionada = form.watch("tipo_item"); const isEnabled = categoriaSelecionada === "A"; return ( @@ -478,25 +598,13 @@ const form = useForm({
( Tipo - + )} @@ -506,30 +614,7 @@ const form = useForm({ {/* Campo: Pessoa (Select) */}
- ( - - Pessoa - - - - )} - /> +
@@ -537,37 +622,29 @@ const form = useForm({
( - - {/* Rótulo do campo */} + Quantidade de pessoas - - { - const apenasNumeros = e.target.value.replace(/[^0-9]/g, ''); - field.onChange(apenasNumeros); + // Converte para número se houver valor + const value = e.target.value === "" ? "" : Number(e.target.value); + field.onChange(value); }} /> - - {/* Exibe mensagens de erro do React Hook Form */} )} @@ -580,7 +657,7 @@ const form = useForm({
( Biometria @@ -588,10 +665,8 @@ const form = useForm({ value={field.value} onValueChange={field.onChange} > - - - - + + Sim @@ -608,7 +683,7 @@ const form = useForm({
( CPF/CNPJ @@ -616,10 +691,8 @@ const form = useForm({ value={field.value} onValueChange={field.onChange} > - - - - + + Sim @@ -637,7 +710,7 @@ const form = useForm({
( Autorização @@ -645,10 +718,8 @@ const form = useForm({ value={field.value} onValueChange={field.onChange} > - - - - + + Sim @@ -666,7 +737,7 @@ const form = useForm({
( Abonador @@ -674,10 +745,8 @@ const form = useForm({ value={field.value} onValueChange={field.onChange} > - - - - + + Sim @@ -740,7 +809,7 @@ const form = useForm({ {itensTabela.map((item, index) => ( - + {String(index + 1).padStart(3, '0')} @@ -750,7 +819,7 @@ const form = useForm({ variant="outline" className="w-full cursor-pointer" type="button" - onClick={() => handleRemoveItem(item.marcacao_tipo_id)} + onClick={() => handleRemoveItem(item.servico_etiqueta_id)} > Remover @@ -789,10 +858,8 @@ const form = useForm({ value={field.value} onValueChange={field.onChange} > - - - - + + Sim @@ -810,7 +877,7 @@ const form = useForm({
( Emolumento @@ -851,7 +918,7 @@ const form = useForm({ (item.valor_taxa_judiciaria ?? 0) + (item.valor_outra_taxa1 ?? 0); - form.setValue("valor_total", total); + form.setValue("valor", total); } } catch (error) { console.error("Erro ao buscar item de emolumento:", error); @@ -873,7 +940,7 @@ const form = useForm({
( Emolumento Adicional (Mesma etiqueta) @@ -953,7 +1020,7 @@ const form = useForm({
( Total R$ diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts new file mode 100644 index 0000000..9d7fb3e --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts @@ -0,0 +1,26 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/shared/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de localizar um tipo de serviço +async function executeTServicoEtiquetaService(data: TServicoEtiquetaInterface) { + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia o ID no endpoint + return await api.send({ + method: Methods.GET, // Verbo GET para consulta + endpoint: `administrativo/t_servico_etiqueta/servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados + }); +} + +// Exporta a função de Readr tipo de serviço já encapsulada com tratamento de erros +export const TServicoEtiquetaReadData = withClientErrorHandler(executeTServicoEtiquetaService); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts new file mode 100644 index 0000000..1c6bdcf --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts @@ -0,0 +1,27 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/shared/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; // Alterado de GCidadeInterface + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de remover um tipo de serviço +async function executeTServicoEtiquetaRemoveData(data: TServicoEtiquetaInterface) { // Nome da função alterado + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia o ID no endpoint + return await api.send({ + method: Methods.DELETE, // Verbo DELETE para exclusão + endpoint: `administrativo/t_servico_etiqueta/${data.servico_etiqueta_id}`, // Endpoint e ID alterados + }); +} + +// Exporta a função de remover tipo de serviço já encapsulada com tratamento de erros +export const TServicoEtiquetaRemoveData = withClientErrorHandler(executeTServicoEtiquetaRemoveData); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts new file mode 100644 index 0000000..b56e5fb --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts @@ -0,0 +1,39 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/shared/services/api/Api'; // + +// Importa o esquema de validação de dados para tipos de serviço +import { TServicoEtiquetaFormValues } from '../../_schemas/TServicoEtiquetaSchema'; + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; // Interface alterada + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço +async function executeTServicoEtiquetaSaveData(data: TServicoEtiquetaFormValues) { + + try{ + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/t_servico_etiqueta`, // Endpoint e ID alterados + body: data, // payload enviado para a API + }); + + } catch (error) { + + console.error('Erro no TServicoEtiquetaSaveData:', error); + throw error; // propaga erro para o form + } +} + +// Exporta a função de salvar tipo de serviço já encapsulada com tratamento de erros +export const TServicoEtiquetaSaveData = withClientErrorHandler(executeTServicoEtiquetaSaveData); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts new file mode 100644 index 0000000..a94106d --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts @@ -0,0 +1,26 @@ +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/shared/services/api/Api'; // + +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // + +// Importa a interface tipada que define a estrutura dos dados do tipo de serviço +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Alterado de GCidadeInterface + +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // + +// Função assíncrona que implementa a lógica de localizar um tipo de serviço +async function executeTServicoTipoEditService(data: TServicoTipoInterface) { + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia o ID no endpoint + return await api.send({ + method: Methods.GET, // Verbo GET para consulta + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados + }); +} + +// Exporta a função de Readr tipo de serviço já encapsulada com tratamento de erros +export const TServicoTipoEditData = withClientErrorHandler(executeTServicoTipoEditService); // Nome da exportação alterado \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts index 5b91bb5..0534182 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts @@ -19,7 +19,7 @@ async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { // N // Executa a requisição para a API com o método apropriado e envia o ID no endpoint return await api.send({ method: Methods.DELETE, // Verbo DELETE para exclusão - endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados de g_cidade/cidade_id + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados }); } diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts index 47942ce..18308b7 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts @@ -1,6 +1,9 @@ // Importa o serviço de API que será utilizado para realizar requisições HTTP import API from '@/shared/services/api/Api'; // +// Importa o esquema de validação de dados para tipos de serviço +import { TServicoTipoFormValues } from '../../_schemas/TServicoTipoSchema'; + // Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // @@ -11,20 +14,33 @@ import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço -async function executeTServicoTipoSaveData(data: TServicoTipoInterface) { // Nome da função alterado +async function executeTServicoTipoSaveData(data: TServicoTipoFormValues & { metodo?: 'POST' | 'PUT' }) { // Verifica se existe ID do tipo de serviço para decidir se é atualização (PUT) ou criação (POST) - const isUpdate = Boolean(data.servico_tipo_id); // Campo de ID alterado de 'cidade_id' para 'servico_tipo_id' + const isEditing = !!data.servico_tipo_id && Number(data.servico_tipo_id) > 0; - // Instancia o cliente da API para enviar a requisição - const api = new API(); // + // Define método: prioridade para valor passado manualmente (metodo) + const method = data.metodo ?? (isEditing ? 'PUT' : 'POST'); - // Executa a requisição para a API com o método apropriado e envia os dados no corpo - return await api.send({ - method: isUpdate ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar - endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id || ''}`, // Endpoint e ID alterados - body: data, // payload enviado para a API - }); + try{ + + console.log(data) + + // Instancia o cliente da API para enviar a requisição + const api = new API(); // + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: isEditing ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id || ''}`, // Endpoint e ID alterados + body: data, // payload enviado para a API + }); + + } catch (error) { + + console.error('Erro no TServicoTipoSaveData:', error); + throw error; // propaga erro para o form + } } // Exporta a função de salvar tipo de serviço já encapsulada com tratamento de erros diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts new file mode 100644 index 0000000..7e37517 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts @@ -0,0 +1,27 @@ +// Importa o utilitário responsável por tratar erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a classe de serviço que gerencia requisições HTTP para a API +import API from '@/shared/services/api/Api'; + +// Importa o enum que define os métodos HTTP disponíveis (GET, POST, PUT, DELETE, etc.) +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import { TTBReconhecimentoTipoReadInterface } from '../../_interfaces/TTBReconhecimentoTipoReadInterface'; + +// Função assíncrona responsável por executar a requisição para listar os tipos de marcação +async function executeTTBReconhecimentoTipoIndexData(data: TTBReconhecimentoTipoReadInterface) { + // Cria uma nova instância da classe API para enviar a requisição + const api = new API(); + + // Concatena o endpoint com a query string (caso existam parâmetros) + const endpoint = `administrativo/t_tb_reconhecimentotipo/`; + + // Envia uma requisição GET para o endpoint 'administrativo/g_marcacao_tipo/' + return await api.send({ + method: Methods.GET, + endpoint: endpoint, + }); +} + +// Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const TTBReconhecimentoTipoIndexData = withClientErrorHandler(executeTTBReconhecimentoTipoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts index 2f1cfb7..696eb74 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts @@ -6,14 +6,15 @@ import { useMemo, useState } from 'react'; // Importa a interface que define a estrutura dos dados de "GMarcacaoTipo" import { GMarcacaoTipoReadInterface } from '../../_interfaces/GMarcacaoTipoReadInterface'; +import { GMarcacaoTipoInterface } from '../../_interfaces/GMarcacaoTipoInterface'; // Importa o serviço responsável por buscar os dados de "GMarcacaoTipo" na API import { GMarcacaoTipoIndexService } from '../../_services/g_marcacao_tipo/GMarcacaoTipoIndexService'; -import { GMarcacaoTipoInterface } from '../../_interfaces/GMarcacaoTipoInterface'; // Hook personalizado para leitura (consulta) dos tipos de marcação export const useGMarcacaoTipoReadHook = () => { + // Obtém a função que atualiza a resposta global do sistema const { setResponse } = useResponse(); diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts new file mode 100644 index 0000000..88b50ab --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts @@ -0,0 +1,44 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useCallback, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "TServicoEtiqueta" +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; + +// Importa o serviço responsável por buscar os dados de "TServicoEtiqueta" na API +import { TServicoEtiquetaServicoIdService } from '../../_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService'; + +// Hook personalizado para leitura (consulta) dos tipos de marcação +export const useTServicoEtiquetaReadHook = () => { + + // Obtém a função que atualiza a resposta global do sistema + const { setResponse } = useResponse(); + + // Define o estado local que armazenará a lista de tipos de marcação + const [tServicoEtiqueta, setTServicoEtiqueta] = useState([]); + + // Função responsável por buscar os dados da API e atualizar o estado + const fetchTServicoEtiqueta = useCallback(async (data: TServicoEtiquetaInterface) => { + + try{ + + // Executa o serviço que faz a requisição à API + const response = await TServicoEtiquetaServicoIdService(data); + + // Atualiza o estado local com os dados retornados + setTServicoEtiqueta(response.data); + + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + + } catch (error) { + console.error('Erro ao buscar etiquetas:', error); + return { data: [] }; + } + }, [setResponse]); + + // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias + return { tServicoEtiqueta, fetchTServicoEtiqueta }; +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts new file mode 100644 index 0000000..8599229 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts @@ -0,0 +1,25 @@ +import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API + +// Interface tipada do tipo de serviço +import { TServicoEtiquetaInterface } from "../../_interfaces/TServicoEtiquetaInterface"; + +// Função que remove o tipo de serviço via API +import { TServicoEtiquetaRemoveData } from "../../_data/TServicoEtiqueta/TServicoEtiquetaRemoveData"; + +// Hook customizado para remoção de tipos de serviço +export const useTServicoEtiquetaRemoveHook = () => { + // Hook do contexto de resposta para feedback global (alertas, mensagens etc.) + const { setResponse } = useResponse(); + + // Função assíncrona que remove um tipo de serviço + const fetchTServicoEtiquetaRemove = async (data: TServicoEtiquetaInterface) => { + // Chama a função de remoção passando os dados do tipo de serviço + const response = await TServicoEtiquetaRemoveData(data); + + // Atualiza o contexto global com a resposta da API + setResponse(response); + }; + + // Retorna a função de remoção para ser usada no componente + return { fetchTServicoEtiquetaRemove }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts new file mode 100644 index 0000000..25ebfcf --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts @@ -0,0 +1,37 @@ +import { useState } from 'react'; +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Interface tipada do serviço etiqueta +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; + +// Serviço que salva os dados do serviço etiqueta +import { TServicoEtiquetaSaveService } from '../../_services/t_servico_etiqueta/TServicoEtiquetaSaveService'; + +export const useTServicoEtiquetaSaveHook = () => { + const { setResponse } = useResponse(); + + // Estado local para armazenar os dados do serviço etiqueta salvos + const [tServicoEtiquetaSave, setTServicoEtiquetaSave] = useState(null); + + /** + * Função que executa o salvamento de um serviço etiqueta. + * @param data Os dados do serviço etiqueta a serem salvos. + */ + const fetchTServicoEtiquetaSave = async (data: TServicoEtiquetaInterface) => { + + // Chama o serviço de salvamento + const response = await TServicoEtiquetaSaveService(data); + + // Guardar os dados localizados + setTServicoEtiquetaSave(response.data); + + // Manda a resposta para o verificador de resposta global + ///setResponse(response); + + // Manda a resposta para o verificador de resposta global + return response.data; + } + + // Retorna o estado e a função de salvamento para uso no componente + return { tServicoEtiquetaSave, fetchTServicoEtiquetaSave }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts new file mode 100644 index 0000000..67f927e --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts @@ -0,0 +1,26 @@ +import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API + +// Interface tipada do tipo de serviço +import TServicoTipoInterface from "../../_interfaces/TServicoTipoInterface"; + +// Função que Edit o tipo de serviço via API +import { TServicoTipoEditData } from "../../_data/TServicoTipo/TServicoTipoEditData"; + +// Hook customizado para remoção de tipos de serviço +export const useTServicoTipoEditHook = () => { + // Hook do contexto de resposta para feedback global (alertas, mensagens etc.) + const { setResponse } = useResponse(); + + // Função assíncrona que Edit um tipo de serviço + const editTServicoTipo = async (data: TServicoTipoInterface) => { + + // Chama a função de remoção passando os dados do tipo de serviço + const response = await TServicoTipoEditData(data); + + // Atualiza o contexto global com a resposta da API + setResponse(response); + }; + + // Retorna a função de remoção para ser usada no componente + return { editTServicoTipo }; +}; \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts new file mode 100644 index 0000000..88a8eaa --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts @@ -0,0 +1,37 @@ +// Importa o hook responsável por gerenciar e exibir respostas globais (sucesso, erro, etc.) +import { useResponse } from '@/shared/components/response/ResponseContext'; + +// Importa hooks do React para gerenciamento de estado e memorização de valores +import { useMemo, useState } from 'react'; + +// Importa a interface que define a estrutura dos dados de "TTBReconhecimentoTipo" +import { TTBReconhecimentoTipoReadInterface } from '../../_interfaces/TTBReconhecimentoTipoReadInterface'; +import { TTBReconhecimentoTipoInterface } from '../../_interfaces/TTBReconhecimentoTipoInterface'; + +// Importa o serviço responsável por buscar os dados de "TTBReconhecimentoTipo" na API +import { TTBReconhecimentoTipoIndexService } from '../../_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService'; + + +// Hook personalizado para leitura (consulta) dos tipos de marcação +export const useTTBReconhecimentoTipoReadHook = () => { + // Obtém a função que atualiza a resposta global do sistema + const { setResponse } = useResponse(); + + // Define o estado local que armazenará a lista de tipos de marcação + const [tTBReconhecimentoTipo, setTTBReconhecimentoTipo] = useState([]); + + // Função responsável por buscar os dados da API e atualizar o estado + const fetchTTBReconhecimentoTipo = async (data: TTBReconhecimentoTipoReadInterface) => { + // Executa o serviço que faz a requisição à API + const response = await TTBReconhecimentoTipoIndexService(data); + + // Atualiza o estado local com os dados retornados + setTTBReconhecimentoTipo(response.data); + + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + }; + + // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias + return useMemo(() => ({ tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo }), [tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo]); +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts new file mode 100644 index 0000000..9ab50d7 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts @@ -0,0 +1,7 @@ +// Interface que representa a tabela T_TB_RECONHECIMENTOTIPO +export interface TServicoEtiquetaInterface { + servico_etiqueta_id?: number; // NUMERIC(10,2) NOT NULL - Chave primária + etiqueta_modelo_id?: number; // NUMERIC(10,2) + servico_tipo_id?: number; // NUMERIC(10,2) + descricao?: string +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts new file mode 100644 index 0000000..12ce5b0 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts @@ -0,0 +1,3 @@ +export interface TServicoEtiquetaServicoIdReadInterface { + servico_tipo_id?: number +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts index 96a05f1..872097e 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts @@ -1,37 +1,27 @@ export default interface TServicoTipoInterface { - servico_tipo_id?: number; // SERVICO_TIPO_ID NUMERIC(10,2) NOT NULL (PK) - descricao: string; // DESCRICAO VARCHAR(60) - valor?: number; // VALOR NUMERIC(14,3) - tipo_item?: string; // TIPO_ITEM VARCHAR(1) - requer_autorizacao?: string; // REQUER_AUTORIZACAO VARCHAR(1) - requer_biometria?: string; // REQUER_BIOMETRIA VARCHAR(1) - tipo_pessoa?: string; // TIPO_PESSOA VARCHAR(1) - tb_reconhecimentotipo_id?: number; // TB_RECONHECIMENTOTIPO_ID NUMERIC(10,2) (FK) - tipo_permissao_cpf?: string; // TIPO_PERMISSAO_CPF VARCHAR(1) - requer_abonador?: string; // REQUER_ABONADOR VARCHAR(1) - requer_representante?: string; // REQUER_REPRESENTANTE VARCHAR(1) - situacao?: string; // SITUACAO VARCHAR(1) - requer_cpf?: string; // REQUER_CPF VARCHAR(1) - servico_padrao?: string; // SERVICO_PADRAO VARCHAR(1) - maximo_pessoa?: number; // MAXIMO_PESSOA NUMERIC(10,2) - alterar_valor?: string; // ALTERAR_VALOR VARCHAR(1) - servico_caixa_id?: number; // SERVICO_CAIXA_ID NUMERIC(10,2) - lancar_taxa?: string; // LANCAR_TAXA VARCHAR(1) - lancar_fundesp?: string; // LANCAR_FUNDESP VARCHAR(1) - liberar_desconto?: string; // LIBERAR_DESCONTO VARCHAR(1) - fundesp_automatica?: string; // FUNDESP_AUTOMATICA VARCHAR(1) - lancar_valor_documento?: string; // LANCAR_VALOR_DOCUMENTO VARCHAR(1) - valor_fixo?: string; // VALOR_FIXO VARCHAR(1) - emolumento_id?: number; // EMOLUMENTO_ID NUMERIC(10,2) (FK) - ato_praticado?: string; // ATO_PRATICADO VARCHAR(1) - selar?: string; // SELAR VARCHAR(1) - frenteverso?: string; // FRENTEVERSO VARCHAR(1) - pagina_acrescida?: string; // PAGINA_ACRESCIDA VARCHAR(1) - emolumento_obrigatorio?: number; // EMOLUMENTO_OBRIGATORIO NUMERIC(10,2) - apresentante_selo?: string; // APRESENTANTE_SELO VARCHAR(1) - renovacao_cartao?: string; // RENOVACAO_CARTAO VARCHAR(1) - etiqueta_unica?: string; // ETIQUETA_UNICA VARCHAR(1) - transferencia_veiculo?: string; // TRANSFERENCIA_VEICULO VARCHAR(1) - usar_a4?: string; // USAR_A4 VARCHAR(1) - averbacao?: string; // AVERBACAO VARCHAR(1) -} \ No newline at end of file + servico_tipo_id?: number; // SERVICO_TIPO_ID NUMERIC(10,2) NOT NULL (PK) + descricao: string; // DESCRICAO VARCHAR(60) + valor?: number; // VALOR NUMERIC(14,3) + requer_autorizacao?: string; // REQUER_AUTORIZACAO VARCHAR(1) + requer_biometria?: string; // REQUER_BIOMETRIA VARCHAR(1) + tipo_pessoa?: string; // TIPO_PESSOA VARCHAR(1) + tb_reconhecimentotipo_id?: number; // TB_RECONHECIMENTOTIPO_ID NUMERIC(10,2) (FK) + requer_abonador?: string; // REQUER_ABONADOR VARCHAR(1) + situacao?: string; // SITUACAO VARCHAR(1) + requer_cpf?: string; // REQUER_CPF VARCHAR(1) + servico_padrao?: string; // SERVICO_PADRAO VARCHAR(1) + maximo_pessoa?: number; // MAXIMO_PESSOA NUMERIC(10,2) + alterar_valor?: string; // ALTERAR_VALOR VARCHAR(1) + servico_caixa_id?: number; // SERVICO_CAIXA_ID NUMERIC(10,2) + caixa_servico_id?: number; // LIBERAR_DESCONTO VARCHAR(1) + valor_fixo?: string; // VALOR_FIXO VARCHAR(1) + emolumento_id?: number; // EMOLUMENTO_ID NUMERIC(10,2) (FK) + emolumento_obrigatorio?: number; // EMOLUMENTO_OBRIGATORIO NUMERIC(10,2) (FK) + ato_praticado?: string; // ATO_PRATICADO VARCHAR(1) + selar?: string; // SELAR VARCHAR(1) + frenteverso?: string; // FRENTEVERSO VARCHAR(1) + etiqueta_unica?: string; // ETIQUETA_UNICA VARCHAR(1) + transferencia_veiculo?: string; // TRANSFERENCIA_VEICULO VARCHAR(1) + usar_a4?: string; // USAR_A4 VARCHAR(1) + averbacao?: string; // AVERBACAO VARCHAR(1) +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts new file mode 100644 index 0000000..8144ce6 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts @@ -0,0 +1,6 @@ +// Interface que representa a tabela T_TB_RECONHECIMENTOTIPO +export interface TTbReconhecimentoTipoInterface { + tb_reconhecimentotipo_id: number; // NUMERIC(10,2) NOT NULL - Chave primária + descricao?: string; // VARCHAR(30) + situacao?: string; // VARCHAR(1) +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts new file mode 100644 index 0000000..69948ee --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts @@ -0,0 +1,4 @@ +export interface TTBReconhecimentoTipoReadInterface { + tb_reconhecimentotipo_id?: number, + descricao?: string +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts new file mode 100644 index 0000000..11dc09e --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts @@ -0,0 +1,15 @@ +/** + * Interface principal baseada na DDL + * Tabela: T_SERVICO_ETIQUETA + */ +export interface TServicoEtiquetaFormValues { + /** Identificador principal (PK) */ + servico_etiqueta_id?: number; + + /** Relacionamento com o modelo de etiqueta (FK) */ + etiqueta_modelo_id?: number; + + /** Relacionamento com o tipo de serviço (FK) */ + servico_tipo_id?: number; + +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts index 84a6ed1..3fae76f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts @@ -29,15 +29,15 @@ export const TServicoTipoSchema = z.object({ etiqueta_unica: SN.optional(), selar: SN.optional(), servico_padrao: SN.optional(), - lancar_taxa: SN.optional(), - lancar_fundesp: SN.optional(), - liberar_desconto: SN.optional(), - fundesp_automatica: SN.optional(), - lancar_valor_documento: SN.optional(), + // lancar_taxa: SN.optional(), + // lancar_fundesp: SN.optional(), + // liberar_desconto: SN.optional(), + // fundesp_automatica: SN.optional(), + // lancar_valor_documento: SN.optional(), valor_fixo: SN.optional(), ato_praticado: SN.optional(), - apresentante_selo: SN.optional(), - renovacao_cartao: SN.optional(), + // apresentante_selo: SN.optional(), + // renovacao_cartao: SN.optional(), // Situação situacao: AI, @@ -46,8 +46,8 @@ export const TServicoTipoSchema = z.object({ valor: OptionalNumber, maximo_pessoa: OptionalNumber, servico_caixa_id: OptionalNumber, - emolumento_id: OptionalNumber, - emolumento_obrigatorio: OptionalNumber, + emolumento_id: z.number().nullable(), + emolumento_obrigatorio: z.number().nullable(), // Relacionamentos e permissões tipo_item: OneCharString, @@ -55,12 +55,12 @@ export const TServicoTipoSchema = z.object({ requer_biometria: OneCharString, tipo_pessoa: OneCharString, tb_reconhecimentotipo_id: OptionalNumber, - tipo_permissao_cpf: OneCharString, + // tipo_permissao_cpf: OneCharString, requer_abonador: OneCharString, - requer_representante: OneCharString, + // requer_representante: OneCharString, requer_cpf: OneCharString, - alterar_valor: OneCharString, - pagina_acrescida: OneCharString, + // alterar_valor: OneCharString, + // pagina_acrescida: OneCharString, // Campos auxiliares usados apenas no formulário (não persistidos) valor_emolumento: z.number().optional(), diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts new file mode 100644 index 0000000..e6675ef --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts @@ -0,0 +1,21 @@ +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Função que salva os dados do serviço etiqueta via API (ou mock) +import { TServicoEtiquetaSaveData } from '../../_data/TServicoEtiqueta/TServicoEtiquetaSaveData'; + +// Interface tipada do serviço etiqueta +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; + +// Função assíncrona que executa o salvamento de um serviço etiqueta +async function executeTServicoEtiquetaSaveService(data: TServicoEtiquetaInterface) { + + // Chama a função que salva os dados do serviço etiqueta + const response = await TServicoEtiquetaSaveData(data); + + // Retorna a resposta do salvamento + return response; +} + +// Exporta o serviço de salvamento de serviço etiqueta já encapsulado com tratamento de erros +export const TServicoEtiquetaSaveService = withClientErrorHandler(executeTServicoEtiquetaSaveService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts new file mode 100644 index 0000000..1d56a87 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts @@ -0,0 +1,20 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente + +import { TServicoEtiquetaReadData } from '../../_data/TServicoEtiqueta/TServicoEtiquetaReadData'; + +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; +// Interface tipada do tipo de serviço + +// Função assíncrona que executa a consulta de um tipo de serviço etiqueta +async function executeTServicoEtiquetaServicoIdService(data: TServicoEtiquetaInterface) { + + // Chama a função que consulta os dados do tipo de serviço etiqueta + const response = await TServicoEtiquetaReadData(data); + + // Retorna a resposta da remoção + return response; +} + +// Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros +export const TServicoEtiquetaServicoIdService = withClientErrorHandler(executeTServicoEtiquetaServicoIdService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts new file mode 100644 index 0000000..873e321 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts @@ -0,0 +1,20 @@ +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +// Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente + +import { TServicoTipoEditData } from '../../_data/TServicoTipo/TServicoTipoEditData'; +// Função que remove os dados do tipo de serviço via API + +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; +// Interface tipada do tipo de serviço + +// Função assíncrona que executa a remoção de um tipo de serviço +async function executeTServicoTipoEditService(data: TServicoTipoInterface) { + // Chama a função que remove os dados do tipo de serviço + const response = await TServicoTipoEditData(data); + + // Retorna a resposta da remoção + return response; +} + +// Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros +export const TServicoTipoEditService = withClientErrorHandler(executeTServicoTipoEditService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts new file mode 100644 index 0000000..fece097 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts @@ -0,0 +1,20 @@ +// Importa o utilitário responsável por lidar com erros de forma padronizada no cliente +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + +// Importa a função que realiza a requisição de listagem dos tipos de marcação +import { TTBReconhecimentoTipoIndexData } from '../../_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData'; +import { TTBReconhecimentoTipoReadInterface } from '../../_interfaces/TTBReconhecimentoTipoReadInterface'; + +// Função assíncrona responsável por executar o serviço de listagem de tipos de marcação +async function executeTTBReconhecimentoTipoIndexService(data: TTBReconhecimentoTipoReadInterface) { + // Chama a função que realiza a requisição à API e aguarda a resposta + const response = await TTBReconhecimentoTipoIndexData(data); + + // Retorna a resposta obtida da requisição + return response; +} + +// Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas +export const TTBReconhecimentoTipoIndexService = withClientErrorHandler( + executeTTBReconhecimentoTipoIndexService, +); diff --git a/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx index 83761bf..125a8aa 100644 --- a/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx +++ b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx @@ -51,12 +51,10 @@ export default function CCaixaServicoSelect({ sistema_id, field }: any) { className="justify-between cursor-pointer" > {isLoading - ? "Carregando..." - : field.value && typeof field.value === 'object' && field.value.value - ? GetCapitalize(field.value.value) // Exibe a descrição do objeto - : field.value && typeof field.value !== 'object' - ? field.value // Se for um ID (valor antigo), exibe ele - : "Selecione o serviço"} + ? "Carregando..." + : selected + ? GetCapitalize(selected.descricao) + : "Selecione o serviço"} @@ -75,10 +73,7 @@ export default function CCaixaServicoSelect({ sistema_id, field }: any) { key={item.caixa_servico_id} value={item.descricao?.toLowerCase() ?? ""} onSelect={() => { - field.onChange({ - key: Number(item.caixa_servico_id), - value: item.descricao, - }); + field.onChange(Number(item.caixa_servico_id)); // envia apenas o número setOpen(false); }} > diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx index c22efd6..0b3df97 100644 --- a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx @@ -56,7 +56,7 @@ export default function GEmolumentoSelect({ sistema_id, field, onSelectChange, c // Obtém o item selecionado com base no valor atual do campo const selected = gEmolumento?.find( - (item) => String(item.emolumento_id) === String(field.value?.key ?? field.value) + (item) => Number(item.emolumento_id) === Number(field.value ?? 0) ); @@ -112,6 +112,7 @@ export default function GEmolumentoSelect({ sistema_id, field, onSelectChange, c className="cursor-pointer w-full" key={item.emolumento_id} value={item.descricao?.toLowerCase() ?? ""} + // Quando o item é selecionado onSelect={() => { // Cria objeto com ID e descrição @@ -120,15 +121,20 @@ export default function GEmolumentoSelect({ sistema_id, field, onSelectChange, c value: item.descricao, }; - // Atualiza o valor no react-hook-form - field.onChange(selectedValue); + // Atualiza o valor no react-hook-form com o ID numérico + field.onChange(Number(item.emolumento_id ?? 0)); - // Dispara callback externo, se existir (ex: fetchGEmolumentoItem) - if (onSelectChange) onSelectChange(selectedValue); + // Dispara callback externo, se existir (mantém o objeto completo) + if (onSelectChange) + onSelectChange({ + key: Number(item.emolumento_id), + value: item.descricao, + }); // Fecha o popover setOpen(false); }} + > {/* Ícone de seleção (check) */} { + const loadData = async () => { + if (!tTBReconhecimentoTipo.length) { + setIsLoading(true); + await fetchTTBReconhecimentoTipo(); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = tTBReconhecimentoTipo?.find( + (item) => Number(item.tb_reconhecimentotipo_id) === Number(field.value) + ); + return ( + + + + + + + + + + + + {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} + + + {tTBReconhecimentoTipo?.map((item) => ( + { + field.onChange(Number(item.tb_reconhecimentotipo_id)); // envia apenas o número + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); +} diff --git a/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx b/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx new file mode 100644 index 0000000..2b8255f --- /dev/null +++ b/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx @@ -0,0 +1,28 @@ +import { FormControl, FormField, FormItem, FormLabel } from "@/components/ui/form"; +import { Checkbox } from "@/components/ui/checkbox"; + +interface ConfirmacaoCheckBoxProps { + name: string; + label: string; + control: any; +} + +export function ConfirmacaoCheckBox({ name, label, control }: ConfirmacaoCheckBoxProps) { + return ( + ( + + + field.onChange(checked ? "S" : "N")} + /> + + {label} + + )} + /> + ); +} diff --git a/src/shared/components/confirmacao/ConfirmacaoSelect.tsx b/src/shared/components/confirmacao/ConfirmacaoSelect.tsx index 18c0511..363f07a 100644 --- a/src/shared/components/confirmacao/ConfirmacaoSelect.tsx +++ b/src/shared/components/confirmacao/ConfirmacaoSelect.tsx @@ -31,16 +31,16 @@ export default function ConfirmacaoSelect({ field }: any) { variant="outline" role="combobox" aria-expanded={open} - className="justify-between" + className="justify-between cursor-pointer" > {field.value ? options.find((item) => item.value === field.value)?.label : 'Selecione...'} - + - + @@ -48,6 +48,7 @@ export default function ConfirmacaoSelect({ field }: any) { {options.map((item) => ( { @@ -57,7 +58,7 @@ export default function ConfirmacaoSelect({ field }: any) { > diff --git a/src/shared/components/numericInputField/NumericInputField.tsx b/src/shared/components/numericInputField/NumericInputField.tsx new file mode 100644 index 0000000..b136ee4 --- /dev/null +++ b/src/shared/components/numericInputField/NumericInputField.tsx @@ -0,0 +1,68 @@ +"use client"; + +import React from "react"; +import { Control, FieldValues, Path } from "react-hook-form"; +import { + FormField, + FormItem, + FormLabel, + FormControl, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; + +interface NumericInputFieldProps { + control: Control; + name: Path; + label?: string; + placeholder?: string; + disabled?: boolean; + min?: number; + max?: number; +} + +export function NumericInputField({ + control, + name, + label = "Número", + placeholder = "Digite um número", + disabled = false, + min, + max, +}: NumericInputFieldProps) { + return ( + ( + + {label && {label}} + + + { + // Mantém apenas números + let value = e.target.value.replace(/[^0-9]/g, ""); + + // Limita faixa, se definido + if (min !== undefined && Number(value) < min) value = String(min); + if (max !== undefined && Number(value) > max) value = String(max); + + field.onChange(value); + }} + /> + + + + + )} + /> + ); +} diff --git a/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx b/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx new file mode 100644 index 0000000..dabe9fd --- /dev/null +++ b/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx @@ -0,0 +1,66 @@ +"use client"; + +import React from "react"; +import { Control, FieldValues, Path } from "react-hook-form"; +import { + FormField, + FormItem, + FormLabel, + FormControl, + FormMessage, +} from "@/components/ui/form"; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "@/components/ui/select"; + +interface PessoaTipoSelectProps { + control: Control; + name: Path; + label?: string; + disabled?: boolean; + placeholder?: string; +} + +export function TipoPessoaSelect({ + control, + name, + label = "Pessoa", + disabled = false, + placeholder = "Selecione uma opção", +}: PessoaTipoSelectProps) { + return ( + ( + + {label && {label}} + + + + )} + /> + ); +} From 23604033feb1d9ca862142445dcbc7beb07daa2b Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Tue, 28 Oct 2025 17:18:05 -0300 Subject: [PATCH 7/7] =?UTF-8?q?fix(eslint):=20Corre=C3=A7=C3=A3o=20autom?= =?UTF-8?q?=C3=A1tica=20de=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eslint.config.mjs | 136 ++-- .../administrativo/andamentos/page.tsx | 10 +- .../administrativo/atos/partes-tipos/page.tsx | 10 +- .../administrativo/bairros/page.tsx | 6 +- .../administrativo/censec/naturezas/page.tsx | 6 +- .../administrativo/censec/qualidades/page.tsx | 6 +- .../centrais/censec/centrais/page.tsx | 6 +- .../censec/naturezas-litigios/page.tsx | 6 +- .../centrais/censec/qualidades/page.tsx | 6 +- .../centrais/censec/tipos-atos/page.tsx | 6 +- .../administrativo/cidades/page.tsx | 6 +- .../administrativo/imoveis/rurais/page.tsx | 2 +- .../imoveis/tipos-logradouros/page.tsx | 6 +- .../administrativo/imoveis/urbanos/page.tsx | 4 +- .../administrativo/medidas/tipos/page.tsx | 6 +- .../administrativo/minutas/naturezas/page.tsx | 12 +- .../pessoas/estados-civis/page.tsx | 6 +- .../administrativo/pessoas/fisicas/page.tsx | 4 +- .../administrativo/pessoas/juridicas/page.tsx | 5 +- .../pessoas/profissoes/page.tsx | 6 +- .../pessoas/regimes-bens/page.tsx | 6 +- .../pessoas/regimes-comunhao/page.tsx | 6 +- .../administrativo/reconhecimentos/page.tsx | 10 +- .../(t_servico_tipo)/servicos-tipo/page.tsx | 92 ++- .../t_servico_tipo/TServicoTipoForm.tsx | 741 ++++++++---------- .../t_servico_tipo/TServicoTipoTable.tsx | 9 +- .../TServicoEtiquetaReadData.ts | 8 +- .../TServicoEtiquetaRemoveData.ts | 7 +- .../TServicoEtiquetaSaveData.ts | 10 +- .../TServicoTipo/TServicoTipoEditData.ts | 6 +- .../TServicoTipo/TServicoTipoIndexData.ts | 5 +- .../TServicoTipo/TServicoTipoRemoveData.ts | 7 +- .../TServicoTipo/TServicoTipoSaveData.ts | 16 +- .../TTBReconhecimentoTipoIndexData.ts | 4 +- .../useCCaixaServicoReadHook.ts | 6 +- .../g_emolumento/useGEmolumentoReadHook.ts | 1 - .../useGEmolumentoItemReadHook.ts | 11 +- .../useGMarcacaoTipoReadHook.ts | 7 +- .../useTServicoEtiquetaReadHook.ts | 33 +- .../useTServicoEtiquetaRemoveHook.ts | 8 +- .../useTServicoEtiquetaSaveHook.ts | 14 +- .../t_servico_tipo/useTServicoTipoEditHook.ts | 9 +- .../t_servico_tipo/useTServicoTipoReadHook.ts | 6 +- .../useTServicoTipoRemoveHook.ts | 8 +- .../t_servico_tipo/useTServicoTipoSaveHook.ts | 8 +- .../useTTBReconhecimentoTipoReadHook.ts | 10 +- .../_interfaces/CCaixaServicoInterface.ts | 30 +- .../_interfaces/CCaixaServicoReadInterface.ts | 2 +- .../_interfaces/GEmolumentoInterface.ts | 34 +- .../_interfaces/GEmolumentoItemInterface.ts | 58 +- .../GEmolumentoItemReadInterface.ts | 6 +- .../_interfaces/GEmolumentoReadInterface.ts | 4 +- .../_interfaces/GMarcacaoTipoInterface.ts | 2 +- .../_interfaces/GMarcacaoTipoReadInterface.ts | 2 +- .../_interfaces/TServicoEtiquetaInterface.ts | 8 +- .../TServicoEtiquetaServicoIdReadInterface.ts | 4 +- .../_interfaces/TServicoTipoInterface.ts | 50 +- .../TTBReconhecimentoTipoInterface.ts | 6 +- .../TTBReconhecimentoTipoReadInterface.ts | 6 +- .../_schemas/TServicoEtiquetaSchema.ts | 1 - .../cadastros/_schemas/TServicoTipoSchema.ts | 16 +- .../CCaixaServicoIndexService.ts | 6 +- .../g_emolumento/GEmolumentoIndexService.ts | 6 +- .../GEmolumentoItemValorService.ts | 2 +- .../GMarcacaoTipoIndexService.ts | 6 +- .../TServicoEtiquetaSaveService.ts | 5 +- .../TServicoEtiquetaServicoIdService.ts | 5 +- .../t_servico_tipo/TServicoTipoEditService.ts | 2 +- .../TServicoTipoIndexService.ts | 2 +- .../TServicoTipoRemoveService.ts | 2 +- .../t_servico_tipo/TServicoTipoSaveService.ts | 2 +- .../TTBReconhecimentoTipoIndexService.ts | 2 +- src/app/(protected)/layout.tsx | 8 +- src/app/(protected)/page.tsx | 74 +- .../confirm_exclusion/ConfirmExclusion.tsx | 197 +++-- .../confirm_exclusion/useConfirmExclusion.ts | 14 +- src/components/app-sidebar.tsx | 31 +- src/components/nav-main.tsx | 4 +- src/components/nav-projects.tsx | 4 +- src/components/ui/input-otp.tsx | 51 +- src/components/ui/sidebar.tsx | 2 +- src/components/ui/switch.tsx | 23 +- src/components/ui/table.tsx | 86 +- .../CCaixaServico/CCaixaServicoSelect.tsx | 179 +++-- .../components/GCidade/GCidadeForm.tsx | 1 - .../GEmolumento/GEmolumentoSelect.tsx | 270 ++++--- .../GMarcacaoTipo/GMarcacaoTipoSelect.tsx | 189 +++-- .../GMedidaTipo/GMedidaTipoIndex.tsx | 1 - .../components/GNatureza/GNaturezaIndex.tsx | 1 - .../components/GTBBairro/GTBBairroIndex.tsx | 1 - .../components/GTBBairro/GTBBairroTable.tsx | 1 - .../GTBEstadoCivil/GTBEstadoCivilIndex.tsx | 1 - .../GTBRegimeBens/GTBRegimeBensForm.tsx | 1 - .../GTBRegimeComunhaoIndex.tsx | 1 - .../GTBTipoLogradouroIndex.tsx | 1 - .../TAtoParteTipo/TAtoParteTipoIndex.tsx | 1 - .../components/TCensec/TCensecIndex.tsx | 1 - .../TCensecNaturezaLitigioIndex.tsx | 1 - .../TCensecQualidade/TCensecQualidadeForm.tsx | 1 - .../TCensecQualidadeIndex.tsx | 1 - .../TCensecQualidadeAtoIndex.tsx | 1 - .../TCensecTipoAto/TCensecTipoAtoForm.tsx | 1 - .../TCensecTipoAto/TCensecTipoAtoIndex.tsx | 1 - .../TCensecTipoNaturezaForm.tsx | 1 - .../TCensecTipoNaturezaIndex.tsx | 1 - .../components/TImovel/TImovelForm.tsx | 2 - .../components/TImovel/TImovelIndex.tsx | 1 - .../TImovelUnidadeRuralIndex.tsx | 1 - .../TImovelUnidadeUrbanoIndex.tsx | 1 - .../TPessoaFisica/TPessoaFisicaColumns.tsx | 1 - .../TPessoaFisica/TPessoaFisicaForm.tsx | 1 - .../TPessoaJuridicaColumns.tsx | 1 - .../TPessoaRepresentanteIndex.tsx | 2 - .../TTBAndamentoServicoIndex.tsx | 1 - .../TTBReconhecimentoTipoSelect.tsx | 177 +++-- .../useTImovelUnidadeRuralDeleteHook.ts | 1 - .../useTImovelUnidadeRuralSaveHook.ts | 1 - .../useTImovelUnidadeUrbanoDeleteHook.ts | 1 - .../useTImovelUnidadeUrbanoSaveHook.ts | 1 - .../useTPessoaFisicaIndexHook.ts | 1 - .../TPessoaFisica/useTPessoaFisicaSaveHook.ts | 1 - .../useTPessoaJuridicaIndexHook.ts | 1 - .../useTPessoaJuridicaSaveHook.ts | 1 - src/shared/actions/api/buildQueryString.ts | 2 +- .../CategoriaServicoSelect.tsx | 152 ++-- .../confirmacao/ConfirmacaoCheckBox.tsx | 12 +- .../confirmacao/ConfirmacaoSelect.tsx | 6 +- src/shared/components/dataTable/DataTable.tsx | 1 - .../numericInputField/NumericInputField.tsx | 25 +- .../tipoPessoa/tipoPessoaSelect.tsx | 27 +- src/shared/enums/CategoriaServicoEnum.ts | 12 +- .../hooks/auth/useGUsuarioGetJWTHook.ts | 1 - 132 files changed, 1454 insertions(+), 1703 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index b754e85..be5690a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,74 +1,70 @@ -import js from "@eslint/js"; -import reactPlugin from "eslint-plugin-react"; -import reactHooks from "eslint-plugin-react-hooks"; -import jsxA11y from "eslint-plugin-jsx-a11y"; -import importPlugin from "eslint-plugin-import"; -import tseslint from "typescript-eslint"; +import js from '@eslint/js'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import importPlugin from 'eslint-plugin-import'; +import tseslint from 'typescript-eslint'; export default [ - js.configs.recommended, - ...tseslint.configs.recommended, - { - files: ["**/*.ts", "**/*.tsx"], - ignores: ["node_modules/**", ".next/**", "out/**", "dist/**"], - languageOptions: { - ecmaVersion: "latest", - sourceType: "module", - parser: tseslint.parser, - parserOptions: { - project: "./tsconfig.json", - }, - globals: { - React: true, - JSX: true, - }, - }, - plugins: { - react: reactPlugin, - "react-hooks": reactHooks, - "jsx-a11y": jsxA11y, - import: importPlugin, - }, - settings: { - react: { version: "detect" }, - "import/resolver": { - typescript: { - alwaysTryTypes: true, - project: "./tsconfig.json", - }, - node: { - extensions: [".js", ".jsx", ".ts", ".tsx"], - }, - }, - }, - rules: { - "react/react-in-jsx-scope": "off", - "react/jsx-uses-react": "off", - "react/jsx-uses-vars": "warn", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "import/order": [ - "error", - { - groups: [ - ["builtin", "external"], - ["internal"], - ["parent", "sibling", "index"], - ], - pathGroups: [ - { - pattern: "@/**", - group: "internal", - position: "after", - }, - ], - alphabetize: { order: "asc", caseInsensitive: true }, - "newlines-between": "always", - }, - ], - "import/no-duplicates": "error", - "import/newline-after-import": ["error", { count: 1 }], - "no-unused-vars": "warn", - }, + js.configs.recommended, + ...tseslint.configs.recommended, + { + files: ['**/*.ts', '**/*.tsx'], + ignores: ['node_modules/**', '.next/**', 'out/**', 'dist/**'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: tseslint.parser, + parserOptions: { + project: './tsconfig.json', + }, + globals: { + React: true, + JSX: true, + }, }, + plugins: { + react: reactPlugin, + 'react-hooks': reactHooks, + 'jsx-a11y': jsxA11y, + import: importPlugin, + }, + settings: { + react: { version: 'detect' }, + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + project: './tsconfig.json', + }, + node: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + }, + }, + }, + rules: { + 'react/react-in-jsx-scope': 'off', + 'react/jsx-uses-react': 'off', + 'react/jsx-uses-vars': 'warn', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + 'import/order': [ + 'error', + { + groups: [['builtin', 'external'], ['internal'], ['parent', 'sibling', 'index']], + pathGroups: [ + { + pattern: '@/**', + group: 'internal', + position: 'after', + }, + ], + alphabetize: { order: 'asc', caseInsensitive: true }, + 'newlines-between': 'always', + }, + ], + 'import/no-duplicates': 'error', + 'import/newline-after-import': ['error', { count: 1 }], + 'no-unused-vars': 'warn', + }, + }, ]; diff --git a/src/app/(protected)/(administrativo)/administrativo/andamentos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/andamentos/page.tsx index 3861396..bb34147 100644 --- a/src/app/(protected)/(administrativo)/administrativo/andamentos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/andamentos/page.tsx @@ -1,9 +1,5 @@ -import TTBAndamentoServicoIndex from "@/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex"; +import TTBAndamentoServicoIndex from '@/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex'; export default function TAtoParteTipo() { - - return ( - < TTBAndamentoServicoIndex /> - ); - -} \ No newline at end of file + return ; +} diff --git a/src/app/(protected)/(administrativo)/administrativo/atos/partes-tipos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/atos/partes-tipos/page.tsx index c00fb3e..79cb7cd 100644 --- a/src/app/(protected)/(administrativo)/administrativo/atos/partes-tipos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/atos/partes-tipos/page.tsx @@ -1,9 +1,5 @@ -import TAtoParteTipoIndex from "@/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex"; +import TAtoParteTipoIndex from '@/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex'; export default function TAtoParteTipo() { - - return ( - < TAtoParteTipoIndex /> - ); - -} \ No newline at end of file + return ; +} diff --git a/src/app/(protected)/(administrativo)/administrativo/bairros/page.tsx b/src/app/(protected)/(administrativo)/administrativo/bairros/page.tsx index d391288..e16ff6b 100644 --- a/src/app/(protected)/(administrativo)/administrativo/bairros/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/bairros/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBBairroIndex from "@/packages/administrativo/components/GTBBairro/GTBBairroIndex"; +import GTBBairroIndex from '@/packages/administrativo/components/GTBBairro/GTBBairroIndex'; export default function GCidadePage() { - return ( - < GTBBairroIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/censec/naturezas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/censec/naturezas/page.tsx index e77066d..db66051 100644 --- a/src/app/(protected)/(administrativo)/administrativo/censec/naturezas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/censec/naturezas/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecTipoNaturezaIndex from "@/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex"; +import TCensecTipoNaturezaIndex from '@/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex'; export default function TCensecTipoNaturezaPage() { - return ( - < TCensecTipoNaturezaIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/censec/qualidades/page.tsx b/src/app/(protected)/(administrativo)/administrativo/censec/qualidades/page.tsx index 94b9d04..391676d 100644 --- a/src/app/(protected)/(administrativo)/administrativo/censec/qualidades/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/censec/qualidades/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecQualidadeIndex from "@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex"; +import TCensecQualidadeIndex from '@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex'; export default function TCensecQualidadePage() { - return ( - < TCensecQualidadeIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/centrais/page.tsx b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/centrais/page.tsx index 8196519..a58a3c8 100644 --- a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/centrais/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/centrais/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecIndex from "@/packages/administrativo/components/TCensec/TCensecIndex"; +import TCensecIndex from '@/packages/administrativo/components/TCensec/TCensecIndex'; export default function GTBEstadoCivilPage() { - return ( - < TCensecIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/naturezas-litigios/page.tsx b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/naturezas-litigios/page.tsx index d195fb7..f9562b4 100644 --- a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/naturezas-litigios/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/naturezas-litigios/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecNaturezaLitigioIndex from "@/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex"; +import TCensecNaturezaLitigioIndex from '@/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex'; export default function GCidadePage() { - return ( - < TCensecNaturezaLitigioIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/qualidades/page.tsx b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/qualidades/page.tsx index c061f40..98f252f 100644 --- a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/qualidades/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/qualidades/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecQualidadeIndex from "@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex"; +import TCensecQualidadeIndex from '@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex'; export default function GTBEstadoCivilPage() { - return ( - < TCensecQualidadeIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/tipos-atos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/tipos-atos/page.tsx index 352b068..257110c 100644 --- a/src/app/(protected)/(administrativo)/administrativo/centrais/censec/tipos-atos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/centrais/censec/tipos-atos/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import TCensecTipoAtoIndex from "@/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex"; +import TCensecTipoAtoIndex from '@/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex'; export default function GTBEstadoCivilPage() { - return ( - < TCensecTipoAtoIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/cidades/page.tsx b/src/app/(protected)/(administrativo)/administrativo/cidades/page.tsx index 498d0ee..93f8b77 100644 --- a/src/app/(protected)/(administrativo)/administrativo/cidades/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/cidades/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GCidadeIndex from "@/packages/administrativo/components/GCidade/GCidadeIndex"; +import GCidadeIndex from '@/packages/administrativo/components/GCidade/GCidadeIndex'; export default function GCidadePage() { - return ( - < GCidadeIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx b/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx index 155e76a..b15671c 100644 --- a/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import TImovelIndex from "@/packages/administrativo/components/TImovel/TImovelIndex"; +import TImovelIndex from '@/packages/administrativo/components/TImovel/TImovelIndex'; export default function TImovelRuralPage() { return ( diff --git a/src/app/(protected)/(administrativo)/administrativo/imoveis/tipos-logradouros/page.tsx b/src/app/(protected)/(administrativo)/administrativo/imoveis/tipos-logradouros/page.tsx index 04f2049..1b9d834 100644 --- a/src/app/(protected)/(administrativo)/administrativo/imoveis/tipos-logradouros/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/imoveis/tipos-logradouros/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBTipoLogradouroIndex from "@/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex"; +import GTBTipoLogradouroIndex from '@/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex'; export default function GMedidaTipoPage() { - return ( - < GTBTipoLogradouroIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx index d2ed097..e356506 100644 --- a/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import TImovelIndex from "@/packages/administrativo/components/TImovel/TImovelIndex"; +import TImovelIndex from '@/packages/administrativo/components/TImovel/TImovelIndex'; export default function TImovelUrbanoPage() { return ( @@ -10,4 +10,4 @@ export default function TImovelUrbanoPage() { tipoClasse={1} /> ); -} \ No newline at end of file +} diff --git a/src/app/(protected)/(administrativo)/administrativo/medidas/tipos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/medidas/tipos/page.tsx index f2d2b5a..67a3023 100644 --- a/src/app/(protected)/(administrativo)/administrativo/medidas/tipos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/medidas/tipos/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GMedidaTipoIndex from "@/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex"; +import GMedidaTipoIndex from '@/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex'; export default function GMedidaTipoPage() { - return ( - < GMedidaTipoIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/minutas/naturezas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/minutas/naturezas/page.tsx index 557c8bf..9a1e352 100644 --- a/src/app/(protected)/(administrativo)/administrativo/minutas/naturezas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/minutas/naturezas/page.tsx @@ -1,11 +1,5 @@ -import GNaturezaIndex from "@/packages/administrativo/components/GNatureza/GNaturezaIndex"; +import GNaturezaIndex from '@/packages/administrativo/components/GNatureza/GNaturezaIndex'; export default function GNaturezaPage() { - - return ( - - ); - -} \ No newline at end of file + return ; +} diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/estados-civis/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/estados-civis/page.tsx index 737c164..634d7e1 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/estados-civis/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/estados-civis/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBEstadoCivilIndex from "@/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex"; +import GTBEstadoCivilIndex from '@/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex'; export default function GTBEstadoCivilPage() { - return ( - < GTBEstadoCivilIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx index e870828..2038d74 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx @@ -3,7 +3,5 @@ import TPessoaFisicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex'; export default function TPessoaFisica() { - return ( - - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx index d3a0eb3..a4292ef 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx @@ -3,8 +3,5 @@ import TPessoaJuridicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaIndex'; export default function TPessoaFisica() { - - return ( - - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/profissoes/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/profissoes/page.tsx index 8ac0f10..db1b077 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/profissoes/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/profissoes/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBProfissaoIndex from "@/packages/administrativo/components/GTBProfissao/GTBProfissaoIndex"; +import GTBProfissaoIndex from '@/packages/administrativo/components/GTBProfissao/GTBProfissaoIndex'; export default function GTBEstadoCivilPage() { - return ( - < GTBProfissaoIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-bens/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-bens/page.tsx index 52f0ffd..27a7d23 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-bens/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-bens/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBRegimeBensIndex from "@/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensIndex"; +import GTBRegimeBensIndex from '@/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensIndex'; export default function GTBRegimeBensPage() { - return ( - < GTBRegimeBensIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-comunhao/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-comunhao/page.tsx index b513d3d..6742deb 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-comunhao/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/regimes-comunhao/page.tsx @@ -1,9 +1,7 @@ 'use client'; -import GTBRegimeComunhaoIndex from "@/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex"; +import GTBRegimeComunhaoIndex from '@/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex'; export default function GTBRegimeBensPage() { - return ( - < GTBRegimeComunhaoIndex /> - ); + return ; } diff --git a/src/app/(protected)/(administrativo)/administrativo/reconhecimentos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/reconhecimentos/page.tsx index 58247dc..04e411e 100644 --- a/src/app/(protected)/(administrativo)/administrativo/reconhecimentos/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/reconhecimentos/page.tsx @@ -1,9 +1,5 @@ -import TTBReconhecimentoTipoIndex from "@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndex"; +import TTBReconhecimentoTipoIndex from '@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndex'; export default function TAtoParteTipo() { - - return ( - < TTBReconhecimentoTipoIndex /> - ); - -} \ No newline at end of file + return ; +} diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx index adb453a..5215447 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_servico_tipo)/servicos-tipo/page.tsx @@ -30,7 +30,9 @@ export default function TServicoTipoPage() { const { editTServicoTipo } = useTServicoTipoEditHook(); // Estados - const [selectedServicoTipo, setSelectedServicoTipo] = useState(null); + const [selectedServicoTipo, setSelectedServicoTipo] = useState( + null, + ); const [isFormOpen, setIsFormOpen] = useState(false); // Estado para saber qual item será deletado @@ -49,45 +51,45 @@ export default function TServicoTipoPage() { /** * Abre o formulário no modo de edição ou criação */ - const handleOpenForm = useCallback(async (data: TServicoTipoInterface | null) => { + const handleOpenForm = useCallback( + async (data: TServicoTipoInterface | null) => { + // Fecha o formulário antes de reabrir (garante reset limpo) + setIsFormOpen(false); - // Fecha o formulário antes de reabrir (garante reset limpo) - setIsFormOpen(false); - - // Se nenhum dado for passado, abre o formulário em modo de criação - if (!data) { - setSelectedServicoTipo(null); - setIsFormOpen(true); - return; - } - - // Define o item selecionado para edição - setSelectedServicoTipo(data); - - // Aguarda carregar/editar o registro (o hook espera o objeto TServicoTipoInterface) - await editTServicoTipo(data); - - // Atualiza a lista de dados - await fetchTServicoTipo(); - - setIsFormOpen(true); - - }, [editTServicoTipo, fetchTServicoTipo]); - - - /** - * Fecha o formulário e limpa o item selecionado - */ - const handleCloseForm = useCallback((_: null, __: boolean) => { + // Se nenhum dado for passado, abre o formulário em modo de criação + if (!data) { setSelectedServicoTipo(null); - setIsFormOpen(false); - }, []); + setIsFormOpen(true); + return; + } - /** - * Salva os dados do formulário - */ - const handleSave = useCallback(async (formData: TServicoTipoInterface) => { - + // Define o item selecionado para edição + setSelectedServicoTipo(data); + + // Aguarda carregar/editar o registro (o hook espera o objeto TServicoTipoInterface) + await editTServicoTipo(data); + + // Atualiza a lista de dados + await fetchTServicoTipo(); + + setIsFormOpen(true); + }, + [editTServicoTipo, fetchTServicoTipo], + ); + + /** + * Fecha o formulário e limpa o item selecionado + */ + const handleCloseForm = useCallback((_: null, __: boolean) => { + setSelectedServicoTipo(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: TServicoTipoInterface) => { // Aguarda salvar o registro await saveTServicoTipo(formData); @@ -95,13 +97,8 @@ export default function TServicoTipoPage() { fetchTServicoTipo(); }, [saveTServicoTipo, fetchTServicoTipo], - - - ); - - /** * Quando o usuário clica em "remover" na tabela */ @@ -116,7 +113,6 @@ export default function TServicoTipoPage() { [openConfirmDialog], ); - /** * Executa a exclusão de fato quando o usuário confirma */ @@ -137,8 +133,6 @@ export default function TServicoTipoPage() { handleCancel(); }, [itemToDelete, removeTServicoTipo, fetchTServicoTipo, handleCancel]); - - /** * Busca inicial dos dados */ @@ -168,7 +162,11 @@ export default function TServicoTipoPage() { {/* Tabela de Tipos de Serviço */} - + @@ -194,4 +192,4 @@ export default function TServicoTipoPage() { />
); -} \ No newline at end of file +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx index fd274ee..37ac514 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoForm.tsx @@ -1,10 +1,10 @@ 'use client'; -import React from "react"; +import React from 'react'; import z from 'zod'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import { useState } from 'react'; +import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -41,25 +41,24 @@ import { TableHead, TableHeader, TableRow, -} from "@/components/ui/table" +} from '@/components/ui/table'; import { TServicoTipoSchema, TServicoTipoFormValues } from '../../_schemas/TServicoTipoSchema'; import { useEffect } from 'react'; import GMarcacaoTipoSelect from '@/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect'; import GEmolumentoSelect from '@/packages/administrativo/components/GEmolumento/GEmolumentoSelect'; -import { useGEmolumentoItemReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook"; -import { GEmolumentoItemReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface"; -import CategoriaServicoSelect from "@/shared/components/categoriaServicoSelect/CategoriaServicoSelect"; -import CCaixaServicoSelect from "@/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect"; -import { TServicoTipoSaveData } from "../../_data/TServicoTipo/TServicoTipoSaveData"; -import TTBReconhecimentoTipoSelect from "@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect"; -import { ConfirmacaoCheckBox } from "@/shared/components/confirmacao/ConfirmacaoCheckBox"; -import ConfirmacaoSelect from "@/shared/components/confirmacao/ConfirmacaoSelect"; -import { TipoPessoaSelect } from "@/shared/components/tipoPessoa/tipoPessoaSelect"; -import { useTServicoEtiquetaReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook"; -import { useTServicoEtiquetaSaveHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook"; -import { useTServicoEtiquetaRemoveHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook"; - +import { useGEmolumentoItemReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook'; +import { GEmolumentoItemReadInterface } from '@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface'; +import CategoriaServicoSelect from '@/shared/components/categoriaServicoSelect/CategoriaServicoSelect'; +import CCaixaServicoSelect from '@/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect'; +import { TServicoTipoSaveData } from '../../_data/TServicoTipo/TServicoTipoSaveData'; +import TTBReconhecimentoTipoSelect from '@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect'; +import { ConfirmacaoCheckBox } from '@/shared/components/confirmacao/ConfirmacaoCheckBox'; +import ConfirmacaoSelect from '@/shared/components/confirmacao/ConfirmacaoSelect'; +import { TipoPessoaSelect } from '@/shared/components/tipoPessoa/tipoPessoaSelect'; +import { useTServicoEtiquetaReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook'; +import { useTServicoEtiquetaSaveHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook'; +import { useTServicoEtiquetaRemoveHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook'; // Propriedades esperadas pelo componente interface Props { @@ -71,226 +70,202 @@ interface Props { // Componente principal do formulário export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Props) { + // Inicializa o react-hook-form com validação via Zod + const form = useForm({ + resolver: zodResolver(TServicoTipoSchema), + defaultValues: { + servico_tipo_id: 0, + emolumento_id: 0, + emolumento_obrigatorio: 0, + descricao: '', + maximo_pessoa: 0, + tipo_item: '', + frenteverso: 'N', + averbacao: 'N', + transferencia_veiculo: 'N', + usar_a4: 'N', + etiqueta_unica: 'N', + situacao: 'A', + selar: 'N', + valor_emolumento: 0, + valor_taxa_judiciaria: 0, + fundesp_valor: 0, + valor_total: 0, + tipo_pessoa: 'F', // ou "J" + } as unknown as TServicoTipoFormValues, + }); - // Inicializa o react-hook-form com validação via Zod - const form = useForm({ - resolver: zodResolver(TServicoTipoSchema), - defaultValues: { - servico_tipo_id: 0, - emolumento_id: 0, - emolumento_obrigatorio: 0, - descricao: "", - maximo_pessoa: 0, - tipo_item: "", - frenteverso: "N", - averbacao: "N", - transferencia_veiculo: "N", - usar_a4: "N", - etiqueta_unica: "N", - situacao: "A", - selar: "N", - valor_emolumento: 0, - valor_taxa_judiciaria: 0, - fundesp_valor: 0, - valor_total: 0, - tipo_pessoa: "F", // ou "J" - } as unknown as TServicoTipoFormValues, - }); + // Carrega o ID caso esteja informado no form + const servico_tipo_id = form.getValues('servico_tipo_id') || 0; + // Hook responsável por buscar emolumentos no backend + const { tServicoEtiqueta, fetchTServicoEtiqueta } = useTServicoEtiquetaReadHook(); - // Carrega o ID caso esteja informado no form - const servico_tipo_id = form.getValues('servico_tipo_id') || 0; + // Hook responsável em salvar o a etiqueta selecionada + const { tServicoEtiquetaSave, fetchTServicoEtiquetaSave } = useTServicoEtiquetaSaveHook(); - // Hook responsável por buscar emolumentos no backend - const { tServicoEtiqueta, fetchTServicoEtiqueta } = useTServicoEtiquetaReadHook(); + // Hook responsável em excluir a etiqueta selecionada + const { fetchTServicoEtiquetaRemove } = useTServicoEtiquetaRemoveHook(); - // Hook responsável em salvar o a etiqueta selecionada - const { tServicoEtiquetaSave, fetchTServicoEtiquetaSave } = useTServicoEtiquetaSaveHook(); + // Estado para gerenciar os itens da tabela de etiquetas/carimbos + const [itensTabela, setItensTabela] = useState< + { servico_etiqueta_id: string | number; descricao: string }[] + >([]); - // Hook responsável em excluir a etiqueta selecionada - const { fetchTServicoEtiquetaRemove } = useTServicoEtiquetaRemoveHook(); - - // Estado para gerenciar os itens da tabela de etiquetas/carimbos - const [itensTabela, setItensTabela] = useState<{ servico_etiqueta_id: string | number; descricao: string }[]>([]); - - - // Carrega os dados de emolumentos apenas uma vez ao montar o componente - React.useEffect(() => { - - // Função para consumir o endpoint da api - const loadData = async () => { - - // Verifica se o ID do serviço tipo foi informado - if(servico_tipo_id > 0){ - - // Consumo o endpoint da api - await fetchTServicoEtiqueta({servico_tipo_id}); - } - }; - - // Chama a função para consumir o endpoint da api - loadData(); - - }, [servico_tipo_id]); - - - // Atualiza itensTabela sempre que tServicoEtiqueta for carregado - React.useEffect(() => { - - // Verifica se a consulta retornou os dados como objeto - if (Array.isArray(tServicoEtiqueta) && tServicoEtiqueta.length > 0) { - - // Lista os itens - const mapped = tServicoEtiqueta.map((item) => ({ - servico_etiqueta_id: Number(item.servico_etiqueta_id ?? 0), - descricao: String(item.descricao ?? 'Sem descrição'), - })); - - setItensTabela(mapped); - - } else { - setItensTabela([]); + // Carrega os dados de emolumentos apenas uma vez ao montar o componente + React.useEffect(() => { + // Função para consumir o endpoint da api + const loadData = async () => { + // Verifica se o ID do serviço tipo foi informado + if (servico_tipo_id > 0) { + // Consumo o endpoint da api + await fetchTServicoEtiqueta({ servico_tipo_id }); } - }, [tServicoEtiqueta]); + }; + // Chama a função para consumir o endpoint da api + loadData(); + }, [servico_tipo_id]); - // Função para adicionar um novo item à tabela Etiquetas/Carimbos - const handleAddEtiquetaCarimbo = async () => { + // Atualiza itensTabela sempre que tServicoEtiqueta for carregado + React.useEffect(() => { + // Verifica se a consulta retornou os dados como objeto + if (Array.isArray(tServicoEtiqueta) && tServicoEtiqueta.length > 0) { + // Lista os itens + const mapped = tServicoEtiqueta.map((item) => ({ + servico_etiqueta_id: Number(item.servico_etiqueta_id ?? 0), + descricao: String(item.descricao ?? 'Sem descrição'), + })); - // Captura o valor selecionado do formulário - const valorSelecionado = form.getValues("etiquetas_carimbos"); + setItensTabela(mapped); + } else { + setItensTabela([]); + } + }, [tServicoEtiqueta]); - // Se não houver valor selecionado, não faz nada - if (!valorSelecionado) return; + // Função para adicionar um novo item à tabela Etiquetas/Carimbos + const handleAddEtiquetaCarimbo = async () => { + // Captura o valor selecionado do formulário + const valorSelecionado = form.getValues('etiquetas_carimbos'); - // Verifica se o item já se encontra na tabela - const alreadyExists = itensTabela.some( - (p) => String(p.descricao).trim() === String(valorSelecionado.value).trim() + // Se não houver valor selecionado, não faz nada + if (!valorSelecionado) return; + + // Verifica se o item já se encontra na tabela + const alreadyExists = itensTabela.some( + (p) => String(p.descricao).trim() === String(valorSelecionado.value).trim(), + ); + + // Caso o item já esteja na tabela, para o procedimento + if (alreadyExists) { + return; + } + + // --- Envio opcional para API --- + try { + // Verifica se o ID do serviço tipo foi informado + if (servico_tipo_id > 0) { + // Monta o objeto do item selecionado + const data = { + etiqueta_modelo_id: valorSelecionado.key, + servico_tipo_id: servico_tipo_id, + }; + + // Consumo o endpoint da api + const response = await fetchTServicoEtiquetaSave(data); + + // Verifica se tServicoEtiquetaSave é um objeto válido (não null e não array) + if (response && typeof response === 'object' && !Array.isArray(response)) { + // Monta o objeto com um único item para a tabela + const item = { + servico_etiqueta_id: Number(response.servico_etiqueta_id) ?? 0, + descricao: String(valorSelecionado.value) ?? 'Sem descrição', + }; + + // Adiciona o item na tabela + setItensTabela((prev) => { + const idAtual = String(response.servico_etiqueta_id ?? ''); + const exists = prev.some((p) => String(p.servico_etiqueta_id ?? '') === idAtual); + return exists ? prev : [...prev, item]; + }); + } + } + + // Se ocorrer erros, informo + } catch (error) { + console.log('Erro ao enviar o serviço para a API: ' + error); + } + }; + + // Função para remover um item da tabela + const handleRemoveItem = async (servico_etiqueta_id: number) => { + try { + // Verifica se o ID da etiqueta tipo foi informado + if (servico_etiqueta_id > 0) { + // Monta o objeto do item selecionado + const data = { + servico_etiqueta_id: servico_etiqueta_id, + }; + + // Consumo o endpoint da api + await fetchTServicoEtiquetaRemove(data); + } + + // Atualiza a tabela no form + setItensTabela((prev) => + prev.filter((p) => Number(p.servico_etiqueta_id) !== servico_etiqueta_id), ); - // Caso o item já esteja na tabela, para o procedimento - if (alreadyExists) { - return; - } - - // --- Envio opcional para API --- - try { - - // Verifica se o ID do serviço tipo foi informado - if(servico_tipo_id > 0){ - - // Monta o objeto do item selecionado - const data = { - etiqueta_modelo_id: valorSelecionado.key, - servico_tipo_id: servico_tipo_id, - }; - - // Consumo o endpoint da api - const response = await fetchTServicoEtiquetaSave(data); - - // Verifica se tServicoEtiquetaSave é um objeto válido (não null e não array) - if (response && typeof response === 'object' && !Array.isArray(response)) { - - // Monta o objeto com um único item para a tabela - const item = { - servico_etiqueta_id: Number(response.servico_etiqueta_id) ?? 0, - descricao: String(valorSelecionado.value) ?? "Sem descrição", - }; - - // Adiciona o item na tabela - setItensTabela((prev) => { - const idAtual = String(response.servico_etiqueta_id ?? ''); - const exists = prev.some((p) => String(p.servico_etiqueta_id ?? '') === idAtual); - return exists ? prev : [...prev, item]; - }); - - } - - } - // Se ocorrer erros, informo - } catch (error) { + } catch (error) { + console.log('Erro ao enviar o serviço para a API: ' + error); + } + }; - console.log("Erro ao enviar o serviço para a API: " + error) + // Parâmetros para o hook de leitura de emolumento_item + // Inicializa com valores padrão (0) para evitar uso de propriedades não declaradas. + const gEmolumentoItemReadParams: GEmolumentoItemReadInterface = { emolumento_id: 0, valor: 0 }; + + // Estados locais + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + + // Hook que realiza a leitura do emolumento_item + const { gGEmolumentoItem, fetchGEmolumentoItem } = useGEmolumentoItemReadHook(); + + // Busca os dados ao montar o componente (somente se houver ID válido) + React.useEffect(() => { + const loadData = async () => { + // Validação: só executa se houver emolumento_id informado e válido + if ( + !gEmolumentoItemReadParams?.emolumento_id || // se não existir o campo + isNaN(Number(gEmolumentoItemReadParams.emolumento_id)) || // se não for número + Number(gEmolumentoItemReadParams.emolumento_id) <= 0 // se for zero ou negativo + ) { + return; // encerra sem executar a busca + } + + // Executa a busca apenas se ainda não houver dados carregados + if (!gGEmolumentoItem.length) { + setIsLoading(true); + await fetchGEmolumentoItem(gEmolumentoItemReadParams); + setIsLoading(false); } }; - - // Função para remover um item da tabela - const handleRemoveItem = async (servico_etiqueta_id: number) => { - - try{ - - // Verifica se o ID da etiqueta tipo foi informado - if(servico_etiqueta_id > 0){ - - // Monta o objeto do item selecionado - const data = { - servico_etiqueta_id: servico_etiqueta_id, - }; - - // Consumo o endpoint da api - await fetchTServicoEtiquetaRemove(data); - - } - - // Atualiza a tabela no form - setItensTabela((prev) => prev.filter((p) => Number(p.servico_etiqueta_id) !== servico_etiqueta_id)); - - // Se ocorrer erros, informo - } catch (error) { - - console.log("Erro ao enviar o serviço para a API: " + error) - } - }; - - - // Parâmetros para o hook de leitura de emolumento_item - // Inicializa com valores padrão (0) para evitar uso de propriedades não declaradas. - const gEmolumentoItemReadParams: GEmolumentoItemReadInterface = { emolumento_id: 0, valor: 0 }; - - // Estados locais - const [open, setOpen] = React.useState(false); - const [isLoading, setIsLoading] = React.useState(false); - - // Hook que realiza a leitura do emolumento_item - const { gGEmolumentoItem, fetchGEmolumentoItem } = useGEmolumentoItemReadHook(); - - // Busca os dados ao montar o componente (somente se houver ID válido) - React.useEffect(() => { - const loadData = async () => { - // Validação: só executa se houver emolumento_id informado e válido - if ( - !gEmolumentoItemReadParams?.emolumento_id || // se não existir o campo - isNaN(Number(gEmolumentoItemReadParams.emolumento_id)) || // se não for número - Number(gEmolumentoItemReadParams.emolumento_id) <= 0 // se for zero ou negativo - ) { - return; // encerra sem executar a busca - } - - // Executa a busca apenas se ainda não houver dados carregados - if (!gGEmolumentoItem.length) { - setIsLoading(true); - await fetchGEmolumentoItem(gEmolumentoItemReadParams); - setIsLoading(false); - } - }; - - loadData(); - }, [gEmolumentoItemReadParams.emolumento_id]); - + loadData(); + }, [gEmolumentoItemReadParams.emolumento_id]); // Captura o ID do serviço para uso local - const servicoTipoId = Number(form.watch("servico_tipo_id") || data?.servico_tipo_id || 0); + const servicoTipoId = Number(form.watch('servico_tipo_id') || data?.servico_tipo_id || 0); // Função chamada ao clicar em "Salvar" const handleSave = async (formData: TServicoTipoFormValues) => { - try { - // Se o form não trouxe o ID, tenta puxar de `data` - const servico_tipo_id = formData.servico_tipo_id || data?.servico_tipo_id || form.getValues('servico_tipo_id') || 0; - + const servico_tipo_id = + formData.servico_tipo_id || data?.servico_tipo_id || form.getValues('servico_tipo_id') || 0; + // Atualiza o valor dentro do formData formData.servico_tipo_id = Number(servico_tipo_id); @@ -300,30 +275,24 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop // Intercepta e trata o valor de emolumento_obrigatorio const emolumentoObrigatorio = Number(formData.emolumento_obrigatorio ?? 0); - formData.emolumento_obrigatorio = - emolumentoObrigatorio === 0 ? null : emolumentoObrigatorio; - + formData.emolumento_obrigatorio = emolumentoObrigatorio === 0 ? null : emolumentoObrigatorio; // Detecta automaticamente se é edição const isEditing = !!formData.servico_tipo_id && Number(formData.servico_tipo_id) > 0; - // Envia os dados para o módulo com o método correto const response = await TServicoTipoSaveData({ ...formData, metodo: isEditing ? 'PUT' : 'POST', // 💡 Definição explícita do método }); - // Atualiza o formulário apenas se o retorno for válido if (response?.data?.servico_tipo_id) { - const novoId = response.data.servico_tipo_id; - form.setValue('servico_tipo_id', novoId); // mantém o ID atualizado - - - // Merge dos dados para preservar valores locais - form.reset({ ...form.getValues(), ...response.data }); + const novoId = response.data.servico_tipo_id; + form.setValue('servico_tipo_id', novoId); // mantém o ID atualizado + // Merge dos dados para preservar valores locais + form.reset({ ...form.getValues(), ...response.data }); console.log(`Serviço ${isEditing ? 'atualizado' : 'criado'} com sucesso (ID: ${novoId})`); } else { @@ -332,42 +301,38 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop } catch (error) { console.log('Erro ao salvar:', error); } - }; - - - // Carrega os dados apenas quando o modal + }; + + // Carrega os dados apenas quando o modal // abrir e houver um registro para editar useEffect(() => { - // Remove as etiquetas selecionadas setItensTabela([]); - if (isOpen && data && Number(data.servico_tipo_id ?? 0) > 0) { + if (isOpen && data && Number(data.servico_tipo_id ?? 0) > 0) { /** Carrega os dados no formulário */ form.reset(data); // edição - } else if (isOpen && !data) { - /** Reseta os campos do formulário */ form.reset({ servico_tipo_id: 0, emolumento_id: 0, - emolumento_obrigatorio: 0, - descricao: "", + emolumento_obrigatorio: 0, + descricao: '', maximo_pessoa: 0, - tipo_item: "", - frenteverso: "N", - averbacao: "N", - transferencia_veiculo: "N", - usar_a4: "N", - etiqueta_unica: "N", - situacao: "A", - selar: "N", + tipo_item: '', + frenteverso: 'N', + averbacao: 'N', + transferencia_veiculo: 'N', + usar_a4: 'N', + etiqueta_unica: 'N', + situacao: 'A', + selar: 'N', valor_emolumento: 0, valor_taxa_judiciaria: 0, fundesp_valor: 0, valor_total: 0, - tipo_pessoa: "F", + tipo_pessoa: 'F', }); } }, [isOpen, data]); @@ -377,12 +342,12 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop } return ( - { - if (!open) onClose(null, false); - }} - > + { + if (!open) onClose(null, false); + }} + > {/* Cabeçalho do diálogo */} @@ -393,25 +358,23 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Estrutura do formulário */} - - {/* Abas principais */} - + Dados do Tipo de Serviço - Configurações - @@ -422,9 +385,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Aba: Dados do Tipo de Serviço */} - -
- +
{/* Campo: Descrição */}
Descrição do Tipo - + @@ -450,9 +415,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Categoria - + )} @@ -467,9 +430,9 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Serviço Padrão - - - + + + )} @@ -484,10 +447,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Serviço Caixa - + )} @@ -514,11 +474,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Campo: Usar A4 (Checkbox) */}
- +
{/* Campo: Etiqueta Única (Texto normal) */} @@ -530,33 +486,33 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop />
- {/* Campo: Frente/Verso (Texto normal) */}
{ - const categoriaSelecionada = form.watch("tipo_item"); - const isEnabled = categoriaSelecionada === "A"; + const categoriaSelecionada = form.watch('tipo_item'); + const isEnabled = categoriaSelecionada === 'A'; return ( - + field.onChange(checked ? "S" : "N")} // grava "S" ou "N" + checked={field.value === 'S'} // marca quando o valor for "S" + onCheckedChange={(checked) => field.onChange(checked ? 'S' : 'N')} // grava "S" ou "N" disabled={!isEnabled} /> - Frente/Verso + + Frente/Verso + ); }} /> -
- +
{/* Campo: Etiqueta Única (Texto normal) */}
@@ -565,35 +521,31 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop name="situacao" render={({ field }) => { // Considera "A" ou vazio como marcado - const isChecked = field.value === "A" || !field.value; + const isChecked = field.value === 'A' || !field.value; return ( - + { - field.onChange(checked ? "A" : "I"); // grava "A" ou "I" no form + field.onChange(checked ? 'A' : 'I'); // grava "A" ou "I" no form }} /> - Ativo + Ativo ); }} /> -
- - +
{/* Outras abas */} - -
- +
{/* Campo: Serviço tipo (Select) */}
( Tipo - + )} /> -
- +
{/* Campo: Pessoa (Select) */}
-
- +
{/* Campo: Quantidade de pessoas */}
@@ -632,15 +580,12 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop min={1} max={100} placeholder="Digite a quantidade de pessoas" - className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm - ring-offset-background placeholder:text-muted-foreground - focus-visible:outline-none focus-visible:ring-2 - focus-visible:ring-ring focus-visible:ring-offset-2" + className="border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none" {...field} - value={field.value ?? ""} // Garante que nunca seja undefined + value={field.value ?? ''} // Garante que nunca seja undefined onChange={(e) => { // Converte para número se houver valor - const value = e.target.value === "" ? "" : Number(e.target.value); + const value = e.target.value === '' ? '' : Number(e.target.value); field.onChange(value); }} /> @@ -661,23 +606,24 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Biometria - - Sim - Não + + Sim + + + Não + )} /> -
+
{/* Campo: CPF/CNPJ (Select) */}
@@ -687,24 +633,24 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( CPF/CNPJ - - Sim - Não + + Sim + + + Não + )} /> -
- +
{/* Campo: autorização (Select) */}
@@ -714,24 +660,24 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Autorização - - Sim - Não + + Sim + + + Não + )} /> -
- +
{/* Campo: abonador (Select) */}
@@ -741,24 +687,24 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Abonador - - Sim - Não + + Sim + + + Não + )} /> -
- +
{/* Campo: etiquetas/carimbos (Select) */}
@@ -778,8 +724,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop )} /> -
- +
{/* Campo: etiquetas/carimbos botão adicionar */}
@@ -794,8 +739,7 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop Adicionar -
- +
{/* Campo: etiquetas/carimbos (Select) */}
@@ -836,16 +780,11 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop )}
-
- - +
- - -
- +
{/* Campo: Biometria (Select) */}
( Selar - - Sim - Não + + Sim + + + Não + )} /> -
- +
{/* Campo: emolumentos (Select) */}
- ( - - Emolumento + ( + + Emolumento - - - - )} - /> - -
+ /> + + + )} + /> +
{/* Campo: emolumentos adicional (Select) */}
@@ -944,17 +884,12 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop render={({ field }) => ( Emolumento Adicional (Mesma etiqueta) - + )} /> -
- + {/* Campo: Quantidade de pessoas */}
@@ -965,9 +900,11 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop Emolumento R$ - @@ -985,16 +922,18 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop Taxa Judiciária R$ - )} /> -
+ {/* Campo: Quantidade de pessoas */}
@@ -1005,16 +944,18 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop Fundesp R$ - )} /> -
+ {/* Campo: Quantidade de pessoas */}
@@ -1031,11 +972,8 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop )} /> -
- - + -
{/* Campo oculto: ID */} @@ -1045,19 +983,18 @@ export default function TServicoTipoForm({ isOpen, data, onClose, onSave }: Prop {/* Rodapé do diálogo */} - - + diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx index 722e255..d0c6e0a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_servico_tipo/TServicoTipoTable.tsx @@ -22,7 +22,8 @@ import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react'; import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Import alterado // Tipagem das props do componente da tabela -interface TServicoTipoTableProps { // Nome da interface alterado +interface TServicoTipoTableProps { + // Nome da interface alterado data: TServicoTipoInterface[]; // lista de tipos de serviço onEdit: (item: TServicoTipoInterface, isEditingFormStatus: boolean) => void; // callback para edição onDelete: (item: TServicoTipoInterface, isEditingFormStatus: boolean) => void; // callback para exclusão @@ -48,12 +49,12 @@ export default function TServicoTipoTable({ data, onEdit, onDelete }: TServicoTi {data.map((item) => ( // Assumindo que o ID do Tipo de Serviço é 'servico_tipo_id' - + {/* ID do Tipo de Serviço */} {item.servico_tipo_id} {/* Nome/descrição do Tipo de Serviço (descricao) */} - {item.descricao} + {item.descricao} {/* As células de IBGE e UF foram removidas */} {/* Ações (menu dropdown) */} @@ -97,4 +98,4 @@ export default function TServicoTipoTable({ data, onEdit, onDelete }: TServicoTi ); -} \ No newline at end of file +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts index 9d7fb3e..7988274 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaReadData.ts @@ -5,22 +5,22 @@ import API from '@/shared/services/api/Api'; // import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; // // Importa a interface tipada que define a estrutura dos dados do tipo de serviço -import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; // Importa função que encapsula chamadas assíncronas e trata erros automaticamente import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de localizar um tipo de serviço -async function executeTServicoEtiquetaService(data: TServicoEtiquetaInterface) { +async function executeTServicoEtiquetaService(data: TServicoEtiquetaInterface) { // Instancia o cliente da API para enviar a requisição const api = new API(); // // Executa a requisição para a API com o método apropriado e envia o ID no endpoint return await api.send({ method: Methods.GET, // Verbo GET para consulta - endpoint: `administrativo/t_servico_etiqueta/servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados + endpoint: `administrativo/t_servico_etiqueta/servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados }); } // Exporta a função de Readr tipo de serviço já encapsulada com tratamento de erros -export const TServicoEtiquetaReadData = withClientErrorHandler(executeTServicoEtiquetaService); // Nome da exportação alterado \ No newline at end of file +export const TServicoEtiquetaReadData = withClientErrorHandler(executeTServicoEtiquetaService); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts index 1c6bdcf..bbbc1f7 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaRemoveData.ts @@ -11,7 +11,8 @@ import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInt import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de remover um tipo de serviço -async function executeTServicoEtiquetaRemoveData(data: TServicoEtiquetaInterface) { // Nome da função alterado +async function executeTServicoEtiquetaRemoveData(data: TServicoEtiquetaInterface) { + // Nome da função alterado // Instancia o cliente da API para enviar a requisição const api = new API(); // @@ -19,9 +20,9 @@ async function executeTServicoEtiquetaRemoveData(data: TServicoEtiquetaInterface // Executa a requisição para a API com o método apropriado e envia o ID no endpoint return await api.send({ method: Methods.DELETE, // Verbo DELETE para exclusão - endpoint: `administrativo/t_servico_etiqueta/${data.servico_etiqueta_id}`, // Endpoint e ID alterados + endpoint: `administrativo/t_servico_etiqueta/${data.servico_etiqueta_id}`, // Endpoint e ID alterados }); } // Exporta a função de remover tipo de serviço já encapsulada com tratamento de erros -export const TServicoEtiquetaRemoveData = withClientErrorHandler(executeTServicoEtiquetaRemoveData); // Nome da exportação alterado \ No newline at end of file +export const TServicoEtiquetaRemoveData = withClientErrorHandler(executeTServicoEtiquetaRemoveData); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts index b56e5fb..0c32e70 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoEtiqueta/TServicoEtiquetaSaveData.ts @@ -14,10 +14,8 @@ import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInt import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço -async function executeTServicoEtiquetaSaveData(data: TServicoEtiquetaFormValues) { - - try{ - +async function executeTServicoEtiquetaSaveData(data: TServicoEtiquetaFormValues) { + try { // Instancia o cliente da API para enviar a requisição const api = new API(); // @@ -27,13 +25,11 @@ async function executeTServicoEtiquetaSaveData(data: TServicoEtiquetaFormValues) endpoint: `administrativo/t_servico_etiqueta`, // Endpoint e ID alterados body: data, // payload enviado para a API }); - } catch (error) { - console.error('Erro no TServicoEtiquetaSaveData:', error); throw error; // propaga erro para o form } } // Exporta a função de salvar tipo de serviço já encapsulada com tratamento de erros -export const TServicoEtiquetaSaveData = withClientErrorHandler(executeTServicoEtiquetaSaveData); // Nome da exportação alterado \ No newline at end of file +export const TServicoEtiquetaSaveData = withClientErrorHandler(executeTServicoEtiquetaSaveData); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts index a94106d..ab2d56d 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoEditData.ts @@ -11,16 +11,16 @@ import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de localizar um tipo de serviço -async function executeTServicoTipoEditService(data: TServicoTipoInterface) { +async function executeTServicoTipoEditService(data: TServicoTipoInterface) { // Instancia o cliente da API para enviar a requisição const api = new API(); // // Executa a requisição para a API com o método apropriado e envia o ID no endpoint return await api.send({ method: Methods.GET, // Verbo GET para consulta - endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados }); } // Exporta a função de Readr tipo de serviço já encapsulada com tratamento de erros -export const TServicoTipoEditData = withClientErrorHandler(executeTServicoTipoEditService); // Nome da exportação alterado \ No newline at end of file +export const TServicoTipoEditData = withClientErrorHandler(executeTServicoTipoEditService); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts index 36533f8..7003e6e 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoIndexData.ts @@ -9,16 +9,15 @@ import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/ // Função assíncrona que implementa a lógica de buscar todos os tipos de serviço (GET) async function executeTServicoTipoIndexData() { - // Instancia o cliente da API para enviar a requisição const api = new API(); // // Executa a requisição para a API com o método apropriado e o endpoint da tabela t_servico_tipo return await api.send({ method: Methods.GET, // GET listar todos os itens - endpoint: `administrativo/t_servico_tipo/` // Endpoint atualizado + endpoint: `administrativo/t_servico_tipo/`, // Endpoint atualizado }); } // Exporta a função de listar tipos de serviço já encapsulada com tratamento de erros -export const TServicoTipoIndexData = withClientErrorHandler(executeTServicoTipoIndexData); \ No newline at end of file +export const TServicoTipoIndexData = withClientErrorHandler(executeTServicoTipoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts index 0534182..aa5c6c3 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoRemoveData.ts @@ -11,7 +11,8 @@ import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de remover um tipo de serviço -async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { // Nome da função alterado +async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { + // Nome da função alterado // Instancia o cliente da API para enviar a requisição const api = new API(); // @@ -19,9 +20,9 @@ async function executeTServicoTipoRemoveData(data: TServicoTipoInterface) { // N // Executa a requisição para a API com o método apropriado e envia o ID no endpoint return await api.send({ method: Methods.DELETE, // Verbo DELETE para exclusão - endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados + endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id}`, // Endpoint e ID alterados }); } // Exporta a função de remover tipo de serviço já encapsulada com tratamento de erros -export const TServicoTipoRemoveData = withClientErrorHandler(executeTServicoTipoRemoveData); // Nome da exportação alterado \ No newline at end of file +export const TServicoTipoRemoveData = withClientErrorHandler(executeTServicoTipoRemoveData); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts index 18308b7..53f6d83 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TServicoTipo/TServicoTipoSaveData.ts @@ -14,17 +14,17 @@ import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; // // Função assíncrona que implementa a lógica de salvar (criar/atualizar) um tipo de serviço -async function executeTServicoTipoSaveData(data: TServicoTipoFormValues & { metodo?: 'POST' | 'PUT' }) { - +async function executeTServicoTipoSaveData( + data: TServicoTipoFormValues & { metodo?: 'POST' | 'PUT' }, +) { // Verifica se existe ID do tipo de serviço para decidir se é atualização (PUT) ou criação (POST) const isEditing = !!data.servico_tipo_id && Number(data.servico_tipo_id) > 0; // Define método: prioridade para valor passado manualmente (metodo) - const method = data.metodo ?? (isEditing ? 'PUT' : 'POST'); + const method = data.metodo ?? (isEditing ? 'PUT' : 'POST'); - try{ - - console.log(data) + try { + console.log(data); // Instancia o cliente da API para enviar a requisição const api = new API(); // @@ -35,13 +35,11 @@ async function executeTServicoTipoSaveData(data: TServicoTipoFormValues & { meto endpoint: `administrativo/t_servico_tipo/${data.servico_tipo_id || ''}`, // Endpoint e ID alterados body: data, // payload enviado para a API }); - } catch (error) { - console.error('Erro no TServicoTipoSaveData:', error); throw error; // propaga erro para o form } } // Exporta a função de salvar tipo de serviço já encapsulada com tratamento de erros -export const TServicoTipoSaveData = withClientErrorHandler(executeTServicoTipoSaveData); // Nome da exportação alterado \ No newline at end of file +export const TServicoTipoSaveData = withClientErrorHandler(executeTServicoTipoSaveData); // Nome da exportação alterado diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts index 7e37517..659c993 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndexData.ts @@ -24,4 +24,6 @@ async function executeTTBReconhecimentoTipoIndexData(data: TTBReconhecimentoTipo } // Exporta a função encapsulada pelo handler de erro, garantindo tratamento uniforme em caso de falhas -export const TTBReconhecimentoTipoIndexData = withClientErrorHandler(executeTTBReconhecimentoTipoIndexData); +export const TTBReconhecimentoTipoIndexData = withClientErrorHandler( + executeTTBReconhecimentoTipoIndexData, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts index 1a4b34d..5288571 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook.ts @@ -11,7 +11,6 @@ import { CCaixaServicoReadInterface } from '../../_interfaces/CCaixaServicoReadI import { CCaixaServicoIndexService } from '../../_services/c_caixa_servico/CCaixaServicoIndexService'; import { CCaixaServicoInterface } from '../../_interfaces/CCaixaServicoInterface'; - // Hook personalizado para leitura (consulta) dos tipos de marcação export const useCCaixaServicoReadHook = () => { // Obtém a função que atualiza a resposta global do sistema @@ -33,5 +32,8 @@ export const useCCaixaServicoReadHook = () => { }; // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias - return useMemo(() => ({ cCaixaServico, fetchCCaixaServico }), [cCaixaServico, fetchCCaixaServico]); + return useMemo( + () => ({ cCaixaServico, fetchCCaixaServico }), + [cCaixaServico, fetchCCaixaServico], + ); }; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts index d4bd9df..b18cc96 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook.ts @@ -11,7 +11,6 @@ import { GEmolumentoReadInterface } from '../../_interfaces/GEmolumentoReadInter import { GEmolumentoIndexService } from '../../_services/g_emolumento/GEmolumentoIndexService'; import { GEmolumentoInterface } from '../../_interfaces/GEmolumentoInterface'; - // Hook personalizado para leitura (consulta) dos emolumentos export const useGEmolumentoReadHook = () => { // Obtém a função que atualiza a resposta global do sistema diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts index a6ef557..000908a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento_item/useGEmolumentoItemReadHook.ts @@ -11,7 +11,6 @@ import { GEmolumentoItemReadInterface } from '../../_interfaces/GEmolumentoItemR import { GEmolumentoItemValorService } from '../../_services/g_emolumento_item/GEmolumentoItemValorService'; import { GEmolumentoItemInterface } from '../../_interfaces/GEmolumentoItemInterface'; - // Hook personalizado para leitura (consulta) dos emolumentos export const useGEmolumentoItemReadHook = () => { const { setResponse } = useResponse(); @@ -27,11 +26,10 @@ export const useGEmolumentoItemReadHook = () => { // Retorna a resposta completa (para uso externo) return response; - } catch (error) { - console.error("Erro ao buscar item de emolumento:", error); + console.error('Erro ao buscar item de emolumento:', error); setResponse({ - message: "Erro ao buscar item de emolumento", + message: 'Erro ao buscar item de emolumento', error: error instanceof Error ? error.message : String(error), }); return null; // Retorna nulo para segurança @@ -39,8 +37,5 @@ export const useGEmolumentoItemReadHook = () => { }; // Retorna função e dados memorizados - return useMemo( - () => ({ gGEmolumentoItem, fetchGEmolumentoItem }), - [gGEmolumentoItem] - ); + return useMemo(() => ({ gGEmolumentoItem, fetchGEmolumentoItem }), [gGEmolumentoItem]); }; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts index 696eb74..b7f99e1 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook.ts @@ -11,10 +11,8 @@ import { GMarcacaoTipoInterface } from '../../_interfaces/GMarcacaoTipoInterface // Importa o serviço responsável por buscar os dados de "GMarcacaoTipo" na API import { GMarcacaoTipoIndexService } from '../../_services/g_marcacao_tipo/GMarcacaoTipoIndexService'; - // Hook personalizado para leitura (consulta) dos tipos de marcação export const useGMarcacaoTipoReadHook = () => { - // Obtém a função que atualiza a resposta global do sistema const { setResponse } = useResponse(); @@ -34,5 +32,8 @@ export const useGMarcacaoTipoReadHook = () => { }; // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias - return useMemo(() => ({ gMarcacaoTipo, fetchGMarcacaoTipo }), [gMarcacaoTipo, fetchGMarcacaoTipo]); + return useMemo( + () => ({ gMarcacaoTipo, fetchGMarcacaoTipo }), + [gMarcacaoTipo, fetchGMarcacaoTipo], + ); }; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts index 88b50ab..3c5369d 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaReadHook.ts @@ -12,7 +12,6 @@ import { TServicoEtiquetaServicoIdService } from '../../_services/t_servico_etiq // Hook personalizado para leitura (consulta) dos tipos de marcação export const useTServicoEtiquetaReadHook = () => { - // Obtém a função que atualiza a resposta global do sistema const { setResponse } = useResponse(); @@ -20,24 +19,24 @@ export const useTServicoEtiquetaReadHook = () => { const [tServicoEtiqueta, setTServicoEtiqueta] = useState([]); // Função responsável por buscar os dados da API e atualizar o estado - const fetchTServicoEtiqueta = useCallback(async (data: TServicoEtiquetaInterface) => { + const fetchTServicoEtiqueta = useCallback( + async (data: TServicoEtiquetaInterface) => { + try { + // Executa o serviço que faz a requisição à API + const response = await TServicoEtiquetaServicoIdService(data); - try{ + // Atualiza o estado local com os dados retornados + setTServicoEtiqueta(response.data); - // Executa o serviço que faz a requisição à API - const response = await TServicoEtiquetaServicoIdService(data); - - // Atualiza o estado local com os dados retornados - setTServicoEtiqueta(response.data); - - // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) - setResponse(response); - - } catch (error) { - console.error('Erro ao buscar etiquetas:', error); - return { data: [] }; - } - }, [setResponse]); + // Atualiza o contexto global de resposta (ex: para exibir alertas ou mensagens) + setResponse(response); + } catch (error) { + console.error('Erro ao buscar etiquetas:', error); + return { data: [] }; + } + }, + [setResponse], + ); // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias return { tServicoEtiqueta, fetchTServicoEtiqueta }; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts index 8599229..8d1d8b9 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaRemoveHook.ts @@ -1,10 +1,10 @@ -import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API +import { useResponse } from '@/shared/components/response/ResponseContext'; // Contexto global para gerenciar respostas da API // Interface tipada do tipo de serviço -import { TServicoEtiquetaInterface } from "../../_interfaces/TServicoEtiquetaInterface"; +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; // Função que remove o tipo de serviço via API -import { TServicoEtiquetaRemoveData } from "../../_data/TServicoEtiqueta/TServicoEtiquetaRemoveData"; +import { TServicoEtiquetaRemoveData } from '../../_data/TServicoEtiqueta/TServicoEtiquetaRemoveData'; // Hook customizado para remoção de tipos de serviço export const useTServicoEtiquetaRemoveHook = () => { @@ -22,4 +22,4 @@ export const useTServicoEtiquetaRemoveHook = () => { // Retorna a função de remoção para ser usada no componente return { fetchTServicoEtiquetaRemove }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts index 25ebfcf..9f54360 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_etiqueta/useTServicoEtiquetaSaveHook.ts @@ -2,23 +2,23 @@ import { useState } from 'react'; import { useResponse } from '@/shared/components/response/ResponseContext'; // Interface tipada do serviço etiqueta -import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; +import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInterface'; // Serviço que salva os dados do serviço etiqueta import { TServicoEtiquetaSaveService } from '../../_services/t_servico_etiqueta/TServicoEtiquetaSaveService'; export const useTServicoEtiquetaSaveHook = () => { const { setResponse } = useResponse(); - + // Estado local para armazenar os dados do serviço etiqueta salvos - const [tServicoEtiquetaSave, setTServicoEtiquetaSave] = useState(null); + const [tServicoEtiquetaSave, setTServicoEtiquetaSave] = + useState(null); /** * Função que executa o salvamento de um serviço etiqueta. * @param data Os dados do serviço etiqueta a serem salvos. */ const fetchTServicoEtiquetaSave = async (data: TServicoEtiquetaInterface) => { - // Chama o serviço de salvamento const response = await TServicoEtiquetaSaveService(data); @@ -26,12 +26,12 @@ export const useTServicoEtiquetaSaveHook = () => { setTServicoEtiquetaSave(response.data); // Manda a resposta para o verificador de resposta global - ///setResponse(response); + ///setResponse(response); // Manda a resposta para o verificador de resposta global return response.data; - } + }; // Retorna o estado e a função de salvamento para uso no componente return { tServicoEtiquetaSave, fetchTServicoEtiquetaSave }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts index 67f927e..b0094f8 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoEditHook.ts @@ -1,10 +1,10 @@ -import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API +import { useResponse } from '@/shared/components/response/ResponseContext'; // Contexto global para gerenciar respostas da API // Interface tipada do tipo de serviço -import TServicoTipoInterface from "../../_interfaces/TServicoTipoInterface"; +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Função que Edit o tipo de serviço via API -import { TServicoTipoEditData } from "../../_data/TServicoTipo/TServicoTipoEditData"; +import { TServicoTipoEditData } from '../../_data/TServicoTipo/TServicoTipoEditData'; // Hook customizado para remoção de tipos de serviço export const useTServicoTipoEditHook = () => { @@ -13,7 +13,6 @@ export const useTServicoTipoEditHook = () => { // Função assíncrona que Edit um tipo de serviço const editTServicoTipo = async (data: TServicoTipoInterface) => { - // Chama a função de remoção passando os dados do tipo de serviço const response = await TServicoTipoEditData(data); @@ -23,4 +22,4 @@ export const useTServicoTipoEditHook = () => { // Retorna a função de remoção para ser usada no componente return { editTServicoTipo }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts index cdb3acd..b827959 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoReadHook.ts @@ -2,10 +2,10 @@ import { useResponse } from '@/shared/components/response/ResponseContext'; // C import { useState } from 'react'; // Serviço que busca a lista de tipos de serviço (TServicoTipoIndexService) -import { TServicoTipoIndexService } from '../../_services/t_servico_tipo/TServicoTipoIndexService'; +import { TServicoTipoIndexService } from '../../_services/t_servico_tipo/TServicoTipoIndexService'; // Interface tipada do tipo de serviço -import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Hook customizado para leitura de dados de tipos de serviço export const useTServicoTipoReadHook = () => { @@ -32,4 +32,4 @@ export const useTServicoTipoReadHook = () => { // Retorna os dados e a função de busca para serem usados no componente return { tServicoTipo, fetchTServicoTipo }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts index 7c7c8f4..e0f8d5d 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoRemoveHook.ts @@ -1,10 +1,10 @@ -import { useResponse } from "@/shared/components/response/ResponseContext"; // Contexto global para gerenciar respostas da API +import { useResponse } from '@/shared/components/response/ResponseContext'; // Contexto global para gerenciar respostas da API // Interface tipada do tipo de serviço -import TServicoTipoInterface from "../../_interfaces/TServicoTipoInterface"; +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Função que remove o tipo de serviço via API -import { TServicoTipoRemoveData } from "../../_data/TServicoTipo/TServicoTipoRemoveData"; +import { TServicoTipoRemoveData } from '../../_data/TServicoTipo/TServicoTipoRemoveData'; // Hook customizado para remoção de tipos de serviço export const useTServicoTipoRemoveHook = () => { @@ -22,4 +22,4 @@ export const useTServicoTipoRemoveHook = () => { // Retorna a função de remoção para ser usada no componente return { removeTServicoTipo }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts index 1ed50de..964d127 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_servico_tipo/useTServicoTipoSaveHook.ts @@ -2,14 +2,14 @@ import { useState } from 'react'; import { useResponse } from '@/shared/components/response/ResponseContext'; // Interface tipada do tipo de serviço -import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; +import TServicoTipoInterface from '../../_interfaces/TServicoTipoInterface'; // Serviço que salva os dados do tipo de serviço import { TServicoTipoSaveService } from '../../_services/t_servico_tipo/TServicoTipoSaveService'; export const useTServicoTipoSaveHook = () => { const { setResponse } = useResponse(); - + // Estado local para armazenar os dados do tipo de serviço salvos const [tServicoTipo, setTServicoTipo] = useState(null); @@ -26,8 +26,8 @@ export const useTServicoTipoSaveHook = () => { // Manda a resposta para o verificador de resposta global setResponse(response); - } + }; // Retorna o estado e a função de salvamento para uso no componente return { tServicoTipo, saveTServicoTipo }; -}; \ No newline at end of file +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts index 88a8eaa..c0f2697 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook.ts @@ -11,14 +11,15 @@ import { TTBReconhecimentoTipoInterface } from '../../_interfaces/TTBReconhecime // Importa o serviço responsável por buscar os dados de "TTBReconhecimentoTipo" na API import { TTBReconhecimentoTipoIndexService } from '../../_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService'; - // Hook personalizado para leitura (consulta) dos tipos de marcação export const useTTBReconhecimentoTipoReadHook = () => { // Obtém a função que atualiza a resposta global do sistema const { setResponse } = useResponse(); // Define o estado local que armazenará a lista de tipos de marcação - const [tTBReconhecimentoTipo, setTTBReconhecimentoTipo] = useState([]); + const [tTBReconhecimentoTipo, setTTBReconhecimentoTipo] = useState< + TTBReconhecimentoTipoInterface[] + >([]); // Função responsável por buscar os dados da API e atualizar o estado const fetchTTBReconhecimentoTipo = async (data: TTBReconhecimentoTipoReadInterface) => { @@ -33,5 +34,8 @@ export const useTTBReconhecimentoTipoReadHook = () => { }; // Retorna os dados e a função de busca, memorizando o valor para evitar recriações desnecessárias - return useMemo(() => ({ tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo }), [tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo]); + return useMemo( + () => ({ tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo }), + [tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo], + ); }; diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts index 13fd319..c6595b6 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoInterface.ts @@ -1,17 +1,17 @@ // Interface que representa a tabela C_CAIXA_SERVICO export interface CCaixaServicoInterface { - interno_sistema?: string; // VARCHAR(1) - caixa_servico_id: number; // NUMERIC(10,2) NOT NULL - Chave primária - descricao?: string; // VARCHAR(60) - situacao?: string; // VARCHAR(1) - tipo_transacao?: string; // VARCHAR(1) - sistema_id?: number; // NUMERIC(14,3) - selo_grupo_id?: number; // NUMERIC(10,2) - emitir_relatorio?: string; // VARCHAR(1) - repasse?: string; // VARCHAR(1) - repetir_descricao?: string; // VARCHAR(1) - codigo_conta?: number; // NUMERIC(10,2) - tipo_conta_carneleao?: string; // VARCHAR(60) - centro_de_custa_id?: number; // NUMERIC(10,2) - Chave estrangeira - devolucao_juizo?: string; // VARCHAR(1) -} \ No newline at end of file + interno_sistema?: string; // VARCHAR(1) + caixa_servico_id: number; // NUMERIC(10,2) NOT NULL - Chave primária + descricao?: string; // VARCHAR(60) + situacao?: string; // VARCHAR(1) + tipo_transacao?: string; // VARCHAR(1) + sistema_id?: number; // NUMERIC(14,3) + selo_grupo_id?: number; // NUMERIC(10,2) + emitir_relatorio?: string; // VARCHAR(1) + repasse?: string; // VARCHAR(1) + repetir_descricao?: string; // VARCHAR(1) + codigo_conta?: number; // NUMERIC(10,2) + tipo_conta_carneleao?: string; // VARCHAR(60) + centro_de_custa_id?: number; // NUMERIC(10,2) - Chave estrangeira + devolucao_juizo?: string; // VARCHAR(1) +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts index b528407..52ed3ef 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface.ts @@ -1,3 +1,3 @@ export interface CCaixaServicoReadInterface { sistema_id?: number; -} \ No newline at end of file +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts index 9998089..64c2518 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoInterface.ts @@ -1,20 +1,20 @@ // Interface que representa a tabela G_EMOLUMENTO export interface GEmolumentoInterface { - emolumento_id?: number; // NUMERIC(10,2) - Chave primária - descricao?: string; // VARCHAR(260) - tipo?: string; // VARCHAR(1) - sistema_id?: number; // NUMERIC(10,2) - selo_grupo_id?: number; // NUMERIC(10,2) - reg_averb?: string; // VARCHAR(1) - pre_definido?: string; // VARCHAR(1) - situacao?: string; // VARCHAR(1) - situacao_ri?: string; // VARCHAR(1) - com_reducao?: string; // VARCHAR(1) - motivo_reducao?: string; // VARCHAR(120) - valor_maximo_certidao?: number; // NUMERIC(14,3) - tipo_objetivo?: string; // VARCHAR(3) - modelo_tag?: string; // VARCHAR(3) - codigo_nota_id?: number; // NUMERIC(10,2) - convenio_codhab?: string; // VARCHAR(1) - item_df?: string; // VARCHAR(10) + emolumento_id?: number; // NUMERIC(10,2) - Chave primária + descricao?: string; // VARCHAR(260) + tipo?: string; // VARCHAR(1) + sistema_id?: number; // NUMERIC(10,2) + selo_grupo_id?: number; // NUMERIC(10,2) + reg_averb?: string; // VARCHAR(1) + pre_definido?: string; // VARCHAR(1) + situacao?: string; // VARCHAR(1) + situacao_ri?: string; // VARCHAR(1) + com_reducao?: string; // VARCHAR(1) + motivo_reducao?: string; // VARCHAR(120) + valor_maximo_certidao?: number; // NUMERIC(14,3) + tipo_objetivo?: string; // VARCHAR(3) + modelo_tag?: string; // VARCHAR(3) + codigo_nota_id?: number; // NUMERIC(10,2) + convenio_codhab?: string; // VARCHAR(1) + item_df?: string; // VARCHAR(10) } diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts index 609426d..11b9857 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemInterface.ts @@ -1,32 +1,32 @@ // Interface que representa a tabela G_EMOLUMENTO_ITEM (inferido) export interface GEmolumentoItemInterface { - valor_emolumento?: number; // NUMERIC(14,3) - emolumento_item_id: number; // NUMERIC(10,2) NOT NULL - Chave primária (assumida) - emolumento_id?: number; // NUMERIC(10,2) - valor_inicio?: number; // NUMERIC(14,3) - valor_fim?: number; // NUMERIC(14,3) - valor_taxa_judiciaria?: number; // NUMERIC(14,3) - emolumento_periodo_id?: number; // NUMERIC(10,2) - codigo?: number; // NUMERIC(10,2) - pagina_extra?: number; // NUMERIC(10,2) - valor_pagina_extra?: number; // NUMERIC(14,3) - valor_outra_taxa1?: number; // NUMERIC(14,3) - codigo_selo?: string; // VARCHAR(30) - valor_fundo_ri?: number; // NUMERIC(14,3) - codigo_tabela?: string; // VARCHAR(30) - selo_grupo_id?: number; // NUMERIC(10,2) - codigo_km?: string; // VARCHAR(30) - emolumento_acresce?: number; // NUMERIC(14,3) - taxa_acresce?: number; // NUMERIC(14,3) - funcivil_acresce?: number; // NUMERIC(14,3) - valor_fracao?: number; // NUMERIC(14,3) - valor_por_excedente_emol?: number; // NUMERIC(14,3) - valor_por_excedente_tj?: number; // NUMERIC(14,3) - valor_por_excedente_fundo?: number; // NUMERIC(14,3) - valor_limite_excedente_emol?: number; // NUMERIC(14,3) - valor_limite_excedente_tj?: number; // NUMERIC(14,3) + valor_emolumento?: number; // NUMERIC(14,3) + emolumento_item_id: number; // NUMERIC(10,2) NOT NULL - Chave primária (assumida) + emolumento_id?: number; // NUMERIC(10,2) + valor_inicio?: number; // NUMERIC(14,3) + valor_fim?: number; // NUMERIC(14,3) + valor_taxa_judiciaria?: number; // NUMERIC(14,3) + emolumento_periodo_id?: number; // NUMERIC(10,2) + codigo?: number; // NUMERIC(10,2) + pagina_extra?: number; // NUMERIC(10,2) + valor_pagina_extra?: number; // NUMERIC(14,3) + valor_outra_taxa1?: number; // NUMERIC(14,3) + codigo_selo?: string; // VARCHAR(30) + valor_fundo_ri?: number; // NUMERIC(14,3) + codigo_tabela?: string; // VARCHAR(30) + selo_grupo_id?: number; // NUMERIC(10,2) + codigo_km?: string; // VARCHAR(30) + emolumento_acresce?: number; // NUMERIC(14,3) + taxa_acresce?: number; // NUMERIC(14,3) + funcivil_acresce?: number; // NUMERIC(14,3) + valor_fracao?: number; // NUMERIC(14,3) + valor_por_excedente_emol?: number; // NUMERIC(14,3) + valor_por_excedente_tj?: number; // NUMERIC(14,3) + valor_por_excedente_fundo?: number; // NUMERIC(14,3) + valor_limite_excedente_emol?: number; // NUMERIC(14,3) + valor_limite_excedente_tj?: number; // NUMERIC(14,3) valor_limite_excedente_fundo?: number; // NUMERIC(14,3) - fundo_selo?: number; // NUMERIC(14,3) - distribuicao?: number; // NUMERIC(14,3) - vrc_ext?: number; // NUMERIC(10,2) - Renomeado de VRCEXT para vrc_ext (convenção) -} \ No newline at end of file + fundo_selo?: number; // NUMERIC(14,3) + distribuicao?: number; // NUMERIC(14,3) + vrc_ext?: number; // NUMERIC(10,2) - Renomeado de VRCEXT para vrc_ext (convenção) +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts index 1ba73db..79144fc 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoItemReadInterface.ts @@ -1,4 +1,4 @@ export interface GEmolumentoItemReadInterface { - emolumento_id?: number, - valor?: number -} \ No newline at end of file + emolumento_id?: number; + valor?: number; +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts index 3e2f596..111562f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface.ts @@ -1,3 +1,3 @@ export interface GEmolumentoReadInterface { - sistema_id?: number -} \ No newline at end of file + sistema_id?: number; +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts index 7e3be09..1127a0c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoInterface.ts @@ -17,4 +17,4 @@ export interface GMarcacaoTipoInterface { protegida?: string; ativar_separador?: string; sql_completo?: string; -} \ No newline at end of file +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts index 9c95bb0..ca49448 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface.ts @@ -2,4 +2,4 @@ export interface GMarcacaoTipoReadInterface { grupo?: string; sistema_id?: number; situacao?: string; -} \ No newline at end of file +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts index 9ab50d7..67c03aa 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaInterface.ts @@ -1,7 +1,7 @@ // Interface que representa a tabela T_TB_RECONHECIMENTOTIPO export interface TServicoEtiquetaInterface { - servico_etiqueta_id?: number; // NUMERIC(10,2) NOT NULL - Chave primária - etiqueta_modelo_id?: number; // NUMERIC(10,2) - servico_tipo_id?: number; // NUMERIC(10,2) - descricao?: string + servico_etiqueta_id?: number; // NUMERIC(10,2) NOT NULL - Chave primária + etiqueta_modelo_id?: number; // NUMERIC(10,2) + servico_tipo_id?: number; // NUMERIC(10,2) + descricao?: string; } diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts index 12ce5b0..4c5b92b 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoEtiquetaServicoIdReadInterface.ts @@ -1,3 +1,3 @@ export interface TServicoEtiquetaServicoIdReadInterface { - servico_tipo_id?: number -} \ No newline at end of file + servico_tipo_id?: number; +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts index 872097e..a7e6e7c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TServicoTipoInterface.ts @@ -1,27 +1,27 @@ export default interface TServicoTipoInterface { - servico_tipo_id?: number; // SERVICO_TIPO_ID NUMERIC(10,2) NOT NULL (PK) - descricao: string; // DESCRICAO VARCHAR(60) - valor?: number; // VALOR NUMERIC(14,3) - requer_autorizacao?: string; // REQUER_AUTORIZACAO VARCHAR(1) - requer_biometria?: string; // REQUER_BIOMETRIA VARCHAR(1) - tipo_pessoa?: string; // TIPO_PESSOA VARCHAR(1) - tb_reconhecimentotipo_id?: number; // TB_RECONHECIMENTOTIPO_ID NUMERIC(10,2) (FK) - requer_abonador?: string; // REQUER_ABONADOR VARCHAR(1) - situacao?: string; // SITUACAO VARCHAR(1) - requer_cpf?: string; // REQUER_CPF VARCHAR(1) - servico_padrao?: string; // SERVICO_PADRAO VARCHAR(1) - maximo_pessoa?: number; // MAXIMO_PESSOA NUMERIC(10,2) - alterar_valor?: string; // ALTERAR_VALOR VARCHAR(1) - servico_caixa_id?: number; // SERVICO_CAIXA_ID NUMERIC(10,2) - caixa_servico_id?: number; // LIBERAR_DESCONTO VARCHAR(1) - valor_fixo?: string; // VALOR_FIXO VARCHAR(1) - emolumento_id?: number; // EMOLUMENTO_ID NUMERIC(10,2) (FK) - emolumento_obrigatorio?: number; // EMOLUMENTO_OBRIGATORIO NUMERIC(10,2) (FK) - ato_praticado?: string; // ATO_PRATICADO VARCHAR(1) - selar?: string; // SELAR VARCHAR(1) - frenteverso?: string; // FRENTEVERSO VARCHAR(1) - etiqueta_unica?: string; // ETIQUETA_UNICA VARCHAR(1) - transferencia_veiculo?: string; // TRANSFERENCIA_VEICULO VARCHAR(1) - usar_a4?: string; // USAR_A4 VARCHAR(1) - averbacao?: string; // AVERBACAO VARCHAR(1) + servico_tipo_id?: number; // SERVICO_TIPO_ID NUMERIC(10,2) NOT NULL (PK) + descricao: string; // DESCRICAO VARCHAR(60) + valor?: number; // VALOR NUMERIC(14,3) + requer_autorizacao?: string; // REQUER_AUTORIZACAO VARCHAR(1) + requer_biometria?: string; // REQUER_BIOMETRIA VARCHAR(1) + tipo_pessoa?: string; // TIPO_PESSOA VARCHAR(1) + tb_reconhecimentotipo_id?: number; // TB_RECONHECIMENTOTIPO_ID NUMERIC(10,2) (FK) + requer_abonador?: string; // REQUER_ABONADOR VARCHAR(1) + situacao?: string; // SITUACAO VARCHAR(1) + requer_cpf?: string; // REQUER_CPF VARCHAR(1) + servico_padrao?: string; // SERVICO_PADRAO VARCHAR(1) + maximo_pessoa?: number; // MAXIMO_PESSOA NUMERIC(10,2) + alterar_valor?: string; // ALTERAR_VALOR VARCHAR(1) + servico_caixa_id?: number; // SERVICO_CAIXA_ID NUMERIC(10,2) + caixa_servico_id?: number; // LIBERAR_DESCONTO VARCHAR(1) + valor_fixo?: string; // VALOR_FIXO VARCHAR(1) + emolumento_id?: number; // EMOLUMENTO_ID NUMERIC(10,2) (FK) + emolumento_obrigatorio?: number; // EMOLUMENTO_OBRIGATORIO NUMERIC(10,2) (FK) + ato_praticado?: string; // ATO_PRATICADO VARCHAR(1) + selar?: string; // SELAR VARCHAR(1) + frenteverso?: string; // FRENTEVERSO VARCHAR(1) + etiqueta_unica?: string; // ETIQUETA_UNICA VARCHAR(1) + transferencia_veiculo?: string; // TRANSFERENCIA_VEICULO VARCHAR(1) + usar_a4?: string; // USAR_A4 VARCHAR(1) + averbacao?: string; // AVERBACAO VARCHAR(1) } diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts index 8144ce6..bbf207c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoInterface.ts @@ -1,6 +1,6 @@ // Interface que representa a tabela T_TB_RECONHECIMENTOTIPO export interface TTbReconhecimentoTipoInterface { - tb_reconhecimentotipo_id: number; // NUMERIC(10,2) NOT NULL - Chave primária - descricao?: string; // VARCHAR(30) - situacao?: string; // VARCHAR(1) + tb_reconhecimentotipo_id: number; // NUMERIC(10,2) NOT NULL - Chave primária + descricao?: string; // VARCHAR(30) + situacao?: string; // VARCHAR(1) } diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts index 69948ee..c1732f6 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TTBReconhecimentoTipoReadInterface.ts @@ -1,4 +1,4 @@ export interface TTBReconhecimentoTipoReadInterface { - tb_reconhecimentotipo_id?: number, - descricao?: string -} \ No newline at end of file + tb_reconhecimentotipo_id?: number; + descricao?: string; +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts index 11dc09e..b7d3b06 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoEtiquetaSchema.ts @@ -11,5 +11,4 @@ export interface TServicoEtiquetaFormValues { /** Relacionamento com o tipo de serviço (FK) */ servico_tipo_id?: number; - } diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts index 3fae76f..8fb4cb2 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TServicoTipoSchema.ts @@ -1,12 +1,12 @@ -import z from "zod"; +import z from 'zod'; /** * Tipos utilitários para campos simples */ -const SN = z.enum(["S", "N"]).default("N"); // Campos do tipo Sim/Não -const AI = z.enum(["A", "I"]).default("A"); // Situação Ativo/Inativo -const OneCharString = z.string().max(1, "Deve ter no máximo 1 caractere").optional(); -const RequiredString = z.string().min(1, "O campo é obrigatório"); +const SN = z.enum(['S', 'N']).default('N'); // Campos do tipo Sim/Não +const AI = z.enum(['A', 'I']).default('A'); // Situação Ativo/Inativo +const OneCharString = z.string().max(1, 'Deve ter no máximo 1 caractere').optional(); +const RequiredString = z.string().min(1, 'O campo é obrigatório'); const OptionalNumber = z.number().optional(); const RequiredNumber = z.number(); @@ -15,10 +15,10 @@ const RequiredNumber = z.number(); */ export const TServicoTipoSchema = z.object({ // Identificador - servico_tipo_id: RequiredNumber.describe("ID do Tipo de Serviço").optional(), + servico_tipo_id: RequiredNumber.describe('ID do Tipo de Serviço').optional(), // Campos principais - descricao: z.string().max(60, "A descrição deve ter no máximo 60 caracteres").optional(), + descricao: z.string().max(60, 'A descrição deve ter no máximo 60 caracteres').optional(), categoria: z.string().optional(), // Controle de flags (S/N) @@ -46,7 +46,7 @@ export const TServicoTipoSchema = z.object({ valor: OptionalNumber, maximo_pessoa: OptionalNumber, servico_caixa_id: OptionalNumber, - emolumento_id: z.number().nullable(), + emolumento_id: z.number().nullable(), emolumento_obrigatorio: z.number().nullable(), // Relacionamentos e permissões diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts index 1b7f368..c9d11be 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/c_caixa_servico/CCaixaServicoIndexService.ts @@ -9,12 +9,10 @@ import { CCaixaServicoReadInterface } from '../../_interfaces/CCaixaServicoReadI async function executeCCaixaServicoIndexService(data: CCaixaServicoReadInterface) { // Chama a função que realiza a requisição à API e aguarda a resposta const response = await CCaixaServicoIndexData(data); - + // Retorna a resposta obtida da requisição return response; } // Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas -export const CCaixaServicoIndexService = withClientErrorHandler( - executeCCaixaServicoIndexService, -); +export const CCaixaServicoIndexService = withClientErrorHandler(executeCCaixaServicoIndexService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts index beef86e..4d46361 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento/GEmolumentoIndexService.ts @@ -9,12 +9,10 @@ import { GEmolumentoReadInterface } from '../../_interfaces/GEmolumentoReadInter async function executeGEmolumentoIndexService(data: GEmolumentoReadInterface) { // Chama a função que realiza a requisição à API e aguarda a resposta const response = await GEmolumentoIndexData(data); - + // Retorna a resposta obtida da requisição return response; } // Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas -export const GEmolumentoIndexService = withClientErrorHandler( - executeGEmolumentoIndexService, -); +export const GEmolumentoIndexService = withClientErrorHandler(executeGEmolumentoIndexService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts index 6bb2963..9c74b1f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_emolumento_item/GEmolumentoItemValorService.ts @@ -9,7 +9,7 @@ import { GEmolumentoItemReadInterface } from '../../_interfaces/GEmolumentoItemR async function executeGEmolumentoItemValorService(data: GEmolumentoItemReadInterface) { // Chama a função que realiza a requisição à API e aguarda a resposta const response = await GEmolumentoItemValorData(data); - + // Retorna a resposta obtida da requisição return response; } diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts index cf886af..7a058ee 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_marcacao_tipo/GMarcacaoTipoIndexService.ts @@ -9,12 +9,10 @@ import { GMarcacaoTipoReadInterface } from '../../_interfaces/GMarcacaoTipoReadI async function executeGMarcacaoTipoIndexService(data: GMarcacaoTipoReadInterface) { // Chama a função que realiza a requisição à API e aguarda a resposta const response = await GMarcacaoTipoIndexData(data); - + // Retorna a resposta obtida da requisição return response; } // Exporta o serviço encapsulado pelo handler de erro, garantindo tratamento uniforme em caso de falhas -export const GMarcacaoTipoIndexService = withClientErrorHandler( - executeGMarcacaoTipoIndexService, -); +export const GMarcacaoTipoIndexService = withClientErrorHandler(executeGMarcacaoTipoIndexService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts index e6675ef..ef0a70d 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaSaveService.ts @@ -9,7 +9,6 @@ import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInt // Função assíncrona que executa o salvamento de um serviço etiqueta async function executeTServicoEtiquetaSaveService(data: TServicoEtiquetaInterface) { - // Chama a função que salva os dados do serviço etiqueta const response = await TServicoEtiquetaSaveData(data); @@ -18,4 +17,6 @@ async function executeTServicoEtiquetaSaveService(data: TServicoEtiquetaInterfac } // Exporta o serviço de salvamento de serviço etiqueta já encapsulado com tratamento de erros -export const TServicoEtiquetaSaveService = withClientErrorHandler(executeTServicoEtiquetaSaveService); \ No newline at end of file +export const TServicoEtiquetaSaveService = withClientErrorHandler( + executeTServicoEtiquetaSaveService, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts index 1d56a87..702d7db 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_etiqueta/TServicoEtiquetaServicoIdService.ts @@ -8,7 +8,6 @@ import { TServicoEtiquetaInterface } from '../../_interfaces/TServicoEtiquetaInt // Função assíncrona que executa a consulta de um tipo de serviço etiqueta async function executeTServicoEtiquetaServicoIdService(data: TServicoEtiquetaInterface) { - // Chama a função que consulta os dados do tipo de serviço etiqueta const response = await TServicoEtiquetaReadData(data); @@ -17,4 +16,6 @@ async function executeTServicoEtiquetaServicoIdService(data: TServicoEtiquetaInt } // Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros -export const TServicoEtiquetaServicoIdService = withClientErrorHandler(executeTServicoEtiquetaServicoIdService); \ No newline at end of file +export const TServicoEtiquetaServicoIdService = withClientErrorHandler( + executeTServicoEtiquetaServicoIdService, +); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts index 873e321..9e0ab2e 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoEditService.ts @@ -17,4 +17,4 @@ async function executeTServicoTipoEditService(data: TServicoTipoInterface) { } // Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros -export const TServicoTipoEditService = withClientErrorHandler(executeTServicoTipoEditService); \ No newline at end of file +export const TServicoTipoEditService = withClientErrorHandler(executeTServicoTipoEditService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts index da0f6be..d8654ca 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoIndexService.ts @@ -14,4 +14,4 @@ async function executeTServicoTipoIndexService() { } // Exporta o serviço de índice de tipos de serviço já encapsulado com tratamento de erros -export const TServicoTipoIndexService = withClientErrorHandler(executeTServicoTipoIndexService); \ No newline at end of file +export const TServicoTipoIndexService = withClientErrorHandler(executeTServicoTipoIndexService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts index 346a859..4376393 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoRemoveService.ts @@ -17,4 +17,4 @@ async function executeTServicoTipoRemoveService(data: TServicoTipoInterface) { } // Exporta o serviço de remoção de tipo de serviço já encapsulado com tratamento de erros -export const TServicoTipoRemoveService = withClientErrorHandler(executeTServicoTipoRemoveService); \ No newline at end of file +export const TServicoTipoRemoveService = withClientErrorHandler(executeTServicoTipoRemoveService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts index 7a4ff82..770d824 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_servico_tipo/TServicoTipoSaveService.ts @@ -17,4 +17,4 @@ async function executeTServicoTipoSaveService(data: TServicoTipoInterface) { } // Exporta o serviço de salvamento de tipo de serviço já encapsulado com tratamento de erros -export const TServicoTipoSaveService = withClientErrorHandler(executeTServicoTipoSaveService); \ No newline at end of file +export const TServicoTipoSaveService = withClientErrorHandler(executeTServicoTipoSaveService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts index fece097..f9fca02 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/t_tb_reconhecimentotipo/TTBReconhecimentoTipoIndexService.ts @@ -9,7 +9,7 @@ import { TTBReconhecimentoTipoReadInterface } from '../../_interfaces/TTBReconhe async function executeTTBReconhecimentoTipoIndexService(data: TTBReconhecimentoTipoReadInterface) { // Chama a função que realiza a requisição à API e aguarda a resposta const response = await TTBReconhecimentoTipoIndexData(data); - + // Retorna a resposta obtida da requisição return response; } diff --git a/src/app/(protected)/layout.tsx b/src/app/(protected)/layout.tsx index 0e86ae0..c6fea82 100644 --- a/src/app/(protected)/layout.tsx +++ b/src/app/(protected)/layout.tsx @@ -56,15 +56,11 @@ export default function RootLayout({ - - Building Your Application - + Building Your Application - - Data Fetching - + Data Fetching diff --git a/src/app/(protected)/page.tsx b/src/app/(protected)/page.tsx index a1f4581..bf69e37 100644 --- a/src/app/(protected)/page.tsx +++ b/src/app/(protected)/page.tsx @@ -4,51 +4,47 @@ import useGUsuarioGetJWTHook from '@/shared/hooks/auth/useGUsuarioGetJWTHook'; import { useEffect, useState } from 'react'; export default function Page() { - const { userAuthenticated } = useGUsuarioGetJWTHook(); + const { userAuthenticated } = useGUsuarioGetJWTHook(); - // Inicializa time como null para renderizar só no cliente - const [time, setTime] = useState(null); + // Inicializa time como null para renderizar só no cliente + const [time, setTime] = useState(null); - useEffect(() => { - setTime(new Date()); // define data inicial no cliente - const interval = setInterval(() => setTime(new Date()), 1000); - return () => clearInterval(interval); - }, []); + useEffect(() => { + setTime(new Date()); // define data inicial no cliente + const interval = setInterval(() => setTime(new Date()), 1000); + return () => clearInterval(interval); + }, []); - // Se ainda não temos a hora, renderiza nada para evitar mismatch - if (!time || !userAuthenticated?.data) return null; + // Se ainda não temos a hora, renderiza nada para evitar mismatch + if (!time || !userAuthenticated?.data) return null; - const hours = time.getHours(); - const greeting = - hours < 12 ? 'Bom dia' : hours < 18 ? 'Boa tarde' : 'Boa noite'; + const hours = time.getHours(); + const greeting = hours < 12 ? 'Bom dia' : hours < 18 ? 'Boa tarde' : 'Boa noite'; - const formattedDate = time.toLocaleDateString('pt-BR', { - weekday: 'long', - day: '2-digit', - month: 'long', - }); - const formattedTime = time.toLocaleTimeString('pt-BR'); + const formattedDate = time.toLocaleDateString('pt-BR', { + weekday: 'long', + day: '2-digit', + month: 'long', + }); + const formattedTime = time.toLocaleTimeString('pt-BR'); - return ( -
-
-

- {greeting},{' '} - {userAuthenticated.data.nome}{' '} - 👋 -

+ return ( +
+
+

+ {greeting}, {userAuthenticated.data.nome} 👋 +

-

- Hoje é {formattedDate}, {formattedTime} -

+

+ Hoje é {formattedDate}, {formattedTime} +

-
-

- Que bom ter você de volta! 🎉 - Aproveite o seu dia e continue alcançando seus objetivos. -

-
-
-
- ); +
+

+ Que bom ter você de volta! 🎉 Aproveite o seu dia e continue alcançando seus objetivos. +

+
+
+
+ ); } diff --git a/src/app/_components/confirm_exclusion/ConfirmExclusion.tsx b/src/app/_components/confirm_exclusion/ConfirmExclusion.tsx index e647429..e6f9226 100644 --- a/src/app/_components/confirm_exclusion/ConfirmExclusion.tsx +++ b/src/app/_components/confirm_exclusion/ConfirmExclusion.tsx @@ -2,123 +2,110 @@ import React, { useState } from 'react'; import { - AlertDialog, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogAction, + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogAction, } from '@/components/ui/alert-dialog'; -import { - InputOTP, - InputOTPGroup, - InputOTPSlot, -} from '@/components/ui/input-otp'; +import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp'; interface ConfirmExclusionProps { - isOpen: boolean; - title: string; - description?: string; - expectedCode: string; - confirmText?: string; - cancelText?: string; - onConfirm: () => void; - onCancel: () => void; - onResendCode: () => void; // Função para reenviar o código + isOpen: boolean; + title: string; + description?: string; + expectedCode: string; + confirmText?: string; + cancelText?: string; + onConfirm: () => void; + onCancel: () => void; + onResendCode: () => void; // Função para reenviar o código } export default function ConfirmExclusion({ - isOpen, - title, - description, - expectedCode, - confirmText = 'Continuar', - cancelText = 'Cancelar', - onConfirm, - onCancel, - onResendCode, // A função para reenvio do código + isOpen, + title, + description, + expectedCode, + confirmText = 'Continuar', + cancelText = 'Cancelar', + onConfirm, + onCancel, + onResendCode, // A função para reenvio do código }: ConfirmExclusionProps) { - const [code, setCode] = useState(''); - const [isValid, setIsValid] = useState(false); - const [isResending, setIsResending] = useState(false); // Novo estado para controle de envio do código + const [code, setCode] = useState(''); + const [isValid, setIsValid] = useState(false); + const [isResending, setIsResending] = useState(false); // Novo estado para controle de envio do código - const handleChange = (value: string) => { - setCode(value); - setIsValid(value === expectedCode); - }; + const handleChange = (value: string) => { + setCode(value); + setIsValid(value === expectedCode); + }; - const handleResendCode = async () => { - setIsResending(true); - try { - await onResendCode(); // Chamando a função de reenvio - } catch (error) { - console.error("Erro ao reenviar código", error); - } finally { - setIsResending(false); // Resetando o estado de envio - } - }; + const handleResendCode = async () => { + setIsResending(true); + try { + await onResendCode(); // Chamando a função de reenvio + } catch (error) { + console.error('Erro ao reenviar código', error); + } finally { + setIsResending(false); // Resetando o estado de envio + } + }; - return ( - !open && onCancel()}> - - - {title} - {description && ( - - {description} - - )} - + return ( + !open && onCancel()}> + + + {title} + {description && ( + + {description} + + )} + -
-
- - - {expectedCode.split('').map((_, index) => ( - - ))} - - -
+
+
+ + + {expectedCode.split('').map((_, index) => ( + + ))} + + +
- {/* Botão "Reenviar Código" */} -
- - Não recebeu o código? - - -
-
+ {/* Botão "Reenviar Código" */} +
+ Não recebeu o código? + +
+
- - - {cancelText} - - - {confirmText} - - -
-
- ); + + + {cancelText} + + + {confirmText} + + +
+
+ ); } diff --git a/src/app/_components/confirm_exclusion/useConfirmExclusion.ts b/src/app/_components/confirm_exclusion/useConfirmExclusion.ts index 25a2c9d..62d9eac 100644 --- a/src/app/_components/confirm_exclusion/useConfirmExclusion.ts +++ b/src/app/_components/confirm_exclusion/useConfirmExclusion.ts @@ -1,4 +1,4 @@ -import { useCallback, useState } from "react"; +import { useCallback, useState } from 'react'; interface UseConfirmExclusionOptions { onConfirm?: () => void; @@ -6,15 +6,19 @@ interface UseConfirmExclusionOptions { expectedCode: string; // código que o usuário precisa digitar } -export function useConfirmExclusion({ onConfirm, onCancel, expectedCode }: UseConfirmExclusionOptions) { +export function useConfirmExclusion({ + onConfirm, + onCancel, + expectedCode, +}: UseConfirmExclusionOptions) { const [isOpen, setIsOpen] = useState(false); - const [code, setCode] = useState(""); + const [code, setCode] = useState(''); const [isValid, setIsValid] = useState(false); const openDialog = useCallback(() => setIsOpen(true), []); const closeDialog = useCallback(() => { setIsOpen(false); - setCode(""); // limpa o código quando fecha + setCode(''); // limpa o código quando fecha setIsValid(false); }, []); @@ -35,7 +39,7 @@ export function useConfirmExclusion({ onConfirm, onCancel, expectedCode }: UseCo setCode(value); setIsValid(value === expectedCode); }, - [expectedCode] + [expectedCode], ); return { diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index 0047c5d..a33ccd8 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -106,8 +106,8 @@ const data = { url: '/administrativo/pessoas/estados-civis', }, { - title: "Regimes/Comunhão", - url: "/administrativo/pessoas/regimes-comunhao/", + title: 'Regimes/Comunhão', + url: '/administrativo/pessoas/regimes-comunhao/', }, { title: 'Tipo de Medida', @@ -130,12 +130,12 @@ const data = { url: '/administrativo/minutas/naturezas', }, { - title: "Censec/Tipo do Ato", - url: "/administrativo/centrais/censec/tipos-atos" + title: 'Censec/Tipo do Ato', + url: '/administrativo/centrais/censec/tipos-atos', }, { - title: "Censec/Qualidades", - url: "/administrativo/centrais/censec/qualidades" + title: 'Censec/Qualidades', + url: '/administrativo/centrais/censec/qualidades', }, { title: 'Censec/Centrais', @@ -146,14 +146,13 @@ const data = { url: '/administrativo/centrais/censec/naturezas-litigios', }, { - title: "Serviços/Tipos", - url: "/cadastros/servicos-tipo/", + title: 'Serviços/Tipos', + url: '/cadastros/servicos-tipo/', }, { - title: "Atos/Partes Tipos", - url: "/administrativo/atos/partes-tipos", + title: 'Atos/Partes Tipos', + url: '/administrativo/atos/partes-tipos', }, - ], }, ], @@ -182,16 +181,12 @@ export function AppSidebar({ ...props }: React.ComponentProps) { alt="Logo do site" width={100} height={100} - className='rounded-lg' + className="rounded-lg" />
- - Orius Tecnologia - - - 25.9.1 - + Orius Tecnologia + 25.9.1
diff --git a/src/components/nav-main.tsx b/src/components/nav-main.tsx index 7b62742..47bbb51 100644 --- a/src/components/nav-main.tsx +++ b/src/components/nav-main.tsx @@ -31,9 +31,7 @@ export function NavMain({ }) { return ( - - SAAS - + SAAS {items.map((item) => ( - - Escrituras - + Escrituras {projects.map((item) => ( diff --git a/src/components/ui/input-otp.tsx b/src/components/ui/input-otp.tsx index 614f70e..8ec7b98 100644 --- a/src/components/ui/input-otp.tsx +++ b/src/components/ui/input-otp.tsx @@ -1,58 +1,51 @@ -"use client" +'use client'; -import * as React from "react" -import { OTPInput, OTPInputContext } from "input-otp" -import { MinusIcon } from "lucide-react" +import * as React from 'react'; +import { OTPInput, OTPInputContext } from 'input-otp'; +import { MinusIcon } from 'lucide-react'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; function InputOTP({ className, containerClassName, ...props }: React.ComponentProps & { - containerClassName?: string + containerClassName?: string; }) { return ( - ) + ); } -function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) { +function InputOTPGroup({ className, ...props }: React.ComponentProps<'div'>) { return ( -
- ) +
+ ); } function InputOTPSlot({ index, className, ...props -}: React.ComponentProps<"div"> & { - index: number +}: React.ComponentProps<'div'> & { + index: number; }) { - const inputOTPContext = React.useContext(OTPInputContext) - const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {} + const inputOTPContext = React.useContext(OTPInputContext); + const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}; return (
@@ -63,15 +56,15 @@ function InputOTPSlot({
)}
- ) + ); } -function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) { +function InputOTPSeparator({ ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator } +export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }; diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx index d4dc14f..d3d8082 100644 --- a/src/components/ui/sidebar.tsx +++ b/src/components/ui/sidebar.tsx @@ -548,7 +548,7 @@ function SidebarMenuAction({ 'peer-data-[size=lg]/menu-button:top-2.5', 'group-data-[collapsible=icon]:hidden', showOnHover && - 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0', + 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0', className, )} {...props} diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx index 6a2b524..d15e20b 100644 --- a/src/components/ui/switch.tsx +++ b/src/components/ui/switch.tsx @@ -1,31 +1,28 @@ -"use client" +'use client'; -import * as React from "react" -import * as SwitchPrimitive from "@radix-ui/react-switch" +import * as React from 'react'; +import * as SwitchPrimitive from '@radix-ui/react-switch'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; -function Switch({ - className, - ...props -}: React.ComponentProps) { +function Switch({ className, ...props }: React.ComponentProps) { return ( - ) + ); } -export { Switch } +export { Switch }; diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx index 51b74dd..418ebdd 100644 --- a/src/components/ui/table.tsx +++ b/src/components/ui/table.tsx @@ -1,116 +1,92 @@ -"use client" +'use client'; -import * as React from "react" +import * as React from 'react'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; -function Table({ className, ...props }: React.ComponentProps<"table">) { +function Table({ className, ...props }: React.ComponentProps<'table'>) { return ( -
+
- ) + ); } -function TableHeader({ className, ...props }: React.ComponentProps<"thead">) { - return ( - - ) +function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) { + return ; } -function TableBody({ className, ...props }: React.ComponentProps<"tbody">) { +function TableBody({ className, ...props }: React.ComponentProps<'tbody'>) { return ( - ) + ); } -function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) { +function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) { return ( tr]:last:border-b-0", - className - )} + className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)} {...props} /> - ) + ); } -function TableRow({ className, ...props }: React.ComponentProps<"tr">) { +function TableRow({ className, ...props }: React.ComponentProps<'tr'>) { return ( - ) + ); } -function TableHead({ className, ...props }: React.ComponentProps<"th">) { +function TableHead({ className, ...props }: React.ComponentProps<'th'>) { return (
[role=checkbox]]:translate-y-[2px]", - className + 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]', + className, )} {...props} /> - ) + ); } -function TableCell({ className, ...props }: React.ComponentProps<"td">) { +function TableCell({ className, ...props }: React.ComponentProps<'td'>) { return ( [role=checkbox]]:translate-y-[2px]", - className + 'p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]', + className, )} {...props} /> - ) + ); } -function TableCaption({ - className, - ...props -}: React.ComponentProps<"caption">) { +function TableCaption({ className, ...props }: React.ComponentProps<'caption'>) { return (
- ) + ); } -export { - Table, - TableHeader, - TableBody, - TableFooter, - TableHead, - TableRow, - TableCell, - TableCaption, -} +export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }; diff --git a/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx index 125a8aa..3b03b5e 100644 --- a/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx +++ b/src/packages/administrativo/components/CCaixaServico/CCaixaServicoSelect.tsx @@ -1,97 +1,96 @@ 'use client'; -import React from "react"; -import { Button } from "@/components/ui/button"; +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; -import GetCapitalize from "@/shared/actions/text/GetCapitalize"; -import { useCCaixaServicoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook"; -import { CCaixaServicoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface"; + 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 { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { useCCaixaServicoReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/c_caixa_servico/useCCaixaServicoReadHook'; +import { CCaixaServicoReadInterface } from '@/app/(protected)/(cadastros)/cadastros/_interfaces/CCaixaServicoReadInterface'; export default function CCaixaServicoSelect({ sistema_id, field }: any) { + const cCaixaServicoReadParams: CCaixaServicoReadInterface = { sistema_id }; - const cCaixaServicoReadParams: CCaixaServicoReadInterface = { sistema_id }; - - const [open, setOpen] = React.useState(false); - const [isLoading, setIsLoading] = React.useState(false); - const { cCaixaServico, fetchCCaixaServico } = useCCaixaServicoReadHook(); - // Busca os dados uma única vez ao montar - React.useEffect(() => { - const loadData = async () => { - if (!cCaixaServico.length) { - setIsLoading(true); - await fetchCCaixaServico(cCaixaServicoReadParams); - setIsLoading(false); - } - }; - loadData(); - }, []); - const selected = cCaixaServico?.find( - (item) => String(item.caixa_servico_id) === String(field.value) - ); - return ( - - - - - - - - - - - - {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} - - - {cCaixaServico?.map((item) => ( - { - field.onChange(Number(item.caixa_servico_id)); // envia apenas o número - setOpen(false); - }} - > - - {GetCapitalize(item.descricao)} - - ))} - - - - - - ); + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { cCaixaServico, fetchCCaixaServico } = useCCaixaServicoReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!cCaixaServico.length) { + setIsLoading(true); + await fetchCCaixaServico(cCaixaServicoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = cCaixaServico?.find( + (item) => String(item.caixa_servico_id) === String(field.value), + ); + return ( + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + {cCaixaServico?.map((item) => ( + { + field.onChange(Number(item.caixa_servico_id)); // envia apenas o número + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); } diff --git a/src/packages/administrativo/components/GCidade/GCidadeForm.tsx b/src/packages/administrativo/components/GCidade/GCidadeForm.tsx index b455abc..c386a5e 100644 --- a/src/packages/administrativo/components/GCidade/GCidadeForm.tsx +++ b/src/packages/administrativo/components/GCidade/GCidadeForm.tsx @@ -35,7 +35,6 @@ import { useGUfReadHook } from '@/packages/administrativo/hooks/GUF/useGUfReadHo import { GCidadeSchema } from '../../schemas/GCidade/GCidadeSchema'; - // Hook responsável em trazer todos os estados brasileiros // Define o tipo do formulário com base no schema Zod diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx index 0b3df97..e073935 100644 --- a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx @@ -1,158 +1,156 @@ 'use client'; // Garante execução no cliente (Next.js App Router) -import React from "react"; -import { Button } from "@/components/ui/button"; +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; -import GetCapitalize from "@/shared/actions/text/GetCapitalize"; -import { useGEmolumentoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook"; -import { GEmolumentoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface"; - + 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 { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { useGEmolumentoReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/g_emolumento/useGEmolumentoReadHook'; +import { GEmolumentoReadInterface } from '@/app/(protected)/(cadastros)/cadastros/_interfaces/GEmolumentoReadInterface'; // Tipagem das props do componente interface GEmolumentoSelectProps { - sistema_id: number; // ID do sistema usado para buscar os emolumentos - field: any; // Objeto de controle do react-hook-form - onSelectChange?: (emolumento: { key: number; value: string }) => void; // Função callback opcional para disparar eventos externos - className?: string; // Classe CSS opcional para customização + sistema_id: number; // ID do sistema usado para buscar os emolumentos + field: any; // Objeto de controle do react-hook-form + onSelectChange?: (emolumento: { key: number; value: string }) => void; // Função callback opcional para disparar eventos externos + className?: string; // Classe CSS opcional para customização } - // Componente principal do select de emolumentos -export default function GEmolumentoSelect({ sistema_id, field, onSelectChange, className }: GEmolumentoSelectProps) { +export default function GEmolumentoSelect({ + sistema_id, + field, + onSelectChange, + className, +}: GEmolumentoSelectProps) { + // Define parâmetros de leitura para o hook que busca os emolumentos + const gEmolumentoReadParams: GEmolumentoReadInterface = { sistema_id }; - // Define parâmetros de leitura para o hook que busca os emolumentos - const gEmolumentoReadParams: GEmolumentoReadInterface = { sistema_id }; + // Estados locais do componente + const [open, setOpen] = React.useState(false); // Controla abertura do popover + const [isLoading, setIsLoading] = React.useState(false); // Exibe “Carregando...” enquanto busca dados - // Estados locais do componente - const [open, setOpen] = React.useState(false); // Controla abertura do popover - const [isLoading, setIsLoading] = React.useState(false); // Exibe “Carregando...” enquanto busca dados + // Hook responsável por buscar emolumentos no backend + const { gEmolumento, fetchGEmolumento } = useGEmolumentoReadHook(); - // Hook responsável por buscar emolumentos no backend - const { gEmolumento, fetchGEmolumento } = useGEmolumentoReadHook(); + // Carrega os dados de emolumentos apenas uma vez ao montar o componente + React.useEffect(() => { + const loadData = async () => { + if (!gEmolumento.length) { + setIsLoading(true); + await fetchGEmolumento(gEmolumentoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); // ← executa apenas uma vez - // Carrega os dados de emolumentos apenas uma vez ao montar o componente - React.useEffect(() => { - const loadData = async () => { - if (!gEmolumento.length) { - setIsLoading(true); - await fetchGEmolumento(gEmolumentoReadParams); - setIsLoading(false); - } - }; - loadData(); - }, []); // ← executa apenas uma vez + // Obtém o item selecionado com base no valor atual do campo + const selected = gEmolumento?.find( + (item) => Number(item.emolumento_id) === Number(field.value ?? 0), + ); + // Estrutura visual do componente + return ( + + {/* === Botão principal (exibe valor selecionado) === */} + + + + + + {/* === Conteúdo do Popover (lista de opções) === */} + + + {/* Campo de busca dentro do popover */} + - // Estrutura visual do componente - return ( - - {/* === Botão principal (exibe valor selecionado) === */} - - - - - + + {/* Estado vazio ou carregando */} + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + - {/* === Conteúdo do Popover (lista de opções) === */} - - - {/* Campo de busca dentro do popover */} - + {/* Grupo de opções */} + + {gEmolumento?.map((item) => ( + { + // Cria objeto com ID e descrição + const selectedValue = { + key: Number(item.emolumento_id), + value: item.descricao, + }; - - {/* Estado vazio ou carregando */} - - {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} - + // Atualiza o valor no react-hook-form com o ID numérico + field.onChange(Number(item.emolumento_id ?? 0)); - {/* Grupo de opções */} - - {gEmolumento?.map((item) => ( - { - // Cria objeto com ID e descrição - const selectedValue = { - key: Number(item.emolumento_id), - value: item.descricao, - }; + // Dispara callback externo, se existir (mantém o objeto completo) + if (onSelectChange) + onSelectChange({ + key: Number(item.emolumento_id), + value: item.descricao, + }); - // Atualiza o valor no react-hook-form com o ID numérico - field.onChange(Number(item.emolumento_id ?? 0)); - - // Dispara callback externo, se existir (mantém o objeto completo) - if (onSelectChange) - onSelectChange({ - key: Number(item.emolumento_id), - value: item.descricao, - }); - - // Fecha o popover - setOpen(false); - }} - - > - {/* Ícone de seleção (check) */} - - {/* Nome formatado do emolumento */} - {GetCapitalize(item.descricao)} - - ))} - - - - - - ); + // Fecha o popover + setOpen(false); + }} + > + {/* Ícone de seleção (check) */} + + {/* Nome formatado do emolumento */} + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); } diff --git a/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx index e6c6058..4720476 100644 --- a/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx +++ b/src/packages/administrativo/components/GMarcacaoTipo/GMarcacaoTipoSelect.tsx @@ -1,102 +1,101 @@ 'use client'; -import React from "react"; -import { Button } from "@/components/ui/button"; +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; -import GetCapitalize from "@/shared/actions/text/GetCapitalize"; -import { useGMarcacaoTipoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook"; -import { GMarcacaoTipoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface"; + 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 { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { useGMarcacaoTipoReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/g_marcacao_tipo/useGMarcacaoTipoReadHook'; +import { GMarcacaoTipoReadInterface } from '@/app/(protected)/(cadastros)/cadastros/_interfaces/GMarcacaoTipoReadInterface'; export default function GMarcacaoTipoSelect({ grupo, sistema_id, situacao, field }: any) { + const gMarcacaoTipoReadParams: GMarcacaoTipoReadInterface = { grupo, sistema_id, situacao }; - const gMarcacaoTipoReadParams: GMarcacaoTipoReadInterface = { grupo, sistema_id, situacao }; - - const [open, setOpen] = React.useState(false); - const [isLoading, setIsLoading] = React.useState(false); - const { gMarcacaoTipo, fetchGMarcacaoTipo } = useGMarcacaoTipoReadHook(); - // Busca os dados uma única vez ao montar - React.useEffect(() => { - const loadData = async () => { - if (!gMarcacaoTipo.length) { - setIsLoading(true); - await fetchGMarcacaoTipo(gMarcacaoTipoReadParams); - setIsLoading(false); - } - }; - loadData(); - }, []); - const selected = gMarcacaoTipo?.find( - (item) => String(item.marcacao_tipo_id) === String(field.value) - ); - return ( - - - - - - - - - - - - {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} - - - {gMarcacaoTipo?.map((item) => ( - { - field.onChange({ - key: Number(item.marcacao_tipo_id), - value: item.descricao, - }); - setOpen(false); - }} - > - - {GetCapitalize(item.descricao)} - - ))} - - - - - - ); + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { gMarcacaoTipo, fetchGMarcacaoTipo } = useGMarcacaoTipoReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!gMarcacaoTipo.length) { + setIsLoading(true); + await fetchGMarcacaoTipo(gMarcacaoTipoReadParams); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = gMarcacaoTipo?.find( + (item) => String(item.marcacao_tipo_id) === String(field.value), + ); + return ( + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + {gMarcacaoTipo?.map((item) => ( + { + field.onChange({ + key: Number(item.marcacao_tipo_id), + value: item.descricao, + }); + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); } diff --git a/src/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex.tsx b/src/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex.tsx index 9d04acf..ac1fce7 100644 --- a/src/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex.tsx +++ b/src/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex.tsx @@ -17,7 +17,6 @@ import { useGMedidaTipoRemoveHook } from '../../hooks/GMedidaTipo/useGMedidaTipo import { useGMedidaTipoSaveHook } from '../../hooks/GMedidaTipo/useGMedidaTipoSaveHook'; import { GMedidaTipoInterface } from '../../interfaces/GMedidaTipo/GMedidaTipoInterface'; - const initialMedidaTipo: GMedidaTipoInterface = { medida_tipo_id: 0, sigla: '', diff --git a/src/packages/administrativo/components/GNatureza/GNaturezaIndex.tsx b/src/packages/administrativo/components/GNatureza/GNaturezaIndex.tsx index 55940a9..195da05 100644 --- a/src/packages/administrativo/components/GNatureza/GNaturezaIndex.tsx +++ b/src/packages/administrativo/components/GNatureza/GNaturezaIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useGNaturezaDeleteHook } from '@/packages/administrativo/hooks/GNatureza/useGNaturezaDeleteHook'; import { useGNaturezaIndexHook } from '@/packages/administrativo/hooks/GNatureza/useGNaturezaIndexHook'; import { useGNaturezaSaveHook } from '@/packages/administrativo/hooks/GNatureza/useGNaturezaSaveHook'; diff --git a/src/packages/administrativo/components/GTBBairro/GTBBairroIndex.tsx b/src/packages/administrativo/components/GTBBairro/GTBBairroIndex.tsx index 5a6528a..5fb9e13 100644 --- a/src/packages/administrativo/components/GTBBairro/GTBBairroIndex.tsx +++ b/src/packages/administrativo/components/GTBBairro/GTBBairroIndex.tsx @@ -17,7 +17,6 @@ import GTBBairroForm from './GTBBairroForm'; import GTBBairroTable from './GTBBairroTable'; import { GTBBairroInterface } from '../../interfaces/GTBBairro/GTBBairroInterface'; - const initialBairro: GTBBairroInterface = { sistema_id: null, tb_bairro_id: 0, diff --git a/src/packages/administrativo/components/GTBBairro/GTBBairroTable.tsx b/src/packages/administrativo/components/GTBBairro/GTBBairroTable.tsx index c4f3454..bc215ed 100644 --- a/src/packages/administrativo/components/GTBBairro/GTBBairroTable.tsx +++ b/src/packages/administrativo/components/GTBBairro/GTBBairroTable.tsx @@ -23,7 +23,6 @@ import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; import { GTBBairroInterface } from '../../interfaces/GTBBairro/GTBBairroInterface'; - interface GTBBairroTableProps { data: GTBBairroInterface[]; onEdit: (item: GTBBairroInterface, isEditingFormStatus: boolean) => void; diff --git a/src/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex.tsx b/src/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex.tsx index 2ea7bc3..92d092a 100644 --- a/src/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex.tsx +++ b/src/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex.tsx @@ -16,7 +16,6 @@ import { useGTBEstadoCivilRemoveHook } from '../../hooks/GTBEstadoCivil/useGTBEs import { useGTBEstadoCivilSaveHook } from '../../hooks/GTBEstadoCivil/useGTBEstadoCivilSaveHook'; import { GTBEstadoCivilInterface } from '../../interfaces/GTBEstadoCivil/GTBEstadoCivilInterface'; - const initalEstadoCivil: GTBEstadoCivilInterface = { tb_estadocivil_id: 0, sistema_id: 0, diff --git a/src/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensForm.tsx b/src/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensForm.tsx index 5808300..eed693a 100644 --- a/src/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensForm.tsx +++ b/src/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensForm.tsx @@ -28,7 +28,6 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { GTBRegimeBensSchema } from '@/packages/administrativo/schemas/GTBRegimeBens/GTBRegimeBensSchema'; - type FormValues = z.infer; interface Props { diff --git a/src/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex.tsx b/src/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex.tsx index 547cdc1..b33e312 100644 --- a/src/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex.tsx +++ b/src/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex.tsx @@ -15,7 +15,6 @@ import { useGTBRegimeComunhaoRemoveHook } from '../../hooks/GTBRegimeComunhao/us import { useGTBRegimeComunhaoSaveHook } from '../../hooks/GTBRegimeComunhao/useGTBRegimeComunhaoSaveHook'; import GTBRegimeComunhaoInterface from '../../interfaces/GTBRegimeComunhao/GTBRegimeComunhaoInterface'; - export default function GTBRegimeComunhaoIndex() { // Hooks para leitura e salvamento const { gTBRegimeComunhao, fetchGTBRegimeComunhao } = useGTBRegimeComunhaoReadHook(); diff --git a/src/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex.tsx b/src/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex.tsx index 72f790d..228ed26 100644 --- a/src/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex.tsx +++ b/src/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex.tsx @@ -16,7 +16,6 @@ import { useGTBTipoLogradouroRemoveHook } from '../../hooks/GTBTipoLogradouro/us import { useGTBTipoLogradouroSaveHook } from '../../hooks/GTBTipoLogradouro/useGTBTipoLogradouroSaveHook'; import { GTBTipoLogradouroInterface } from '../../interfaces/GTBTipoLogradouro/GTBTipoLogradouroInterface'; - export default function GTBTipoLogradouroIndex() { // Controle de exibição de respostas const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex.tsx b/src/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex.tsx index 5ef0c11..aeb6ebe 100644 --- a/src/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex.tsx +++ b/src/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useTAtoParteTipoDeleteHook } from '@/packages/administrativo/hooks/TAtoParteTipo/useTAtoParteTipoDeleteHook'; import { useTAtoParteTipoIndexHook } from '@/packages/administrativo/hooks/TAtoParteTipo/useTAtoParteTipoIndexHook'; import { useTAtoParteTipoSaveHook } from '@/packages/administrativo/hooks/TAtoParteTipo/useTAtoParteTipoSaveHook'; diff --git a/src/packages/administrativo/components/TCensec/TCensecIndex.tsx b/src/packages/administrativo/components/TCensec/TCensecIndex.tsx index 3074935..2e4a0d6 100644 --- a/src/packages/administrativo/components/TCensec/TCensecIndex.tsx +++ b/src/packages/administrativo/components/TCensec/TCensecIndex.tsx @@ -15,7 +15,6 @@ import { useTCensecReadHook } from '../../hooks/TCensec/useTCensecReadHook'; import { useTCensecSaveHook } from '../../hooks/TCensec/useTCensecSaveHook'; import TCensecInterface from '../../interfaces/TCensec/TCensecInterface'; - export default function TCensecIndex() { // Controle de estado do botão const [buttonIsLoading, setButtonIsLoading] = useState(false); diff --git a/src/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex.tsx b/src/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex.tsx index 2b251a2..6c46a87 100644 --- a/src/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex.tsx +++ b/src/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex.tsx @@ -17,7 +17,6 @@ import TCensecNaturezaLitigioForm from './TCensecNaturezaLitigioForm'; import TCensecNaturezaLitigioTable from './TCensecNaturezaLitigioTable'; import { TCensecNaturezaLitigioInterface } from '../../interfaces/TCensecNaturezaLitigio/TCensecNaturezaLitigioInterface'; - const initialCensecNaturezaLitigio: TCensecNaturezaLitigioInterface = { censec_naturezalitigio_id: 0, descricao: '', diff --git a/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeForm.tsx b/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeForm.tsx index 2c07e31..3d17091 100644 --- a/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeForm.tsx +++ b/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeForm.tsx @@ -29,7 +29,6 @@ import SituacoesSelect from '@/shared/components/situacoes/SituacoesSelect'; import { useTCensecQualidadeFormHook } from '../../hooks/TCensecQualidade/useTCensecQualidadeHook'; import { TCensecQualidadeFormInterface } from '../../interfaces/TCensecQualidade/TCensecQualidadeFormInterface'; - export default function TCensecQualidadeForm({ isOpen, data, diff --git a/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex.tsx b/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex.tsx index 85f6b4d..bdeb86e 100644 --- a/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex.tsx +++ b/src/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useTCensecQualidadeDeleteHook } from '@/packages/administrativo/hooks/TCensecQualidade/useTCensecQualidadeDeleteHook'; import { useTCensecQualidadeIndexHook } from '@/packages/administrativo/hooks/TCensecQualidade/useTCensecQualidadeIndexHook'; import { useTCensecQualidadeSaveHook } from '@/packages/administrativo/hooks/TCensecQualidade/useTCensecQualidadeSaveHook'; diff --git a/src/packages/administrativo/components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx b/src/packages/administrativo/components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx index 0ffafbd..3e46dbe 100644 --- a/src/packages/administrativo/components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx +++ b/src/packages/administrativo/components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useState, useCallback } from 'react'; - import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import Header from '@/shared/components/structure/Header'; diff --git a/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoForm.tsx b/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoForm.tsx index 1e6761f..8158703 100644 --- a/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoForm.tsx +++ b/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoForm.tsx @@ -41,7 +41,6 @@ import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; import TCensecInterface from '../../interfaces/TCensec/TCensecInterface'; import { TCensecTipoAtoSchema } from '../../schemas/TCensecTipoAto/TCensecTipoAtoSchema'; - type FormValues = z.infer; interface TCensecTipoAtoFormProps { diff --git a/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex.tsx b/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex.tsx index 70a3f57..9fdaa6a 100644 --- a/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex.tsx +++ b/src/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex.tsx @@ -17,7 +17,6 @@ import { useTCensecTipoAtoRemoveHook } from '../../hooks/TCensecTipoAto/useTCens import { useTCensecTipoAtoSaveHook } from '../../hooks/TCensecTipoAto/useTCensecTipoAtoSaveHook'; import { TCensecTipoAtoInterface } from '../../interfaces/TCensecTipoAto/TCensecTipoAtoInterface'; - // Estado inicial para criação const initialTCensecTipoAto: TCensecTipoAtoInterface = { censec_tipoato_id: 0, diff --git a/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaForm.tsx b/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaForm.tsx index f3950fe..91b5514 100644 --- a/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaForm.tsx +++ b/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaForm.tsx @@ -32,7 +32,6 @@ import { useTCensecTipoNaturezaFormHook } from '../../hooks/TCensecTipoNatureza/ import { TCensecTipoNaturezaFormInterface } from '../../interfaces/TCensecTipoNatureza/TCensecTipoNaturezaFormInterface'; import TCensecTipoAtoSelect from '../TCensecTipoAto/TCensecTipoAtoSelect'; - export default function TCensecTipoNaturezaForm({ isOpen, data, diff --git a/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex.tsx b/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex.tsx index 53ff874..795d8a2 100644 --- a/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex.tsx +++ b/src/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useTCensecTipoNaturezaDeleteHook } from '@/packages/administrativo/hooks/TCensecTipoNatureza/useTCensecTipoNaturezaDeleteHook'; import { useTCensecTipoNaturezaIndexHook } from '@/packages/administrativo/hooks/TCensecTipoNatureza/useTCensecTipoNaturezaIndexHook'; import { useTCensecTipoNaturezaSaveHook } from '@/packages/administrativo/hooks/TCensecTipoNatureza/useTCensecTipoNaturezaSaveHook'; diff --git a/src/packages/administrativo/components/TImovel/TImovelForm.tsx b/src/packages/administrativo/components/TImovel/TImovelForm.tsx index 4e45508..66e9d61 100644 --- a/src/packages/administrativo/components/TImovel/TImovelForm.tsx +++ b/src/packages/administrativo/components/TImovel/TImovelForm.tsx @@ -34,8 +34,6 @@ import GTBBairroSelect from '../GTBBairro/GTBBairroSelect'; import TImovelUnidadeRuralIndex from '../TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex'; import TImovelUnidadeUrbanoPage from '../TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex'; - - export default function TImovelForm({ isOpen, data, diff --git a/src/packages/administrativo/components/TImovel/TImovelIndex.tsx b/src/packages/administrativo/components/TImovel/TImovelIndex.tsx index bf6b260..73ccb35 100644 --- a/src/packages/administrativo/components/TImovel/TImovelIndex.tsx +++ b/src/packages/administrativo/components/TImovel/TImovelIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useTImovelDeleteHook } from '@/packages/administrativo/hooks/TImovel/useTImovelDeleteHook'; import { useTImovelIndexHook } from '@/packages/administrativo/hooks/TImovel/useTImovelIndexHook'; import { useTImovelSaveHook } from '@/packages/administrativo/hooks/TImovel/useTImovelSaveHook'; diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx index 386ede0..3eeaeeb 100644 --- a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx @@ -2,7 +2,6 @@ import { useEffect, useState, useCallback } from 'react'; - import { useTImovelUnidadeRuralDeleteHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook'; import { useTImovelUnidadeRuralIndexHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralIndexHook'; import { useTImovelUnidadeRuralSaveHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook'; diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx index 3513ba1..9257ead 100644 --- a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx @@ -14,7 +14,6 @@ import Header from '@/shared/components/structure/Header'; import TImovelUnidadeUrbanoForm from './TImovelUnidadeUrbanoForm'; import TImovelUnidadeUrbanoTable from './TImovelUnidadeUrbanoTable'; - export default function TImovelUnidadeUrbanoPage({ imovel_id }: TImovelUnidadePageInterface) { const TImovelUnidadePage: TImovelUnidadePageInterface = { imovel_id: imovel_id, diff --git a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx index c67bee5..d8a5d6d 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx @@ -17,7 +17,6 @@ import { FormatPhone } from '@/shared/actions/phone/FormatPhone'; import GetNameInitials from '@/shared/actions/text/GetNameInitials'; import empty from '@/shared/actions/validations/empty'; - /** * Função para criar a definição das colunas da tabela */ diff --git a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx index 10bfff3..50c5aab 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx @@ -42,7 +42,6 @@ import { Sexo } from '@/shared/enums/SexoEnum'; import { useGTBEstadoCivilReadHook } from '../../../hooks/GTBEstadoCivil/useGTBEstadoCivilReadHook'; - import { useGTBRegimeComunhaoReadHook } from '../../../hooks/GTBRegimeComunhao/useGTBRegimeComunhaoReadHook'; import { useTPessoaFisicaFormHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaFormHook'; diff --git a/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaColumns.tsx b/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaColumns.tsx index fe9e0a8..f999158 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaColumns.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaColumns.tsx @@ -16,7 +16,6 @@ import { FormatDateTime } from '@/shared/actions/dateTime/FormatDateTime'; import { FormatPhone } from '@/shared/actions/phone/FormatPhone'; import empty from '@/shared/actions/validations/empty'; - export default function TPessoaJuridicaColumns( onEdit: (item: TPessoaJuridicaInterface, isEditingFormStatus: boolean) => void, onDelete: (item: TPessoaJuridicaInterface, isEditingFormStatus: boolean) => void, diff --git a/src/packages/administrativo/components/TPessoaRepresentante/TPessoaRepresentanteIndex.tsx b/src/packages/administrativo/components/TPessoaRepresentante/TPessoaRepresentanteIndex.tsx index 5669279..4dfed26 100644 --- a/src/packages/administrativo/components/TPessoaRepresentante/TPessoaRepresentanteIndex.tsx +++ b/src/packages/administrativo/components/TPessoaRepresentante/TPessoaRepresentanteIndex.tsx @@ -2,8 +2,6 @@ import React, { useEffect, useState, useCallback } from 'react'; - - import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import Loading from '@/shared/components/loading/loading'; diff --git a/src/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex.tsx b/src/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex.tsx index 098b71d..a28f781 100644 --- a/src/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex.tsx +++ b/src/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex.tsx @@ -15,7 +15,6 @@ import TTBAndamentoServicoForm from './TTBAndamentoServicoForm'; import TTBAndamentoServicoTable from './TTBAndamentoServicoTable'; import TTBAndamentoServicoInterface from '../../interfaces/TTBAndamentoServico/TTBAndamentoServicoInterface'; - export default function TTBAndamentoServicoIndex() { // Hooks para leitura e salvamento const { tTBAndamentosServicos, fetchTTBAndamentoServico } = useTTBAndamentoServicoReadHook(); diff --git a/src/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect.tsx b/src/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect.tsx index cb77454..1a00275 100644 --- a/src/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect.tsx +++ b/src/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoSelect.tsx @@ -1,95 +1,94 @@ 'use client'; -import React from "react"; -import { Button } from "@/components/ui/button"; +import React 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 { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; -import GetCapitalize from "@/shared/actions/text/GetCapitalize"; -import { useTTBReconhecimentoTipoReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook"; -import { TTBREconhecimentoTipoReadInterface } from "@/app/(protected)/(cadastros)/cadastros/_interfaces/TTBREconhecimentoTipoReadInterface"; + 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 { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { useTTBReconhecimentoTipoReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook'; +import { TTBREconhecimentoTipoReadInterface } from '@/app/(protected)/(cadastros)/cadastros/_interfaces/TTBREconhecimentoTipoReadInterface'; export default function TTBReconhecimentoTipoSelect({ field }: any) { - - const [open, setOpen] = React.useState(false); - const [isLoading, setIsLoading] = React.useState(false); - const { tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo } = useTTBReconhecimentoTipoReadHook(); - // Busca os dados uma única vez ao montar - React.useEffect(() => { - const loadData = async () => { - if (!tTBReconhecimentoTipo.length) { - setIsLoading(true); - await fetchTTBReconhecimentoTipo(); - setIsLoading(false); - } - }; - loadData(); - }, []); - const selected = tTBReconhecimentoTipo?.find( - (item) => Number(item.tb_reconhecimentotipo_id) === Number(field.value) - ); - return ( - - - - - - - - - - - - {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} - - - {tTBReconhecimentoTipo?.map((item) => ( - { - field.onChange(Number(item.tb_reconhecimentotipo_id)); // envia apenas o número - setOpen(false); - }} - > - - {GetCapitalize(item.descricao)} - - ))} - - - - - - ); + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo } = useTTBReconhecimentoTipoReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!tTBReconhecimentoTipo.length) { + setIsLoading(true); + await fetchTTBReconhecimentoTipo(); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = tTBReconhecimentoTipo?.find( + (item) => Number(item.tb_reconhecimentotipo_id) === Number(field.value), + ); + return ( + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + {tTBReconhecimentoTipo?.map((item) => ( + { + field.onChange(Number(item.tb_reconhecimentotipo_id)); // envia apenas o número + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); } diff --git a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook.ts b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook.ts index d37c636..c548209 100644 --- a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook.ts +++ b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook.ts @@ -4,7 +4,6 @@ import { TImovelUnidadeRuralInterface } from '@/packages/administrativo/interfac import { TImovelUnidadeRuralDeleteService } from '@/packages/administrativo/services/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralDeleteService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTImovelUnidadeRuralDeleteHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook.ts b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook.ts index f0cdc8e..a41410f 100644 --- a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook.ts +++ b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook.ts @@ -6,7 +6,6 @@ import { TImovelUnidadeRuralInterface } from '@/packages/administrativo/interfac import { TImovelUnidadeRuralSaveService } from '@/packages/administrativo/services/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralSaveService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTImovelUnidadeRuralSaveHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoDeleteHook.ts b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoDeleteHook.ts index 5a3fd63..fc40c13 100644 --- a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoDeleteHook.ts +++ b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoDeleteHook.ts @@ -4,7 +4,6 @@ import { TImovelUnidadeUrbanoInterface } from '@/packages/administrativo/interfa import { TImovelUnidadeUrbanoDeleteService } from '@/packages/administrativo/services/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoDeleteService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTImovelUnidadeUrbanoDeleteHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoSaveHook.ts b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoSaveHook.ts index 6d95c79..a4ae9a7 100644 --- a/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoSaveHook.ts +++ b/src/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoSaveHook.ts @@ -6,7 +6,6 @@ import { TImovelUnidadeUrbanoInterface } from '@/packages/administrativo/interfa import { TImovelUnidadeUrbanoSaveService } from '@/packages/administrativo/services/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoSaveService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTImovelUnidadeUrbanoSaveHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaIndexHook.ts b/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaIndexHook.ts index 4b6e609..feb748a 100644 --- a/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaIndexHook.ts +++ b/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaIndexHook.ts @@ -4,7 +4,6 @@ import TPessoaFisicaInterface from '@/packages/administrativo/interfaces/TPessoa import { TPessoaFisicaIndexService } from '@/packages/administrativo/services/TPessoa/TPessoaFisica/TPessoaFisicaIndexService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTPessoaFisicaIndexHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaSaveHook.ts b/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaSaveHook.ts index 3ca7682..8c93098 100644 --- a/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaSaveHook.ts +++ b/src/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaSaveHook.ts @@ -6,7 +6,6 @@ import TPessoaFisicaInterface from '@/packages/administrativo/interfaces/TPessoa import { TPessoaFisicaSaveService } from '@/packages/administrativo/services/TPessoa/TPessoaFisica/TPessoaFisicaSaveService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTPessoaFisicaSaveHook = () => { const { setResponse } = useResponse(); diff --git a/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaIndexHook.ts b/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaIndexHook.ts index e612185..90b4b07 100644 --- a/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaIndexHook.ts +++ b/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaIndexHook.ts @@ -4,7 +4,6 @@ import TPessoaJuridicaInterface from '@/packages/administrativo/interfaces/TPess import { TPessoaJuridicaIndexService } from '@/packages/administrativo/services/TPessoa/TPessoaJuridica/TPessoaJuridicaIndexService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTPessoaJuridicaIndexHook = () => { const { setResponse } = useResponse(); const [tPessoaJuridica, setPessoaJuridica] = useState([]); diff --git a/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaSaveHook.ts b/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaSaveHook.ts index 0c90c86..9048c24 100644 --- a/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaSaveHook.ts +++ b/src/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaSaveHook.ts @@ -6,7 +6,6 @@ import TPessoaJuridicaInterface from '@/packages/administrativo/interfaces/TPess import { TPessoaJuridicaSaveService } from '@/packages/administrativo/services/TPessoa/TPessoaJuridica/TPessoaJuridicaSaveService'; import { useResponse } from '@/shared/components/response/ResponseContext'; - export const useTPessoaJuridicaSaveHook = () => { const { setResponse } = useResponse(); diff --git a/src/shared/actions/api/buildQueryString.ts b/src/shared/actions/api/buildQueryString.ts index 37293fe..7f05445 100644 --- a/src/shared/actions/api/buildQueryString.ts +++ b/src/shared/actions/api/buildQueryString.ts @@ -11,4 +11,4 @@ export function buildQueryString(params: Record): string { .join('&'); return query ? `?${query}` : ''; -} \ No newline at end of file +} diff --git a/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx b/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx index 47c3a0d..701e953 100644 --- a/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx +++ b/src/shared/components/categoriaServicoSelect/CategoriaServicoSelect.tsx @@ -1,87 +1,85 @@ -import { Button } from "@/components/ui/button"; +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import React 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 { CategoriaServicoEnum } from "@/shared/enums/CategoriaServicoEnum"; -import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; -import React from "react"; + 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 { CategoriaServicoEnum } from '@/shared/enums/CategoriaServicoEnum'; type CategoriaServicoSelectProps = { - field: { - value?: string | null; - onChange: (value: string) => void; - }; + field: { + value?: string | null; + onChange: (value: string) => void; + }; }; export default function CategoriaServicoSelect({ field }: CategoriaServicoSelectProps) { - const [open, setOpen] = React.useState(false); + const [open, setOpen] = React.useState(false); - // Cria as opções a partir do enum - const options = Object.entries(CategoriaServicoEnum).map(([key, label]) => ({ - value: String(key), - label, - })); + // Cria as opções a partir do enum + const options = Object.entries(CategoriaServicoEnum).map(([key, label]) => ({ + value: String(key), + label, + })); - const selectedLabel = - field.value != null - ? options.find((o) => o.value === String(field.value))?.label ?? "Selecione..." - : "Selecione..."; + const selectedLabel = + field.value != null + ? (options.find((o) => o.value === String(field.value))?.label ?? 'Selecione...') + : 'Selecione...'; - return ( - - - - - - - - - - - Nenhum resultado encontrado. - - {options.map((item) => ( - { - field.onChange(item.value); // envia número - setOpen(false); - }} - > - - {item.label} - - ))} - - - - - - ); + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); // envia número + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); } diff --git a/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx b/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx index 2b8255f..706bab2 100644 --- a/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx +++ b/src/shared/components/confirmacao/ConfirmacaoCheckBox.tsx @@ -1,5 +1,5 @@ -import { FormControl, FormField, FormItem, FormLabel } from "@/components/ui/form"; -import { Checkbox } from "@/components/ui/checkbox"; +import { Checkbox } from '@/components/ui/checkbox'; +import { FormControl, FormField, FormItem, FormLabel } from '@/components/ui/form'; interface ConfirmacaoCheckBoxProps { name: string; @@ -13,14 +13,14 @@ export function ConfirmacaoCheckBox({ name, label, control }: ConfirmacaoCheckBo control={control} name={name} render={({ field }) => ( - + field.onChange(checked ? "S" : "N")} + checked={field.value === 'S'} + onCheckedChange={(checked) => field.onChange(checked ? 'S' : 'N')} /> - {label} + {label} )} /> diff --git a/src/shared/components/confirmacao/ConfirmacaoSelect.tsx b/src/shared/components/confirmacao/ConfirmacaoSelect.tsx index 363f07a..686affd 100644 --- a/src/shared/components/confirmacao/ConfirmacaoSelect.tsx +++ b/src/shared/components/confirmacao/ConfirmacaoSelect.tsx @@ -31,16 +31,16 @@ export default function ConfirmacaoSelect({ field }: any) { variant="outline" role="combobox" aria-expanded={open} - className="justify-between cursor-pointer" + className="cursor-pointer justify-between" > {field.value ? options.find((item) => item.value === field.value)?.label : 'Selecione...'} - + - + diff --git a/src/shared/components/dataTable/DataTable.tsx b/src/shared/components/dataTable/DataTable.tsx index 44e8baa..f99c703 100644 --- a/src/shared/components/dataTable/DataTable.tsx +++ b/src/shared/components/dataTable/DataTable.tsx @@ -33,7 +33,6 @@ import { TableRow, } from '@/components/ui/table'; - import DataTableInterface from './interfaces/DataTableInterface'; export function DataTable({ diff --git a/src/shared/components/numericInputField/NumericInputField.tsx b/src/shared/components/numericInputField/NumericInputField.tsx index b136ee4..5df99e0 100644 --- a/src/shared/components/numericInputField/NumericInputField.tsx +++ b/src/shared/components/numericInputField/NumericInputField.tsx @@ -1,15 +1,10 @@ -"use client"; +'use client'; -import React from "react"; -import { Control, FieldValues, Path } from "react-hook-form"; -import { - FormField, - FormItem, - FormLabel, - FormControl, - FormMessage, -} from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; +import React from 'react'; +import { Control, FieldValues, Path } from 'react-hook-form'; + +import { FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; interface NumericInputFieldProps { control: Control; @@ -24,8 +19,8 @@ interface NumericInputFieldProps { export function NumericInputField({ control, name, - label = "Número", - placeholder = "Digite um número", + label = 'Número', + placeholder = 'Digite um número', disabled = false, min, max, @@ -43,13 +38,13 @@ export function NumericInputField({ {...field} type="text" disabled={disabled} - value={field.value ?? ""} + value={field.value ?? ''} placeholder={placeholder} inputMode="numeric" pattern="[0-9]*" onChange={(e) => { // Mantém apenas números - let value = e.target.value.replace(/[^0-9]/g, ""); + let value = e.target.value.replace(/[^0-9]/g, ''); // Limita faixa, se definido if (min !== undefined && Number(value) < min) value = String(min); diff --git a/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx b/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx index dabe9fd..abbd70b 100644 --- a/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx +++ b/src/shared/components/tipoPessoa/tipoPessoaSelect.tsx @@ -1,21 +1,16 @@ -"use client"; +'use client'; -import React from "react"; -import { Control, FieldValues, Path } from "react-hook-form"; -import { - FormField, - FormItem, - FormLabel, - FormControl, - FormMessage, -} from "@/components/ui/form"; +import React from 'react'; +import { Control, FieldValues, Path } from 'react-hook-form'; + +import { FormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form'; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, -} from "@/components/ui/select"; +} from '@/components/ui/select'; interface PessoaTipoSelectProps { control: Control; @@ -28,9 +23,9 @@ interface PessoaTipoSelectProps { export function TipoPessoaSelect({ control, name, - label = "Pessoa", + label = 'Pessoa', disabled = false, - placeholder = "Selecione uma opção", + placeholder = 'Selecione uma opção', }: PessoaTipoSelectProps) { return ( ({ render={({ field }) => ( {label && {label}} - diff --git a/src/shared/enums/CategoriaServicoEnum.ts b/src/shared/enums/CategoriaServicoEnum.ts index 224a0bf..4781296 100644 --- a/src/shared/enums/CategoriaServicoEnum.ts +++ b/src/shared/enums/CategoriaServicoEnum.ts @@ -1,7 +1,7 @@ export const CategoriaServicoEnum = { - A: 'Autenticação', - C: 'Certidão', - G: 'Serviços Gerais', - R: 'Reconhecimento', - B: 'Geral', -} as const; \ No newline at end of file + A: 'Autenticação', + C: 'Certidão', + G: 'Serviços Gerais', + R: 'Reconhecimento', + B: 'Geral', +} as const; diff --git a/src/shared/hooks/auth/useGUsuarioGetJWTHook.ts b/src/shared/hooks/auth/useGUsuarioGetJWTHook.ts index 9ed3ef1..42a7e2b 100644 --- a/src/shared/hooks/auth/useGUsuarioGetJWTHook.ts +++ b/src/shared/hooks/auth/useGUsuarioGetJWTHook.ts @@ -3,7 +3,6 @@ import { jwtDecode } from 'jwt-decode'; import { useEffect, useState } from 'react'; - import GetSigla from '@/shared/actions/text/GetSigla'; import GUsuarioAuthenticatedInterface from '@/shared/interfaces/GUsuarioAuthenticatedInterface';