From a733aa125cca48758c7335bd4f58156daa53878a Mon Sep 17 00:00:00 2001 From: Agostinho Date: Fri, 10 Jan 2025 14:18:35 -0300 Subject: [PATCH 1/2] =?UTF-8?q?feature(124182):=20Inclus=C3=A3o=20de=20Par?= =?UTF-8?q?ametriza=C3=A7=C3=B5es=20Tipos=20de=20Documentos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Despesas/TiposDocumento/BtnAdd.js | 20 ++ .../Despesas/TiposDocumento/Filtros.js | 28 ++ .../TiposDocumento/ModalConfirmDelete.js | 19 ++ .../Despesas/TiposDocumento/ModalForm.js | 252 ++++++++++++++ .../TiposDocumento/ModalInfoNaoPodeExcluir.js | 16 + .../ModalInfoUpdateNaoPermitido.js | 16 + .../Despesas/TiposDocumento/Tabela.js | 23 ++ .../TiposDocumento/YupSignupSchemaTags.js | 5 + .../Despesas/TiposDocumento/index.js | 312 ++++++++++++++++++ src/rotas/index.js | 7 + src/services/sme/Parametrizacoes.service.js | 17 + 11 files changed, 715 insertions(+) create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/BtnAdd.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Filtros.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalConfirmDelete.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalForm.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoNaoPodeExcluir.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoUpdateNaoPermitido.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Tabela.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/YupSignupSchemaTags.js create mode 100644 src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/BtnAdd.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/BtnAdd.js new file mode 100644 index 000000000..9a3a79bbb --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/BtnAdd.js @@ -0,0 +1,20 @@ +import React from "react"; +import {RetornaSeTemPermissaoEdicaoPainelParametrizacoes} from "../../../Parametrizacoes/RetornaSeTemPermissaoEdicaoPainelParametrizacoes" + +export const BtnAdd = ({FontAwesomeIcon, faPlus, setShowModalForm, initialStateFormModal, setStateFormModal}) =>{ + const TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES = RetornaSeTemPermissaoEdicaoPainelParametrizacoes() + return( +
+ +
+ ); +}; diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Filtros.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Filtros.js new file mode 100644 index 000000000..c9e4d835a --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Filtros.js @@ -0,0 +1,28 @@ +import React from "react"; + +export const Filtros = ({stateFiltros, handleChangeFiltros, handleSubmitFiltros, limpaFiltros}) => { + return ( + <> +
+
+
+ + handleChangeFiltros(e.target.name, e.target.value)} + name='filtrar_por_nome' + id="filtrar_por_nome" + type="text" + className="form-control" + placeholder='Escreva o nome do tipo' + /> +
+
+
+ + +
+
+ + ); +}; diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalConfirmDelete.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalConfirmDelete.js new file mode 100644 index 000000000..1bc5365a6 --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalConfirmDelete.js @@ -0,0 +1,19 @@ +import {ModalBootstrap} from "../../../../Globais/ModalBootstrap"; +import React from "react"; + +export const ModalConfirmDelete = (props) => { + return ( + + ) +}; diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalForm.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalForm.js new file mode 100644 index 000000000..69eb131ea --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalForm.js @@ -0,0 +1,252 @@ +import React, {memo} from "react"; +import {ModalFormBodyText} from "../../../../Globais/ModalBootstrap"; +import {Formik} from "formik"; +import ReactTooltip from "react-tooltip"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faInfoCircle} from "@fortawesome/free-solid-svg-icons"; +import {YupSignupSchemaTags} from "./YupSignupSchemaTags"; +import {RetornaSeTemPermissaoEdicaoPainelParametrizacoes} from "../../../Parametrizacoes/RetornaSeTemPermissaoEdicaoPainelParametrizacoes" + +const ModalForm = ({show, stateFormModal, handleClose, handleSubmitModalForm, setShowModalConfirmDelete}) => { + const TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES = RetornaSeTemPermissaoEdicaoPainelParametrizacoes() + const bodyTextarea = () => { + return ( + <> + + {props => { + const { values, setFieldValue } = props; + return( +
+ +
+
+

* Preenchimento obrigatório

+
+
+
+ + + {props.touched.nome && props.errors.nome && {props.errors.nome} } +
+
+
+ +
+
+

Solicitar a digitação do número do documento?

+
+ setFieldValue("numero_documento_digitado", true)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ setFieldValue("numero_documento_digitado", false)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ +
+ <> +

No número do documento deve constar apenas dígitos? + + + + +

+ +
+ setFieldValue("apenas_digitos", true)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ setFieldValue("apenas_digitos", false)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ +
+

Documento comprobatório de despesa?

+
+ setFieldValue("documento_comprobatorio_de_despesa", true)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ setFieldValue("documento_comprobatorio_de_despesa", false)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ +
+

Habilita preenchimento do imposto?

+
+ setFieldValue("pode_reter_imposto", true)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ setFieldValue("pode_reter_imposto", false)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ +
+

Documento relativo ao imposto recolhido?

+
+ setFieldValue("eh_documento_de_retencao_de_imposto", true)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+ setFieldValue("eh_documento_de_retencao_de_imposto", false)} + disabled={!TEM_PERMISSAO_EDICAO_PAINEL_PARAMETRIZACOES} + /> + +
+
+
+ +
+
+

ID

+

{values.id}

+
+
+
+
+ {values.operacao === 'edit' ? ( + + ): null} +
+
+ +
+ +
+ +
+
+
+ ); + }} +
+ + ) + }; + + return ( + + ) +}; + +export default memo(ModalForm) diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoNaoPodeExcluir.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoNaoPodeExcluir.js new file mode 100644 index 000000000..52583562f --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoNaoPodeExcluir.js @@ -0,0 +1,16 @@ +import {ModalBootstrap} from "../../../../Globais/ModalBootstrap"; +import React from "react"; + +export const ModalInfoNaoPodeExcluir = (props) => { + return ( + + ) +}; diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoUpdateNaoPermitido.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoUpdateNaoPermitido.js new file mode 100644 index 000000000..1a526595c --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/ModalInfoUpdateNaoPermitido.js @@ -0,0 +1,16 @@ +import {ModalBootstrap} from "../../../../Globais/ModalBootstrap"; +import React from "react"; + +export const ModalInfoUpdateNaoPermitido = (props) => { + return ( + + ) +}; diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Tabela.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Tabela.js new file mode 100644 index 000000000..b8e8ab8a0 --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/Tabela.js @@ -0,0 +1,23 @@ +import React, {memo} from "react"; +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; + +const Tabela = ({rowsPerPage, lista, acoesTemplate})=>{ + return( + rowsPerPage} + paginatorTemplate="PrevPageLink PageLinks NextPageLink" + > + + + + ); +}; +export default memo(Tabela) diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/YupSignupSchemaTags.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/YupSignupSchemaTags.js new file mode 100644 index 000000000..de1d0c9af --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/YupSignupSchemaTags.js @@ -0,0 +1,5 @@ +import * as yup from "yup"; + +export const YupSignupSchemaTags = yup.object().shape({ + nome: yup.string().required("Nome é obrigatório"), +}); diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js new file mode 100644 index 000000000..fb81b1fdd --- /dev/null +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js @@ -0,0 +1,312 @@ +import React, {useCallback, useEffect, useMemo, useState} from "react"; +import {PaginasContainer} from "../../../../../paginas/PaginasContainer"; +import ReactTooltip from "react-tooltip"; +import { + getTodosTiposDeDocumento, + getFiltrosTiposDeDocumento, + postCreateTipoDeDocumento, + patchAlterarTipoDeDocumento, + deleteTipoDeDocumento, +} from "../../../../../services/sme/Parametrizacoes.service"; +import Tabela from "./Tabela"; +import {Filtros} from "./Filtros"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faEdit, faPlus} from "@fortawesome/free-solid-svg-icons"; +import Img404 from "../../../../../assets/img/img-404.svg" +import ModalForm from "./ModalForm"; +import {ModalInfoUpdateNaoPermitido} from "./ModalInfoUpdateNaoPermitido"; +import {ModalConfirmDelete} from "./ModalConfirmDelete"; +import {BtnAdd} from "./BtnAdd"; +import Loading from "../../../../../utils/Loading"; +import {ModalInfoNaoPodeExcluir} from "../../Estrutura/Acoes/ModalInfoNaoPodeExcluir"; +import {toastCustom} from "../../../../Globais/ToastCustom"; +import { MsgImgCentralizada } from "../../../../Globais/Mensagens/MsgImgCentralizada"; +export const TiposDocumento = ()=>{ + + const [listaDeTipos, setListaDeTipos] = useState([]); + const [loading, setLoading] = useState(true); + + const carregaTodos = useCallback(async ()=>{ + setLoading(true); + let todos = await getTodosTiposDeDocumento(); + setListaDeTipos(todos); + setLoading(false); + }, []); + + useEffect(()=>{ + carregaTodos() + }, [carregaTodos]); + + // Quando a state da lista sofrer alteração + const totalDeTipos = useMemo(() => (listaDeTipos||[]).length, [listaDeTipos]); + + // Filtros + const initialStateFiltros = { + filtrar_por_nome: "", + }; + const [stateFiltros, setStateFiltros] = useState(initialStateFiltros); + + const handleChangeFiltros = useCallback((name, value) => { + setStateFiltros({ + ...stateFiltros, + [name]: value + }); + }, [stateFiltros]); + + const handleSubmitFiltros = async () => { + setLoading(true); + let filtrados = await getFiltrosTiposDeDocumento(stateFiltros.filtrar_por_nome); + setListaDeTipos(filtrados); + setLoading(false); + }; + + const limpaFiltros = async () => { + setLoading(true); + setStateFiltros(initialStateFiltros); + await carregaTodos(); + setLoading(false); + }; + + // Tabela + const rowsPerPage = 20; + const statusTemplate = (rowData) => { + return rowData.status && rowData.status === 'ATIVO' ? 'Ativo' : 'Inativo' + }; + const apenasDigitoTemplate = (rowData) => { + // Apenas Dígitos + return rowData.apenas_digitos ? 'Sim': 'Não' + } + + // Modal + const initialStateFormModal = { + nome: "", + uuid:"", + id:"", + apenas_digitos: false, + numero_documento_digitado: false, + pode_reter_imposto: false, + eh_documento_de_retencao_de_imposto: false, + documento_comprobatorio_de_despesa: false, + operacao: 'create', + }; + + const [showModalForm, setShowModalForm] = useState(false); + const [showModalInfoUpdateNaoPermitido, setShowModalInfoUpdateNaoPermitido] = useState(false); + const [showModalConfirmDelete, setShowModalConfirmDelete] = useState(false); + const [erroExclusaoNaoPermitida, setErroExclusaoNaoPermitida] = useState(''); + const [stateFormModal, setStateFormModal] = useState(initialStateFormModal); + const [showModalInfoNaoPodeExcluir, setShowModalInfoNaoPodeExcluir] = useState(false); + const [mensagemModalInfoNaoPodeExcluir, setMensagemModalInfoNaoPodeExcluir] = useState(""); + const handleEditFormModal = useCallback( async (rowData) =>{ + console.log(stateFormModal, rowData) + setStateFormModal({ + ...stateFormModal, + nome: rowData.nome, + uuid: rowData.uuid, + id: rowData.id, + apenas_digitos: rowData.apenas_digitos, + numero_documento_digitado: rowData.numero_documento_digitado, + pode_reter_imposto: rowData.pode_reter_imposto, + eh_documento_de_retencao_de_imposto: rowData.eh_documento_de_retencao_de_imposto, + documento_comprobatorio_de_despesa: rowData.documento_comprobatorio_de_despesa, + operacao: 'edit', + }); + setShowModalForm(true) + }, [stateFormModal]); + + const acoesTemplate = useCallback((rowData) =>{ + return ( +
+ +
+ ) + }, [handleEditFormModal]); + + const handleSubmitModalForm = useCallback(async (values)=>{ + let payload = { + ...values + }; + + if (values.operacao === 'create'){ + try{ + await postCreateTipoDeDocumento(payload); + toastCustom.ToastCustomSuccess('Inclusão de tipo de documento realizado com sucesso.', 'O tipo de documento foi adicionado ao sistema com sucesso.') + setShowModalForm(false); + await carregaTodos(); + }catch (e) { + console.log('Erro ao criar Tipo de Documento ', e.response.data); + if (e.response.data && e.response.data.non_field_errors) { + setErroExclusaoNaoPermitida('Este tipo de documento já existe.'); + setShowModalInfoUpdateNaoPermitido(true) + } else { + console.log(e.response) + setErroExclusaoNaoPermitida('Houve um erro ao tentar fazer essa atualização.'); + setShowModalInfoUpdateNaoPermitido(true) + } + } + }else { + try { + await patchAlterarTipoDeDocumento(values.uuid, payload); + toastCustom.ToastCustomSuccess('Edição do tipo de documento realizado com sucesso.', 'O tipo de documento foi editado no sistema com sucesso.') + setShowModalForm(false); + await carregaTodos(); + }catch (e) { + console.log('Erro ao alterar tipo de documento ', e.response.data); + if (e.response.data && e.response.data.non_field_errors) { + setErroExclusaoNaoPermitida('Este tipo de documento já existe.'); + setShowModalInfoUpdateNaoPermitido(true); + } else { + setErroExclusaoNaoPermitida('Houve um erro ao tentar fazer essa atualização.'); + setShowModalInfoUpdateNaoPermitido(true); + } + } + setLoading(false); + } + }, [carregaTodos]); + + const onDeleteTrue = useCallback(async ()=>{ + setLoading(true); + try { + setShowModalConfirmDelete(false); + await deleteTipoDeDocumento(stateFormModal.uuid); + toastCustom.ToastCustomSuccess('Remoção do tipo de documento efetuado com sucesso.', 'O tipo de documento foi removido do sistema com sucesso.') + setShowModalForm(false); + await carregaTodos(); + }catch (e) { + if (e.response && e.response.data && e.response.data.mensagem){ + setMensagemModalInfoNaoPodeExcluir(e.response.data.mensagem); + setShowModalInfoNaoPodeExcluir(true); + console.log(e.response.data.mensagem) + }else { + setMensagemModalInfoNaoPodeExcluir('Houve um erro ao tentar fazer essa atualização.'); + setShowModalInfoNaoPodeExcluir(true); + } + } + setLoading(false); + }, [stateFormModal, carregaTodos]); + + const handleCloseFormModal = useCallback(()=>{ + setStateFormModal(initialStateFormModal); + setShowModalForm(false) + }, [initialStateFormModal]); + + const handleCloseModalInfoUpdateNaoPermitido = useCallback(()=>{ + setShowModalInfoUpdateNaoPermitido(false); + }, []); + + const handleCloseInfoNaoPodeExcluir = () => { + setShowModalInfoNaoPodeExcluir(false); + setMensagemModalInfoNaoPodeExcluir(""); + }; + + const handleCloseConfirmDelete = useCallback(()=>{ + setShowModalConfirmDelete(false) + }, []); + + return( + +

Tipo de documento

+ {loading ? ( +
+ +
+ ) : + <> +
+ + { + (listaDeTipos || []).length ? + <> + +

Exibindo {totalDeTipos} tipo(s) de documento

+ + + : + + } +
+
+ +
+
+ ${erroExclusaoNaoPermitida}

`} + primeiroBotaoTexto="Fechar" + primeiroBotaoCss="success" + /> +
+
+ +
+
+ +
+ + } +
+ ) +}; diff --git a/src/rotas/index.js b/src/rotas/index.js index f1011963c..9ce836e21 100644 --- a/src/rotas/index.js +++ b/src/rotas/index.js @@ -73,6 +73,7 @@ import {TiposConta} from "../componentes/sme/Parametrizacoes/Estrutura/TiposCont import {FiqueDeOlho} from "../componentes/sme/Parametrizacoes/EdicaoDeTextos/FiqueDeOlho"; import ArquivosDeCarga from "../componentes/Globais/ArquivosDeCarga"; import {EspecificacoesMateriaisServicos} from "../componentes/sme/Parametrizacoes/Despesas/EspecificacoesMateriaisServicos"; +import {TiposDocumento} from "../componentes/sme/Parametrizacoes/Despesas/TiposDocumento"; import {TiposDeCusteio} from "../componentes/sme/Parametrizacoes/Despesas/TiposDeCusteio" import {Fornecedores} from "../componentes/sme/Parametrizacoes/Despesas/Fornecedores"; import {AnaliseDre} from "../componentes/escolas/AnaliseDre"; @@ -489,6 +490,12 @@ const routesConfig = [ component: TiposConta, permissoes: ['access_painel_parametrizacoes', 'change_painel_parametrizacoes'], }, + { + exact: true, + path: "/parametro-tipos-documento", + component: TiposDocumento, + permissoes: ['access_painel_parametrizacoes', 'change_painel_parametrizacoes'], + }, { exact: true, path: "/parametro-mandato", diff --git a/src/services/sme/Parametrizacoes.service.js b/src/services/sme/Parametrizacoes.service.js index 507a2e990..0fc18da3c 100644 --- a/src/services/sme/Parametrizacoes.service.js +++ b/src/services/sme/Parametrizacoes.service.js @@ -346,6 +346,23 @@ export const deleteTipoDeCusteio = async (tag_uuid) => { return (await api.delete(`/api/tipos-custeio/${tag_uuid}/`, authHeader)) }; +// Tipos de Documento +export const getTodosTiposDeDocumento = async () => { + return (await api.get(`/api/tipos-documento/`, authHeader)).data +}; +export const getFiltrosTiposDeDocumento = async (nome) => { + return (await api.get(`/api/tipos-documento/?nome=${nome}`, authHeader)).data +}; +export const postCreateTipoDeDocumento = async (payload) => { + return (await api.post(`/api/tipos-documento/`, payload, authHeader)).data +}; +export const patchAlterarTipoDeDocumento = async (tag_uuid, payload) => { + return (await api.patch(`/api/tipos-documento/${tag_uuid}/`, payload, authHeader)).data +}; +export const deleteTipoDeDocumento = async (tag_uuid) => { + return (await api.delete(`/api/tipos-documento/${tag_uuid}/`, authHeader)) +}; + // Fornecedores export const getFornecedores = async () => { return (await api.get(`/api/fornecedores/`, authHeader)).data From 28cedb35ea2b71bf6909164a9372c21fe64db415 Mon Sep 17 00:00:00 2001 From: Agostinho Date: Fri, 10 Jan 2025 14:21:06 -0300 Subject: [PATCH 2/2] =?UTF-8?q?feature(124182):=20Remo=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20console=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sme/Parametrizacoes/Despesas/TiposDocumento/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js index fb81b1fdd..71272e579 100644 --- a/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js +++ b/src/componentes/sme/Parametrizacoes/Despesas/TiposDocumento/index.js @@ -98,7 +98,6 @@ export const TiposDocumento = ()=>{ const [showModalInfoNaoPodeExcluir, setShowModalInfoNaoPodeExcluir] = useState(false); const [mensagemModalInfoNaoPodeExcluir, setMensagemModalInfoNaoPodeExcluir] = useState(""); const handleEditFormModal = useCallback( async (rowData) =>{ - console.log(stateFormModal, rowData) setStateFormModal({ ...stateFormModal, nome: rowData.nome,