WO0000001455651.sql 13.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
/**
 * OBS:
 * 1 - EXECUTAR TODOS OS PASSOS PARA PREPARAÇÃO
 */

--DROP MATERIALIZED VIEW IF EXISTS par.vm_relatorio_pc_fluxo CASCADE;

CREATE MATERIALIZED VIEW par.vm_relatorio_pc_fluxo AS 
SELECT * FROM par.v_fluxo_prestacao_contas_v2 vfpc; -- EXEC 1

CREATE INDEX idx_processo ON par.vm_relatorio_pc_fluxo(processo); --EXEC 2
CREATE INDEX idx_terid ON par.vm_relatorio_pc_fluxo(terid); --EXEC 3
CREATE INDEX idx_dopid ON par.vm_relatorio_pc_fluxo(dopid); --EXEC 4
CREATE INDEX idx_dotid_par3 ON par.vm_relatorio_pc_fluxo(dotid_par3); --EXEC 5
CREATE INDEX idx_dotid_par4 ON par.vm_relatorio_pc_fluxo(dotid_par4); --EXEC 6
CREATE INDEX idx_proid_pac ON par.vm_relatorio_pc_fluxo(proid_pac); --EXEC 7
CREATE INDEX idx_proid_par ON par.vm_relatorio_pc_fluxo(proid_par); --EXEC 8
CREATE INDEX idx_prpid ON par.vm_relatorio_pc_fluxo(prpid); --EXEC 9
CREATE INDEX idx_proid_par3 ON par.vm_relatorio_pc_fluxo(proid_par3); --EXEC 10
CREATE INDEX idx_proid_par4 ON par.vm_relatorio_pc_fluxo(proid_par4); --EXEC 11

--DROP MATERIALIZED VIEW IF EXISTS par.vm_relatorio_pc_datas_limite CASCADE;

CREATE MATERIALIZED VIEW par.vm_relatorio_pc_datas_limite AS
SELECT
	vfpc.processo,
	vfpc.tipo,
	vfpc.modulo,
	par.data_limite_pc(vfpc.processo) AS prazo_pc,
	CASE
		WHEN vfpc.tipo = 'OBRA' OR vfpc.tipo = 'PAC'
			THEN par.retornadataenviopc(vfpc.processo)
		WHEN vfpc.tipo = 'PAR' AND vfpc.modulo = 'PAR2'
			THEN cpar.cpcdtenvio
		WHEN vfpc.tipo = 'PAR' AND vfpc.modulo = 'PAR3'
			THEN epc.epcdatavalidacao
		WHEN vfpc.tipo = 'PAR' AND vfpc.modulo = 'PAR4'
			THEN epc2.epcdatavalidacao
	END::date AS dt_envio_pc
FROM par.vm_relatorio_pc_fluxo vfpc
LEFT JOIN (
	SELECT 
		c.prpid,
		max(c.cpcdtenvio)::date AS cpcdtenvio
	FROM par.comprovanteprestacaocontas c
	WHERE c.cpcstatus = 'A'
	GROUP BY prpid
) cpar ON cpar.prpid = vfpc.prpid
LEFT JOIN (
	SELECT 
		epc.proid,
		max(epc.epcdatavalidacao)::date AS epcdatavalidacao
	FROM par3.execucao_prestacao_contas epc
	WHERE epc.epcstatus = 'A'
	GROUP BY proid
) AS epc ON epc.proid = vfpc.proid_par3
LEFT JOIN (
	SELECT 
		epc.proid,
		max(epc.epcdatavalidacao)::date AS epcdatavalidacao
	FROM par4.execucao_prestacao_contas epc
	WHERE epc.epcstatus = 'A'
	GROUP BY proid
) AS epc2 ON epc2.proid = vfpc.proid_par4; --EXEC 12


CREATE INDEX idx_processo_datas ON par.vm_relatorio_pc_datas_limite(processo); --EXEC 13

--DROP MATERIALIZED VIEW IF EXISTS par.vm_relatorio_pc_pagamento_processo_ob CASCADE;

CREATE MATERIALIZED VIEW par.vm_relatorio_pc_pagamento_processo_ob AS
SELECT 
	e.empnumeroprocesso AS processo,
	sum(p.pagvalorparcela) AS total_pag,
	MIN(p.pagnumeroob) AS primeiro_ob
