Verifica quais processos OBRA pode ser candidatos a declaração de omissão

parent 0e6eba7c
-- 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$;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment