<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSR56852 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL

            INSERT INTO manutencao.materialized_views (
                dt_criacao,
                migration_name,
                ordem,
                schemaname,
                matviewname,
                dt_ultima_atualizacao
                ) VALUES (
                    CURRENT_DATE,
                    'TaskReservasV2',
                    28,
                    'sumario',
                    'relatorio_parcelas',
                    CURRENT_TIMESTAMP
                );

CREATE MATERIALIZED VIEW sumario.relatorio_parcelas AS (
    SELECT pr.id_proposta_mae AS id_proposta,
           s.id as id_safra,
           pr.id_versao,
           seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
           pr.id_proposta_mae,
           pr.nr_apolice,
           to_char(pr.dt_vigencia_inicio, 'DD/MM/YYYY') as dt_vigencia_inicio,
           pr.id_status,
           c.ds_nome_cultura,
           pp.ds_nome_proponente,
           st.ds_status,
           st.cd_status,
           co.ds_nome_abreviado AS ds_nome_fantasia,
           u.tp_usuario,
           CASE WHEN u.tp_usuario='P' THEN
               u.ds_nome_usuario
           ELSE
               ''
           END AS sublogin,
           pb.nr_parcela,
           pb.vl_total,
           pb.vl_segurado,
           pb.vl_subvencao_federal,
           pb.vl_subvencao_estadual,
           CASE WHEN bo.fl_pago=true THEN
               'Sim'
           ELSE
               'Não'
           END AS fl_pago,
           pc.vl_comissao,
           to_char(pb.dt_vencimento, 'DD/MM/YYYY') as dt_vencimento,
           tblprorrogacoes.dt_vencto_prorrogado
      FROM seguro.propostas_endosso pe
INNER JOIN seguro.propostas pr ON pe.id_proposta = pr.id
INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
INNER JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
INNER JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
INNER JOIN produto.culturas c ON c.id = pg.id_cultura
INNER JOIN sistema.status st ON st.id = pr.id_status
INNER JOIN sistema.usuarios u ON pr.id_usuario_criacao = u.id
INNER JOIN sistema.corretores co ON co.id_usuario = pc.id_usuario
INNER JOIN seguro.propostas_parcelas pb ON pb.id_proposta = pr.id
INNER JOIN produto.safras s ON s.id = pd.id_safra
 LEFT JOIN seguro.proposta_boletos bo ON bo.id_proposta = pb.id_proposta
                                    AND bo.nr_parcela = pb.nr_parcela
                                    AND bo.id_versao = pr.id_versao
 LEFT JOIN (
     SELECT id_proposta, nr_parcela, to_char(dt_vencimento, 'DD/MM/YYYY') as dt_vencto_prorrogado
       FROM seguro.propostas_boletos_prorrogacoes
 ) as tblprorrogacoes ON tblprorrogacoes.id_proposta = bo.id_proposta
                      AND tblprorrogacoes.nr_parcela = bo.nr_parcela
     WHERE pd.id_safra IN (
         SELECT safras.id
           FROM produto.safras
     JOIN (
         SELECT id
           FROM produto.safras
          WHERE fl_vigente = TRUE
     ) AS vigente ON vigente.id >= safras.id
          WHERE safras.id = vigente.id
             OR safras.id = vigente.id -1
     )
       AND st.ds_chave NOT IN (
           'PROPOSTA_INCOMPLETA', 'NAO_ENVIADA', 'DEVOLVIDA',
           'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO',
           'PROPOSTA_CANCELADA', 'APOLICE_CANCELADA',
           'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA'
       )
       AND pc.id_usuario <> 487
       AND pb.vl_segurado > 0
       AND (s.fl_vigente = true OR s.id = (
           SELECT id FROM produto.safras WHERE fl_vigente = false ORDER BY id DESC LIMIT 1
       ))
 ORDER BY pr.id_proposta_mae ASC, pr.id ASC, pb.nr_parcela ASC
);

-- Migration to create materialized view 'sumario.relatorio_parcelas'
REFRESH MATERIALIZED VIEW sumario.relatorio_parcelas;

SQL
);
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DROP MATERIALIZED VIEW sumario.relatorio_parcelas;

            DELETE FROM manutencao.materialized_views
            WHERE migration_name = 'TaskReservasV2'
            AND ordem = 28 
            AND schemaname = 'sumario'
            AND matviewname = 'relatorio_parcelas';

SQL);
    }
}
