<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2402071357 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
DROP VIEW sinistro.v_laudos_cobranca_preliminar_final;

CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_preliminar_final AS
   SELECT lf.id_cobertura
        , pr.id                             AS id_processo
        , v_id_proposta_mae.id_proposta_mae
        , po.ds_nome_proponente
        , m.ds_nome_municipio
        , e.ds_sigla
        , ep.ds_nome_fantasia
        , ep.id                             AS id_empresa
        , vlf.id_vistoria
        , cu.ds_nome_cultura
        , lf.ds_itens_segurados             AS itens
        , lf.ds_variedades                  AS variedade
        , lf.vl_area_vistoriada
        , 'Final'::TEXT                     AS tp_vistoria
        , pg.id_tipo_produto
        , cu.id                             AS id_cultura
        , p.id                              AS id_proposta
        , e.id                              AS id_estado
        , pr.id_processo_seguradora
        , lf.dt_vistoria
        , vgvf.municipio_perito as municipio_perito
        , vgvf.nome_perito as perito
        , STRING_AGG(vgaf.nome_auxiliar, ', ') AS auxiliar
        , lf.fl_evento_nao_constatado       AS evento_nao_constatado
        , pd.id                             AS id_produto
        , pd.id_seguradora
        , pd.id_produto_geral               AS id_produto_geral
        , ep.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
        , m.id                              AS id_municipio
        , vgvf.id_perito
        , to_char(p.dt_criacao, 'YYYY-MM-DD') as data_criacao_proposta
     FROM seguro.propostas_endosso ped
     JOIN seguro.propostas p
       ON ped.id_proposta = p.id
      AND ped.fl_proposta_vigente
        , seguro.propostas_proponentes po
        , seguro.propostas_propriedades pp
        , sistema.municipios m
        , sistema.estados e
        , produto.produtos pd
        , produto.produtos_geral pg
        , produto.culturas cu
        , sinistro.processos pr
        , sinistro.processos_empresas pe
        , sistema.empresas ep
        LEFT JOIN sistema.municipios em ON em.id = ep.id_municipio
        LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
        , sistema.vistorias_laudos_finais vlf
        LEFT JOIN sinistro.v_get_auxiliares_final vgaf ON vgaf.id_laudo_final = vlf.id_laudo_final
        , sinistro.laudos_finais lf
        , sistema.usuarios u
        , sistema.vistorias_empresas ve
        , seguro.v_id_proposta_mae
        , sinistro.v_get_vistoriadores_final vgvf
    WHERE (
               lf.id_status = 110
            OR lf.id_status = 205
          )
      AND pr.id_status                 <> 5
      AND pr.id_proposta                = p.id
      AND po.id_proposta                = p.id
      AND pp.id_proposta                = p.id
      AND pp.id_municipio               = m.id
      AND pd.id                         = p.id_produto
      AND pg.id                         = pd.id_produto_geral
      AND cu.id                         = pg.id_cultura
      AND e.id                          = m.id_estado
      AND pe.id_processo                = pr.id
      AND ep.id                         = pe.id_empresa
      AND vlf.id_laudo_final            = lf.id
      AND lf.id_processo                = pr.id
      AND u.id                          = lf.id_usuario_criacao
      AND pd.id_safra                  >= 17
      AND ve.id_empresa                 = ep.id
      AND ve.id_vistoria                = vlf.id_vistoria
      AND v_id_proposta_mae.id_proposta = p.id_proposta_mae
      AND vgvf.id_laudo_final           = vlf.id_laudo_final

 GROUP BY lf.id_cobertura
        , pr.id
        , v_id_proposta_mae.id_proposta_mae
        , po.ds_nome_proponente
        , m.ds_nome_municipio
        , e.ds_sigla
        , ep.ds_nome_fantasia
        , ep.id
        , ep.cpf_cnpj
        , vlf.id_vistoria
        , cu.ds_nome_cultura
        , lf.ds_itens_segurados
        , lf.ds_variedades
        , lf.vl_area_vistoriada
        , 'Final'::TEXT
        , pg.id_tipo_produto
        , cu.id
        , p.id
        , e.id
        , pr.id_processo_seguradora
        , lf.dt_vistoria
        , lf.fl_evento_nao_constatado
        , pd.id
        , pd.id_seguradora
        , em.ds_nome_municipio
        , ee.ds_sigla
        , vgvf.nome_perito
        , vgvf.municipio_perito
        , m.id
        , vgvf.id_perito
