<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2205271615 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
CREATE OR REPLACE VIEW produto.v_combo_produto_proposta AS
   SELECT p.id,
          p.ds_nome_produto,
          p.ds_nome_abreviado,
          produtos_habilitacoes.id_usuario
     FROM produto.produtos p
          JOIN produto.produtos_coberturas prod_cob ON prod_cob.id_produto = p.id
                                                   AND prod_cob.fl_cobertura_principal = TRUE
          JOIN produto.produtos_habilitacoes ON produtos_habilitacoes.id_produto = p.id
          JOIN comercializacao.taxas_agrupamento t ON t.id_produto = p.id
                                                  AND t.fl_del = FALSE
                                                  AND t.fl_ativo = TRUE
          JOIN comercializacao.comercializacoes c ON c.id_produto = p.id
                                                 AND c.fl_del = FALSE
                                                 AND c.fl_ativo = TRUE
          LEFT JOIN
              (SELECT cm.id_comercializacao,
                      e.id
                 FROM comercializacao.comercializacoes_municipios cm,
                      comercializacao.comercializacoes c,
                      sistema.municipios m,
                      sistema.estados e
                WHERE c.id = cm.id_comercializacao
                  AND m.id = cm.id_municipio
                  AND e.id = m.id_estado
                  AND c.tp_comercializacao = 'M'
                GROUP BY cm.id_comercializacao,
                         e.id
                UNION 
               SELECT ce.id_comercializacao,
                      e.id
                 FROM comercializacao.comercializacoes_estados ce,
                      comercializacao.comercializacoes c,
                      sistema.estados e
                WHERE c.id = ce.id_comercializacao
                  AND e.id = ce.id_estado
                  AND c.tp_comercializacao = 'E'
                GROUP BY ce.id_comercializacao,
                         e.id) ces ON ces.id = produtos_habilitacoes.id_estado
                                  AND ces.id_comercializacao = c.id
        LEFT JOIN 
            (SELECT cu.id_comercializacao,
                    u.id
               FROM comercializacao.comercializacoes_usuarios cu,
                    comercializacao.comercializacoes c,
                    sistema.usuarios u
               WHERE c.id = cu.id_comercializacao
                 AND u.id = cu.id_usuario
                 AND NOT EXISTS(SELECT 1 
                                  FROM comercializacao.comercializacoes_municipios cm 
                                 WHERE cm.id_comercializacao = cu.id_comercializacao)
               GROUP BY cu.id_comercializacao,
                        u.id) cu ON cu.id = produtos_habilitacoes.id_usuario
                                AND cu.id_comercializacao = c.id
        LEFT JOIN 
            (SELECT cu.id_comercializacao,
                    m.id_estado,
                    cu.id_usuario
               FROM comercializacao.comercializacoes_usuarios cu
                    INNER JOIN comercializacao.comercializacoes c ON c.id = cu.id_comercializacao
                    INNER JOIN comercializacao.comercializacoes_municipios cm ON cm.id_comercializacao = cu.id_comercializacao
                    INNER JOIN sistema.municipios m ON m.id = cm.id_municipio
                    INNER JOIN sistema.estados e ON e.id = m.id_estado
              WHERE c.tp_comercializacao = 'U'
        ) cum ON cum.id_comercializacao = c.id
             AND cum.id_usuario = produtos_habilitacoes.id_usuario
             AND cum.id_estado = produtos_habilitacoes.id_estado
        JOIN produto.produtos_grupos_atributos_rn pga ON pga.id_produto = p.id
                                                    AND pga.fl_grupo_padrao = TRUE
        JOIN produto.produtos_atributos_rn pa ON pa.id_grupo_atributo_rn = pga.id
        JOIN produto.atributos_rn arn ON arn.id = pa.id_atributo_rn
                                     AND arn.ds_chave_rn::text = 'PROD_PERMITE_NOVO_ORCAMENTO'::text
WHERE (ces.id_comercializacao IS NOT NULL OR cu.id_comercializacao IS NOT NULL OR cum.id_comercializacao IS NOT NULL)
  AND to_char(now(), 'YYYY-mm-dd'::text) >= to_char(c.dt_comercializacao_inicio::TIMESTAMP WITH time ZONE, 'YYYY-mm-dd'::text)
  AND to_char(now(), 'YYYY-mm-dd'::text) <= to_char(c.dt_comercializacao_fim::TIMESTAMP WITH time ZONE, 'YYYY-mm-dd'::text)
  AND (pa.ds_valor::text = ANY (ARRAY['1'::character varying::text, '3'::character varying::text]))
