From d13c961bfba7ca6a5aeacba730d87a1bf709434a Mon Sep 17 00:00:00 2001 From: RONALDO RODRIGUES DE OLIVEIRA Date: Mon, 16 Jun 2025 12:35:54 -0300 Subject: [PATCH] Verifica quais processos OBRA pode ser candidatos a declaração de omissão --- declaracao_omissao/regras-100625/OBRA/2-function_par_.omisso_declarado_candidato_obra.sql | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 declaracao_omissao/regras-100625/OBRA/2-function_par_.omisso_declarado_candidato_obra.sql diff --git a/declaracao_omissao/regras-100625/OBRA/2-function_par_.omisso_declarado_candidato_obra.sql b/declaracao_omissao/regras-100625/OBRA/2-function_par_.omisso_declarado_candidato_obra.sql new file mode 100644 index 0000000..0b51130 --- /dev/null +++ b/declaracao_omissao/regras-100625/OBRA/2-function_par_.omisso_declarado_candidato_obra.sql @@ -0,0 +1,231 @@ +-- DROP FUNCTION IF EXISTS par.omisso_declarado_candidato_obra(); + +CREATE OR REPLACE FUNCTION par.omisso_declarado_candidato_obra() + RETURNS TABLE( + _processo character varying, + _proid int, + _dopid int, + _numero_termo bigint, + _fase_pc_esddsc character varying, + _fase_pc_esdid integer, + _situacao_da_pc_esddsc character varying, + _situacao_da_pc_esdid integer, + _situacao_da_opc_esddsc character varying, + _situacao_da_opc_esdid integer, + _muncod character varying, + _datainiciovigencia date, + _datafimvigencia date, + _total_cpf_ciencia integer, + _contador_responsavel integer, + _contador_ciencia integer, + _aux_cpf_ciencia text, + _aux_cpf_responsavel text + ) + LANGUAGE plpgsql +AS $function$ + DECLARE + erro_carga boolean default false; + erro_msg text default ''; + dt_limite_envio_pc date; + contador_cpf_ciencia integer default 0; + contador_ciencia integer default 0; + contador_responsavel integer default 0; + last_insert_odeid integer default 0; + array_ciencia_cpf text[]; + array_responsavel_cpf text[]; + array_ciencia_ids integer[]; + sem_dtinicio_mandato integer default 0; + programa record; + cpfs_ciencia record; + cpfs_responsavel record; + verifica_equivalencia boolean default false; + BEGIN + FOR programa IN( + WITH wf_documento_estado AS + ( SELECT + esd.esddsc, docid, doc.esdid + FROM workflow.documento doc + INNER join workflow.estadodocumento esd ON doc.esdid = esd.esdid + WHERE doc.tpdid IN (303, 336, 335, 328, 344, 345, 443, 444, 442 ) + ) + select + distinct processo, proid, dopid, numero_termo, situacao_da_pc as situacao_da_pc_docid, fase_pc_esddsc, fase_pc_esdid, situacao_da_pc_esddsc, situacao_da_pc_esdid, + situacao_da_opc_esddsc, situacao_da_opc_esdid, muncod, datainiciovigencia, datafimvigencia + from + ( + select + distinct + pro.pronumeroprocesso as processo, + dop.dopid, + pro.proid, + dop.dopnumerodocumento as numero_termo, + exe.docid as fase_pc, + spco.docid AS situacao_da_pc, + opco.docid AS situacao_da_opc, + pro.muncod, + par.formata_data_termo_inicio(dop.dopdatainiciovigencia) AS datainiciovigencia, + dop.dopdatafimvigencia::date AS datafimvigencia, + (SELECT esd2.esdid from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = exe.docid) AS fase_pc_esdid, + (SELECT esd2.esdid from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = spco.docid) AS situacao_da_pc_esdid, + (SELECT esd2.esdid from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = opco.docid) AS situacao_da_opc_esdid, + (SELECT esd2.esddsc from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = exe.docid) AS fase_pc_esddsc, + (SELECT esd2.esddsc from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = spco.docid) AS situacao_da_pc_esddsc, + (SELECT esd2.esddsc from workflow.estadodocumento esd2 INNER join workflow.documento doc2 ON doc2.esdid = esd2.esdid where doc2.docid = opco.docid) AS situacao_da_opc_esddsc + FROM par.processoobraspar pro + INNER JOIN par.documentopar dop on dop.proid = pro.proid and pro.prostatus = 'A' and dop.dopstatus='A' + INNER JOIN obras2.execucaofinanceira exe ON pro.proid = exe.proid_par AND exe.exestatus = 'A' + INNER JOIN obras2.situacaoopcobras opco ON pro.proid = opco.proid_par and opco.sopstatus = 'A' + INNER JOIN obras2.situacaoprestacaocontasobras spco ON pro.proid = spco.proid_par and spco.spostatus='A' + ) as sql + left join wf_documento_estado situacao_da_opc on sql.situacao_da_opc = situacao_da_opc.docid + left join wf_documento_estado situacao_da_pc on sql.situacao_da_pc = situacao_da_pc.docid + left join wf_documento_estado doc_est on sql.fase_pc = doc_est.docid + where + datainiciovigencia is not null and fase_pc_esdid='2174' and situacao_da_pc_esdid='2283' and situacao_da_opc_esdid='2278' + ) + LOOP + sem_dtinicio_mandato := (SELECT count(*) FROM par.rollresponsaveisprefeitos WHERE muncod = programa.muncod and rrpdtiniciomandato isnull); + IF sem_dtinicio_mandato < 1 THEN + + contador_responsavel := 0; + contador_cpf_ciencia := 0; + dt_limite_envio_pc := (select data_limite_pc from par.data_limite_pc(programa.processo::text)); + + + FOR cpfs_responsavel IN( select _cpf as cpf, _rrpid as rrpid from par.get_responsaveis_termo(programa.muncod, programa.datainiciovigencia, programa.datafimvigencia, dt_limite_envio_pc, 'OBRA') ) + LOOP + + array_responsavel_cpf := array_append(array_responsavel_cpf, cpfs_responsavel.cpf::text); + contador_responsavel := contador_responsavel + 1; + contador_ciencia := 0; + FOR cpfs_ciencia IN ( select _cpf as cpf, _id as id from par.get_ciencias_termo_obra(programa.proid, programa.dopid) ) + LOOP + + contador_ciencia := contador_ciencia + 1; + IF cpfs_responsavel.cpf = cpfs_ciencia.cpf THEN + array_ciencia_cpf := array_append(array_ciencia_cpf, cpfs_ciencia.cpf::text); + array_ciencia_ids := array_append(array_ciencia_ids, cpfs_ciencia.id ); + END IF; + + END LOOP; + + END LOOP; + + array_ciencia_ids := (SELECT array_agg(DISTINCT elem) FROM unnest(array_ciencia_ids) AS elem); + contador_cpf_ciencia := array_length(array_ciencia_ids, 1); + verifica_equivalencia := (SELECT bool_and(elem = ANY(array_ciencia_cpf)) FROM unnest(array_responsavel_cpf) AS elem); + + + IF (contador_responsavel > 0) and ( contador_ciencia > 0 ) and (contador_cpf_ciencia >= contador_responsavel) and (verifica_equivalencia) THEN + IF( select not exists( select * from par.omissodeclarado where proid_par in(programa.proid) and odestatus = 'A' ) ) THEN + + BEGIN + BEGIN + INSERT INTO par.omissodeclarado (proid_par, dopid, programa) + VALUES (programa.proid, programa.dopid, 'OBRA') + RETURNING par.omissodeclarado.odeid INTO last_insert_odeid; + EXCEPTION WHEN others THEN + erro_carga := true; + erro_msg := format(E' \n INSERT INTO par.omissodeclarado (proid, dopid, programa VALUES (%, %, "OBRA")', programa.proid, programa.dopid); + RAISE WARNING 'Erro ao inserir em omissodeclarado: % PROCESSO: %', SQLERRM, programa.processo; + RETURN; + END; + + + FOR cpfs_responsavel IN ( select _rrpid as rrpid, _cpf as cpf , _nomeprefeito as nomeprefeito, _dtiniciomandato as dtiniciomandato, _dtfimmandato as dtfimmandato, _naturezainteresse as naturezainteresse + from par.get_responsaveis(programa.muncod, programa.datainiciovigencia, programa.datafimvigencia, dt_limite_envio_pc, 'OBRA') + ) + LOOP + BEGIN + -- raise notice '%, %, %, %, %, %, "OBRA" ',programa.muncod, programa.processo, programa.proid, programa.dopid, programa.datainiciovigencia, programa.datafimvigencia; + INSERT INTO par.responsaveisomisso(odeid, usucpf, dtiniciomandato, dtfimmandato, naturezainteresse, rrpid) + VALUES (last_insert_odeid, cpfs_responsavel.cpf, cpfs_responsavel.dtiniciomandato, cpfs_responsavel.dtfimmandato, cpfs_responsavel.naturezainteresse, cpfs_responsavel.rrpid); + EXCEPTION WHEN others THEN + erro_carga := true; + erro_msg := erro_msg || format(E' \n INSERT INTO par.responsaveisomisso (odeid, usucpf, dtiniciomandato, dtfimmandato, naturezainteresse, rrpid) VALUES (%s, %s, %s, %s, %s, %s)',last_insert_odeid, cpfs_responsavel.cpf, cpfs_responsavel.dtiniciomandato, cpfs_responsavel.dtfimmandato, cpfs_responsavel.naturezainteresse, cpfs_responsavel.rrpid); + RAISE WARNING 'Erro ao inserir em responsaveisomisso: % PROCESSO: %', SQLERRM, programa.processo; + END; + END LOOP; + + + FOR cpfs_ciencia IN ( + SELECT _id AS id, _cpf AS cpf, _tipo AS tipo + from par.get_ciencias_termo_obra(programa.proid, programa.dopid) + ) + LOOP + IF NOT EXISTS( + SELECT * + FROM par.cienciasomisso + WHERE opcid = cpfs_ciencia.id OR npid = cpfs_ciencia.id OR negid = cpfs_ciencia.id + ) THEN + BEGIN + IF cpfs_ciencia.tipo = 'omissaopcente' THEN + INSERT INTO par.cienciasomisso(odeid, usucpf, opcid) + VALUES (last_insert_odeid, cpfs_ciencia.cpf, cpfs_ciencia.id); + ELSIF cpfs_ciencia.tipo = 'notificacaoexgestor' THEN + + INSERT INTO par.cienciasomisso(odeid, usucpf, negid) + VALUES (last_insert_odeid, cpfs_ciencia.cpf, cpfs_ciencia.id); + ELSE + INSERT INTO par.cienciasomisso(odeid, usucpf, npid) + VALUES (last_insert_odeid, cpfs_ciencia.cpf, cpfs_ciencia.id); + END IF; + EXCEPTION WHEN others THEN + erro_carga := true; + erro_msg := erro_msg || format(E' \nINSERT INTO par.cienciasomisso(odeid, usucpf, npid) VALUES (%, %, %)', last_insert_odeid, cpfs_ciencia.cpf, cpfs_ciencia.id ); + RAISE WARNING 'Erro ao inserir em cienciasomisso: % PROCESSO: %', SQLERRM, programa.processo; + END; + END IF; + END LOOP; + + END; + + IF erro_carga THEN + IF last_insert_odeid > 0 THEN -- Em caso de alguma falha na carga realiza especie de Rollback + DELETE FROM par.cienciasomisso WHERE odeid = last_insert_odeid; + DELETE FROM par.responsaveisomisso where odeid = last_insert_odeid; + DELETE FROM par.omissodeclarado where odeid = last_insert_odeid; + END IF; + -- Registra a falha + INSERT INTO par.logerros_omissodeclarado_carga (mensagem, numeroprocesso, programa, origem) + VALUES (erro_msg, programa.processo, 'OBRA','par.omisso_declarado_candidato_obra'); + ELSE + update par.omissodeclarado set andamento='fase-1' where proid_par in(programa.proid); + END IF; + + erro_carga := false; + last_insert_odeid := 0; + + + _processo := programa.processo; + _proid := programa.proid; + _dopid := programa.dopid; + _numero_termo := programa.numero_termo; + _fase_pc_esddsc := programa.fase_pc_esddsc; + _fase_pc_esdid := programa.fase_pc_esdid; + _situacao_da_pc_esddsc := programa.situacao_da_pc_esddsc; + _situacao_da_pc_esdid := programa.situacao_da_pc_esdid; + _situacao_da_opc_esddsc := programa.situacao_da_opc_esddsc; + _situacao_da_opc_esdid := programa.situacao_da_opc_esdid; + _muncod := programa.muncod; + _datainiciovigencia := programa.datainiciovigencia; + _datafimvigencia := programa.datafimvigencia; + _total_cpf_ciencia := contador_cpf_ciencia; + _contador_ciencia := contador_ciencia; + _contador_responsavel := contador_responsavel; + _aux_cpf_ciencia := array_to_string(array_ciencia_cpf, ', '); + _aux_cpf_responsavel := array_to_string(array_responsavel_cpf, ', '); + RETURN NEXT; + END IF; + END IF; + array_ciencia_ids := NULL; + array_responsavel_cpf := NULL; + array_ciencia_cpf := NULL; + END IF; + + END LOOP; + +END; $function$; + + + -- libgit2 0.25.0