UNION
   SELECT lp.id_cobertura
        , pr.id                             AS id_processo
        , v_id_proposta_mae.id_proposta_mae
        , po.ds_nome_proponente
        , m.ds_nome_municipio
        , e.ds_sigla
        , ep.ds_nome_fantasia
        , ep.id                             AS id_empresa
        , vlp.id_vistoria
        , cu.ds_nome_cultura
        , lp.ds_itens_segurados             AS itens
        , lp.ds_variedades                  AS variedade
        , lp.vl_area_vistoriada
        , 'Preliminar'::TEXT                AS tp_vistoria
        , pg.id_tipo_produto
        , cu.id                             AS id_cultura
        , p.id                              AS id_proposta
        , e.id                              AS id_estado
        , pr.id_processo_seguradora
        , lp.dt_vistoria
        , vgvp.municipio_perito as municipio_perito
        , vgvp.nome_perito as perito
        , STRING_AGG(vgap.nome_auxiliar, ', ') AS auxiliar
        , lp.fl_evento_nao_constatado       AS evento_nao_constatado
        , pd.id                             AS id_produto
        , pd.id_seguradora
        , pd.id_produto_geral               AS id_produto_geral
        , ep.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
        , m.id                              AS id_municipio
        , vgvp.id_perito
        , to_char(p.dt_criacao, 'YYYY-MM-DD') as data_criacao_proposta
     FROM seguro.propostas_endosso ped
     JOIN seguro.propostas p
       ON ped.id_proposta = p.id
      AND ped.fl_proposta_vigente
        , seguro.propostas_proponentes po
        , seguro.propostas_propriedades pp
        , sistema.municipios m
        , sistema.estados e
        , produto.produtos pd
        , produto.produtos_geral pg
        , produto.culturas cu
        , sinistro.processos pr
        , sinistro.processos_empresas pe
        , sistema.empresas ep
        LEFT JOIN sistema.municipios em ON em.id = ep.id_municipio
        LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
        , sistema.vistorias_laudos_preliminares vlp
        LEFT JOIN sinistro.v_get_auxiliares_preliminar vgap
        ON vgap.id_laudo_preliminar = vlp.id_laudo_preliminar
        , sinistro.laudos_preliminares lp
        , sistema.usuarios u
        , sistema.vistorias v
        , sistema.vistorias_empresas ve
        , seguro.v_id_proposta_mae
        , sinistro.v_get_vistoriadores_preliminar vgvp
    WHERE (
               lp.id_status = 76
            OR lp.id_status = 204
          )
      AND pe.fl_ativo                   = TRUE
      AND pr.id_status                 <> 5
      AND pe.fl_ativo                   = TRUE
      AND pr.id_proposta                = p.id
      AND po.id_proposta                = p.id
      AND pp.id_proposta                = p.id
      AND pp.id_municipio               = m.id
      AND pd.id                         = p.id_produto
      AND pg.id                         = pd.id_produto_geral
      AND cu.id                         = pg.id_cultura
      AND e.id                          = m.id_estado
      AND pe.id_processo                = pr.id
      AND ep.id                         = pe.id_empresa
      AND vlp.id_laudo_preliminar       = lp.id
      AND lp.id_processo                = pr.id
      AND u.id                          = lp.id_usuario_criacao
      AND pd.id_safra                  >= 17
      AND v.id                          = vlp.id_vistoria
      AND ve.id_empresa                 = ep.id
      AND ve.id_vistoria                = vlp.id_vistoria
      AND v_id_proposta_mae.id_proposta = p.id_proposta_mae
      AND vgvp.id_laudo_preliminar      = vlp.id_laudo_preliminar
 GROUP BY lp.id_cobertura
        , pr.id
        , v_id_proposta_mae.id_proposta_mae
        , po.ds_nome_proponente
        , m.ds_nome_municipio
        , e.ds_sigla
        , ep.ds_nome_fantasia
        , ep.id
        , ep.cpf_cnpj
        , vlp.id_vistoria
        , cu.ds_nome_cultura
        , lp.ds_itens_segurados
        , lp.ds_variedades
        , lp.vl_area_vistoriada
        , 'Preliminar'::TEXT
        , pg.id_tipo_produto
        , cu.id
        , p.id
        , e.id
        , pr.id_processo_seguradora
        , lp.dt_vistoria
        , lp.fl_evento_nao_constatado
        , pd.id
        , pd.id_seguradora
        , em.ds_nome_municipio
        , ee.ds_sigla
        , vgvp.nome_perito
        , vgvp.municipio_perito
        , m.id
        , vgvp.id_perito
 ORDER BY 16
        ;
