Skip to content

Commit

Permalink
Merge pull request #2140 from prefeiturasp/release/8.16.0
Browse files Browse the repository at this point in the history
Release/8.16.0
  • Loading branch information
rayanemsantos authored Jan 3, 2024
2 parents 1e79f58 + a590d1e commit b74add0
Show file tree
Hide file tree
Showing 13 changed files with 243 additions and 20 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ptrf",
"version": "8.15.1",
"version": "8.16.0",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.2.1",
Expand Down
6 changes: 6 additions & 0 deletions src/assets/css/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -340,4 +340,10 @@ body {

.title-primary {
color: $corPrimaria;
}

.is_invalid{
background-image: url("../img/icone-nao-conciliado.svg");
background-repeat: no-repeat;
background-position: 97% 50%;
}
3 changes: 2 additions & 1 deletion src/componentes/Globais/Modal/ModalConfirm.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ export function ModalConfirm({
if (onConfirm) {
onConfirm();
}
handleClose();

dispatch(closeModal());
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,22 @@ export const FormRecebimentoPelaDiretoria = ({stateFormRecebimentoPelaDiretoria,

return lista;
}


const isValid = (value) => {
if(value !== '' &&
value !== null &&
value !== undefined){
return true
} else {
return false
}
};

return(
<>
<div className="mb-3">
<span>* Campos obrigatórios</span>
</div>
<h4 data-qa="recebimento-pela-diretoria">Recebimento pela Diretoria</h4>
<form method="post">
<div className="row mt-3">
Expand All @@ -34,14 +47,15 @@ export const FormRecebimentoPelaDiretoria = ({stateFormRecebimentoPelaDiretoria,
/>
</div>
<div className="col">
<label htmlFor="data_recebimento">Data de recebimento</label>
<label htmlFor="data_recebimento">Data de recebimento *</label>
<DatePickerField
dataQa="data-de-recebimento"
name="data_recebimento"
id="data_recebimento"
value={stateFormRecebimentoPelaDiretoria.data_recebimento ? stateFormRecebimentoPelaDiretoria.data_recebimento : ''}
onChange={handleChangeFormRecebimentoPelaDiretoria}
disabled={disabledData}
className={`form-control ${isValid(stateFormRecebimentoPelaDiretoria.data_recebimento) ? '' : 'is_invalid'}`}
/>
</div>
<div className="col">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import ConferenciaDeDocumentos from "./ConferenciaDeDocumentos";
import DevolutivaDaAssociacao from "./DevolutivaDaAssociacao";
import JustificativaDeFaltaDeAjustes from "./JustificativaDeFaltaDeAjustes";
import {RetornaSeTemPermissaoEdicaoAcompanhamentoDePc} from "../RetornaSeTemPermissaoEdicaoAcompanhamentoDePc";
import { PendenciasRecebimento } from "../PendeciasRecebimento";


export const GetComportamentoPorStatus = (
Expand Down Expand Up @@ -79,6 +80,15 @@ export const GetComportamentoPorStatus = (
setCarregaLancamentosParaConferencia(prev => prev + 1);
};

const podeReceber = () => {
return (
TEMPERMISSAO &&
stateFormRecebimentoPelaDiretoria.data_recebimento &&
informacoesPrestacaoDeContas.processo_sei &&
prestacaoDeContas.ata_aprensentacao_gerada
)
};

if (prestacaoDeContas && prestacaoDeContas.status) {
if (prestacaoDeContas.status === 'NAO_RECEBIDA') {
return (
Expand All @@ -93,13 +103,15 @@ export const GetComportamentoPorStatus = (
textoBtnRetroceder={"Reabrir PC"}
metodoAvancar={() => verificaDadosParaRecebimentoDePrestacaoDeContas()}
metodoRetroceder={() => setShowReabrirPc(true)}
disabledBtnAvancar={!stateFormRecebimentoPelaDiretoria.data_recebimento || !informacoesPrestacaoDeContas.processo_sei || !TEMPERMISSAO}
disabledBtnAvancar={!podeReceber()}
disabledBtnRetroceder={!TEMPERMISSAO}
tooltipAvancar={tooltipAvancar()}
/>
<TrilhaDeStatus
prestacaoDeContas={prestacaoDeContas}
/>
<PendenciasRecebimento prestacaoDeContas={prestacaoDeContas}/>

<FormRecebimentoPelaDiretoria
handleChangeFormRecebimentoPelaDiretoria={handleChangeFormRecebimentoPelaDiretoria}
stateFormRecebimentoPelaDiretoria={stateFormRecebimentoPelaDiretoria}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,30 @@ import MaskedInput from "react-text-mask";
import { processoSeiMask } from "../../../../utils/ProcessoSeiMask";

export const InformacoesPrestacaoDeContas = ({handleChangeFormInformacoesPrestacaoDeContas, informacoesPrestacaoDeContas, editavel}) =>{

const isValid = (value) => {
if(value !== '' &&
value !== null &&
value !== undefined){
return true
} else {
return false
}
};

return(
<>
<hr className='mt-4 mb-3'/>
<h4 className='mb-4'>Informativos da prestação de contas</h4>
<form method="post">
<div className="row mt-3">
<div className="col">
<label htmlFor="processo_sei">Processo SEI</label>
<label htmlFor="processo_sei">Processo SEI *</label>
<MaskedInput
mask={(valor) => processoSeiMask(valor)}
onChange={(e) => handleChangeFormInformacoesPrestacaoDeContas(e.target.name, e.target.value)}
name="processo_sei"
className="form-control"
className={`form-control ${isValid(informacoesPrestacaoDeContas.processo_sei) ? '' : 'is_invalid'}`}
value={informacoesPrestacaoDeContas.processo_sei ? informacoesPrestacaoDeContas.processo_sei : ''}
id="processo_regularidade"
disabled={!editavel}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import React, { useEffect, useState } from "react";

import { List, Divider } from 'antd';
import { ExclamationCircleFilled } from '@ant-design/icons';

import {postNotificarPendenciaGeracaoAtaApresentacao} from '../../../../services/dres/PrestacaoDeContas.service';
import { toastCustom } from "../../../Globais/ToastCustom";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faSpinner} from "@fortawesome/free-solid-svg-icons";

export function PendenciasRecebimento({prestacaoDeContas}) {
const [pendencias, setPendencias] = useState([]);
const [loading, setLoading] = useState(false);
const [notificationSent, setNotificationSent] = useState(false);

async function notificar() {
setLoading(true);
try {
await postNotificarPendenciaGeracaoAtaApresentacao(prestacaoDeContas.uuid)
setNotificationSent(true);
toastCustom.ToastCustomSuccess('Notificação enviada com sucesso!')
} catch (error) {
toastCustom.ToastCustomError('Ops! Houve um erro ao tentar enviar notificação.')
} finally {
setLoading(false);
}
}

const ataApresentacao = {
title: 'Associação - Geração da ata de apresentação (PDF)',
subtitle: 'Notificar a associação sobre a geração da ata',
actions: [
<button
id="btn-avancar"
onClick={() => notificar()}
className="btn btn-success ml-2"
disabled={loading || notificationSent}
>
{
loading ? (
<FontAwesomeIcon
style={{marginRight: "3px", color: '#fff'}}
icon={faSpinner}
/>
) : 'Notificar associação'
}
</button>
]
}

const handlePendencias = () => {
let _pendencias = [];
if (!prestacaoDeContas.ata_aprensentacao_gerada){
_pendencias.push(ataApresentacao);
}
setPendencias(_pendencias);
};


useEffect(() => {
handlePendencias();
}, [loading]);

if(!pendencias.length) return null;

return (
<>
<h4>Pendências para o recebimento da prestação de contas</h4>
<List
itemLayout="horizontal"
dataSource={pendencias}
style={{background: "#F4F4F4", padding: "1px 8px", marginBottom: 16}}
renderItem={(item) => (
<List.Item
actions={item.actions}
style={{background: "#ffff", padding: 12, marginBottom: 8, marginTop: 8}}
>
<List.Item.Meta
avatar={<ExclamationCircleFilled style={{color: "#DE5F04", fontSize: '16px'}}/>}
title={<span style={{color: "#DE5F04", fontWeight: 600}}>{item.title}</span>}
description={<span style={{color: "#424848"}}>{item.subtitle}</span>}
/>
</List.Item>
)}
/>
<Divider/>
</>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export const FormCadastro = ({cargo, onSubmitForm, composicaoUuid, switchStatusP
}

const retornaSePeriodoFinalEhDisable = () =>{
if(cargo && cargo.id !== null){
if(cargo && cargo.id){
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,8 @@ import {useMutation, useQueryClient} from "@tanstack/react-query";
import {putCargoComposicao} from "../../../../services/Mandatos.service";
import {toastCustom} from "../../../Globais/ToastCustom";

// Preparação para react-router-dom-v6
import {useNavigate} from "react-router-dom-v5-compat";

export const usePutCargoDaComposicao = () => {
const queryClient = useQueryClient()
const navigate = useNavigate();

const mutationPutCargoDaComposicao = useMutation({
mutationFn: ({uuidCargoComposicao, payload}) => {
Expand All @@ -24,7 +20,6 @@ export const usePutCargoDaComposicao = () => {
else{
toastCustom.ToastCustomSuccess('Membro alterado com sucesso.', `O membro foi alterado no sistema com sucesso.`)
}
navigate("/membros-da-associacao");
},
onError: (error) => {
console.log("Erro ao alterar Cargo da Composição ", error.response)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import React, {useCallback, useEffect, useState} from "react";
import {useDispatch} from "react-redux";
import {PaginasContainer} from "../../../../paginas/PaginasContainer";
import {useLocation, useParams} from "react-router-dom";
// Preparação para react-router-dom-v6
import {useNavigate} from "react-router-dom-v5-compat";
import {FormCadastro} from "../components/FormCadastro";
import {usePostCargoDaComposicao} from "../hooks/usePostCargoDaComposicao";
import {useGetCargosDiretoriaExecutiva} from "../hooks/useGetCargosDiretoriaExecutiva";
Expand All @@ -10,12 +13,39 @@ import {getStatusPresidenteAssociacao} from "../../../../services/escolas/Associ

import {ASSOCIACAO_UUID} from "../../../../services/auth.service";
import {usePatchStatusPresidente} from "../hooks/usePatchStatusPresidente";
import { ModalConfirm } from "../../../Globais/Modal/ModalConfirm";

const CargoComposicaoModel = {
"ocupante_do_cargo": {
"nome": null,
"codigo_identificacao": null,
"cargo_educacao": null,
"representacao": "",
"representacao_label": "",
"email": null,
"cpf_responsavel": null,
"telefone": null,
"cep": null,
"bairro": null,
"endereco": null
},
"cargo_associacao": null,
"cargo_associacao_label": null,
"data_inicio_no_cargo": null,
"data_fim_no_cargo": null,
"eh_composicao_vigente": true,
"substituto": null,
"substituido": null,
"ocupante_editavel": true,
"data_final_editavel": false
}
export const PaginaCadastroHistoricoDeMembros = () => {

const dispatch = useDispatch();
let uuid_associacao = localStorage.getItem(ASSOCIACAO_UUID);
let {composicaoUuid} = useParams();
const { state } = useLocation();
const navigate = useNavigate();

const {mutationPostCargoDaComposicao} = usePostCargoDaComposicao()
const {mutationPutCargoDaComposicao} = usePutCargoDaComposicao()
const {mutationPatchStatusPresidenteAssociacao} = usePatchStatusPresidente()
Expand Down Expand Up @@ -55,6 +85,31 @@ export const PaginaCadastroHistoricoDeMembros = () => {
carregaCargosDaDiretoriaExecutiva().then()
}, [carregaCargosDaDiretoriaExecutiva])

const perguntarIncluirNovoMembro = async (payload, cargoVazio) => {
ModalConfirm({
dispatch,
title: 'Importante',
message: 'Deseja incluir um novo membro para o cargo?',
cancelText: 'Não incluir',
confirmText: 'Incluir novo membro',
dataQa: 'modal-sugerir-incluir-novo-membro',
onConfirm: async () => {
const mutationResp = await mutationPutCargoDaComposicao.mutateAsync({uuidCargoComposicao: state.cargo.uuid, payload: payload});
if (mutationResp.data.composicao_posterior) {
navigate(`/cadastro-historico-de-membros/${mutationResp.data.composicao_posterior}`, {
state: {cargo: cargoVazio}
});
} else {
navigate("/membros-da-associacao");
}
},
onCancel: async () => {
await mutationPutCargoDaComposicao.mutateAsync({uuidCargoComposicao: state.cargo.uuid, payload: payload});
navigate("/membros-da-associacao");
}
})
};


const onSubmitForm = async (values) => {
let payload = {
Expand All @@ -81,7 +136,15 @@ export const PaginaCadastroHistoricoDeMembros = () => {
if (!state.cargo.uuid){
mutationPostCargoDaComposicao.mutate({payload: payload})
}else {
mutationPutCargoDaComposicao.mutate({uuidCargoComposicao: state.cargo.uuid, payload: payload})
if(values.data_fim_no_cargo !== state.cargo.data_fim_no_cargo){
let cargoVazio = {...CargoComposicaoModel};
cargoVazio.cargo_associacao = values.cargo_associacao
cargoVazio.cargo_associacao_label = values.cargo_associacao_label;
perguntarIncluirNovoMembro(payload, cargoVazio);
} else {
await mutationPutCargoDaComposicao.mutateAsync({uuidCargoComposicao: state.cargo.uuid, payload: payload});
navigate("/membros-da-associacao");
}
}

let payloadStatusPresidente;
Expand Down
Loading

0 comments on commit b74add0

Please sign in to comment.