<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2209092003 extends AbstractMigration
{
	public function up(): void {
		$this->execute(<<<SQL
DROP view produto.v_limite_capacidade;
DROP view produto.v_limite_capacidade_utilizado;
DROP view produto.v_limite_capacidade_utilizado_resumido;
ALTER table produto.validacoes_limites_capacidade alter column vl_limite_capacidade type numeric(20,2);
CREATE OR REPLACE view produto.v_limite_capacidade AS
SELECT vlc.id,
    vlc.ds_nome_grupo,
    vlc.vl_limite_capacidade,
    vlc.fl_agrupar_municipios,
    vlc.fl_limite_corretor,
    vlc.id_parent,
    vlcc.id_cobertura AS coberturas,
    vlcp.id_produto AS produtos,
    vlcu.id_usuario AS usuarios,
    vlce.id_estado AS estados,
    vlcm.id_municipio AS municipios
   FROM produto.validacoes_limites_capacidade vlc
     LEFT JOIN ( SELECT validacoes_limites_capacidade_coberturas.id_grupo_limite_capacidade,
            array_agg(validacoes_limites_capacidade_coberturas.id_cobertura) AS id_cobertura
           FROM produto.validacoes_limites_capacidade_coberturas
          GROUP BY validacoes_limites_capacidade_coberturas.id_grupo_limite_capacidade) vlcc ON vlcc.id_grupo_limite_capacidade = vlc.id
     LEFT JOIN ( SELECT validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade,
            array_agg(validacoes_limites_capacidade_produtos.id_produto) AS id_produto
           FROM produto.validacoes_limites_capacidade_produtos
             JOIN produto.produtos ON produtos.id = validacoes_limites_capacidade_produtos.id_produto
          GROUP BY validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade) vlcp ON vlcp.id_grupo_limite_capacidade = vlc.id
     LEFT JOIN ( SELECT validacoes_limites_capacidade_usuarios.id_grupo_limite_capacidade,
            array_agg(validacoes_limites_capacidade_usuarios.id_usuario) AS id_usuario
           FROM produto.validacoes_limites_capacidade_usuarios
          GROUP BY validacoes_limites_capacidade_usuarios.id_grupo_limite_capacidade) vlcu ON vlcu.id_grupo_limite_capacidade = vlc.id
     LEFT JOIN ( SELECT validacoes_limites_capacidade_estados.id_grupo_limite_capacidade,
            array_agg(validacoes_limites_capacidade_estados.id_estado) AS id_estado
           FROM produto.validacoes_limites_capacidade_estados
          GROUP BY validacoes_limites_capacidade_estados.id_grupo_limite_capacidade) vlce ON vlce.id_grupo_limite_capacidade = vlc.id
     LEFT JOIN ( SELECT validacoes_limites_capacidade_municipios.id_grupo_limite_capacidade,
            array_agg(validacoes_limites_capacidade_municipios.id_municipio) AS id_municipio
           FROM produto.validacoes_limites_capacidade_municipios
          GROUP BY validacoes_limites_capacidade_municipios.id_grupo_limite_capacidade) vlcm ON vlcm.id_grupo_limite_capacidade = vlc.id
  WHERE vlc.fl_ativo = true
  GROUP BY vlc.id, vlc.ds_nome_grupo, vlc.vl_limite_capacidade, vlc.fl_agrupar_municipios, vlc.fl_limite_corretor, vlc.id_parent, vlcc.id_cobertura, vlcp.id_produto, vlcu.id_usuario, vlce.id_estado, vlcm.id_municipio;
CREATE OR REPLACE view produto.v_limite_capacidade_utilizado AS
 SELECT DISTINCT validacoes_limites_capacidade.id_usuario_criacao,
    validacoes_limites_capacidade.id_usuario_alteracao,
    validacoes_limites_capacidade.dt_criacao,
    validacoes_limites_capacidade.dt_alteracao,
    validacoes_limites_capacidade.fl_ativo,
    validacoes_limites_capacidade.fl_del,
    validacoes_limites_capacidade.id,
    validacoes_limites_capacidade.ds_nome_grupo,
    validacoes_limites_capacidade.vl_limite_capacidade,
    validacoes_limites_capacidade.fl_agrupar_municipios,
    validacoes_limites_capacidade.fl_limite_corretor,
    validacoes_limites_capacidade.tipo_corretor_vinculo,
    validacoes_limites_capacidade.id_parent,
    validacoes_limites_capacidade_produtos.id_safra,
        CASE
            WHEN validacoes_limites_capacidade.fl_agrupar_municipios = true THEN COALESCE(produto.fn_get_limite_capacidade(validacoes_limites_capacidade.id, NULL::integer), 0.00)
            ELSE 0.00
        END AS vl_utilizado,
    ( SELECT count(*) AS count
           FROM produto.validacoes_limites_capacidade tmp
          WHERE tmp.id_parent = validacoes_limites_capacidade.id) AS count_parent
   FROM produto.validacoes_limites_capacidade
     JOIN ( SELECT validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade,
            produtos.id_safra
           FROM produto.validacoes_limites_capacidade_produtos validacoes_limites_capacidade_produtos_1
             JOIN produto.produtos ON produtos.id = validacoes_limites_capacidade_produtos_1.id_produto
             JOIN produto.produtos_geral ON produtos_geral.id = produtos.id_produto_geral
             JOIN produto.culturas ON culturas.id = produtos_geral.id_cultura
          GROUP BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade, produtos.id_safra
          ORDER BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade) validacoes_limites_capacidade_produtos ON validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade = validacoes_limites_capacidade.id
  WHERE 1 = 1
  ORDER BY validacoes_limites_capacidade.ds_nome_grupo;
CREATE OR REPLACE view produto.v_limite_capacidade_utilizado_resumido AS
 SELECT DISTINCT validacoes_limites_capacidade.id_usuario_criacao,
    validacoes_limites_capacidade.id_usuario_alteracao,
    validacoes_limites_capacidade.dt_criacao,
    validacoes_limites_capacidade.dt_alteracao,
    validacoes_limites_capacidade.fl_ativo,
    validacoes_limites_capacidade.fl_del,
    validacoes_limites_capacidade.id,
    validacoes_limites_capacidade.ds_nome_grupo,
    validacoes_limites_capacidade.vl_limite_capacidade,
    validacoes_limites_capacidade.fl_agrupar_municipios,
    validacoes_limites_capacidade.fl_limite_corretor,
    validacoes_limites_capacidade.tipo_corretor_vinculo,
    validacoes_limites_capacidade.id_parent,
    validacoes_limites_capacidade_produtos.id_safra,
    0 AS count_parent,
    validacoes_limites_capacidade.vl_reserva_tecnica
   FROM produto.validacoes_limites_capacidade
     JOIN ( SELECT validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade,
            produtos.id_safra
           FROM produto.validacoes_limites_capacidade_produtos validacoes_limites_capacidade_produtos_1
             JOIN produto.produtos ON produtos.id = validacoes_limites_capacidade_produtos_1.id_produto
             JOIN produto.produtos_geral ON produtos_geral.id = produtos.id_produto_geral
             JOIN produto.culturas ON culturas.id = produtos_geral.id_cultura
          GROUP BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade, produtos.id_safra
          ORDER BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade) validacoes_limites_capacidade_produtos ON validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade = validacoes_limites_capacidade.id
  WHERE 1 = 1
  ORDER BY validacoes_limites_capacidade.ds_nome_grupo;
SQL
		);
}

	public function down(): void {
		$this->execute(<<<SQL
ALTER table produto.validacao_limites_capacidade alter column vl_limite_capacidade type numeric(20,2);
SQL
		);
	}
}