SQL
);
    }

    public function down(): void
    {
        $this->execute(<<<SQL
DROP VIEW sinistro.v_laudos_cobranca_preliminar_final;

CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_preliminar_final AS
SELECT lf.id_cobertura,
       pr.id                                            AS id_processo,
       v_id_proposta_mae.id_proposta_mae,
       po.ds_nome_proponente,
       m.ds_nome_municipio,
       e.ds_sigla,
       ep.ds_nome_fantasia,
       ep.id                                            AS id_empresa,
       vlf.id_vistoria,
       cu.ds_nome_cultura,
       lf.ds_itens_segurados                            AS itens,
       lf.ds_variedades                                 AS variedade,
       lf.vl_area_vistoriada,
       'Final'::text                                    AS tp_vistoria,
       pg.id_tipo_produto,
       cu.id                                            AS id_cultura,
       p.id                                             AS id_proposta,
       e.id                                             AS id_estado,
       pr.id_processo_seguradora,
       lf.dt_vistoria,
       vistoriadores_laudos_finais.municipio_perito,
       vistoriadores_laudos_finais.nome_perito          AS perito,
       string_agg(vgaf.nome_auxiliar::text, ', '::text) AS auxiliar,
       lf.fl_evento_nao_constatado                      AS evento_nao_constatado,
       pd.id                                            AS id_produto,
       pd.id_seguradora,
       pd.id_produto_geral,
       ep.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,
       m.id                                             AS id_municipio,
       vistoriadores_laudos_finais.id_perito,
       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 AND ped.fl_proposta_vigente
         JOIN seguro.propostas_proponentes po ON po.id_proposta = p.id
         JOIN seguro.propostas_propriedades pp ON pp.id_proposta = p.id
         JOIN sistema.municipios m ON m.id = pp.id_municipio
         JOIN sistema.estados e ON e.id = m.id_estado
         JOIN produto.produtos pd ON pd.id = p.id_produto
         JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
         JOIN produto.culturas cu ON cu.id = pg.id_cultura
         JOiN sinistro.processos pr ON pr.id_proposta = p.id
         JOIN sinistro.processos_empresas pe ON pe.id_processo = pr.id
         JOIN sistema.empresas ep ON ep.id = pe.id_empresa
         JOIN sistema.municipios em ON em.id = ep.id_municipio
         JOIN sistema.estados ee ON ee.id = em.id_estado
         JOIN sinistro.laudos_finais lf ON lf.id_processo = pr.id
         JOIN sistema.vistorias_laudos_finais vlf ON vlf.id_laudo_final = lf.id
         LEFT JOIN sinistro.v_get_auxiliares_final vgaf ON vgaf.id_laudo_final = vlf.id_laudo_final
         JOIN sistema.usuarios u ON u.id = lf.id_usuario_criacao
         JOIN sistema.vistorias v ON v.id = vlf.id_vistoria
         JOIN sistema.vistorias_empresas ve ON ve.id_empresa = ep.id AND ve.id_vistoria = vlf.id_vistoria
         LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
         LEFT JOIN (SELECT x.id_laudo_final,
                           STRING_AGG(x.nome_perito, ', ')           AS nome_perito,
                           STRING_AGG(x.ds_municipio_completo, ', ') AS municipio_perito,
                           ARRAY_AGG(x.id_perito)                    AS id_perito
                    FROM (SELECT laudos_finais.id                                  AS id_laudo_final
                               , CAST(funcionarios.ds_nome_funcionario AS VARCHAR) AS nome_perito
                               , COALESCE(fm.ds_nome_municipio, 'NAO INFORMADO') || '/' ||
                                 COALESCE(fe.ds_sigla, '-')                        as ds_municipio_completo
                               , CAST(funcionarios.id AS VARCHAR)                  AS id_perito
                          FROM sistema.funcionarios
                                   JOIN sinistro.laudos_finais_funcionarios
                                        ON laudos_finais_funcionarios.id_funcionario = funcionarios.id
                                   JOIN sinistro.laudos_finais
                                        ON laudos_finais.id = laudos_finais_funcionarios.id_laudo_final
                                   JOIN sistema.usuarios
                                        ON funcionarios.id_usuario = usuarios.id AND usuarios.tp_usuario <> 'H'
                                   LEFT JOIN sistema.municipios fm ON fm.id = funcionarios.id_municipio
                                   LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
                          GROUP BY laudos_finais.id
                                 , funcionarios.ds_nome_funcionario
                                 , fm.ds_nome_municipio
                                 , funcionarios.id
                                 , fe.ds_sigla
                          ORDER BY funcionarios.ds_nome_funcionario) as x
                    GROUP BY x.id_laudo_final) as vistoriadores_laudos_finais
                   ON vistoriadores_laudos_finais.id_laudo_final = lf.id
WHERE (
            lf.id_status = 110
        OR lf.id_status = 205
    )
  AND pr.id_status <> 5
  AND pd.id_safra >= (select id - 1
                      from produto.safras
                      where fl_vigente = true)
GROUP BY lf.id_cobertura,
         pr.id,
         v_id_proposta_mae.id_proposta_mae,
         po.ds_nome_proponente,
         m.ds_nome_municipio,
         e.ds_sigla,
         ep.ds_nome_fantasia,
         ep.id,
         vlf.id_vistoria,
         cu.ds_nome_cultura,
         lf.ds_itens_segurados,
         lf.ds_variedades,
         lf.vl_area_vistoriada,
         'Final'::text,
         pg.id_tipo_produto,
         cu.id,
         p.id,
         e.id,
         pr.id_processo_seguradora,
         lf.dt_vistoria,
         vistoriadores_laudos_finais.municipio_perito,
         e.ds_sigla,
         vistoriadores_laudos_finais.nome_perito,
         vgaf.nome_auxiliar,
         lf.fl_evento_nao_constatado,
         pd.id,
         pd.id_seguradora,
         pd.id_produto_geral,
         ep.cpf_cnpj,
         p.nr_apolice,
         em.ds_nome_municipio,
         ee.ds_sigla,
         m.id,
         vistoriadores_laudos_finais.id_perito,
         p.dt_criacao
UNION
SELECT lp.id_cobertura,
       pr.id                                            AS id_processo,
       v_id_proposta_mae.id_proposta_mae,
       po.ds_nome_proponente,
       m.ds_nome_municipio,
       e.ds_sigla,
       ep.ds_nome_fantasia,
       ep.id                                            AS id_empresa,
       vlp.id_vistoria,
       cu.ds_nome_cultura,
       lp.ds_itens_segurados                            AS itens,
       lp.ds_variedades                                 AS variedade,
       lp.vl_area_vistoriada,
       'Preliminar'::text                               AS tp_vistoria,
       pg.id_tipo_produto,
       cu.id                                            AS id_cultura,
       p.id                                             AS id_proposta,
       e.id                                             AS id_estado,
       pr.id_processo_seguradora,
       lp.dt_vistoria,
       vistoriadores_laudos_preliminares.municipio_perito,
       vistoriadores_laudos_preliminares.nome_perito    AS perito,
       string_agg(vgap.nome_auxiliar::text, ', '::text) AS auxiliar,
       lp.fl_evento_nao_constatado                      AS evento_nao_constatado,
       pd.id                                            AS id_produto,
       pd.id_seguradora,
       pd.id_produto_geral,
       ep.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,
       m.id                                             AS id_municipio,
       vistoriadores_laudos_preliminares.id_perito,
       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 AND ped.fl_proposta_vigente
         JOIN seguro.propostas_proponentes po ON po.id_proposta = p.id
         JOIN seguro.propostas_propriedades pp ON pp.id_proposta = p.id
         JOIN sistema.municipios m ON m.id = pp.id_municipio
         JOIN sistema.estados e ON e.id = m.id_estado
         JOIN produto.produtos pd ON pd.id = p.id_produto
         JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
         JOIN produto.culturas cu ON cu.id = pg.id_cultura
         JOIN sinistro.processos pr ON pr.id_proposta = p.id
         JOIN sinistro.processos_empresas pe ON pe.id_processo = pr.id
         JOIN sistema.empresas ep ON ep.id = pe.id_empresa
         JOIN sistema.municipios em ON em.id = ep.id_municipio
         JOIN sistema.estados ee ON ee.id = em.id_estado
         JOIN sinistro.laudos_preliminares lp ON lp.id_processo = pr.id
         JOIN sistema.vistorias_laudos_preliminares vlp ON vlp.id_laudo_preliminar = lp.id
         LEFT JOIN sinistro.v_get_auxiliares_preliminar vgap ON vgap.id_laudo_preliminar = vlp.id_laudo_preliminar
         JOIN sistema.usuarios u ON u.id = lp.id_usuario_criacao AND u.tp_usuario <> 'H'::bpchar
         JOIN sistema.vistorias v ON v.id = vlp.id_vistoria
         JOIN sistema.vistorias_empresas ve ON ve.id_empresa = ep.id AND ve.id_vistoria = vlp.id_vistoria
         LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
         LEFT JOIN (SELECT x.id_laudo_preliminar,
                           STRING_AGG(x.nome_perito, ', ')           AS nome_perito,
                           STRING_AGG(x.ds_municipio_completo, ', ') AS municipio_perito,
                           ARRAY_AGG(x.id_perito)                    AS id_perito
                    FROM (SELECT laudos_preliminares.id                            AS id_laudo_preliminar
                               , CAST(funcionarios.ds_nome_funcionario AS VARCHAR) AS nome_perito
                               , COALESCE(fm.ds_nome_municipio, 'NAO INFORMADO') || '/' ||
                                 COALESCE(fe.ds_sigla, '-')                        as ds_municipio_completo
                               , CAST(funcionarios.id AS VARCHAR)                  AS id_perito
                          FROM sistema.funcionarios
                                   JOIN sistema.vistorias_funcionarios
                                        ON vistorias_funcionarios.id_funcionario = funcionarios.id
                                   JOIN sistema.vistorias_laudos_preliminares
                                        ON vistorias_laudos_preliminares.id_vistoria =
                                           vistorias_funcionarios.id_vistoria
                                   JOIN sinistro.laudos_preliminares
                                        ON laudos_preliminares.id = vistorias_laudos_preliminares.id_laudo_preliminar
                                   JOIN sistema.usuarios
                                        ON funcionarios.id_usuario = usuarios.id AND usuarios.tp_usuario <> 'H'
                                   LEFT JOIN sistema.municipios fm ON fm.id = funcionarios.id_municipio
                                   LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
                          GROUP BY laudos_preliminares.id
                                 , funcionarios.ds_nome_funcionario
                                 , funcionarios.id
                                 , fm.ds_nome_municipio
                                 , fe.ds_sigla
                          ORDER BY funcionarios.ds_nome_funcionario) as x
                    GROUP BY x.id_laudo_preliminar) AS vistoriadores_laudos_preliminares
                   ON vistoriadores_laudos_preliminares.id_laudo_preliminar = vlp.id_laudo_preliminar
WHERE (
            lp.id_status = 76
        OR lp.id_status = 204
    )
  AND pe.fl_ativo = true
  AND pr.id_status <> 5
  AND pe.fl_ativo = true
  AND pd.id_safra >= (select id - 1
                      from produto.safras
                      where fl_vigente = true)
GROUP BY lp.id_cobertura,
         pr.id,
         v_id_proposta_mae.id_proposta_mae,
         po.ds_nome_proponente,
         m.ds_nome_municipio,
         e.ds_sigla,
         ep.ds_nome_fantasia,
         ep.id,
         vlp.id_vistoria,
         cu.ds_nome_cultura,
         lp.ds_itens_segurados,
         lp.ds_variedades,
         lp.vl_area_vistoriada,
         pg.id_tipo_produto,
         cu.id,
         p.id,
         e.id,
         pr.id_processo_seguradora,
         lp.dt_vistoria,
         vistoriadores_laudos_preliminares.municipio_perito,
         e.ds_sigla,
         vistoriadores_laudos_preliminares.nome_perito,
         vgap.nome_auxiliar,
         lp.fl_evento_nao_constatado,
         pd.id,
         pd.id_seguradora,
         pd.id_produto_geral,
         ep.cpf_cnpj,
         p.nr_apolice,
         em.ds_nome_municipio,
         ee.ds_sigla,
         m.id,
         vistoriadores_laudos_preliminares.id_perito,
         p.dt_criacao;
SQL
);
    }
}