FROM par.empenho e
JOIN par.pagamento p ON p.empid = e.empid
WHERE p.pagsituacaopagamento ILIKE '%EFETIVADO%'
GROUP BY empnumeroprocesso
UNION ALL
SELECT 
	e.empnumeroprocesso,
	sum(p.pagvalorparcela),
	MIN(p.pagnumeroob) AS primeiro_ob
FROM par3.empenho e
JOIN par3.pagamento p ON p.empid = e.empid
WHERE p.pagsituacaopagamento ILIKE '%EFETIVADO%'
GROUP BY e.empnumeroprocesso
UNION ALL
SELECT 
	e.empnumeroprocesso,
	sum(p.pagvalorparcela),
	MIN(p.pagnumeroob) AS primeiro_ob
FROM par4.empenho e
JOIN par4.pagamento p ON p.empid = e.empid
WHERE p.pagsituacaopagamento ILIKE '%EFETIVADO%'
GROUP BY e.empnumeroprocesso; --EXEC 14

CREATE INDEX idx_processo_pag_ob ON par.vm_relatorio_pc_pagamento_processo_ob(processo); --EXEC 15

--DROP MATERIALIZED VIEW IF EXISTS par.vm_relatorio_pc_me_situacao_fase CASCADE;

CREATE MATERIALIZED VIEW par.vm_relatorio_pc_me_situacao_fase AS
SELECT DISTINCT
	rs.rspid,
	s.smpcdesc,
	f.fmpcdesc,
	rs.proid_par,
	rs.proid_pac,
	rs.proid_par3,
	NULL AS proid_par4,
	rs.prpid
FROM par.registrosituacaopc rs
JOIN par.situacaomeprestacaocontas s ON rs.smpcid = s.smpcid --AND rs.smpcid IS NOT NULL
JOIN par.fasemeprestacaocontas f ON f.fmpcid = rs.fmpcid --AND rs.fmpcid IS NOT NULL
WHERE rs.rspstatus = 'A'; --EXEC 16

CREATE INDEX idx_proid_pac_sitme ON par.vm_relatorio_pc_me_situacao_fase(proid_pac); --EXEC 17
CREATE INDEX idx_proid_par_sitme ON par.vm_relatorio_pc_me_situacao_fase(proid_par); --EXEC 18
CREATE INDEX idx_prpid_sitme ON par.vm_relatorio_pc_me_situacao_fase(prpid); --EXEC 19
CREATE INDEX idx_proid_par3_sitme ON par.vm_relatorio_pc_me_situacao_fase(proid_par3); --EXEC 20
CREATE INDEX idx_proid_par4_sitme ON par.vm_relatorio_pc_me_situacao_fase(proid_par4); --EXEC 21


--DROP MATERIALIZED VIEW IF EXISTS par.vm_relatorio_pc_relatorio_xlsx CASCADE;

