<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2205261736 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("DROP VIEW sinistro.v_laudos_cobranca_previa");
        $this->execute("DROP VIEW sinistro.v_laudos_cobranca_preliminar_final");
        $this->execute("DROP VIEW sinistro.v_get_vistoriadores_preliminar");
        $this->execute("DROP VIEW sinistro.v_get_vistoriadores_final");

        $this->upViewLaudosCobrancaPrevia();
        $this->upViewGetVistoriadoresFinal();
        $this->upViewGetVistoriadoresPreliminar();
        $this->upViewLaudosCobrancaPreliminarFinal();
    }

    public function down(): void
    {
        $this->execute("DROP VIEW sinistro.v_laudos_cobranca_previa");
        $this->execute("DROP VIEW sinistro.v_laudos_cobranca_preliminar_final");
        $this->execute("DROP VIEW sinistro.v_get_vistoriadores_preliminar");
        $this->execute("DROP VIEW sinistro.v_get_vistoriadores_final");

        $this->downViewLaudosCobrancaPrevia();
        $this->downViewGetVistoriadoresFinal();
        $this->downViewGetVistoriadoresPreliminar();
        $this->downViewLaudosCobrancaPreliminarFinal();
    }

    public function upViewLaudosCobrancaPreliminarFinal(): void
    {
        $this->execute(<<<SQL
            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
                    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
                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
                    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
                ORDER BY 16
                        ;
SQL
        );
    }

    public function downViewLaudosCobrancaPreliminarFinal(): void
    {
        $this->execute(<<<SQL
            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
                        , STRING_AGG(DISTINCT(vgvf.nome_perito), ', ' ORDER BY nome_perito DESC) 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
                    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
                        , 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
                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
                        , STRING_AGG(DISTINCT(vgvp.nome_perito), ', ' ORDER BY nome_perito DESC) 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
                    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
                        , 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
                ORDER BY 16
                        ;
SQL
        );
    }

    public function upViewGetVistoriadoresPreliminar(): void
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_get_vistoriadores_preliminar AS
                SELECT x.id_laudo_preliminar, 
                        STRING_AGG(x.nome_perito, ', ') AS nome_perito,
                        STRING_AGG(x.ds_municipio_completo, ', ') AS municipio_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
                        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
                        , fm.ds_nome_municipio
                        , fe.ds_sigla
                    ORDER BY funcionarios.ds_nome_funcionario
                ) as x
                GROUP BY x.id_laudo_preliminar;
SQL
        );
    }

    public function downViewGetVistoriadoresPreliminar(): void
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_get_vistoriadores_preliminar AS
                SELECT laudos_preliminares.id                         AS id_laudo_preliminar
                    , CAST(funcionarios.ds_nome_funcionario AS VARCHAR) AS nome_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'
                GROUP BY laudos_preliminares.id
                    , funcionarios.ds_nome_funcionario
                ORDER BY funcionarios.ds_nome_funcionario
                    ;
SQL
        );
    }

    public function upViewGetVistoriadoresFinal(): void
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_get_vistoriadores_final AS
                SELECT x.id_laudo_final, 
                        STRING_AGG(x.nome_perito, ', ') AS nome_perito,
                        STRING_AGG(x.ds_municipio_completo, ', ') AS municipio_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
                        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
                        , fe.ds_sigla
                    ORDER BY funcionarios.ds_nome_funcionario
                ) as x
                GROUP BY x.id_laudo_final;
SQL
        );
    }

    public function downViewGetVistoriadoresFinal(): void
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_get_vistoriadores_final AS
                SELECT laudos_finais.id                               AS id_laudo_final
                    , CAST(funcionarios.ds_nome_funcionario AS VARCHAR) AS nome_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'
                GROUP BY laudos_finais.id
                    , funcionarios.ds_nome_funcionario
                ORDER BY funcionarios.ds_nome_funcionario
                    ;
SQL
        );
    }

    public function upViewLaudosCobrancaPrevia(): void
    {
        $this->execute(<<<SQL
            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' 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,
                    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, 'NAO INFORMADO') || '/' || COALESCE(fe.ds_sigla, '-') as municipio_perito
                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 > 14
                    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 downViewLaudosCobrancaPrevia(): void
    {
        $this->execute(<<<SQL
            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' 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,
                    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
                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 > 14
                    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
                ORDER BY to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text);
SQL
        );
    }
}
