<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc47011 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
    DROP view sinistro.v_laudos_cobranca_previa;

    CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_previa AS
        SELECT p.id AS id_proposta,
            v_id_proposta_mae.id_proposta_mae,
            pvp.id_vistoria,
            prc.id AS id_processo,
            prc.id_processo_seguradora,
            pvp.id AS id_proposta_vistoria,
            prop.ds_nome_proponente,
            pd.ds_nome_abreviado,
            m.ds_nome_municipio,
            e.ds_sigla,
            e.id AS id_estado,
            emp.ds_nome_fantasia,
            emp.id AS id_empresa,
            'Previa'::text AS tp_vistoria,
            pg.id_tipo_produto,
            cu.id AS id_cultura,
            cu.ds_nome_cultura,
            c.id AS id_cobertura,
            fu.ds_nome_funcionario AS perito,
            ARRAY[fu.id::character varying] AS id_perito,
            to_char(pvp.dt_laudo, 'YYYY-MM-DD HH24:MI:SS'::text) AS dt_vistoria,
            to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text) AS dt_laudo,
            pvp.dt_laudo AS dt_laudo_order,
            sf.ds_chave AS ds_safra,
            c.ds_chave_cobertura,
            pd.id_seguradora,
            pd.id_safra,
            sf.ds_nome_safra,
            emp.cpf_cnpj AS cpf_cnpj_empresa,
            p.nr_apolice,
            em.ds_nome_municipio AS ds_nome_municipio_empresa,
            ee.ds_sigla AS ds_sigla_uf_empresa,
            (COALESCE(fm.ds_nome_municipio::character varying, 'NAO INFORMADO'::character varying)::text || '/'::text) || COALESCE(fe.ds_sigla, '-'::bpchar)::text AS municipio_perito,
            m.id AS id_municipio,
            to_char(p.dt_criacao::timestamp with time zone, 'YYYY-MM-DD'::text) AS data_criacao_proposta
        FROM seguro.propostas_endosso ped
            JOIN seguro.propostas p ON ped.id_proposta = p.id
            JOIN seguro.propostas_coberturas pc ON pc.id_proposta = p.id AND pc.fl_principal = true
            JOIN produto.coberturas c ON c.id = pc.id_cobertura
            JOIN produto.produtos pd ON pd.id = p.id_produto AND pd.id_safra >= (( SELECT safras.id - 2
                FROM produto.safras
                WHERE safras.fl_vigente = true))
            JOIN produto.safras sf ON sf.id = pd.id_safra
            JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
            JOIN produto.culturas cu ON cu.id = pg.id_cultura
            LEFT JOIN sinistro.processos prc ON prc.id_proposta = p.id
            JOIN seguro.propostas_propriedades pp ON p.id = pp.id_proposta
            JOIN seguro.propostas_proponentes prop ON p.id = prop.id_proposta
            JOIN sistema.municipios m ON pp.id_municipio = m.id
            JOIN sistema.estados e ON m.id_estado = e.id
            JOIN seguro.propostas_vistorias_previas pvp ON p.id = pvp.id_proposta AND pvp.fl_transmitido = true AND pvp.fl_nova_vistoria_custo_perito IS NOT TRUE
            LEFT JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = pvp.id_vistoria
            LEFT JOIN sistema.agendamentos_funcionarios af ON af.id_agendamento = va.id_agendamento
            LEFT JOIN sistema.funcionarios fu ON fu.id = af.id_funcionario
            JOIN sistema.vistorias_empresas vemp ON pvp.id_vistoria = vemp.id_vistoria AND vemp.fl_ativo = true
            JOIN sistema.empresas emp ON vemp.id_empresa = emp.id
            LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
            LEFT JOIN sistema.municipios em ON em.id = emp.id_municipio
            LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
            LEFT JOIN sistema.municipios fm ON fm.id = fu.id_municipio
            LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
        ORDER BY (to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text));

SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
    DROP view sinistro.v_laudos_cobranca_previa;
    
    CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_previa AS
        SELECT p.id AS id_proposta,
            v_id_proposta_mae.id_proposta_mae,
            pvp.id_vistoria,
            prc.id AS id_processo,
            prc.id_processo_seguradora,
            pvp.id AS id_proposta_vistoria,
            prop.ds_nome_proponente,
            pd.ds_nome_abreviado,
            m.ds_nome_municipio,
            e.ds_sigla,
            e.id AS id_estado,
            emp.ds_nome_fantasia,
            emp.id AS id_empresa,
            'Previa'::text AS tp_vistoria,
            pg.id_tipo_produto,
            cu.id AS id_cultura,
            cu.ds_nome_cultura,
            c.id AS id_cobertura,
            fu.ds_nome_funcionario AS perito,
            fu.id AS id_perito,
            to_char(pvp.dt_laudo, 'YYYY-MM-DD HH24:MI:SS'::text) AS dt_vistoria,
            to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text) AS dt_laudo,
            pvp.dt_laudo AS dt_laudo_order,
            sf.ds_chave AS ds_safra,
            c.ds_chave_cobertura,
            pd.id_seguradora,
            pd.id_safra,
            sf.ds_nome_safra,
            emp.cpf_cnpj AS cpf_cnpj_empresa,
            p.nr_apolice,
            em.ds_nome_municipio AS ds_nome_municipio_empresa,
            ee.ds_sigla AS ds_sigla_uf_empresa,
            (COALESCE(fm.ds_nome_municipio::character varying, 'NAO INFORMADO'::character varying)::text || '/'::text) || COALESCE(fe.ds_sigla, '-'::bpchar)::text AS municipio_perito,
            m.id AS id_municipio,
            to_char(p.dt_criacao::timestamp with time zone, 'YYYY-MM-DD'::text) AS data_criacao_proposta
        FROM seguro.propostas_endosso ped
            JOIN seguro.propostas p ON ped.id_proposta = p.id
            JOIN seguro.propostas_coberturas pc ON pc.id_proposta = p.id AND pc.fl_principal = true
            JOIN produto.coberturas c ON c.id = pc.id_cobertura
            JOIN produto.produtos pd ON pd.id = p.id_produto AND pd.id_safra >= (( SELECT safras.id - 2
                FROM produto.safras
                WHERE safras.fl_vigente = true))
            JOIN produto.safras sf ON sf.id = pd.id_safra
            JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
            JOIN produto.culturas cu ON cu.id = pg.id_cultura
            LEFT JOIN sinistro.processos prc ON prc.id_proposta = p.id
            JOIN seguro.propostas_propriedades pp ON p.id = pp.id_proposta
            JOIN seguro.propostas_proponentes prop ON p.id = prop.id_proposta
            JOIN sistema.municipios m ON pp.id_municipio = m.id
            JOIN sistema.estados e ON m.id_estado = e.id
            JOIN seguro.propostas_vistorias_previas pvp ON p.id = pvp.id_proposta AND pvp.fl_transmitido = true AND pvp.fl_nova_vistoria_custo_perito IS NOT TRUE
            LEFT JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = pvp.id_vistoria
            LEFT JOIN sistema.agendamentos_funcionarios af ON af.id_agendamento = va.id_agendamento
            LEFT JOIN sistema.funcionarios fu ON fu.id = af.id_funcionario
            JOIN sistema.vistorias_empresas vemp ON pvp.id_vistoria = vemp.id_vistoria AND vemp.fl_ativo = true
            JOIN sistema.empresas emp ON vemp.id_empresa = emp.id
            LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
            LEFT JOIN sistema.municipios em ON em.id = emp.id_municipio
            LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
            LEFT JOIN sistema.municipios fm ON fm.id = fu.id_municipio
            LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
        ORDER BY (to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text));
SQL
        );
    }
}
