SET TERM ^;

CREATE OR ALTER TRIGGER GRUPOSCONTROLE_VEICULOS_AIU0 FOR GRUPOSCONTROLE_VEICULOS
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
DECLARE VARIABLE CODIGO_GRUPOCONTRO_DESLOCAMENTO INTEGER;
DECLARE VARIABLE GRUPOCONTROLE_VEICULO INTEGER;
DECLARE VARIABLE CODIGO_OPERACAO INTEGER;
DECLARE VARIABLE CODIGO_ALARME INTEGER;
BEGIN
  SELECT FIRST 1 E.CODIGO_GRUPOCONTRO_DESLOCAMENTO
               , COALESCE(GV.CODIGO, 0) AS GRUPOCONTROLE_VEICULO
               , OT.CODIGO AS CODIGO_OPERACAO
               , A.CODIGO AS CODIGO_ALARME
    FROM VEICULOS V
    INNER JOIN EMPRESAS E ON E.CODIGO = V.CODIGOEMPRESA
    LEFT JOIN GRUPOSCONTROLE_VEICULOS GV ON GV.CODIGOGRUPOCONTROLE = E.CODIGO_GRUPOCONTRO_DESLOCAMENTO AND GV.CODIGOVEICULO = V.CODIGO
    INNER JOIN OPERACOES_TECNOLOGIA OT ON (OT.CODIGOOPERACOES = E.CODIGO_OPERACAO_DESLOCAMENTO)
    INNER JOIN ALARMES A ON A.CODIGOOPERACOES = OT.CODIGO AND A.APAGADO = 'F'
    WHERE V.CODIGO = NEW.CODIGOVEICULO
    INTO :CODIGO_GRUPOCONTRO_DESLOCAMENTO,
         :GRUPOCONTROLE_VEICULO,
         :CODIGO_OPERACAO,
         :CODIGO_ALARME;

  IF (GRUPOCONTROLE_VEICULO = 0
      AND NEW.CODIGOGRUPOCONTROLE <> :CODIGO_GRUPOCONTRO_DESLOCAMENTO) THEN
  BEGIN
    UPDATE OR INSERT INTO GRUPOSCONTROLE_VEICULOS (
        CODIGOGRUPOCONTROLE,
        CODIGOVEICULO,
        CODIGODISPOSITIVO,
        CODIGOOPERACOES,
        CODIGOALARMES)
    VALUES (:CODIGO_GRUPOCONTRO_DESLOCAMENTO,
            NEW.CODIGOVEICULO,
            NEW.CODIGODISPOSITIVO,
            :CODIGO_OPERACAO,
            :CODIGO_ALARME)
    MATCHING (CODIGOGRUPOCONTROLE,
              CODIGOVEICULO,
              CODIGODISPOSITIVO);
  END

  /* Se o registro está sendo inserido no Grupo de Controle de Deslocamento, remover noções anteriores para não duplicar */
  ELSE
  IF (CODIGO_GRUPOCONTRO_DESLOCAMENTO = NEW.CODIGOGRUPOCONTROLE) THEN
  BEGIN
    IF (INSERTING) THEN
      DELETE FROM GRUPOSCONTROLE_VEICULOS GCV
        WHERE CODIGOVEICULO = NEW.CODIGOVEICULO
          AND CODIGODISPOSITIVO = NEW.CODIGODISPOSITIVO
          AND CODIGOGRUPOCONTROLE = NEW.CODIGOGRUPOCONTROLE
          AND CODIGO <> NEW.CODIGO;
  END
END^

SET TERM;^

COMMENT ON TRIGGER GRUPOSCONTROLE_VEICULOS_AIU0 IS '24.09.2020 - Vitorino: Ajustado trigger para não duplicar registros na tabela de GRUPOSCONTROLE_VEICULOS quando
feito remoção e nova inserção na mesma transação. Neste caso, ele remove o item inserido pela trigger de deletar'; 