<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2201281527 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
               ALTER TABLE atendimento.tipo_chamado ADD COLUMN fl_destinatario_corretor BOOLEAN NOT NULL default false;
               ALTER TABLE atendimento.tipo_chamado ADD COLUMN fl_destinatario_empresa_vistoria BOOLEAN NOT NULL default false;
               ALTER TABLE atendimento.tipo_chamado ADD COLUMN fl_destinatario_seguradora BOOLEAN NOT NULL default false;

               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 1;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 8;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 12;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 14;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 24;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 26;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 'f', fl_destinatario_empresa_vistoria = 't', fl_destinatario_seguradora = 'f' WHERE id = 28;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 'f', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 't' WHERE id = 31;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 'f', fl_destinatario_empresa_vistoria = 't', fl_destinatario_seguradora = 'f' WHERE id = 40;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 'f', fl_destinatario_empresa_vistoria = 't', fl_destinatario_seguradora = 'f' WHERE id = 43;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 44;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 61;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 65;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 67;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 't', fl_destinatario_seguradora = 'f' WHERE id = 68;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 'f', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 't' WHERE id = 69;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 80;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 81;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 84;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 85;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 86;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 89;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 90;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 91;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 't', fl_destinatario_seguradora = 'f' WHERE id = 92;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 93;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 94;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 95;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 96;
               UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = 't', fl_destinatario_empresa_vistoria = 'f', fl_destinatario_seguradora = 'f' WHERE id = 97;

               -- Referente aos registros de id 20 e 29
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Agendamento de vistoria', 'AGENDAMENTO_VISTORIA', 23, 1026, 't', 't', 'f');

               -- Referente aos registros de id 23, 45 e 35. 
               -- Diferenças: registro 45 tinha ds_chave VISTORIADOR_CANCELAMENTO. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Cancelamento Aviso/Processo', 'CANCELAMENTO_AVISO_PROCESSO', 23, 1026, 't', 't', 't');

               -- Referente aos registros de id 22 e 34
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Liquidação/Indenização', 'LIQUIDACAO_INDENIZACAO', 23, 1060, 't', 'f', 't');

               -- Referente aos registros de id 37, 39 e 38
               -- Diferenças: os registros tinham ds_chave diferentes: REVISTORIA, VISTORIADOR_REVISTORIA e SEGURADORA_REVISTORIA. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Nova avaliação', 'NOVA_AVALIACAO', 23, 1026, 't', 't', 't');

               -- Referente aos registros de id 19 e 32
               -- Diferenças: 
               --            * Campo ds_tipo_chamado diferentes: 'Pendência de Documentos de Sinistro' e 'Pendências de documentos'. (não localizei impacto)
               --            * Campo ds_chave diferentes: registro 19 tinha PENDENCIA_DOCUMENTOS_SINISTRO
               --              ################ (Impacto nos fontes ProcessoController(linha: 1011) que buscam pela ds_chave 'PENDENCIA_DOCUMENTOS_SINISTRO') ################
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Pendência de Documentos', 'PENDENCIA_DOCUMENTOS', 23, 1026, 't', 'f', 't');

               -- Referente aos registros de id 21 e 33
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Previsão de pagamento', 'PREVISAO_PAGAMENTO', 23, 1026, 't', 'f', 't');

               -- Referente aos registros de id 47 e 48
               -- Diferenças: os registros tinham ds_chave diferentes: CORRETOR_VALOR_INDENIZACAO e SEGURADORA_VALOR_INDENIZACAO. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Valor da Indenização', 'VALOR_INDENIZACAO', 23, 1026, 't', 'f', 't');

               -- Referente aos registros de id 41 e 42
               -- Diferenças: os registros tinham ds_chave diferentes: CORRETOR_PARCELAS_EM_ABERTO e SEGURADORA_PARCELAS_EM_ABERTO. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Parcelas em aberto', 'PARCELAS_EM_ABERTO', 23, 1026, 't', 'f', 't');
               
               -- Referente aos registros de id 25, 30 e 36
               -- Diferenças:o registro 36 tinha o ds_chave SEGURADORA_SUPORTE_AGRONET. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Suporte AgroNet', 'SUPORTE_AGRONET', 23, 1026, 't', 't', 't');

               -- Referente aos registros de id 27 e 46
               -- Diferenças:o registro 46 tinha o ds_chave SEGURADORA_SOLICITACAO_LAUDOS. (não localizei impacto)
               INSERT INTO atendimento.tipo_chamado (ds_tipo_chamado, ds_chave, id_departamento, id_responsavel, fl_destinatario_corretor, fl_destinatario_empresa_vistoria, fl_destinatario_seguradora) 
                    VALUES ('Solicitação de laudos', 'SOLICITACAO_LAUDOS', 23, 1594, 'f', 't', 't');

               -- Referente ao registro de id 24
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Aviso de inicio de colheita de cura', fl_destinatario_corretor = 't' WHERE id = 24;

               -- Referente ao registro de id 26
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Vistoria final antecipada', fl_destinatario_corretor = 't' WHERE id = 26;

               -- Referente ao registro de id 28
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Declaração de pericia', fl_destinatario_empresa_vistoria = 't' WHERE id = 28;

               -- Referente ao registro de id 31
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Declaração de documentos', fl_destinatario_seguradora = 't' WHERE id = 31;

               -- Referente ao registro de id 40
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Correção de Laudo', fl_destinatario_empresa_vistoria = 't' WHERE id = 40;

               -- Referente ao registro de id 43
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Digitação de laudos', fl_destinatario_empresa_vistoria = 't' WHERE id = 43;

               -- Referente ao registro de id 44
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Questionário Circ. 380', fl_destinatario_corretor = 't' WHERE id = 44;

               -- Referente ao registro de id 69
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Exclusão de liquidação', fl_destinatario_seguradora = 't' WHERE id = 69;
SQL
        );

        $this->upViewChamados();
    }

    public function down(): void
    {
        $this->downViewChamados();

        $this->execute(<<<SQL

               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Corretor - Aviso de inicio de colheita de cura' WHERE id = 24;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Corretor - Vistoria final antecipada' WHERE id = 26;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Vistoriador - Declaração de pericia' WHERE id = 28;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Seguradora - Declaração de documentos' WHERE id = 31;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Vistoriador - Correção de Laudo' WHERE id = 40;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Vistoriador - Digitação de laudos' WHERE id = 43;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Corretor - Questionário Circ. 380' WHERE id = 44;
               UPDATE atendimento.tipo_chamado SET ds_tipo_chamado = 'Exclusão de liquidação' WHERE id = 69;

               DELETE FROM atendimento.tipo_chamado WHERE id IN (
                    SELECT id
                      FROM atendimento.tipo_chamado
                     WHERE (ds_tipo_chamado = 'Agendamento de vistoria' AND ds_chave = 'AGENDAMENTO_VISTORIA')
                        OR (ds_tipo_chamado = 'Cancelamento Aviso/Processo' AND ds_chave = 'CANCELAMENTO_AVISO_PROCESSO')
                        OR (ds_tipo_chamado = 'Liquidação/Indenização' AND ds_chave = 'LIQUIDACAO_INDENIZACAO')
                        OR (ds_tipo_chamado = 'Nova avaliação' AND ds_chave = 'NOVA_AVALIACAO')
                        OR (ds_tipo_chamado = 'Pendência de Documentos' AND ds_chave = 'PENDENCIA_DOCUMENTOS')
                        OR (ds_tipo_chamado = 'Previsão de pagamento' AND ds_chave = 'PREVISAO_PAGAMENTO')
                        OR (ds_tipo_chamado = 'Valor da Indenização' AND ds_chave = 'VALOR_INDENIZACAO')
                        OR (ds_tipo_chamado = 'Parcelas em aberto' AND ds_chave = 'PARCELAS_EM_ABERTO')
                        OR (ds_tipo_chamado = 'Suporte AgroNet' AND ds_chave = 'SUPORTE_AGRONET')
                        OR (ds_tipo_chamado = 'Solicitação de laudos' AND ds_chave = 'SOLICITACAO_LAUDOS')
               );

            ALTER TABLE atendimento.tipo_chamado DROP COLUMN fl_destinatario_seguradora;
            ALTER TABLE atendimento.tipo_chamado DROP COLUMN fl_destinatario_empresa_vistoria;
            ALTER TABLE atendimento.tipo_chamado DROP COLUMN fl_destinatario_corretor;
SQL
        );
    }

    private function upViewChamados()
    {
    	$this->execute(<<<SQL
CREATE OR REPLACE VIEW atendimento.v_chamados AS
 SELECT DISTINCT c.id,
    c.id_usuario_criacao,
    c.id_usuario_alteracao,
    c.dt_alteracao,
    c.fl_ativo,
    c.fl_del,
    c.id_prioridade,
    c.id_tipo_chamado,
    c.id_status,
    c.id_departamento,
    c.id_proposta,
    c.ds_descricao,
    c.id_parent,
    c.dt_criacao,
    c.fl_lido,
    c.id_responsavel,
    c.fl_pendencia_agrobrasil,
    tc.ds_chave AS tipo_chamado,
    tc.ds_tipo_chamado,
    p.ds_chave AS prioridade,
    s.ds_status,
    d.ds_nome_departamento,
    u.ds_nome_usuario,
    u2.ds_nome_usuario AS ds_nome_responsavel,
    pp.ds_nome_proponente,
    cd.ds_tipo_destinatario,
    pr2.id_status AS id_status_proposta,
    pr2.nr_apolice,
    pe.id_endosso,
    prd.id_safra,
    cd.id_empresa,
    seguro.nr_endosso(pr2.id, pr2.id_endosso) AS nr_endosso,
    seguro.id_proposta_mae(pr2.id) AS id_proposta_mae,
    pr2.id_proposta_endossada,
    seguro.id_proposta_mae_completo(pr2.id) AS id_proposta_mae_completo,
    c.dt_agendamento AS prorrogacao_dt_agendamento,
    c.dt_prazo_agendamento AS prorrogacao_dt_prazo_agendamento,
    e.id AS id_estado,
    m.id AS id_municipio,
    c.dt_prazo_retorno,
    tc.fl_destinatario_corretor,
    tc.fl_destinatario_empresa_vistoria,
    tc.fl_destinatario_seguradora
   FROM atendimento.chamados c
     JOIN atendimento.tipo_chamado tc ON tc.id = c.id_tipo_chamado
     JOIN atendimento.prioridade p ON p.id = c.id_prioridade
     JOIN sistema.status s ON s.id = c.id_status
     JOIN sistema.departamentos d ON d.id = c.id_departamento
     JOIN sistema.usuarios u ON u.id = c.id_usuario_criacao
     JOIN seguro.propostas pr2 ON pr2.id = c.id_proposta
     JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr2.id
     JOIN produto.produtos prd ON prd.id = pr2.id_produto
     JOIN seguro.propostas_propriedades prpro ON prpro.id_proposta = pr2.id
     JOIN sistema.municipios m ON m.id = prpro.id_municipio
     JOIN sistema.estados e ON e.id = m.id_estado
     LEFT JOIN seguro.propostas_endosso pe ON pe.id_proposta = pr2.id
     LEFT JOIN sistema.usuarios u2 ON c.id_responsavel = u2.id
     LEFT JOIN atendimento.chamados_destinatario cd ON c.id = cd.id_chamado
  WHERE c.id_parent IS NULL
  ORDER BY c.id, c.dt_criacao DESC;
SQL
        );
    }

    private function downViewChamados()
    {
    	$this->execute(<<<SQL
DROP VIEW atendimento.v_chamados;

CREATE OR REPLACE VIEW atendimento.v_chamados AS
 SELECT DISTINCT c.id,
    c.id_usuario_criacao,
    c.id_usuario_alteracao,
    c.dt_alteracao,
    c.fl_ativo,
    c.fl_del,
    c.id_prioridade,
    c.id_tipo_chamado,
    c.id_status,
    c.id_departamento,
    c.id_proposta,
    c.ds_descricao,
    c.id_parent,
    c.dt_criacao,
    c.fl_lido,
    c.id_responsavel,
    c.fl_pendencia_agrobrasil,
    tc.ds_chave AS tipo_chamado,
    tc.ds_tipo_chamado,
    p.ds_chave AS prioridade,
    s.ds_status,
    d.ds_nome_departamento,
    u.ds_nome_usuario,
    u2.ds_nome_usuario AS ds_nome_responsavel,
    pp.ds_nome_proponente,
    cd.ds_tipo_destinatario,
    pr2.id_status AS id_status_proposta,
    pr2.nr_apolice,
    pe.id_endosso,
    prd.id_safra,
    cd.id_empresa,
    seguro.nr_endosso(pr2.id, pr2.id_endosso) AS nr_endosso,
    seguro.id_proposta_mae(pr2.id) AS id_proposta_mae,
    pr2.id_proposta_endossada,
    seguro.id_proposta_mae_completo(pr2.id) AS id_proposta_mae_completo,
    c.dt_agendamento AS prorrogacao_dt_agendamento,
    c.dt_prazo_agendamento AS prorrogacao_dt_prazo_agendamento,
    e.id AS id_estado,
    m.id AS id_municipio,
    c.dt_prazo_retorno
   FROM atendimento.chamados c
     JOIN atendimento.tipo_chamado tc ON tc.id = c.id_tipo_chamado
     JOIN atendimento.prioridade p ON p.id = c.id_prioridade
     JOIN sistema.status s ON s.id = c.id_status
     JOIN sistema.departamentos d ON d.id = c.id_departamento
     JOIN sistema.usuarios u ON u.id = c.id_usuario_criacao
     JOIN seguro.propostas pr2 ON pr2.id = c.id_proposta
     JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr2.id
     JOIN produto.produtos prd ON prd.id = pr2.id_produto
     JOIN seguro.propostas_propriedades prpro ON prpro.id_proposta = pr2.id
     JOIN sistema.municipios m ON m.id = prpro.id_municipio
     JOIN sistema.estados e ON e.id = m.id_estado
     LEFT JOIN seguro.propostas_endosso pe ON pe.id_proposta = pr2.id
     LEFT JOIN sistema.usuarios u2 ON c.id_responsavel = u2.id
     LEFT JOIN atendimento.chamados_destinatario cd ON c.id = cd.id_chamado
  WHERE c.id_parent IS NULL
  ORDER BY c.id, c.dt_criacao DESC;
SQL
);
    }
}
