<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2102082155 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("
                         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.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
                                  ;
                     ");
    }

    public function down(): void
    {
        $this->execute("
                         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 seguro.v_tem_parcela_vencida ON v_tem_parcela_vencida.id_endosso = pend.id_endosso
                              WHERE 1 = 1
                           ORDER BY a.id
                                  ;
                     ");
    }
}
