From b362968a4f9f798e5aff2d2d27967e19bf1d0516 Mon Sep 17 00:00:00 2001 From: keven Date: Tue, 28 Oct 2025 18:11:13 -0300 Subject: [PATCH] =?UTF-8?q?[MVPTN-117]=20feat(CRUD):=20Cria=20o=20crud=20d?= =?UTF-8?q?e=20manipular=20o=20c=C3=A1lculo=20r=C3=A1pido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .code-workspace | 124 ++++++++++++ .../financeiro/calculo-rapido/page.tsx | 9 + src/components/app-sidebar.tsx | 4 + .../components/GCalculo/GCalculoColumns.tsx | 117 +++++++++++ .../components/GCalculo/GCalculoForm.tsx | 182 ++++++++++++++++++ .../components/GCalculo/GCalculoIndex.tsx | 151 +++++++++++++++ .../components/GCalculo/GCalculoTable.tsx | 23 +++ .../GEmolumento/GEmolumentoSelect.tsx | 119 ++++++++++++ .../components/GTBBairro/GTBBairroSelect.tsx | 2 +- .../data/GCalculo/GCalculoCalcularData.ts | 17 ++ .../hooks/GCalculo/useGCalculoDeleteHook.ts | 17 ++ .../hooks/GCalculo/useGCalculoFormHook.ts | 14 ++ .../hooks/GCalculo/useGCalculoIndexHook.ts | 21 ++ .../hooks/GCalculo/useGCalculoSaveHook.ts | 25 +++ .../GCalculo/GCalculoFormInterface.ts | 9 + .../interfaces/GCalculo/GCalculoInterface.ts | 7 + .../GCalculo/GCalculoTableInterface.ts | 7 + .../GEmolumento/GEmolumentoSelectInterface.ts | 6 + .../schemas/GCalculo/GCalculoSchema.ts | 12 ++ .../GCalculo/GCalculoCalcularService.ts | 11 ++ 20 files changed, 876 insertions(+), 1 deletion(-) create mode 100644 .code-workspace create mode 100644 src/app/(protected)/(administrativo)/administrativo/financeiro/calculo-rapido/page.tsx create mode 100644 src/packages/administrativo/components/GCalculo/GCalculoColumns.tsx create mode 100644 src/packages/administrativo/components/GCalculo/GCalculoForm.tsx create mode 100644 src/packages/administrativo/components/GCalculo/GCalculoIndex.tsx create mode 100644 src/packages/administrativo/components/GCalculo/GCalculoTable.tsx create mode 100644 src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx create mode 100644 src/packages/administrativo/data/GCalculo/GCalculoCalcularData.ts create mode 100644 src/packages/administrativo/hooks/GCalculo/useGCalculoDeleteHook.ts create mode 100644 src/packages/administrativo/hooks/GCalculo/useGCalculoFormHook.ts create mode 100644 src/packages/administrativo/hooks/GCalculo/useGCalculoIndexHook.ts create mode 100644 src/packages/administrativo/hooks/GCalculo/useGCalculoSaveHook.ts create mode 100644 src/packages/administrativo/interfaces/GCalculo/GCalculoFormInterface.ts create mode 100644 src/packages/administrativo/interfaces/GCalculo/GCalculoInterface.ts create mode 100644 src/packages/administrativo/interfaces/GCalculo/GCalculoTableInterface.ts create mode 100644 src/packages/administrativo/interfaces/GEmolumento/GEmolumentoSelectInterface.ts create mode 100644 src/packages/administrativo/schemas/GCalculo/GCalculoSchema.ts create mode 100644 src/packages/administrativo/services/GCalculo/GCalculoCalcularService.ts diff --git a/.code-workspace b/.code-workspace new file mode 100644 index 0000000..0ea3642 --- /dev/null +++ b/.code-workspace @@ -0,0 +1,124 @@ +{ + "folders": [ + { "path": "D:/IIS/Orius/app" } + ], + "settings": { + // === GERAL === + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "editor.formatOnPaste": false, + "editor.formatOnType": false, + "editor.minimap.enabled": false, + "files.trimTrailingWhitespace": true, + "files.autoSave": "onFocusChange", + "telemetry.telemetryLevel": "off", + "update.mode": "manual", + + // === PERFORMANCE === + "files.watcherExclude": { + "**/node_modules/**": true, + "**/dist/**": true, + "**/build/**": true, + "**/.next/**": true, + "**/.git/**": true + }, + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/.next": true, + "**/.git": true + }, + + // === FRONTEND === + "editor.defaultFormatter": "esbenp.prettier-vscode", + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + + // === TAILWIND === + "files.associations": { + "*.css": "tailwindcss" + }, + "tailwindCSS.includeLanguages": { + "plaintext": "html", + "javascript": "javascript", + "typescriptreact": "typescriptreact" + }, + + // === TERMINAIS === + "terminal.integrated.profiles.windows": { + "Next.js Dev": { + "path": "cmd.exe", + "args": ["/k", "cd D:\\IIS\\Orius\\app && npm run dev"] + }, + "Build & Preview": { + "path": "cmd.exe", + "args": ["/k", "cd D:\\IIS\\Orius\\app && npm run build && npm run start"] + }, + "Git Bash": { + "path": "C:\\Program Files\\Git\\bin\\bash.exe" + } + }, + "terminal.integrated.defaultProfile.windows": "Git Bash", + + // === GIT === + "git.enabled": true, + "git.autorefresh": false, + "git.fetchOnPull": true, + "git.confirmSync": false, + + // === VISUAL === + "workbench.colorTheme": "Default Dark Modern", + "window.zoomLevel": 0, + "breadcrumbs.enabled": true, + "explorer.compactFolders": false, + + // === MISC === + "files.exclude": { + "**/.DS_Store": true, + "**/*.log": true + } + }, + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: Debug Development Server", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "cwd": "${workspaceFolder}", + "port": 9229 + } + ] + }, + "extensions": { + "recommendations": [ + // === FRONTEND CORE === + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "bradlc.vscode-tailwindcss", + "ms-vscode.vscode-typescript-next", + + // === DEV EXPERIENCE === + "formulahendry.code-runner", + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens", + "mhutchie.git-graph", + "donjayamanne.githistory" + ] + } +} diff --git a/src/app/(protected)/(administrativo)/administrativo/financeiro/calculo-rapido/page.tsx b/src/app/(protected)/(administrativo)/administrativo/financeiro/calculo-rapido/page.tsx new file mode 100644 index 0000000..5c952d6 --- /dev/null +++ b/src/app/(protected)/(administrativo)/administrativo/financeiro/calculo-rapido/page.tsx @@ -0,0 +1,9 @@ +import GCalculoIndex from "@/packages/administrativo/components/GCalculo/GCalculoIndex"; + +export default function GEmolumentoPeriodoPage() { + + return ( + + ); + +} \ No newline at end of file diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index 857ada2..fc470e3 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -195,6 +195,10 @@ const data = { { title: "Selos/Grupos", url: "/administrativo/selos/grupos", + }, + { + title: "Financeiro/Cálculo Rápido", + url: "/administrativo/financeiro/calculo-rapido", } ], diff --git a/src/packages/administrativo/components/GCalculo/GCalculoColumns.tsx b/src/packages/administrativo/components/GCalculo/GCalculoColumns.tsx new file mode 100644 index 0000000..3f5dd33 --- /dev/null +++ b/src/packages/administrativo/components/GCalculo/GCalculoColumns.tsx @@ -0,0 +1,117 @@ +import { ColumnDef } from '@tanstack/react-table'; +import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { SortableHeader } from '@/shared/components/dataTable/SortableHeader'; + + +export default function GCalculoColumns( + onEdit: (item: GCalculoInterface, isEditingFormStatus: boolean) => void, + onDelete: (item: GCalculoInterface, isEditingFormStatus: boolean) => void, +): ColumnDef[] { + return [ + + // Descrição + { + accessorKey: 'apresentante', + header: ({ column }) => SortableHeader('Apresentante', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('apresentante') || '')), + }, + + // valor documento + { + accessorKey: 'valor_documento', + header: ({ column }) => SortableHeader('Documento', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_documento') || '')), + }, + + // valor_emolumento + { + accessorKey: 'valor_emolumento', + header: ({ column }) => SortableHeader('Emolumento', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_emolumento') || '')), + }, + + // valor_taxa_judiciaria + { + accessorKey: 'valor_taxa_judiciaria', + header: ({ column }) => SortableHeader('Tx. Judiciária', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_taxa_judiciaria') || '')), + }, + + // valor_fundos + { + accessorKey: 'valor_fundos', + header: ({ column }) => SortableHeader('Fundos', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_fundos') || '')), + }, + + // valor_iss + { + accessorKey: 'valor_iss', + header: ({ column }) => SortableHeader('ISS', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_iss') || '')), + }, + + // quantidade + { + accessorKey: 'quantidade', + header: ({ column }) => SortableHeader('Quantidade', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('quantidade') || '')), + }, + + // valor_total + { + accessorKey: 'valor_total', + header: ({ column }) => SortableHeader('Total', column), + cell: ({ row }) => GetCapitalize(String(row.getValue('valor_total') || '')), + }, + + // Ações + { + id: 'actions', + header: 'Ações', + cell: ({ row }) => { + const natureza = row.original; + + return ( + + + + + + + onEdit(natureza, true)}> + + Editar + + + onDelete({ ...natureza, index: row.index }, true)} + > + + Remover + + + + + ); + }, + enableSorting: false, + enableHiding: false, + }, + ]; +} diff --git a/src/packages/administrativo/components/GCalculo/GCalculoForm.tsx b/src/packages/administrativo/components/GCalculo/GCalculoForm.tsx new file mode 100644 index 0000000..3ec75c0 --- /dev/null +++ b/src/packages/administrativo/components/GCalculo/GCalculoForm.tsx @@ -0,0 +1,182 @@ +'use client'; + +import { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import GEmolumentoSelect from '@/packages/administrativo/components/GEmolumento/GEmolumentoSelect'; +import { useGCalculoFormHook } from '@/packages/administrativo/hooks/GCalculo/useGCalculoFormHook'; +import { GCalculoFormInterface } from '@/packages/administrativo/interfaces/GCalculo/GCalculoFormInterface'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; + +/** + * Formulário de cadastro/edição de Natureza + * Baseado nos campos da tabela G_NATUREZA + */ +export default function GCalculoForm({ + isOpen, + data, + onClose, + onSave, + buttonIsLoading, +}: GCalculoFormInterface) { + + const form = useGCalculoFormHook({}); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + ResetFormIfData(form, data); + }, [data, form]); + + function onError(error: any) { + console.log('Erro no formulário:', error); + } + + return ( + { + if (!open) onClose(null, false); + }} + > + + + Formulário de Cálculo Rápido + + Formulário de Cálculo Rápido + + + {/* Formulário principal */} +
+ + {/* GRID MOBILE FIRST */} +
+ {/* apresentante */} +
+ ( + + Apresentante + + + + + + )} + /> +
+ {/* Observação */} +
+ ( + + Observação + + + + + + )} + /> +
+ {/* Emolumento */} +
+ ( + + Emolumento + + + + )} + /> +
+ {/* valor_documento */} +
+ ( + + Valor Documento + + + + + + )} + /> +
+ {/* quantidade */} +
+ ( + + Quantidade + + + + + + )} + /> +
+
+ {/* Rodapé */} + + + + + + +
+ +
+
+ ); +} diff --git a/src/packages/administrativo/components/GCalculo/GCalculoIndex.tsx b/src/packages/administrativo/components/GCalculo/GCalculoIndex.tsx new file mode 100644 index 0000000..1831325 --- /dev/null +++ b/src/packages/administrativo/components/GCalculo/GCalculoIndex.tsx @@ -0,0 +1,151 @@ +'use client'; + +import { useCallback, useState } from 'react'; + + +import { useGCalculoDeleteHook } from '@/packages/administrativo/hooks/GCalculo/useGCalculoDeleteHook'; +import { useGCalculoIndexHook } from '@/packages/administrativo/hooks/GCalculo/useGCalculoIndexHook'; +import { useGCalculoSaveHook } from '@/packages/administrativo/hooks/GCalculo/useGCalculoSaveHook'; +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import Header from '@/shared/components/structure/Header'; + +import GCalculoForm from './GCalculoForm'; +import GCalculoTable from './GCalculoTable'; + +export default function GCalculoIndex() { + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Hooks para leitura e salvamento + const { gCalculo, setGCalculo } = useGCalculoIndexHook(); + const { saveGCalculo } = useGCalculoSaveHook(setGCalculo); + const { deleteGCalculo } = useGCalculoDeleteHook(); + + // Estados + const [selectedData, setSelectedData] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + + // Estado para saber qual item será deletado + const [itemToDelete, setItemToDelete] = useState(null); + + /** + * Hook do modal de confirmação + */ + const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: GCalculoInterface | null) => { + setSelectedData(data); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o andamento selecionado + */ + const handleCloseForm = useCallback(() => { + setSelectedData(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: GCalculoInterface) => { + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Aguarda salvar o registro + const response = await saveGCalculo(formData); + + // Adiciona o item no array atual (sem apagar os anteriores) + setGCalculo((prev) => [...prev, response]); + + // Remove o botão em estado de loading + setButtonIsLoading(false); + }, + [saveGCalculo, handleCloseForm], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: GCalculoInterface) => { + // 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 () => { + // Se não houver item selecionado para exclusão, encerra a função + if (itemToDelete === null || itemToDelete === undefined) return; + + // Chama a função de exclusão, passando o item + await deleteGCalculo(itemToDelete); + + // Atualiza a lista de cálculos em memória, removendo o item pelo índice + setGCalculo((prev) => + prev.filter((_, index) => index !== itemToDelete.index) + ); + + // Limpa o item selecionado para exclusão + setItemToDelete(null); + + // Fecha o diálogo de confirmação + handleCancel(); + }, [itemToDelete, deleteGCalculo, setGCalculo, handleCancel]); + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela de andamentos */} + + {/* Modal de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário de criação/edição */} + {isFormOpen && ( + + )} +
+ ); +} diff --git a/src/packages/administrativo/components/GCalculo/GCalculoTable.tsx b/src/packages/administrativo/components/GCalculo/GCalculoTable.tsx new file mode 100644 index 0000000..0319162 --- /dev/null +++ b/src/packages/administrativo/components/GCalculo/GCalculoTable.tsx @@ -0,0 +1,23 @@ +'use client'; + +import GCalculoTableInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoTableInterface'; +import { DataTable } from '@/shared/components/dataTable/DataTable'; + +import GCalculoColumns from './GCalculoColumns'; + +/** + * Componente principal da tabela de Naturezas + */ +export default function GCalculoTable({ data, onEdit, onDelete }: GCalculoTableInterface) { + const columns = GCalculoColumns(onEdit, onDelete); + return ( +
+ +
+ ); +} diff --git a/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx new file mode 100644 index 0000000..f824c9d --- /dev/null +++ b/src/packages/administrativo/components/GEmolumento/GEmolumentoSelect.tsx @@ -0,0 +1,119 @@ +'use client'; + +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import { useCallback, useEffect, useMemo, useState } 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 { useGEmolumentoIndexHook } from '@/packages/administrativo/hooks/GEmolumento/useGEmolumentoIndexHook'; +import GEmolumentoSelectInterface from '@/packages/administrativo/interfaces/GEmolumento/GEmolumentoSelectInterface'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; + +export default function GEmolumentoSelect({ field }: GEmolumentoSelectInterface) { + const [open, setOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const { gGramatica = [], indexGEmolumento } = useGEmolumentoIndexHook(); + + /** + * Carrega dados apenas uma vez + */ + const loadData = useCallback(async () => { + if (gGramatica.length) return; + setIsLoading(true); + await indexGEmolumento(); + setIsLoading(false); + }, [gGramatica.length, indexGEmolumento]); + + useEffect(() => { + loadData(); + }, [loadData]); + + /** + * Garante que o valor do campo seja sempre número (ou null) + */ + const value: number | null = field?.value ? Number(field.value) : null; + + /** + * Item selecionado (memoizado) + */ + const selected = useMemo( + () => gGramatica.find((b) => Number(b.emolumento_id) === value), + [gGramatica, value], + ); + + /** + * Manipula a seleção + */ + const handleSelect = useCallback( + (emolumentoId: number) => { + if (!field?.onChange) return; + field.onChange(emolumentoId); // envia como número + setOpen(false); + }, + [field], + ); + + return ( + + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + + {gGramatica.map((item) => ( + handleSelect(Number(item.emolumento_id))} + > + + {GetCapitalize(item.descricao ?? '')} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx b/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx index 2ac746e..94d10eb 100644 --- a/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx +++ b/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx @@ -1,7 +1,7 @@ 'use client'; import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; -import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { diff --git a/src/packages/administrativo/data/GCalculo/GCalculoCalcularData.ts b/src/packages/administrativo/data/GCalculo/GCalculoCalcularData.ts new file mode 100644 index 0000000..d109b1e --- /dev/null +++ b/src/packages/administrativo/data/GCalculo/GCalculoCalcularData.ts @@ -0,0 +1,17 @@ +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import ApiResponseInterface from '@/shared/services/api/interfaces/ApiResponseInterface'; + + +async function executeGCalculoCalcularData(data: GCalculoInterface): Promise { + const api = new API(); + return api.send({ + method: Methods.POST, + endpoint: `administrativo/g_calculo/rapido/`, + body: data, + }); +} + +export const GCalculoCalcularData = withClientErrorHandler(executeGCalculoCalcularData); diff --git a/src/packages/administrativo/hooks/GCalculo/useGCalculoDeleteHook.ts b/src/packages/administrativo/hooks/GCalculo/useGCalculoDeleteHook.ts new file mode 100644 index 0000000..1e53997 --- /dev/null +++ b/src/packages/administrativo/hooks/GCalculo/useGCalculoDeleteHook.ts @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +import { useResponse } from '@/shared/components/response/ResponseContext'; + +import GCalculoInterface from '../../interfaces/GCalculo/GCalculoInterface'; + +export const useGCalculoDeleteHook = () => { + const { setResponse } = useResponse(); + + const [gGramatica, setGCalculo] = useState(); + + const deleteGCalculo = async (data: GCalculoInterface) => { + + }; + + return { gGramatica, deleteGCalculo }; +}; diff --git a/src/packages/administrativo/hooks/GCalculo/useGCalculoFormHook.ts b/src/packages/administrativo/hooks/GCalculo/useGCalculoFormHook.ts new file mode 100644 index 0000000..1a71ea0 --- /dev/null +++ b/src/packages/administrativo/hooks/GCalculo/useGCalculoFormHook.ts @@ -0,0 +1,14 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; + +import { GCalculoFormValues, GCalculoSchema } from '@/packages/administrativo/schemas/GCalculo/GCalculoSchema'; + +export function useGCalculoFormHook(defaults?: Partial) { + return useForm({ + resolver: zodResolver(GCalculoSchema), + defaultValues: { + emolumento_id: 0, + ...defaults, + }, + }); +} diff --git a/src/packages/administrativo/hooks/GCalculo/useGCalculoIndexHook.ts b/src/packages/administrativo/hooks/GCalculo/useGCalculoIndexHook.ts new file mode 100644 index 0000000..a82af06 --- /dev/null +++ b/src/packages/administrativo/hooks/GCalculo/useGCalculoIndexHook.ts @@ -0,0 +1,21 @@ +'use client'; + +import { useState } from 'react'; + +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; + + +export const useGCalculoIndexHook = () => { + + const [gCalculo, setGCalculo] = useState([]); + + const indexGCalculo = async () => { + setGCalculo([]) + }; + + return { + gCalculo, + indexGCalculo, + setGCalculo, + }; +}; diff --git a/src/packages/administrativo/hooks/GCalculo/useGCalculoSaveHook.ts b/src/packages/administrativo/hooks/GCalculo/useGCalculoSaveHook.ts new file mode 100644 index 0000000..cd672ed --- /dev/null +++ b/src/packages/administrativo/hooks/GCalculo/useGCalculoSaveHook.ts @@ -0,0 +1,25 @@ +'use client'; + +import { useState } from 'react'; + +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; +import { GCalculoCalcularService } from '@/packages/administrativo/services/GCalculo/GCalculoCalcularService'; +import { useResponse } from '@/shared/components/response/ResponseContext'; + + +export const useGCalculoSaveHook = (setGCalculo?: React.Dispatch>) => { + const { setResponse } = useResponse(); + const [GCalculo, setGCalculoItem] = useState(null); + const [isOpen, setIsOpen] = useState(false); + const saveGCalculo = async (data: GCalculoInterface) => { + const response = await GCalculoCalcularService(data); + setGCalculoItem(response.data); + setResponse(response); + setIsOpen(false); + if (setGCalculo) { + setGCalculo((prev) => [...prev, response.data]); + } + return response.data; + }; + return { GCalculo, saveGCalculo, isOpen, setIsOpen }; +}; \ No newline at end of file diff --git a/src/packages/administrativo/interfaces/GCalculo/GCalculoFormInterface.ts b/src/packages/administrativo/interfaces/GCalculo/GCalculoFormInterface.ts new file mode 100644 index 0000000..7ba97e0 --- /dev/null +++ b/src/packages/administrativo/interfaces/GCalculo/GCalculoFormInterface.ts @@ -0,0 +1,9 @@ +import { GCalculoFormValues } from '@/packages/administrativo/schemas/GCalculo/GCalculoSchema'; + +export interface GCalculoFormInterface { + isOpen: boolean; + data: GCalculoFormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: GCalculoFormValues) => void; + buttonIsLoading: boolean; +} diff --git a/src/packages/administrativo/interfaces/GCalculo/GCalculoInterface.ts b/src/packages/administrativo/interfaces/GCalculo/GCalculoInterface.ts new file mode 100644 index 0000000..a8462bd --- /dev/null +++ b/src/packages/administrativo/interfaces/GCalculo/GCalculoInterface.ts @@ -0,0 +1,7 @@ +export default interface GCalculoInterface { + idnex?: number; + apresentante?: string; + observacao?: string; + quantidade?: number; + emolumento_id?: number; +} \ No newline at end of file diff --git a/src/packages/administrativo/interfaces/GCalculo/GCalculoTableInterface.ts b/src/packages/administrativo/interfaces/GCalculo/GCalculoTableInterface.ts new file mode 100644 index 0000000..2f1bfcf --- /dev/null +++ b/src/packages/administrativo/interfaces/GCalculo/GCalculoTableInterface.ts @@ -0,0 +1,7 @@ +import GCalculoInterface from './GCalculoInterface'; + +export default interface GCalculoTableInterface { + data?: GCalculoInterface[]; + onEdit: (item: GCalculoInterface, isEditingFormStatus: boolean) => void; + onDelete: (item: GCalculoInterface, isEditingFormStatus: boolean) => void; +} diff --git a/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoSelectInterface.ts b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoSelectInterface.ts new file mode 100644 index 0000000..beb921b --- /dev/null +++ b/src/packages/administrativo/interfaces/GEmolumento/GEmolumentoSelectInterface.ts @@ -0,0 +1,6 @@ +export default interface GEmolumentoSelectInterface { + field?: { + value?: number | string; + onChange?: (value: string | number) => void; + }; +} diff --git a/src/packages/administrativo/schemas/GCalculo/GCalculoSchema.ts b/src/packages/administrativo/schemas/GCalculo/GCalculoSchema.ts new file mode 100644 index 0000000..11d0da7 --- /dev/null +++ b/src/packages/administrativo/schemas/GCalculo/GCalculoSchema.ts @@ -0,0 +1,12 @@ +import z from "zod"; + +export const GCalculoSchema = z.object({ + index: z.coerce.number().min(0).optional(), + apresentante: z.string().optional(), + observacao: z.string().optional(), + quantidade: z.coerce.number().min(0).optional(), + valor_documento: z.coerce.number().min(0).optional(), + emolumento_id: z.coerce.number().min(0).optional(), +}); + +export type GCalculoFormValues = z.infer; \ No newline at end of file diff --git a/src/packages/administrativo/services/GCalculo/GCalculoCalcularService.ts b/src/packages/administrativo/services/GCalculo/GCalculoCalcularService.ts new file mode 100644 index 0000000..ffde5f1 --- /dev/null +++ b/src/packages/administrativo/services/GCalculo/GCalculoCalcularService.ts @@ -0,0 +1,11 @@ +import { GCalculoCalcularData } from '@/packages/administrativo/data/GCalculo/GCalculoCalcularData'; +import GCalculoInterface from '@/packages/administrativo/interfaces/GCalculo/GCalculoInterface'; +import { withClientErrorHandler } from '@/shared/actions/withClientErrorHandler/withClientErrorHandler'; + + +async function executeGCalculoCalcularService(data: GCalculoInterface) { + const response = await GCalculoCalcularData(data); + return response; +} + +export const GCalculoCalcularService = withClientErrorHandler(executeGCalculoCalcularService);