<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2104210035 extends AbstractMigration
{
    public function up(): void
    {
        $this->upIndex();
        $this->upViewAvisos();
    }

    public function down(): void
    {
        $this->downIndex();
        $this->downViewAvisos();
    }

    private function upIndex()
    {
        $this->execute(<<<SQL
CREATE INDEX idx_propostas_endosso ON seguro.propostas(id_endosso);
CREATE INDEX idx_propostas_vistorias_previas_status_analise ON seguro.propostas_vistorias_previas(id_status_analise);
SQL
        );
    }

    private function downIndex()
    {
        $this->execute(<<<SQL
DROP INDEX seguro.idx_propostas_endosso;
DROP INDEX seguro.idx_propostas_vistorias_previas_status_analise;
SQL
        );
    }

    private function upViewAvisos()
    {
        $this->execute(<<<SQL
-- View: sinistro.v_avisos

DROP VIEW sinistro.v_avisos;

CREATE OR REPLACE VIEW sinistro.v_avisos AS
    SELECT DISTINCT ul.ds_nome_usuario AS ds_nome_usuario_responsavel
         , cl.ds_nome_cliente
         , a.fl_ativo
         , a.fl_del
         , a.id
         , a.dt_criacao
         , a.dt_sinistro
         , pp.id AS id_proposta
         , (to_char(seguro.dt_vigencia_inicio_original(pp.id)::timestamp with time zone, 'DD/MM/YYYY'::text) || ' - '::text) || to_char(pp.dt_vigencia_fim::timestamp with time zone, 'DD/MM/YYYY'::text) AS dt_vigencia
         , pp.nr_apolice
         , pc.id AS id_processo
         , pc.id_processo_seguradora
         , pppr.ds_nome_proponente
         , pppr.cpf_cnpj
         , pp.id_produto
         , pd.ds_nome_produto
         , u.ds_nome_usuario
         , c.id AS id_corretor
         , c.id_usuario AS id_usuario_corretor
         , c.ds_nome_fantasia AS ds_nome_corretor
         , s.id AS id_safra
         , a.id_status
         , mun.ds_nome_municipio
         , est.ds_sigla
         , est.id AS id_estado
         , mun.id AS id_municipio
         , ppr.ds_endereco
         , st.ds_status
         , pend.id_endosso
         , pc.fl_pasta_aberta
         , spc.id_usuario AS id_usuario_proposta_corretor
         , sis.vl_lmga
         , pe.ds_nome_evento AS ds_eventos
         , empvist.ds_nome_fantasia AS ds_empresa_previa
         , CASE
                WHEN a.id_status = 27 THEN
                    CASE
                        WHEN pdg.id_tipo_produto = 1 THEN
                            CASE
                                WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                    empproc.ds_nome_fantasia::character varying
                                WHEN  empcpf.ds_nome_fantasia IS NOT NULL THEN
                                    empcpf.ds_nome_fantasia::character varying
                                ELSE
                                    ''::character varying
                            END
                        ELSE
                            CASE
                                WHEN pdg.id_epoca_cultivo IS NULL OR pdg.id_epoca_cultivo = ''::bpchar THEN
                                    CASE
                                        WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                            empproc.ds_nome_fantasia::character varying
                                        WHEN empcpf.ds_nome_fantasia IS NOT NULL THEN
                                            empcpf.ds_nome_fantasia::character varying
                                        ELSE
                                            ''::character varying
                                    END
                                ELSE
                                    CASE
                                        WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                            empproc.ds_nome_fantasia::character varying
                                        ELSE
                                            sinistro.busca_empresa_cnpj(pd.id_safra, pppr.cpf_cnpj::text, pdg.id_epoca_cultivo::text)
                                    END
                            END
                    END
                ELSE NULL::character varying
           END AS ds_empresa_cpf_segurado
         , a.fl_novo
         , empcpf.id AS id_empresa_vistoriadora
         , emp.ds_nome_fantasia AS ds_nome_seguradora
         , CASE
                WHEN v_nr_endosso.nr_endosso > 0 THEN
                    v_nr_endosso.nr_endosso
                ELSE
                    0::bigint
           END AS nr_endosso
         , pp.id_proposta_mae
         , pp.id_proposta_endossada
         , seguro.id_proposta_mae_completo(pp.id_proposta_mae) AS id_proposta_mae_completo
         , ppe.id_empresa AS id_empresa_processo_sinistro
         , pp.id_usuario_criacao
         , CASE
                WHEN btrim(v_tem_parcela_vencida.id_endosso::character varying::text) <> ''::text OR v_tem_parcela_vencida.id_endosso IS NOT NULL THEN
                    TRUE
                ELSE
                    FALSE
           END AS vencida
         , empvist.ds_status AS ds_status_vistoria_previa
      FROM sinistro.avisos a
      JOIN seguro.propostas pp ON pp.id = a.id_proposta
      JOIN seguro.propostas_endosso spe ON spe.id_proposta = pp.id AND spe.fl_proposta_vigente = true
      JOIN sumario.itens_segurados sis ON sis.id_proposta = pp.id
      JOIN seguro.propostas_endosso pend ON pend.id_proposta = pp.id
      JOIN seguro.propostas_propriedades ppr ON ppr.id_proposta = pp.id
      JOIN seguro.propostas_corretores spc ON spc.id_proposta = pp.id
      JOIN sistema.corretores c ON c.id_usuario = spc.id_usuario
      JOIN sistema.municipios mun ON mun.id = ppr.id_municipio
      JOIN sistema.estados est ON est.id = mun.id_estado
      JOIN seguro.propostas_proponentes pppr ON pppr.id_proposta = pp.id
      JOIN seguro.proponentes ppo ON ppo.cpf_cnpj::text = pppr.cpf_cnpj::text
      JOIN produto.produtos pd ON pd.id = pp.id_produto
      JOIN produto.produtos_geral pdg ON pdg.id = pd.id_produto_geral
      JOIN sistema.empresas emp ON emp.id = pd.id_seguradora
      JOIN sistema.usuarios u ON u.id = a.id_usuario_criacao
      JOIN produto.safras s ON s.id = pd.id_safra
      JOIN sistema.status st ON st.id = a.id_status
      JOIN sinistro.avisos_eventos sae ON sae.id_aviso = a.id
      JOIN produto.eventos pe ON pe.id = sae.id_evento
 LEFT JOIN sinistro.processos pc ON pc.id_proposta = pp.id
 LEFT JOIN sinistro.processos_empresas ppe ON ppe.id_processo = pc.id AND ppe.fl_ativo = true
 LEFT JOIN sistema.usuarios ul ON ul.id = pc.id_usuario_responsavel_liquidacao
 LEFT JOIN seguro.clientes_propostas clp ON clp.id_proposta = pp.id
 LEFT JOIN seguro.clientes cl ON clp.id_cliente = cl.id
 LEFT JOIN sistema.empresas empcpf ON empcpf.id = ppo.id_empresa_vistoria
 LEFT JOIN (   SELECT empr.ds_nome_fantasia
                    , pvp.id_proposta
                    , pe_1.id_endosso
                    , ss.ds_status
                 FROM seguro.propostas_endosso pe_1
                 JOIN seguro.propostas_vistorias_previas pvp ON pe_1.id_proposta = pvp.id_proposta
                 JOIN (   SELECT v.id_proposta
                               , max(v.id) AS id
                            FROM seguro.propostas_vistorias_previas v
                        GROUP BY v.id_proposta
                      ) pvpp ON pvp.id = pvpp.id
                 JOIN sistema.vistorias_empresas ve ON pvp.id_vistoria = ve.id_vistoria
                 JOIN sistema.empresas empr ON ve.id_empresa = empr.id
                 JOIN sistema.status ss ON ss.id = pvp.id_status_analise
             GROUP BY empr.ds_nome_fantasia, pvp.id_proposta, pe_1.id_endosso, ss.ds_status
           ) empvist ON empvist.id_endosso = spe.id_endosso
 LEFT JOIN sistema.empresas empproc ON empproc.id = ppe.id_empresa
 LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = pp.id_endosso
 LEFT JOIN (
             SELECT propostas.id_endosso
               FROM seguro.propostas
               JOIN (   SELECT propostas_parcelas.id_proposta
                             , propostas_parcelas.dt_vencimento
                             , propostas_parcelas.vl_segurado
                             , proposta_boletos.fl_pago
                          FROM seguro.propostas propostas_1
                          JOIN seguro.propostas_endosso propostas_endosso_1
                            ON propostas_endosso_1.id_endosso = propostas_1.id_endosso
                           AND propostas_endosso_1.fl_proposta_vigente = TRUE
                          JOIN seguro.propostas_parcelas
                            ON propostas_parcelas.id_proposta = propostas_1.id
                     LEFT JOIN seguro.proposta_boletos
                            ON proposta_boletos.id_proposta = propostas_endosso_1.id_proposta
                           AND proposta_boletos.id_proposta = propostas_parcelas.id_proposta
                           AND proposta_boletos.nr_parcela  = propostas_parcelas.nr_parcela
                         WHERE proposta_boletos.fl_pago = FALSE
                    ) propostas_boletos ON propostas_boletos.id_proposta = propostas.id
               JOIN seguro.propostas_endosso ON propostas_endosso.id_endosso = propostas.id_endosso AND propostas_endosso.fl_proposta_vigente = TRUE
              WHERE propostas_boletos.vl_segurado > 0::numeric
                AND propostas_boletos.dt_vencimento < to_char(now(), 'YYYY-mm-dd'::text)::date
           ) AS v_tem_parcela_vencida
        ON v_tem_parcela_vencida.id_endosso = pend.id_endosso
     WHERE 1 = 1
  ORDER BY a.id
         ;

ALTER TABLE sinistro.v_avisos
  OWNER TO agrobrasilpg;
SQL
        );
    }

    private function downViewAvisos()
    {
        $this->execute(<<<SQL
-- View: sinistro.v_avisos

DROP VIEW sinistro.v_avisos;

CREATE OR REPLACE VIEW sinistro.v_avisos AS
    SELECT DISTINCT ul.ds_nome_usuario AS ds_nome_usuario_responsavel
         , cl.ds_nome_cliente
         , a.fl_ativo
         , a.fl_del
         , a.id
         , a.dt_criacao
         , a.dt_sinistro
         , pp.id AS id_proposta
         , (to_char(seguro.dt_vigencia_inicio_original(pp.id)::timestamp with time zone, 'DD/MM/YYYY'::text) || ' - '::text) || to_char(pp.dt_vigencia_fim::timestamp with time zone, 'DD/MM/YYYY'::text) AS dt_vigencia
         , pp.nr_apolice
         , pc.id AS id_processo
         , pc.id_processo_seguradora
         , pppr.ds_nome_proponente
         , pppr.cpf_cnpj
         , pp.id_produto
         , pd.ds_nome_produto
         , u.ds_nome_usuario
         , c.id AS id_corretor
         , c.id_usuario AS id_usuario_corretor
         , c.ds_nome_fantasia AS ds_nome_corretor
         , s.id AS id_safra
         , a.id_status
         , mun.ds_nome_municipio
         , est.ds_sigla
         , est.id AS id_estado
         , mun.id AS id_municipio
         , ppr.ds_endereco
         , st.ds_status
         , pend.id_endosso
         , pc.fl_pasta_aberta
         , spc.id_usuario AS id_usuario_proposta_corretor
         , sis.vl_lmga
         , pe.ds_nome_evento AS ds_eventos
         , empvist.ds_nome_fantasia AS ds_empresa_previa
         , CASE
                WHEN a.id_status = 27 THEN
                    CASE
                        WHEN pdg.id_tipo_produto = 1 THEN
                            CASE
                                WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                    empproc.ds_nome_fantasia::character varying
                                WHEN  empcpf.ds_nome_fantasia IS NOT NULL THEN
                                    empcpf.ds_nome_fantasia::character varying
                                ELSE
                                    ''::character varying
                            END
                        ELSE
                            CASE
                                WHEN pdg.id_epoca_cultivo IS NULL OR pdg.id_epoca_cultivo = ''::bpchar THEN
                                    CASE
                                        WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                            empproc.ds_nome_fantasia::character varying
                                        WHEN empcpf.ds_nome_fantasia IS NOT NULL THEN
                                            empcpf.ds_nome_fantasia::character varying
                                        ELSE
                                            ''::character varying
                                    END
                                ELSE
                                    CASE
                                        WHEN empproc.ds_nome_fantasia IS NOT NULL THEN
                                            empproc.ds_nome_fantasia::character varying
                                        ELSE
                                            sinistro.busca_empresa_cnpj(pd.id_safra, pppr.cpf_cnpj::text, pdg.id_epoca_cultivo::text)
                                    END
                            END
                    END
                ELSE NULL::character varying
           END AS ds_empresa_cpf_segurado
         , a.fl_novo
         , empcpf.id AS id_empresa_vistoriadora
         , emp.ds_nome_fantasia AS ds_nome_seguradora
         , CASE
                WHEN v_nr_endosso.nr_endosso > 0 THEN
                    v_nr_endosso.nr_endosso
                ELSE
                    0::bigint
           END AS nr_endosso
         , pp.id_proposta_mae
         , pp.id_proposta_endossada
         , v_id_proposta_mae_completo.chave_mae AS id_proposta_mae_completo
         , ppe.id_empresa AS id_empresa_processo_sinistro
         , pp.id_usuario_criacao
         , CASE
                WHEN btrim(v_tem_parcela_vencida.id_endosso::character varying::text) <> ''::text OR v_tem_parcela_vencida.id_endosso IS NOT NULL THEN
                    TRUE
                ELSE
                    FALSE
           END AS vencida
         , empvist.ds_status AS ds_status_vistoria_previa
      FROM sinistro.avisos a
      JOIN seguro.propostas pp ON pp.id = a.id_proposta
      JOIN seguro.propostas_endosso spe ON spe.id_proposta = pp.id AND spe.fl_proposta_vigente = true
      JOIN sumario.itens_segurados sis ON sis.id_proposta = pp.id
      JOIN seguro.propostas_endosso pend ON pend.id_proposta = pp.id
      JOIN seguro.propostas_propriedades ppr ON ppr.id_proposta = pp.id
      JOIN seguro.propostas_corretores spc ON spc.id_proposta = pp.id
      JOIN sistema.corretores c ON c.id_usuario = spc.id_usuario
      JOIN sistema.municipios mun ON mun.id = ppr.id_municipio
      JOIN sistema.estados est ON est.id = mun.id_estado
      JOIN seguro.propostas_proponentes pppr ON pppr.id_proposta = pp.id
      JOIN seguro.proponentes ppo ON ppo.cpf_cnpj::text = pppr.cpf_cnpj::text
      JOIN produto.produtos pd ON pd.id = pp.id_produto
      JOIN produto.produtos_geral pdg ON pdg.id = pd.id_produto_geral
      JOIN sistema.empresas emp ON emp.id = pd.id_seguradora
      JOIN sistema.usuarios u ON u.id = a.id_usuario_criacao
      JOIN produto.safras s ON s.id = pd.id_safra
      JOIN sistema.status st ON st.id = a.id_status
      JOIN sinistro.avisos_eventos sae ON sae.id_aviso = a.id
      JOIN produto.eventos pe ON pe.id = sae.id_evento
 LEFT JOIN sinistro.processos pc ON pc.id_proposta = pp.id
 LEFT JOIN sinistro.processos_empresas ppe ON ppe.id_processo = pc.id AND ppe.fl_ativo = true
 LEFT JOIN sistema.usuarios ul ON ul.id = pc.id_usuario_responsavel_liquidacao
 LEFT JOIN seguro.clientes_propostas clp ON clp.id_proposta = pp.id
 LEFT JOIN seguro.clientes cl ON clp.id_cliente = cl.id
 LEFT JOIN sistema.empresas empcpf ON empcpf.id = ppo.id_empresa_vistoria
 LEFT JOIN (   SELECT empr.ds_nome_fantasia
                    , pvp.id_proposta
                    , pe_1.id_endosso
                    , ss.ds_status
                 FROM seguro.propostas_endosso pe_1
                 JOIN seguro.propostas_vistorias_previas pvp ON pe_1.id_proposta = pvp.id_proposta
                 JOIN (   SELECT v.id_proposta
                               , max(v.id) AS id
                            FROM seguro.propostas_vistorias_previas v
                        GROUP BY v.id_proposta
                      ) pvpp ON pvp.id = pvpp.id
                 JOIN sistema.vistorias_empresas ve ON pvp.id_vistoria = ve.id_vistoria
                 JOIN sistema.empresas empr ON ve.id_empresa = empr.id
                 JOIN sistema.status ss ON ss.id = pvp.id_status_analise
             GROUP BY empr.ds_nome_fantasia, pvp.id_proposta, pe_1.id_endosso, ss.ds_status
           ) empvist ON empvist.id_endosso = spe.id_endosso
 LEFT JOIN sistema.empresas empproc ON empproc.id = ppe.id_empresa
 LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = pp.id_endosso
 LEFT JOIN seguro.v_id_proposta_mae_completo ON v_id_proposta_mae_completo.id_proposta = pp.id_proposta_mae
 LEFT JOIN (
             SELECT propostas.id_endosso
               FROM seguro.propostas
               JOIN (   SELECT propostas_parcelas.id_proposta
                             , propostas_parcelas.dt_vencimento
                             , propostas_parcelas.vl_segurado
                             , proposta_boletos.fl_pago
                          FROM seguro.propostas propostas_1
                          JOIN seguro.propostas_endosso propostas_endosso_1
                            ON propostas_endosso_1.id_endosso = propostas_1.id_endosso
                           AND propostas_endosso_1.fl_proposta_vigente = TRUE
                          JOIN seguro.propostas_parcelas
                            ON propostas_parcelas.id_proposta = propostas_1.id
                     LEFT JOIN seguro.proposta_boletos
                            ON proposta_boletos.id_proposta = propostas_endosso_1.id_proposta
                           AND proposta_boletos.id_proposta = propostas_parcelas.id_proposta
                           AND proposta_boletos.nr_parcela  = propostas_parcelas.nr_parcela
                         WHERE proposta_boletos.fl_pago = FALSE
                    ) propostas_boletos ON propostas_boletos.id_proposta = propostas.id
               JOIN seguro.propostas_endosso ON propostas_endosso.id_endosso = propostas.id_endosso AND propostas_endosso.fl_proposta_vigente = TRUE
              WHERE propostas_boletos.vl_segurado > 0::numeric
                AND propostas_boletos.dt_vencimento < to_char(now(), 'YYYY-mm-dd'::text)::date
           ) AS v_tem_parcela_vencida
        ON v_tem_parcela_vencida.id_endosso = pend.id_endosso
     WHERE 1 = 1
  ORDER BY a.id
         ;

ALTER TABLE sinistro.v_avisos
  OWNER TO agrobrasilpg;
SQL
        );
    }
}
