/**
 * 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;