CREATE MATERIALIZED VIEW par.vm_relatorio_pc_relatorio_xlsx AS
SELECT * FROM (
	SELECT DISTINCT 
		vfpc.processo,
		COALESCE(t.ternumero, d.dopnumerodocumento, d_par3.dotnumero, d_par4.dotnumero) AS termo,
		CASE
			WHEN vfpc.tipo = 'PAC'
				THEN 'Programa PAC'
				ELSE COALESCE(m2.mdonome, m3.mdonome, m4.mdonome)
		END AS programa_projeto,
		COALESCE(mun.estuf, est.estuf) AS uf,
		COALESCE(mun.inudescricao, est.inudescricao) AS municipio,
		COALESCE(iemun.entcnpj, ieest.entcnpj) AS cnpj,
		COALESCE(iemun.entnome, ieest.entnome) AS entidade,
		
		TO_CHAR(
    COALESCE(
      COALESCE(t.terdataassinatura::date, t.terdatainclusao::date),
      par.formata_data_termo_inicio(d.dopdatainiciovigencia::text),
      d3.dotdatainiciovigencia::date,
      d4.dotdatainiciovigencia::date
    ), 
    'DD/MM/YYYY'
  ) AS inicio_vigencia,

  TO_CHAR(
    COALESCE(
      par.formata_data_termo_fim(t.terdatafimvigencia::text),
      par.formata_data_termo_fim(d.dopdatafimvigencia::text),
      d3.dotdatafimvigencia::date,
      d4.dotdatafimvigencia::date
    ), 
    'DD/MM/YYYY'
  ) AS fim_vigencia,

		to_char(v_dt.prazo_pc, 'DD/MM/YYYY') AS prazo_pc,
		CASE 
			WHEN v_dt.dt_envio_pc IS NULL AND t2.prpid IS NULL AND t3.proid_pac IS NULL AND t4.proid_par IS NULL AND v_dt.prazo_pc < now()::date
			THEN (now()::date - v_dt.prazo_pc)
			ELSE 0
		END AS dias_atraso,
		CASE
			WHEN t2.prpid IS NOT NULL OR t3.proid_pac IS NOT NULL OR t4.proid_par IS NOT NULL
				THEN 'Enviado via SIGPC'
			ELSE to_char(v_dt.dt_envio_pc, 'DD/MM/YYYY')
		END AS data_recibo,
		COALESCE(pag.total_pag, 0) AS vlr_repassado,
		-- Dados bancários
		COALESCE(propar.prpagencia, proobrapar.proagencia, propac.proagencia, pro3.proagencia, pro4.proagencia) AS agencia,
		COALESCE(propar.nu_conta_corrente, proobrapar.nu_conta_corrente, propac.nu_conta_corrente, pro3.nu_conta_corrente, pro4.nu_conta_corrente) AS conta,
		COALESCE(io.itrid, ip.itrid, ip4.itrid, ip5.itrid) as itrid,
		m.muncod,
		est.estuf,
		
		pag.primeiro_ob AS primeiro_ob,
		vfpc.fase_pc_esdsc AS fase_pc_atual,
		vfpc.situacao_pc_esddsc AS situcao_pc_atual,
		vfpc.situacao_opc_esddsc AS situacao_opc_atual,
		
		CASE
			WHEN COALESCE(efeitosuspensivo.efdstatus, efeitosuspensivo1.efdstatus, efeitosuspensivo2.efdstatus, efeitosuspensivo3.efdstatus) = 'A'
				THEN 'Vigente' 
				ELSE 'Não vigente' 
				END AS ef_suspensivo,				
		COALESCE(vm_s_f_me.fmpcdesc, vm_s_f_me1.fmpcdesc, vm_s_f_me2.fmpcdesc,vm_s_f_me3.fmpcdesc) AS fase_me,
		COALESCE(vm_s_f_me.smpcdesc, vm_s_f_me1.smpcdesc, vm_s_f_me2.smpcdesc, vm_s_f_me3.smpcdesc) AS situacao_me,
		vfpc.tipo AS tipo,
		vfpc.modulo
	FROM par.vm_relatorio_pc_fluxo vfpc
	JOIN par.vm_relatorio_pc_datas_limite AS v_dt ON v_dt.processo = vfpc.processo
	LEFT JOIN par.vm_relatorio_pc_pagamento_processo_ob AS pag ON pag.processo = vfpc.processo
	LEFT JOIN (
		SELECT 
			d.proid,
			d.dotnumero,
			max(dotid) AS dotid 
		FROM par3.documentotermo d
		WHERE d.dotstatus = 'A'
		GROUP BY proid, dotnumero
	) AS d_par3 ON d_par3.dotid = vfpc.dotid_par3
	LEFT JOIN (
		SELECT 
			d.proid,
			d.dotnumero,
			max(dotid) AS dotid 
		FROM par4.documentotermo d
		WHERE d.dotstatus = 'A'
		GROUP BY proid, dotnumero
	) AS d_par4 ON d_par4.dotid = vfpc.dotid_par4
	LEFT JOIN par3.documentotermo d3 ON d3.dotid = d_par3.dotid AND d3.dotstatus = 'A'
	--par3 banco
	LEFT JOIN par3.processo pro3 ON pro3.proid = d3.proid
	LEFT JOIN par4.documentotermo d4 ON d4.dotid = d_par4.dotid AND d4.dotstatus = 'A'
	--par4 banco 
	LEFT JOIN par4.processo pro4 ON pro4.proid = d4.proid
	LEFT JOIN par.vm_relatorio_pc_me_situacao_fase AS vm_s_f_me ON vm_s_f_me.prpid = vfpc.prpid
	LEFT JOIN par.vm_relatorio_pc_me_situacao_fase AS vm_s_f_me1 ON vm_s_f_me1.proid_pac = vfpc.proid_pac 
	LEFT JOIN par.vm_relatorio_pc_me_situacao_fase AS vm_s_f_me2 ON vm_s_f_me2.proid_par = vfpc.proid_par 
	LEFT JOIN par.vm_relatorio_pc_me_situacao_fase AS vm_s_f_me3 ON vm_s_f_me3.proid_par3 = vfpc.proid_par3
	-- efeito susp
	LEFT JOIN par.efeitosuspensivodocumento AS efeitosuspensivo ON efeitosuspensivo.prpid = vfpc.prpid
	LEFT JOIN par.efeitosuspensivodocumento AS efeitosuspensivo1 ON efeitosuspensivo1.proid_pac = vfpc.proid_pac 
	LEFT JOIN par.efeitosuspensivodocumento AS efeitosuspensivo2 ON efeitosuspensivo2.proid = vfpc.proid_par 
	LEFT JOIN par.efeitosuspensivodocumento AS efeitosuspensivo3 ON efeitosuspensivo3.proid_par3 = vfpc.proid_par3
	
	LEFT JOIN par.processoobra p ON p.proid = vfpc.proid_pac
	LEFT JOIN par.processoobraspar p2 ON p2.proid = vfpc.proid_par
	LEFT JOIN par.instrumentounidade io ON io.inuid = p2.inuid
	LEFT JOIN par.processopar p3 ON p3.prpid = vfpc.prpid
	LEFT JOIN par.instrumentounidade ip ON ip.inuid = p3.inuid
	LEFT JOIN par3.processo p4 ON p4.proid = vfpc.proid_par3
	LEFT JOIN par3.instrumentounidade ip4 ON ip4.inuid = p4.inuid
	LEFT JOIN par4.processo p5 ON p5.proid = vfpc.proid_par4
	LEFT JOIN par4.instrumentounidade ip5 ON ip5.inuid = p5.inuid
	
	LEFT JOIN par.termocompromissopac t ON t.terid = vfpc.terid 
	-- pac banco
	LEFT JOIN par.processoobra propac ON t.proid = propac.proid AND propac.prostatus = 'A'

	LEFT JOIN par.documentopar d ON d.dopid = vfpc.dopid AND d.dopid IN (
		SELECT dopid FROM (
				SELECT 
					d.prpid,
					d.dopnumerodocumento,
					max(dopid) AS dopid
				FROM par.documentopar d
				WHERE d.dopstatus  = 'A'
				GROUP BY prpid, d.dopnumerodocumento
		) lastdopid
	)
	-- banco obra par 
	LEFT JOIN par.processoobraspar proobrapar ON d.proid = proobrapar.proid AND proobrapar.prostatus = 'A'
	-- banco par
    LEFT JOIN par.processopar propar ON d.prpid = propar.prpid AND propar.prpstatus = 'A'
	LEFT JOIN territorios.municipio m ON m.muncod = COALESCE(t.muncod, ip.muncod, io.muncod, ip4.muncod, ip5.muncod)
	LEFT JOIN territorios.estado e ON e.estuf = COALESCE(t.estuf, ip.estuf, io.estuf, ip4.estuf, ip5.estuf)
	LEFT JOIN par4.instrumentounidade mun ON mun.muncod = m.muncod AND mun.itrid = 2
	LEFT JOIN par4.instrumentounidade est ON est.estuf = e.estuf AND est.itrid = 1
	LEFT JOIN par4.instrumentounidade_entidade iemun ON iemun.inuid = mun.inuid 
		AND iemun.tenid = 1 
		AND iemun.entstatus = 'A' 
		AND iemun.entrazaosocial IS NOT NULL
		AND iemun.entcnpj IN(p.procnpj, p2.procnpj, p3.prpcnpj, p4.procnpj, p5.procnpj)
	LEFT JOIN par4.instrumentounidade_entidade ieest ON ieest.inuid = est.inuid 
		AND ieest.tenid = 3 
		AND ieest.entstatus = 'A' 
		AND ieest.entrazaosocial IS NOT NULL
		AND ieest.entcnpj IN(p.procnpj, p2.procnpj, p3.prpcnpj, p4.procnpj, p5.procnpj)
	LEFT JOIN par.termossigpcpar t2 ON t2.prpid = vfpc.prpid
	LEFT JOIN par.termossigpcpar t3 ON t3.proid_pac = vfpc.proid_pac
	LEFT JOIN par.termossigpcpar t4 ON t4.proid_par = vfpc.proid_par
	LEFT JOIN par.modelosdocumentos m2 ON m2.mdoid = d.mdoid and m2.tpdcod in (16, 21, 102, 103)
	LEFT JOIN par3.modelodocumento m3 ON m3.mdoid = d3.mdoid
	LEFT JOIN par4.modelodocumento m4 ON m4.mdoid = d4.mdoid
	wHERE 1 = 1 
	--AND vfpc.tipo = 'OBRA' AND vfpc.modulo = 'PAR3' 
--	AND vfpc.processo = '23400004475201391'
	--ORDER BY vfpc.modulo, vfpc.tipo;
) AS foo WHERE termo IS NOT NULL AND programa_projeto IS NOT NULL; --EXEC 22