GROUP BY p.ds_nome_abreviado,
         p.id,
         p.ds_nome_produto,
         produtos_habilitacoes.id_usuario,
         p.fl_ativo HAVING (
                              (SELECT DISTINCT cp.id_produto
                               FROM produto.condicoes_pagamento cp,
                                    produto.condicoes_pagamento_itens cpi
                               WHERE cp.fl_condicao_padrao = TRUE
                                 AND cp.id = cpi.id_condicao_pagamento
                                 AND cp.id_produto = p.id
                                 AND cpi.ds_mes = (to_char(now(), 'MM'::text)::integer - 1)
                                 AND p.fl_ativo = TRUE
                               ORDER BY cp.id_produto)) = p.id
ORDER BY p.ds_nome_abreviado,
         p.id,
         p.ds_nome_produto,
         produtos_habilitacoes.id_usuario;
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
CREATE OR REPLACE VIEW produto.v_combo_produto_proposta AS
       SELECT p.id,
          p.ds_nome_produto,
          p.ds_nome_abreviado,
          produtos_habilitacoes.id_usuario
         FROM produto.produtos p
           JOIN produto.produtos_coberturas prod_cob ON prod_cob.id_produto = p.id AND prod_cob.fl_cobertura_principal = true
           JOIN produto.produtos_habilitacoes ON produtos_habilitacoes.id_produto = p.id
           JOIN comercializacao.taxas_agrupamento t ON t.id_produto = p.id AND t.fl_del = false AND t.fl_ativo = true
           JOIN comercializacao.comercializacoes c ON c.id_produto = p.id AND c.fl_del = false AND c.fl_ativo = true
           JOIN ( SELECT cm.id_comercializacao,
                  e.id
                 FROM comercializacao.comercializacoes_municipios cm,
                  sistema.municipios m,
                  sistema.estados e
                WHERE m.id = cm.id_municipio AND e.id = m.id_estado
                GROUP BY cm.id_comercializacao, e.id
              UNION
               SELECT ce.id_comercializacao,
                  e.id
                 FROM comercializacao.comercializacoes_estados ce,
                  sistema.estados e
                WHERE e.id = ce.id_estado
                GROUP BY ce.id_comercializacao, e.id) ces ON ces.id = produtos_habilitacoes.id_estado AND ces.id_comercializacao = c.id
           JOIN produto.produtos_grupos_atributos_rn pga ON pga.id_produto = p.id AND pga.fl_grupo_padrao = true
           JOIN produto.produtos_atributos_rn pa ON pa.id_grupo_atributo_rn = pga.id
           JOIN produto.atributos_rn arn ON arn.id = pa.id_atributo_rn AND arn.ds_chave_rn::text = 'PROD_PERMITE_NOVO_ORCAMENTO'::text
        WHERE to_char(now(), 'YYYY-mm-dd'::text) >= to_char(c.dt_comercializacao_inicio::timestamp with time zone, 'YYYY-mm-dd'::text) AND to_char(now(), 'YYYY-mm-dd'::text) <= to_char(c.dt_comercializacao_fim::timestamp with time zone, 'YYYY-mm-dd'::text) AND (pa.ds_valor::text = ANY (ARRAY['1'::character varying::text, '3'::character varying::text]))
        GROUP BY p.ds_nome_abreviado, p.id, p.ds_nome_produto, produtos_habilitacoes.id_usuario, p.fl_ativo
       HAVING (( SELECT DISTINCT cp.id_produto
                 FROM produto.condicoes_pagamento cp,
                  produto.condicoes_pagamento_itens cpi
                WHERE cp.fl_condicao_padrao = true AND cp.id = cpi.id_condicao_pagamento AND cp.id_produto = p.id AND cpi.ds_mes = (to_char(now(), 'MM'::text)::integer - 1) AND p.fl_ativo = true
                ORDER BY cp.id_produto)) = p.id
        ORDER BY p.ds_nome_abreviado, p.id, p.ds_nome_produto, produtos_habilitacoes.id_usuario;
SQL
        );
    }
}
