From bb64d1fa5c2933bc03baea8a35cbf35e7a3e548b Mon Sep 17 00:00:00 2001 From: keven Date: Mon, 13 Oct 2025 15:24:26 -0300 Subject: [PATCH] [MVPTN-90] feat(CRUD): Adiciona os endpoints para vinculadar qualidades ao ato --- .../censec-tipoato/page.tsx | 43 +-- .../TCensecQualidadeAtoForm.tsx | 119 +++++++ .../TCensecQualidadeAtoIndex.tsx | 138 ++++++++ .../TCensecQualidadeAtoTable.tsx | 99 ++++++ .../t_censec_tipoato/TCensecTipoAtoForm.tsx | 325 ++++++++++-------- .../t_censec_tipoato/TCensecTipoAtoTable.tsx | 119 +++---- .../TCensecQualidadeAtoIndexData.ts | 21 ++ .../TCensecQualidadeAtoRemoveData.ts | 23 ++ .../TCensecQualidadeAtoSaveData.ts | 26 ++ .../TCensecTipoAto/GMedidaTipoIndexData.ts | 3 - .../useTCensecQualidadeAtoIndexHook.ts | 28 ++ .../useTCensecQualidadeAtoRemoveHook.ts | 24 ++ .../useTCensecQualidadeAtoSaveHook.ts | 33 ++ .../TCensecQualidadeAtoInterface.ts | 6 + .../_schemas/TCensecQualidadeAtoSchema.ts | 8 + .../TCensecQualidadeAtoIndexService.ts | 19 + .../TCensecQualidadeAtoRemoveService.ts | 20 ++ .../TCensecQualidadeAtoSaveService.ts | 19 + 18 files changed, 852 insertions(+), 221 deletions(-) create mode 100644 src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoForm.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoTable.tsx create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoIndexData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoRemoveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoSaveData.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoIndexHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoRemoveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoSaveHook.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_interfaces/TCensecQualidadeAtoInterface.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_schemas/TCensecQualidadeAtoSchema.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoIndexService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoRemoveService.ts create mode 100644 src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoSaveService.ts diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx index 92f62af..6fcd484 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx @@ -112,7 +112,6 @@ export default function TCensecTipoAtoPage() { handleOpenForm((data = initialTCensecTipoAto)); }} /> - {/* Tabela */} @@ -124,28 +123,30 @@ export default function TCensecTipoAtoPage() { /> - {/* Dialog de confirmação */} - - + {isConfirmOpen && ( + + )} {/* Formulário */} - + {isFormOpen && ( + + )} ); } diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoForm.tsx new file mode 100644 index 0000000..4a94800 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoForm.tsx @@ -0,0 +1,119 @@ +'use client'; + +import z from "zod"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import LoadingButton from "@/shared/components/loadingButton/LoadingButton"; +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 { TCensecQualidadeAtoSchema } from "../../_schemas/TCensecQualidadeAtoSchema"; +import { parseNumberInput } from "@/shared/actions/form/parseNumberInput"; + +type FormValues = z.infer; + +interface TCensecQualidadeAtoFormProps { + isOpen: boolean; + data: FormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: FormValues) => void; + buttonIsLoading: boolean; +} + +export default function TCensecQualidadeAtoForm({ + isOpen, + data, + onClose, + onSave, + buttonIsLoading, +}: TCensecQualidadeAtoFormProps) { + + // react-hook-form com Zod + const form = useForm({ + resolver: zodResolver(TCensecQualidadeAtoSchema), + defaultValues: {}, + }); + + // Atualiza o formulário quando em modo de edição + useEffect(() => { + console.log(data) + if (data) form.reset(data); + }, [data, form]); + + return ( + { + if (!open) onClose(null, false); + }} + > + + + Qualidade de Ato (CENSEC) + + Crie ou edite uma Qualidade vinculada a um Tipo de Ato da CENSEC + + +
+ + {/* Quantidade Mínima */} + ( + + Quantidade Mínima + + field.onChange(parseNumberInput(e))} /> + + + + )} + /> + {/* Rodapé */} + + + + + + + + +
+
+ ); +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx new file mode 100644 index 0000000..a39af45 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoIndex.tsx @@ -0,0 +1,138 @@ +'use client'; + +import { useEffect, useState, useCallback } from "react"; +import { Card, CardContent } from "@/components/ui/card"; +import { useConfirmDialog } from "@/shared/components/confirmDialog/useConfirmDialog"; + +import Header from "@/shared/components/structure/Header"; +import ConfirmDialog from "@/shared/components/confirmDialog/ConfirmDialog"; + +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { useTCensecQualidadeAtoIndexHook } from "../../_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoIndexHook"; +import { useTCensecQualidadeAtoSaveHook } from "../../_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoSaveHook"; +import { useTCensecQualidadeAtoRemoveHook } from "../../_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoRemoveHook"; +import TCensecQualidadeAtoTable from "./TCensecQualidadeAtoTable"; +import TCensecQualidadeAtoForm from "./TCensecQualidadeAtoForm"; + +interface TCensecQulidadeAtoIndexInterface { + censec_tipoato_id: number +} + +export default function TCensecQualidadeAtoIndex({ censec_tipoato_id }: TCensecQulidadeAtoIndexInterface) { + + // Hooks para leitura, salvamento e remoção + const { tCensecQualidadeAto, fetchTCensecQualidadeAto } = useTCensecQualidadeAtoIndexHook(); + const { saveTCensecQualidadeAto } = useTCensecQualidadeAtoSaveHook(); + const { removeTCensecQualidadeAto } = useTCensecQualidadeAtoRemoveHook(); + + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Estado para controle do form e item selecionado + const [selectedItem, setSelectedItem] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + const [itemToDelete, setItemToDelete] = useState(null); + + // Hook do modal de confirmação + const { + isOpen: isConfirmOpen, + openDialog: openConfirmDialog, + handleConfirm, + handleCancel, + } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: TCensecQualidadeAtoInterface | null) => { + // Se não houver dados (criação), cria um objeto inicial com pessoa_tipo + const initialData: TCensecQualidadeAtoInterface = data ?? { censec_tipoato_id: censec_tipoato_id } as TCensecQualidadeAtoInterface; + setSelectedItem(initialData); + setIsFormOpen(true); + }, []); + + const handleCloseForm = useCallback(() => { + setIsFormOpen(false); + setSelectedItem(null); + }, []); + + // Salvar + const handleSave = useCallback( + async (data: TCensecQualidadeAtoInterface) => { + setButtonIsLoading(true); + await saveTCensecQualidadeAto(data); + await fetchTCensecQualidadeAto(censec_tipoato_id); + setButtonIsLoading(false); + handleCloseForm(); + }, + [saveTCensecQualidadeAto, fetchTCensecQualidadeAto] + ); + + // Deleção + const handleConfirmDelete = useCallback( + (item: TCensecQualidadeAtoInterface) => { + setItemToDelete(item); + openConfirmDialog(); + }, + [openConfirmDialog] + ); + + const handleDelete = useCallback(async () => { + if (itemToDelete) { + await removeTCensecQualidadeAto(itemToDelete); + await fetchTCensecQualidadeAto(censec_tipoato_id); + } + handleCancel(); + }, [itemToDelete, fetchTCensecQualidadeAto, handleCancel]); + + // Carregar dados ao montar + useEffect(() => { + fetchTCensecQualidadeAto(censec_tipoato_id); + }, []); + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela */} + + + + + + {/* Dialog de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário */} + {isFormOpen && ( + + )} +
+ ); +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoTable.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoTable.tsx new file mode 100644 index 0000000..5dd3120 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/TCensecQualidadeAto/TCensecQualidadeAtoTable.tsx @@ -0,0 +1,99 @@ +'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 { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; + +interface TCensecQualidadeAtoTableProps { + data: TCensecQualidadeAtoInterface[]; + onEdit: (item: TCensecQualidadeAtoInterface, isEditingFormStatus: boolean) => void; + onDelete: (item: TCensecQualidadeAtoInterface, isEditingFormStatus: boolean) => void; +} + +/** + * Tabela de exibição para registros da tabela T_CENSEC_QUALIDADEATO. + */ +export default function TCensecQualidadeAtoTable({ + data, + onEdit, + onDelete +}: TCensecQualidadeAtoTableProps) { + return ( + + + + # + Tipo de Ato + Qualidade + Qtd. Mínima + Ações + + + + + {data?.map((item) => { + return ( + + + {item.censec_qualidadeato_id} + + {item.qtd_minima ?? "-"} + + + + + + + + + onEdit(item, true)} + > + + Editar + + + + + onDelete(item, true)} + > + + Remover + + + + + + + ); + })} + +
+ ); +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx index b528fa1..8703b8a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx @@ -1,7 +1,7 @@ 'use client'; import z from "zod"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Checkbox } from "@/components/ui/checkbox"; @@ -14,7 +14,7 @@ import { DialogDescription, DialogFooter, DialogHeader, - DialogTitle + DialogTitle, } from "@/components/ui/dialog"; import { Form, @@ -25,12 +25,26 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; import { Label } from "@/components/ui/label"; +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/components/ui/tabs"; +import { IdCardIcon, SettingsIcon } from "lucide-react"; + import { TCensecTipoAtoSchema } from "../../_schemas/TCensecTipoAtoSchema"; -import { TCensecTipoAtoInterface } from "../../_interfaces/TCensecTipoAtoInterface"; import TCensecInterface from "../../_interfaces/TCensecInterface"; import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; +import TCensecQualidadeAtoPage from "../TCensecQualidadeAto/TCensecQualidadeAtoIndex"; type FormValues = z.infer; @@ -49,9 +63,12 @@ export default function TCensecTipoAtoForm({ tCensec, onClose, onSave, - buttonIsLoading + buttonIsLoading, }: TCensecTipoAtoFormProps) { - // react-hook-form com schema Zod + // Estado para controle da aba ativa + const [tabValue, setTabValue] = useState("dados"); + + // Configuração do formulário const form = useForm({ resolver: zodResolver(TCensecTipoAtoSchema), defaultValues: { @@ -65,7 +82,7 @@ export default function TCensecTipoAtoForm({ }, }); - // Atualiza o formulário se houver dados para edição + // Atualiza o formulário quando há edição useEffect(() => { if (data) form.reset(data); }, [data, form]); @@ -77,149 +94,181 @@ export default function TCensecTipoAtoForm({ if (!open) onClose(null, false); }} > - + Tipo de Ato CENSEC - Crie ou edite um tipo de ato da CENSEC + Crie ou edite um tipo de ato vinculado à Central do CENSEC. + + {/* Cabeçalho das Tabs */} + + + Dados Gerais + -
- + {data?.censec_tipoato_id !== 0 && ( + + Qualidades + + )} + - {/* Descrição */} - ( - - Descrição - - - - - - )} - /> + {/* Aba: Dados Gerais */} + + + + {/* Descrição */} + ( + + Descrição + + + + + + )} + /> - {/* Select Censec */} - ( - - Central do Censec - - - - )} - /> + {/* Select Censec */} + ( + + Central do CENSEC + + + + )} + /> + {/* Situação */} + ( +
+ + field.onChange(checked ? "A" : "I") + } + /> + +
+ )} + /> - {/* Situação */} - ( -
- field.onChange(checked ? "A" : "I")} + {/* Tipo de Separação */} + ( + + Tipo de Separação + + + + )} + /> + + {/* Tipo de Revogação */} + ( + + Tipo de Revogação + + + + )} + /> + + {/* Botões */} + + + + + - -
- )} - /> + - {/* Tipo de Separação */} - ( - - Tipo de Separação - - - - )} - /> - - {/* Tipo de Revogação */} - ( - - Tipo de Revogação - - - - )} - /> - - {/* Rodapé */} - - - - - - - - {/* Campos ocultos */} - - - - + {/* Campos ocultos */} + + + + +
+ {data?.censec_tipoato_id !== 0 && ( + + + + )} +
); diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoTable.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoTable.tsx index 9359597..2ff016a 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoTable.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoTable.tsx @@ -29,22 +29,22 @@ interface TCensecTipoAtoTableProps { } function StatusBadge({ situacao }: { situacao: string }) { - const isActive = situacao === "A"; + const isActive = situacao === "A"; - const baseClasses = - "text-xs font-medium px-2.5 py-0.5 rounded-sm me-2"; + const baseClasses = + "text-xs font-medium px-2.5 py-0.5 rounded-sm me-2"; - const activeClasses = - "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300"; + const activeClasses = + "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300"; - const inactiveClasses = - "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300"; + const inactiveClasses = + "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300"; - return ( - - {isActive ? "Ativo" : "Inativo"} - - ); + return ( + + {isActive ? "Ativo" : "Inativo"} + + ); } export default function TCensecTipoAtoTable({ @@ -70,57 +70,58 @@ export default function TCensecTipoAtoTable({ {data.map((item) => { - const censecDesc = tCensec.find(c => c.censec_id === item.censec_id)?.descricao || "N/A" - return ( - - - {item.censec_tipoato_id} - - - - - {censecDesc} - {/*{item.codigo ?? "-"}*/} - {item.descricao} - {item.tipo_separacao ?? "-"} - {item.tipo_revogacao ?? "-"} - - - - - - - - - c.censec_id === item.censec_id)?.descricao || "N/A" + return ( + + + {item.censec_tipoato_id} + + + + + {censecDesc} + {/*{item.codigo ?? "-"}*/} + {item.descricao} + {item.tipo_separacao ?? "-"} + {item.tipo_revogacao ?? "-"} + + + + + - + + + onEdit(item, true)} + > + + Editar + - onDelete(item, true)} - > - - Remover - - - - - - - )})} + + + onDelete(item, true)} + > + + Remover + + + + + + + ) + })} ); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoIndexData.ts new file mode 100644 index 0000000..7ef2a73 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoIndexData.ts @@ -0,0 +1,21 @@ +import API from "@/shared/services/api/Api"; +import { Methods } from "@/shared/services/api/enums/ApiMethodEnum"; +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; + +/** + * Função responsável por buscar todos os registros da tabela T_CENSEC_QUALIDADEATO. + * Utiliza o serviço centralizado de API e tratamento de erros via HOC. + */ +async function executeTCensecQualidadeAtoIndexData(censec_tipoato_id: number) { + const api = new API(); + return await api.send({ + method: Methods.GET, + endpoint: `administrativo/t_censec_qualidadeato/tipo-ato/${censec_tipoato_id}`, + }); +} + +/** + * Exporta a função decorada com o handler de erros, + * garantindo tratamento consistente de respostas no client. + */ +export const TCensecQualidadeAtoIndexData = withClientErrorHandler(executeTCensecQualidadeAtoIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoRemoveData.ts new file mode 100644 index 0000000..a2cb7b2 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoRemoveData.ts @@ -0,0 +1,23 @@ +import API from "@/shared/services/api/Api"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { Methods } from "@/shared/services/api/enums/ApiMethodEnum"; +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; + +/** + * Função responsável por remover um registro da tabela T_CENSEC_QUALIDADEATO. + * Utiliza o serviço centralizado de API e o tratador de erros client-side. + */ +async function executeTCensecQualidadeAtoRemoveData(data: TCensecQualidadeAtoInterface) { + const api = new API(); + + return await api.send({ + method: Methods.DELETE, + endpoint: `administrativo/t_censec_qualidadeato/${data.censec_qualidadeato_id}`, + }); +} + +/** + * Exporta a função decorada com o handler de erros, + * garantindo tratamento consistente de respostas no client. + */ +export const TCensecQualidadeAtoRemoveData = withClientErrorHandler(executeTCensecQualidadeAtoRemoveData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoSaveData.ts new file mode 100644 index 0000000..85b1ac6 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecQualidadeAto/TCensecQualidadeAtoSaveData.ts @@ -0,0 +1,26 @@ +import API from "@/shared/services/api/Api"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { Methods } from "@/shared/services/api/enums/ApiMethodEnum"; +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; + +/** + * Função responsável por salvar ou atualizar registros da tabela T_CENSEC_QUALIDADEATO. + * Utiliza a estrutura centralizada de API e tratamento de erros do sistema. + */ +async function executeTCensecQualidadeAtoSaveData(data: TCensecQualidadeAtoInterface) { + // Verifica se é uma operação de atualização ou criação + const isUpdate = Boolean(data.censec_qualidadeato_id); + + // Instancia o serviço de API + const api = new API(); + + // Envia a requisição com método dinâmico e endpoint apropriado + return await api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, + endpoint: `administrativo/t_censec_qualidadeato/${data.censec_qualidadeato_id || ""}`, + body: data, + }); +} + +// Exporta a função com o tratador de erros client-side +export const TCensecQualidadeAtoSaveData = withClientErrorHandler(executeTCensecQualidadeAtoSaveData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/TCensecTipoAto/GMedidaTipoIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecTipoAto/GMedidaTipoIndexData.ts index fad057f..312b784 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/TCensecTipoAto/GMedidaTipoIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/TCensecTipoAto/GMedidaTipoIndexData.ts @@ -1,10 +1,7 @@ import API from "@/shared/services/api/Api"; import { Methods } from "@/shared/services/api/enums/ApiMethodEnum"; -import TCensecTipoAtoMockDeDados from "./mockCensecTipoAto"; import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; -const useMock = true - async function executeTCensecTipoAtoIndexData() { const api = new API(); return await api.send({ diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoIndexHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoIndexHook.ts new file mode 100644 index 0000000..682777f --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoIndexHook.ts @@ -0,0 +1,28 @@ +import { useResponse } from "@/shared/components/response/ResponseContext"; +import { useState } from "react"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { TCensecQualidadeAtoIndexService } from "../../_services/TCensecQualidadeAto/TCensecQualidadeAtoIndexService"; + +/** + * Hook responsável por gerenciar a listagem (index) + * de registros da tabela T_CENSEC_QUALIDADEATO. + * + * Integra-se com o ResponseContext para tratamento + * global de mensagens e respostas da API. + */ +export const useTCensecQualidadeAtoIndexHook = () => { + const { setResponse } = useResponse(); + const [tCensecQualidadeAto, setTCensecQualidadeAto] = useState([]); + + /** + * Busca todos os registros da tabela T_CENSEC_QUALIDADEATO. + */ + const fetchTCensecQualidadeAto = async (censec_tipoato_id: number) => { + const response = await TCensecQualidadeAtoIndexService(censec_tipoato_id); + + setTCensecQualidadeAto(response.data); + setResponse(response); + }; + + return { tCensecQualidadeAto, fetchTCensecQualidadeAto }; +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoRemoveHook.ts new file mode 100644 index 0000000..c9a8878 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoRemoveHook.ts @@ -0,0 +1,24 @@ +import { useResponse } from "@/shared/components/response/ResponseContext"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { TCensecQualidadeAtoRemoveService } from "../../_services/TCensecQualidadeAto/TCensecQualidadeAtoRemoveService"; + +/** + * Hook responsável por gerenciar a exclusão de registros da tabela T_CENSEC_QUALIDADEATO. + * + * Integra-se com o ResponseContext para exibir feedbacks globais após a operação. + */ +export const useTCensecQualidadeAtoRemoveHook = () => { + const { setResponse } = useResponse(); + + /** + * Executa a remoção de um registro da tabela T_CENSEC_QUALIDADEATO. + * + * @param data Objeto contendo o ID do registro a ser removido. + */ + const removeTCensecQualidadeAto = async (data: TCensecQualidadeAtoInterface) => { + const response = await TCensecQualidadeAtoRemoveService(data); + setResponse(response); + }; + + return { removeTCensecQualidadeAto }; +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoSaveHook.ts new file mode 100644 index 0000000..46286d9 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/TCensecQualidadeAto/useTCensecQualidadeAtoSaveHook.ts @@ -0,0 +1,33 @@ +import { useResponse } from "@/shared/components/response/ResponseContext"; +import { useState } from "react"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; +import { TCensecQualidadeAtoSaveService } from "../../_services/TCensecQualidadeAto/TCensecQualidadeAtoSaveService"; + +/** + * Hook responsável por gerenciar o estado e a operação de salvamento + * de registros na tabela T_CENSEC_QUALIDADEATO. + * + * Integra-se com o ResponseContext para feedbacks globais e mantém + * estado local do último registro salvo. + */ +export const useTCensecQualidadeAtoSaveHook = () => { + const { setResponse } = useResponse(); + const [tCensecQualidadeAto, setTCensecQualidadeAto] = useState(null); + const [isOpen, setIsOpen] = useState(false); + + /** + * Executa a operação de salvamento (insert/update) + * e atualiza o estado local e global de resposta. + */ + const saveTCensecQualidadeAto = async (data: TCensecQualidadeAtoInterface) => { + const response = await TCensecQualidadeAtoSaveService(data); + + setTCensecQualidadeAto(response.data); + setResponse(response); + setIsOpen(false); + + return response; + }; + + return { tCensecQualidadeAto, saveTCensecQualidadeAto }; +}; diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/TCensecQualidadeAtoInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TCensecQualidadeAtoInterface.ts new file mode 100644 index 0000000..f64bad4 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/TCensecQualidadeAtoInterface.ts @@ -0,0 +1,6 @@ +export interface TCensecQualidadeAtoInterface { + censec_qualidadeato_id?: number; + censec_tipoato_id?: number; + censec_qualidade_id?: number; + qtd_minima?: number; +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/TCensecQualidadeAtoSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/TCensecQualidadeAtoSchema.ts new file mode 100644 index 0000000..f05eebc --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/TCensecQualidadeAtoSchema.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const TCensecQualidadeAtoSchema = z.object({ + censec_qualidadeato_id: z.number().optional(), + censec_tipoato_id: z.number().optional(), + censec_qualidade_id: z.number().optional(), + qtd_minima: z.number().optional(), +}); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoIndexService.ts new file mode 100644 index 0000000..90a82e9 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoIndexService.ts @@ -0,0 +1,19 @@ +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; +import { TCensecQualidadeAtoIndexData } from "../../_data/TCensecQualidadeAto/TCensecQualidadeAtoIndexData"; + +/** + * Service responsável por orquestrar a listagem de registros + * da tabela T_CENSEC_QUALIDADEATO. + * + * Utiliza o Data Layer (TCensecQualidadeAtoIndexData) para buscar os dados na API. + */ +async function executeTCensecQualidadeAtoIndexService(censec_tipoato_id: number) { + const response = await TCensecQualidadeAtoIndexData(censec_tipoato_id); + return response; +} + +/** + * Exporta a função decorada com o handler de erros client-side, + * garantindo tratamento consistente de falhas. + */ +export const TCensecQualidadeAtoIndexService = withClientErrorHandler(executeTCensecQualidadeAtoIndexService); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoRemoveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoRemoveService.ts new file mode 100644 index 0000000..4ec89ca --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoRemoveService.ts @@ -0,0 +1,20 @@ +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; +import { TCensecQualidadeAtoRemoveData } from "../../_data/TCensecQualidadeAto/TCensecQualidadeAtoRemoveData"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; + +/** + * Service responsável por orquestrar a exclusão de registros + * da tabela T_CENSEC_QUALIDADEATO. + * + * Utiliza o Data Layer (TCensecQualidadeAtoRemoveData) para comunicação com a API. + */ +async function executeTCensecQualidadeAtoRemoveService(data: TCensecQualidadeAtoInterface) { + const response = await TCensecQualidadeAtoRemoveData(data); + return response; +} + +/** + * Exporta a função decorada com o handler de erros client-side, + * garantindo tratamento consistente de falhas. + */ +export const TCensecQualidadeAtoRemoveService = withClientErrorHandler(executeTCensecQualidadeAtoRemoveService); diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoSaveService.ts new file mode 100644 index 0000000..a8ae9a4 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/TCensecQualidadeAto/TCensecQualidadeAtoSaveService.ts @@ -0,0 +1,19 @@ +import { withClientErrorHandler } from "@/shared/actions/withClientErrorHandler/withClientErrorHandler"; +import { TCensecQualidadeAtoSaveData } from "../../_data/TCensecQualidadeAto/TCensecQualidadeAtoSaveData"; +import { TCensecQualidadeAtoInterface } from "../../_interfaces/TCensecQualidadeAtoInterface"; + +/** + * Service responsável por orquestrar a operação de criação ou atualização + * de registros da tabela T_CENSEC_QUALIDADEATO. + * + * Utiliza o Data Layer (TCensecQualidadeAtoSaveData) para comunicação com a API. + */ +async function executeTCensecQualidadeAtoSaveService(data: TCensecQualidadeAtoInterface) { + const response = await TCensecQualidadeAtoSaveData(data); + return response; +} + +/** + * Exporta a função decorada com o handler de erros client-side. + */ +export const TCensecQualidadeAtoSaveService = withClientErrorHandler(executeTCensecQualidadeAtoSaveService);