--query para trazer a planilha que joão batista pediu de Prestação de Contas
select distinct 
	to_char(processo::bigint, 'FM00000"."000000"/"0000"-"00') as "N° do processo",
	--termo as "Termo de Compromisso", 
	vrprx.uf as "UF", 
	municipio as "Município",
	'' as "Origem dos recursos",
	COALESCE(REPLACE(TO_CHAR(vlr_repassado, 'FM999999990.00'), '.', ','), '0,00') as "Valor total do recurso",
	prazo_pc as "Data limite prestação de contas",
	data_recibo as "Data efetiva prestação de contas",
	primeiro_ob as "Ordem Bancária",
	CASE 
	    WHEN vrprx.itrid = 2 
	    THEN 
	    	SUBSTRING(rrp.rrpcnpj FROM 1 FOR 2) || '.' ||
            SUBSTRING(rrp.rrpcnpj FROM 3 FOR 3) || '.' ||
            SUBSTRING(rrp.rrpcnpj FROM 6 FOR 3) || '/' ||
            SUBSTRING(rrp.rrpcnpj FROM 9 FOR 4) || '-' ||
            SUBSTRING(rrp.rrpcnpj FROM 13 FOR 2)
	    ELSE 
	    	SUBSTRING(rrs.rrscnpj FROM 1 FOR 2) || '.' ||
            SUBSTRING(rrs.rrscnpj FROM 3 FOR 3) || '.' ||
            SUBSTRING(rrs.rrscnpj FROM 6 FOR 3) || '/' ||
            SUBSTRING(rrs.rrscnpj FROM 9 FOR 4) || '-' ||
            SUBSTRING(rrs.rrscnpj FROM 13 FOR 2)
	END as "CPF/CNPJ do beneficiário",
	CASE 
        WHEN vrprx.itrid = 2 THEN (
            SELECT STRING_AGG(rpref.usucpf, ', ')
            FROM par.rollresponsaveisprefeitos rpref
            WHERE rpref.muncod = vrprx.muncod
            	limit 1
        )
        ELSE (
            SELECT STRING_AGG(rsec.usucpf, ', ')
            FROM par.rollresponsaveissecretarios rsec
            WHERE rsec.uf = vrprx.estuf
            	limit 1
        )
    END as "CPF/CNPJ dos Responsáveis",
	'' as "Estágio do Processo",
	substr(processo, 12, 4) AS"Ano do Processo",
	termo as "Identificação do Repasse",
	fase_pc_atual,
	situcao_pc_atual as "situacao_pc_atual",
	situacao_opc_atual,
	fase_me,
	situacao_me,
	CASE 	
		WHEN 
			(  
				SELECT COUNT(1)
				FROM par.termossigpcpar tsp
				LEFT JOIN par.processoobra po ON po.proid = tsp.proid_pac
				LEFT JOIN par.processoobraspar pop ON pop.proid = tsp.proid_par
				LEFT JOIN par.processopar pp ON pp.prpid = tsp.prpid
				WHERE COALESCE(po.pronumeroprocesso, pop.pronumeroprocesso, pp.prpnumeroprocesso) = processo
				LIMIT 1
			) > 0 
        THEN
			'Enviado via SIGPC'
        ELSE
        	data_recibo
        END as "Dt Recibo Envio"
from par.vm_relatorio_pc_relatorio_xlsx vrprx
left join par.rollresponsaveisprefeitos rrp on rrp.muncod = vrprx.muncod and vrprx.itrid = 2
left join par.rollresponsaveissecretarios rrs on rrs.uf = vrprx.estuf  and vrprx.itrid = 1;