EXECUTE BLOCK
AS
DECLARE VARIABLE CODIGO_SETOR_REALIZADO DM_INTEIRO;
DECLARE VARIABLE CODIGOVEICULO DM_INTEIRO;
DECLARE VARIABLE CODIGO_SRC_VEI DM_INTEIRO;
DECLARE VARIABLE CODIGO_MOBILE DM_INTEIRO;
DECLARE VARIABLE DATAHORA_INICIO DM_DATAHORA;
BEGIN
  DELETE FROM SETORES_REALIZADOS_CONTROLE;
  DELETE FROM SETORES_REALIZADOS_CONTROLE_VEI;
  FOR WITH SR_ATIVOS
    AS (--
    SELECT DISTINCT SR.CODIGO AS CODIGOREALIZADO
                  , SR.CODIGOVEICULO
                  , SR.CODIGOSETOR
                  , SR.CONTROLE
                    --                  , SR.CODIGOVEICULO
                    --                  , SR.DATA_EXECUCAO
                  , SR.DATAHORA_INICIO
                    --                  , SR.DATAHORA_FIM
      FROM SETORES_REALIZADOS SR
      WHERE SR.CODIGOSETOR IS NOT NULL
        AND (SR.DATA_EXECUCAO between '01.01.2021' and '11.01.2021')
      ORDER BY SR.DATA_EXECUCAO, SR.CODIGOSETOR, SR.DATAHORA_INICIO
      --
    )

    SELECT DISTINCT SRA.CODIGOREALIZADO
                  , SRA.CODIGOVEICULO
                  , TR.CODIGODISPOSITIVO_MOBILE
                  , TR.DATAHORA_GMT
      FROM SR_ATIVOS SRA
      INNER JOIN SETORES_ROTAS R ON R.CODIGOSETOR = SRA.CODIGOSETOR AND R.APAGADO = 'F' AND R.ATIVO = 'T'
      INNER JOIN TABELAS_REPOSITORIO TR ON TR.SESSAO = SRA.CONTROLE AND TR.DATAHORA = SRA.DATAHORA_INICIO
      WHERE EXISTS(SELECT FIRST 1 SRP.CODIGO
                     FROM SETORES_ROTAS_PACMAN SRP
                     WHERE SRP.CODIGOROTA = R.CODIGO)
      INTO :CODIGO_SETOR_REALIZADO,
           :CODIGOVEICULO,
           :CODIGO_MOBILE,
           :DATAHORA_INICIO
  DO
  BEGIN
    UPDATE OR INSERT INTO SETORES_REALIZADOS_CONTROLE_VEI (
        CODIGOVEICULO)
    VALUES (:CODIGOVEICULO)
    MATCHING (CODIGOVEICULO)
    RETURNING CODIGO
    INTO :CODIGO_SRC_VEI;

    INSERT INTO SETORES_REALIZADOS_CONTROLE (
        CODIGO_SRC_VEI,
        CODIGO_SETORES_REALIZADOS,
        CODIGODISPOSITIVO_MOBILE,
        DATAHORA_GMT_HISTORICO,
        DATAHORA_GMT_STATUS_MOBILE)
    VALUES (:CODIGO_SRC_VEI,
            :CODIGO_SETOR_REALIZADO,
            :CODIGO_MOBILE,
            '01.01.2021',
            '01.01.2021');
  END
END
----------------
EXECUTE BLOCK
AS
DECLARE VARIABLE CODIGO_CONTROLE_VEI DM_INTEIRO;
DECLARE VARIABLE CODIGOVEICULO DM_INTEIRO;
DECLARE VARIABLE CODIGOULTIMO_HISTORICO DM_INTEIRO;
DECLARE VARIABLE CODIGO_CONTROLE DM_INTEIRO;
DECLARE VARIABLE DATAHORA_GMT_HISTORICO DM_DATAHORA;
DECLARE VARIABLE DATAHORA_INICIO DM_DATAHORA;
BEGIN
  FOR
    SELECT V.CODIGO
         , V.CODIGOVEICULO
         , V.CODIGOULTIMO_HISTORICO
         , C.CODIGO
         , C.DATAHORA_GMT_HISTORICO
         , SR.DATAHORA_INICIO
      FROM SETORES_REALIZADOS_CONTROLE C
      INNER JOIN SETORES_REALIZADOS SR ON C.CODIGO_SETORES_REALIZADOS = SR.CODIGO
      INNER JOIN SETORES_REALIZADOS_CONTROLE_VEI V ON C.CODIGO_SRC_VEI = V.CODIGO
      INTO :CODIGO_CONTROLE_VEI,
           :CODIGOVEICULO,
           :CODIGOULTIMO_HISTORICO,
           :CODIGO_CONTROLE,
           :DATAHORA_GMT_HISTORICO,
           :DATAHORA_INICIO
  DO
  BEGIN
    IF (DATAHORA_INICIO < CURRENT_DATE -3) THEN
    BEGIN
      DELETE FROM SETORES_REALIZADOS_CONTROLE
        WHERE CODIGO = :CODIGO_CONTROLE;
    END
    ELSE
    BEGIN
      IF (CODIGOULTIMO_HISTORICO IS NULL) THEN
      BEGIN
        SELECT MAX(CODIGO)
          FROM RASTREAMENTO_HISTORICO RH
          WHERE RH.CODIGOVEICULO = :CODIGOVEICULO
            AND RH.DATAHORA_GMT BETWEEN(:DATAHORA_GMT_HISTORICO - 10) AND :DATAHORA_GMT_HISTORICO
          INTO :CODIGOULTIMO_HISTORICO;

        UPDATE SETORES_REALIZADOS_CONTROLE_VEI
          SET CODIGOULTIMO_HISTORICO = :CODIGOULTIMO_HISTORICO
          WHERE CODIGO = :CODIGO_CONTROLE_VEI;
      END
    END
  END

  -- Para os que ficaram nulos, atualiza com o último conhecido
  FOR
    SELECT DISTINCT V.CODIGO
                  , V.CODIGOVEICULO
                  , LV.DATAHORA_ULTIMO_HISTORICO
      FROM SETORES_REALIZADOS_CONTROLE_VEI V
      INNER JOIN LISTAGEMVEICULOS LV ON LV.CODIGOVEICULO = V.CODIGOVEICULO AND LV.DATAHORA_ULTIMO_HISTORICO IS NOT NULL AND LV.REMOVIDO = 'F'
      WHERE V.CODIGOULTIMO_HISTORICO IS NULL
      INTO :CODIGO_CONTROLE_VEI,
           :CODIGOVEICULO,
           :DATAHORA_GMT_HISTORICO

  DO
  BEGIN
    UPDATE SETORES_REALIZADOS_CONTROLE_VEI VS
      SET VS.CODIGOULTIMO_HISTORICO = (SELECT MAX(RH.CODIGO)
                                         FROM RASTREAMENTO_HISTORICO RH
                                         WHERE VS.CODIGOVEICULO = RH.CODIGOVEICULO
                                           AND :datahora_gmt_historico = RH.DATAHORA_GMT)
      WHERE VS.CODIGO = :CODIGO_CONTROLE_VEI;
  END
END; 
