<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2107051137 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("CREATE TABLE manutencao.ajusta_dispensas(
                        id_proposta     INTEGER,
                        in_tipo         INTEGER
                      );");

        $table = $this->table('manutencao.ajusta_dispensas');
        $rows = [
                   ['id_proposta' => 483877, 'in_tipo' => 1],
                   ['id_proposta' => 487050, 'in_tipo' => 1],
                   ['id_proposta' => 487412, 'in_tipo' => 1],
                   ['id_proposta' => 484211, 'in_tipo' => 2],
                   ['id_proposta' => 483826, 'in_tipo' => 2],
                   ['id_proposta' => 483824, 'in_tipo' => 2],
                   ['id_proposta' => 483831, 'in_tipo' => 2],
                   ['id_proposta' => 485294, 'in_tipo' => 2],
                   ['id_proposta' => 485194, 'in_tipo' => 2],
                   ['id_proposta' => 483895, 'in_tipo' => 2],
                   ['id_proposta' => 482275, 'in_tipo' => 2],
                   ['id_proposta' => 485116, 'in_tipo' => 2],
                   ['id_proposta' => 483779, 'in_tipo' => 2],
                   ['id_proposta' => 484650, 'in_tipo' => 2],		
                   ['id_proposta' => 478501, 'in_tipo' => 2],		
                   ['id_proposta' => 478493, 'in_tipo' => 2],		
                   ['id_proposta' => 478492, 'in_tipo' => 2],		
                   ['id_proposta' => 482406, 'in_tipo' => 2],		
                   ['id_proposta' => 478734, 'in_tipo' => 2],		
                   ['id_proposta' => 478746, 'in_tipo' => 2],		
                   ['id_proposta' => 478517, 'in_tipo' => 2],		
                   ['id_proposta' => 478503, 'in_tipo' => 2],		
                   ['id_proposta' => 486876, 'in_tipo' => 2],		
                   ['id_proposta' => 485841, 'in_tipo' => 2],		
                   ['id_proposta' => 485638, 'in_tipo' => 2],		
                   ['id_proposta' => 487339, 'in_tipo' => 2],		
                   ['id_proposta' => 488210, 'in_tipo' => 2],		
                   ['id_proposta' => 487330, 'in_tipo' => 2],		
                   ['id_proposta' => 482583, 'in_tipo' => 2],		
                   ['id_proposta' => 482579, 'in_tipo' => 2],		
                   ['id_proposta' => 488765, 'in_tipo' => 2],		
                   ['id_proposta' => 486034, 'in_tipo' => 2],		
                   ['id_proposta' => 486046, 'in_tipo' => 2],		
                   ['id_proposta' => 483828, 'in_tipo' => 2],		
                   ['id_proposta' => 487283, 'in_tipo' => 2],		
                   ['id_proposta' => 483908, 'in_tipo' => 2],		
                   ['id_proposta' => 482380, 'in_tipo' => 2],		
                   ['id_proposta' => 479573, 'in_tipo' => 2],		
                   ['id_proposta' => 481085, 'in_tipo' => 2],		
                   ['id_proposta' => 487293, 'in_tipo' => 2],		
                   ['id_proposta' => 480048, 'in_tipo' => 2],		
                   ['id_proposta' => 480045, 'in_tipo' => 2],		
                   ['id_proposta' => 485884, 'in_tipo' => 2],		
                   ['id_proposta' => 480467, 'in_tipo' => 2],		
                   ['id_proposta' => 480461, 'in_tipo' => 2],		
                   ['id_proposta' => 480041, 'in_tipo' => 2],		
                   ['id_proposta' => 482519, 'in_tipo' => 2],		
                   ['id_proposta' => 484398, 'in_tipo' => 2],		
                   ['id_proposta' => 484404, 'in_tipo' => 2],		
                   ['id_proposta' => 484402, 'in_tipo' => 2],		
                   ['id_proposta' => 484409, 'in_tipo' => 2],		
                   ['id_proposta' => 482821, 'in_tipo' => 2],		
                   ['id_proposta' => 493668, 'in_tipo' => 2],		
                   ['id_proposta' => 487526, 'in_tipo' => 2],		
                   ['id_proposta' => 492143, 'in_tipo' => 2],		
                   ['id_proposta' => 487438, 'in_tipo' => 2],		
                   ['id_proposta' => 490099, 'in_tipo' => 2],		
                   ['id_proposta' => 490093, 'in_tipo' => 2],		
                   ['id_proposta' => 492125, 'in_tipo' => 2],		
                   ['id_proposta' => 492124, 'in_tipo' => 2],		
                   ['id_proposta' => 488525, 'in_tipo' => 2],		
                   ['id_proposta' => 482092, 'in_tipo' => 2],		
                   ['id_proposta' => 480318, 'in_tipo' => 2],		
                   ['id_proposta' => 484577, 'in_tipo' => 2],		
                   ['id_proposta' => 480345, 'in_tipo' => 2],		
                   ['id_proposta' => 480376, 'in_tipo' => 2],		
                   ['id_proposta' => 480342, 'in_tipo' => 2],		
                   ['id_proposta' => 483042, 'in_tipo' => 2],		
                   ['id_proposta' => 480356, 'in_tipo' => 2],		
                   ['id_proposta' => 493491, 'in_tipo' => 2],		
                   ['id_proposta' => 488120, 'in_tipo' => 2],		
                   ['id_proposta' => 493499, 'in_tipo' => 2],		
                   ['id_proposta' => 493484, 'in_tipo' => 2],		
                   ['id_proposta' => 488251, 'in_tipo' => 2],		
                   ['id_proposta' => 481302, 'in_tipo' => 2],		
                   ['id_proposta' => 480471, 'in_tipo' => 2],		
                   ['id_proposta' => 481127, 'in_tipo' => 2],		
                   ['id_proposta' => 487393, 'in_tipo' => 2],		
                   ['id_proposta' => 480381, 'in_tipo' => 2],		
                   ['id_proposta' => 486879, 'in_tipo' => 2],		
                   ['id_proposta' => 485765, 'in_tipo' => 2],		
                   ['id_proposta' => 485750, 'in_tipo' => 2],		
                   ['id_proposta' => 486865, 'in_tipo' => 2],		
                   ['id_proposta' => 488498, 'in_tipo' => 2],		
                   ['id_proposta' => 483951, 'in_tipo' => 2],		
                   ['id_proposta' => 485885, 'in_tipo' => 2],		
                   ['id_proposta' => 484543, 'in_tipo' => 2],		
                   ['id_proposta' => 493602, 'in_tipo' => 2],		
                   ['id_proposta' => 493589, 'in_tipo' => 2],		
                   ['id_proposta' => 493566, 'in_tipo' => 2],		
                   ['id_proposta' => 488255, 'in_tipo' => 2],		
                   ['id_proposta' => 488246, 'in_tipo' => 2],		
                   ['id_proposta' => 485528, 'in_tipo' => 2],		
                   ['id_proposta' => 483642, 'in_tipo' => 2],		
                   ['id_proposta' => 483922, 'in_tipo' => 2],		
                   ['id_proposta' => 483937, 'in_tipo' => 2],		
                   ['id_proposta' => 488173, 'in_tipo' => 2],		
                   ['id_proposta' => 481063, 'in_tipo' => 2],		
                   ['id_proposta' => 481046, 'in_tipo' => 2],		
                   ['id_proposta' => 481054, 'in_tipo' => 2],		
                   ['id_proposta' => 481048, 'in_tipo' => 2],		
                   ['id_proposta' => 487322, 'in_tipo' => 2],		
                   ['id_proposta' => 481067, 'in_tipo' => 2],		
                   ['id_proposta' => 489762, 'in_tipo' => 2],		
                   ['id_proposta' => 481416, 'in_tipo' => 2],		
                   ['id_proposta' => 485957, 'in_tipo' => 2],		
                   ['id_proposta' => 482557, 'in_tipo' => 2],		
                   ['id_proposta' => 481274, 'in_tipo' => 2],		
                   ['id_proposta' => 481244, 'in_tipo' => 2],		
                   ['id_proposta' => 482311, 'in_tipo' => 2],		
                   ['id_proposta' => 481278, 'in_tipo' => 2],		
                   ['id_proposta' => 481070, 'in_tipo' => 2],		
                   ['id_proposta' => 480525, 'in_tipo' => 2],		
                   ['id_proposta' => 480492, 'in_tipo' => 2],		
                   ['id_proposta' => 480063, 'in_tipo' => 2],		
                   ['id_proposta' => 481306, 'in_tipo' => 2],		
                   ['id_proposta' => 480494, 'in_tipo' => 2],		
                   ['id_proposta' => 480489, 'in_tipo' => 2],		
                   ['id_proposta' => 481385, 'in_tipo' => 2],		
                   ['id_proposta' => 481307, 'in_tipo' => 2],		
                   ['id_proposta' => 491188, 'in_tipo' => 2],		
                   ['id_proposta' => 482856, 'in_tipo' => 2],		
                   ['id_proposta' => 492072, 'in_tipo' => 2],		
                   ['id_proposta' => 492066, 'in_tipo' => 2],		
                   ['id_proposta' => 480051, 'in_tipo' => 2],		
                   ['id_proposta' => 492129, 'in_tipo' => 2],
                   ['id_proposta' => 485247, 'in_tipo' => 2],		
                   ['id_proposta' => 484110, 'in_tipo' => 2],		
                   ['id_proposta' => 483870, 'in_tipo' => 2],		
                   ['id_proposta' => 482815, 'in_tipo' => 2],		
                   ['id_proposta' => 483737, 'in_tipo' => 2],		
                   ['id_proposta' => 482827, 'in_tipo' => 2],		
                   ['id_proposta' => 487398, 'in_tipo' => 2],		
                   ['id_proposta' => 487373, 'in_tipo' => 2],		
                   ['id_proposta' => 490106, 'in_tipo' => 2],		
                   ['id_proposta' => 487378, 'in_tipo' => 2],		
                   ['id_proposta' => 490409, 'in_tipo' => 2],		
                   ['id_proposta' => 490103, 'in_tipo' => 2],		
                   ['id_proposta' => 490100, 'in_tipo' => 2],		
                   ['id_proposta' => 490097, 'in_tipo' => 2],		
                   ['id_proposta' => 487436, 'in_tipo' => 2],		
                   ['id_proposta' => 485318, 'in_tipo' => 2],		
                   ['id_proposta' => 488144, 'in_tipo' => 2],		
                   ['id_proposta' => 484171, 'in_tipo' => 2],		
                   ['id_proposta' => 482600, 'in_tipo' => 2],		
                   ['id_proposta' => 487231, 'in_tipo' => 2],		
                   ['id_proposta' => 482331, 'in_tipo' => 2],		
                   ['id_proposta' => 482650, 'in_tipo' => 2],		
                   ['id_proposta' => 482637, 'in_tipo' => 2],		
                   ['id_proposta' => 482584, 'in_tipo' => 2],		
                   ['id_proposta' => 482341, 'in_tipo' => 2],		
                   ['id_proposta' => 481875, 'in_tipo' => 2],		
                   ['id_proposta' => 482625, 'in_tipo' => 2],		
                   ['id_proposta' => 482602, 'in_tipo' => 2],		
                   ['id_proposta' => 482630, 'in_tipo' => 2],		
                   ['id_proposta' => 482594, 'in_tipo' => 2],		
                   ['id_proposta' => 482356, 'in_tipo' => 2],		
                   ['id_proposta' => 482643, 'in_tipo' => 2],		
                   ['id_proposta' => 482616, 'in_tipo' => 2],		
                   ['id_proposta' => 480005, 'in_tipo' => 2],		
                   ['id_proposta' => 485626, 'in_tipo' => 2],		
                   ['id_proposta' => 485155, 'in_tipo' => 2],		
                   ['id_proposta' => 485165, 'in_tipo' => 2],		
                   ['id_proposta' => 487310, 'in_tipo' => 2],		
                   ['id_proposta' => 485160, 'in_tipo' => 2],		
                   ['id_proposta' => 485054, 'in_tipo' => 2],		
                   ['id_proposta' => 489761, 'in_tipo' => 2],		
                   ['id_proposta' => 480044, 'in_tipo' => 2],		
                   ['id_proposta' => 491932, 'in_tipo' => 2],		
                   ['id_proposta' => 486792, 'in_tipo' => 2],		
                   ['id_proposta' => 480050, 'in_tipo' => 2],		
                   ['id_proposta' => 480049, 'in_tipo' => 2],		
                   ['id_proposta' => 488288, 'in_tipo' => 2],		
                   ['id_proposta' => 488298, 'in_tipo' => 2],		
                   ['id_proposta' => 487165, 'in_tipo' => 2],		
                   ['id_proposta' => 485779, 'in_tipo' => 2],		
                   ['id_proposta' => 485748, 'in_tipo' => 2],		
                   ['id_proposta' => 485730, 'in_tipo' => 2],		
                   ['id_proposta' => 485714, 'in_tipo' => 2],		
                   ['id_proposta' => 485738, 'in_tipo' => 2],		
                   ['id_proposta' => 485668, 'in_tipo' => 2],		
                   ['id_proposta' => 480047, 'in_tipo' => 2],		
                   ['id_proposta' => 485622, 'in_tipo' => 2],		
                   ['id_proposta' => 490682, 'in_tipo' => 2],		
                   ['id_proposta' => 485631, 'in_tipo' => 2],		
                   ['id_proposta' => 489165, 'in_tipo' => 2],		
                   ['id_proposta' => 489156, 'in_tipo' => 2],		
                   ['id_proposta' => 487727, 'in_tipo' => 3],
                   ['id_proposta' => 487334, 'in_tipo' => 3],
                   ['id_proposta' => 487314, 'in_tipo' => 3],
                   ['id_proposta' => 487261, 'in_tipo' => 3],
                   ['id_proposta' => 482663, 'in_tipo' => 3],
                   ['id_proposta' => 487259, 'in_tipo' => 3],
                   ['id_proposta' => 486998, 'in_tipo' => 3],
                   ['id_proposta' => 487257, 'in_tipo' => 3],
                   ['id_proposta' => 486912, 'in_tipo' => 3],
                   ['id_proposta' => 486872, 'in_tipo' => 3],		
                   ['id_proposta' => 486875, 'in_tipo' => 4],
                   ['id_proposta' => 493047, 'in_tipo' => 4]
        ];
        $table->insert($rows)
              ->save();

        $this->execute("CREATE OR REPLACE FUNCTION manutencao.ajusta_dispensas() RETURNS VOID AS $$
                        DECLARE
                            stSQL           VARCHAR;
                            reRecord        RECORD;
                            id_aviso_meio   INTEGER;
                        BEGIN
                            stSQL := '
                                        SELECT ajusta_dispensas.id_proposta
                                              , ajusta_dispensas.in_tipo
                                              , propostas.id                           AS id_endosso
                                              , processos.id                           AS id_processo
                                              , MIN(avisos.id)                         AS id_aviso_first
                                              , MAX(avisos.id)                         AS id_aviso_last
                                              , vistoria_preliminar.id_vistoria        AS id_vistoria_preliminar
                                              , agendamento_preliminar.id_agendamento  AS id_agendamento_preliminar
                                              , MIN(laudos_preliminares.id)            AS id_laudo_preliminar
                                              , vistoria_final.id_vistoria             AS id_vistoria_final
                                              , agendamento_final.id_agendamento       AS id_agendamento_final
                                              , vistoria_dispensada.id_vistoria        AS id_vistoria_dispensada
                                              , agendamento_dispensada.id_agendamento  AS id_agendamento_dispensada
                                              , MAX(laudos_preliminares.id)            AS id_laudo_dispensada
                                           FROM manutencao.ajusta_dispensas
                                           JOIN seguro.propostas
                                             ON propostas.id_proposta_mae = ajusta_dispensas.id_proposta
                                           JOIN sinistro.avisos
                                             ON avisos.id_proposta = propostas.id
                                           JOIN sinistro.processos
                                             ON processos.id_proposta = propostas.id
                                           JOIN (
                                                    SELECT MIN(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 2 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_preliminar
                                             ON vistoria_preliminar.id_processo = processos.id
                                           JOIN (
                                                    SELECT MAX(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 2 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_dispensada
                                             ON vistoria_dispensada.id_processo = processos.id
                                           JOIN (
                                                    SELECT MIN(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 3 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_final
                                             ON vistoria_final.id_processo = processos.id
                                           JOIN sinistro.laudos_preliminares
                                             ON laudos_preliminares.id_processo = processos.id
                                           JOIN sistema.vistorias_agendamentos AS agendamento_preliminar
                                             ON agendamento_preliminar.id_vistoria = vistoria_preliminar.id_vistoria
                                           JOIN sistema.vistorias_agendamentos AS agendamento_final
                                             ON agendamento_final.id_vistoria = vistoria_final.id_vistoria
                                           JOIN sistema.vistorias_agendamentos AS agendamento_dispensada
                                             ON agendamento_dispensada.id_vistoria = vistoria_dispensada.id_vistoria
                                                                               GROUP BY ajusta_dispensas.id_proposta
                                              , ajusta_dispensas.in_tipo
                                              , propostas.id
                                              , processos.id
                                              , vistoria_preliminar.id_vistoria
                                              , agendamento_preliminar.id_agendamento
                                              , vistoria_final.id_vistoria
                                              , agendamento_final.id_agendamento
                                              , vistoria_dispensada.id_vistoria
                                              , agendamento_dispensada.id_agendamento
                                       ORDER BY ajusta_dispensas.in_tipo
                                           ;
                                           ;
                                     ';
                            FOR reRecord IN EXECUTE stSQL LOOP
                                IF reRecord.in_tipo = 1 THEN
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203
                                         ;
                                        
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND id_status = 202 OR id_status = 201
                                       AND id_tipo_vistoria = 2
                                         ;
                                        
                                    UPDATE sistema.agendamentos
                                       SET id_status = 201
                                     WHERE id = reRecord.id_agendamento_final
                                       AND id_status = 202 OR id_status = 203
                                       AND id_tipo_vistoria = 3
                                         ;
                                        
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 210
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar;
                                        
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 2 THEN
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203
                                         ;
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND id_status = 202 OR id_status = 201
                                       AND id_tipo_vistoria = 2
                                         ;
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 201
                                     WHERE id = reRecord.id_agendamento_final
                                       AND id_status = 202 OR id_status = 203
                                       AND id_tipo_vistoria = 3
                                         ;
                                         
                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                                 OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                        IF (reRecord.in_tipo != 4) THEN
                                            UPDATE sinistro.laudos_preliminares
                                               SET id_status = 206
                                             WHERE id_processo = reRecord.id_processo
                                               AND id = reRecord.id_laudo_dispensada
                                                 ;
                                        END IF;
                                    END IF;
                                         
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar;
                                         
                                    UPDATE sinistro.laudos_preliminares_itens_segurados
                                       SET fl_quadra_sinistrada = TRUE
                                     WHERE id_laudo_preliminar  = reRecord.id_laudo_preliminar
                                       AND id_laudo_preliminar  = 35168
                                       AND fl_quadra_sinistrada = FALSE;
                                         
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 3 THEN
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203
                                         ;
                                    
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND id_status = 202 OR id_status = 201
                                       AND id_tipo_vistoria = 2
                                         ;
                                    
                                    UPDATE sistema.agendamentos
                                       SET id_status = 201
                                     WHERE id = reRecord.id_agendamento_final
                                       AND id_status = 202 OR id_status = 203
                                       AND id_tipo_vistoria = 3
                                         ;
                                    
                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                                 OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                        IF (reRecord.in_tipo != 4) THEN
                                            UPDATE sinistro.laudos_preliminares
                                               SET id_status = 206
                                             WHERE id_processo = reRecord.id_processo
                                               AND id = reRecord.id_laudo_dispensada
                                                 ;
                                        END IF;
                                    END IF;
                                    
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar;
                                    
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                    
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                                                                  
                                    SELECT id
                                      INTO id_aviso_meio
                                      FROM sinistro.avisos
                                     WHERE id_proposta = reRecord.id_endosso
                                       AND id NOT IN (reRecord.id_aviso_first,reRecord.id_aviso_last);
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = id_aviso_meio) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , id_aviso_meio
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 4 THEN
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203
                                         ;
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND id_status = 202 OR id_status = 201
                                       AND id_tipo_vistoria = 2
                                         ;
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 201
                                     WHERE id = reRecord.id_agendamento_final
                                       AND id_status = 203
                                       AND id_tipo_vistoria = 3
                                         ;
                                         
                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                                 OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                        IF (reRecord.in_tipo != 4) THEN
                                            UPDATE sinistro.laudos_preliminares
                                               SET id_status = 206
                                             WHERE id_processo = reRecord.id_processo
                                               AND id = reRecord.id_laudo_dispensada
                                                 ;
                                        END IF;
                                    END IF;
                                         
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar;
                                         
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                END IF;
                            END LOOP;
                        END;
                        $$ LANGUAGE 'plpgsql';");

        $this->execute("SELECT manutencao.ajusta_dispensas();");
        $this->execute("DROP FUNCTION manutencao.ajusta_dispensas();");

    }

    public function down(): void
    {

    }
}
