CREATE OR REPLACE TRIGGER LOG_FCT_ENDERECOORCA 
  BEFORE UPDATE OR INSERT OR DELETE ON FCT_ENDERECOORCA 
  FOR EACH ROW 
DECLARE 
PRAGMA AUTONOMOUS_TRANSACTION;
    V_NRLOGDADOSPROP      NUMBER; 
    V_IDSITUACAOORCAMENTO VARCHAR2(30); 
    V_ENDERECO VARCHAR2(30);
BEGIN 
    BEGIN 
        SELECT IDSITUACAOORCAMENTO 
        INTO   V_IDSITUACAOORCAMENTO 
        FROM   FCT_ORCAMENTO 
        WHERE  ( NRSEQORCAMENTO = :NEW.NRSEQORCAMENTO 
                 AND NRORG = :NEW.NRORG ) 
                OR ( NRSEQORCAMENTO = :OLD.NRSEQORCAMENTO 
                     AND NRORG = :OLD.NRORG ); 
    EXCEPTION 
        WHEN NO_DATA_FOUND THEN 
          BEGIN 
              V_IDSITUACAOORCAMENTO := NULL; 
          END; 
    END; 

    IF V_IDSITUACAOORCAMENTO = 'CONCLUIDO' THEN 
      IF UPDATING THEN 
        IF ( NVL(:OLD.CDBAIRRO, 0) ) <> ( NVL(:NEW.CDBAIRRO, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Bairro', 
                       :OLD.CDBAIRRO, 
                       :NEW.CDBAIRRO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       (SELECT NMBAIRRO 
                        FROM   BAIRRO 
                        WHERE  CDBAIRRO = :OLD.CDBAIRRO 
                               AND CDMUNICIPIO = :OLD.CDMUNICIPIO 
                               AND SGESTADO = :OLD.SGESTADO 
                               AND CDPAIS = :OLD.CDPAIS), 
                       (SELECT NMBAIRRO 
                        FROM   BAIRRO 
                        WHERE  CDBAIRRO = :NEW.CDBAIRRO 
                               AND CDMUNICIPIO = :NEW.CDMUNICIPIO 
                               AND SGESTADO = :NEW.SGESTADO 
                               AND CDPAIS = :NEW.CDPAIS) ); 
        END IF; 

        IF ( NVL(:OLD.CDTIPOENDERECO, 0) ) <> ( NVL(:NEW.CDTIPOENDERECO, 0) ) 
        THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Tipo de Endereço', 
                       :OLD.CDTIPOENDERECO, 
                       :NEW.CDTIPOENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       (SELECT NMTIPOENDERECO 
                        FROM   TIPOENDERECO 
                        WHERE  CDTIPOENDERECO = :OLD.CDTIPOENDERECO), 
                       (SELECT NMTIPOENDERECO 
                        FROM   TIPOENDERECO 
                        WHERE  CDTIPOENDERECO = :NEW.CDTIPOENDERECO) ); 
        END IF; 

        IF ( NVL(:OLD.NRCEPENDERECO, 0) ) <> ( NVL(:NEW.NRCEPENDERECO, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - CEP', 
                       :OLD.NRCEPENDERECO, 
                       :NEW.NRCEPENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        END IF; 

        IF ( NVL(:OLD.CDPAIS, 0) ) <> ( NVL(:NEW.CDPAIS, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - País', 
                       :OLD.CDPAIS, 
                       :NEW.CDPAIS, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       (SELECT NMPAIS 
                        FROM   PAIS 
                        WHERE  CDPAIS = :OLD.CDPAIS), 
                       (SELECT NMPAIS 
                        FROM   PAIS 
                        WHERE  CDPAIS = :NEW.CDPAIS) ); 
        END IF; 

        IF ( NVL(:OLD.SGESTADO, 0) ) <> ( NVL(:NEW.SGESTADO, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Estado', 
                       :OLD.SGESTADO, 
                       :NEW.SGESTADO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       (SELECT NMESTADO 
                        FROM   ESTADO 
                        WHERE  SGESTADO = :OLD.SGESTADO 
                               AND CDPAIS = :OLD.CDPAIS), 
                       (SELECT NMESTADO 
                        FROM   ESTADO 
                        WHERE  SGESTADO = :NEW.SGESTADO 
                               AND CDPAIS = :NEW.CDPAIS) ); 
        END IF; 

        IF ( NVL(:OLD.CDMUNICIPIO, 0) ) <> ( NVL(:NEW.CDMUNICIPIO, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Município', 
                       :OLD.CDMUNICIPIO, 
                       :NEW.CDMUNICIPIO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       (SELECT NMMUNICIPIO 
                        FROM   MUNICIPIO 
                        WHERE  CDMUNICIPIO = :OLD.CDMUNICIPIO 
                               AND SGESTADO = :OLD.SGESTADO 
                               AND CDPAIS = :OLD.CDPAIS), 
                       (SELECT NMMUNICIPIO 
                        FROM   MUNICIPIO 
                        WHERE  CDMUNICIPIO = :NEW.CDMUNICIPIO 
                               AND SGESTADO = :NEW.SGESTADO 
                               AND CDPAIS = :NEW.CDPAIS) ); 
        END IF; 

        IF ( NVL(:OLD.DSENDERECO, 0) ) <> ( NVL(:NEW.DSENDERECO, 0) ) THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Endereço', 
                       :OLD.DSENDERECO, 
                       :NEW.DSENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        END IF; 

        IF ( NVL(:OLD.NRIMOVELENDERECO, 0) ) <> 
           ( NVL(:NEW.NRIMOVELENDERECO, 0) ) 
        THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Número', 
                       :OLD.NRIMOVELENDERECO, 
                       :NEW.NRIMOVELENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        END IF; 

        IF ( NVL(:OLD.DSCOMPLEENDERECO, 0) ) <> 
           ( NVL(:NEW.DSCOMPLEENDERECO, 0) ) 
        THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Complemento', 
                       :OLD.DSCOMPLEENDERECO, 
                       :NEW.DSCOMPLEENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        END IF; 

        IF ( NVL(:OLD.DSREFERENCIAENDE, 0) ) <> 
           ( NVL(:NEW.DSREFERENCIAENDE, 0) ) 
        THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 

          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço - Referência', 
                       :OLD.DSREFERENCIAENDE, 
                       :NEW.DSREFERENCIAENDE, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        END IF; 
      ELSE 
        IF INSERTING THEN 
          NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 
          IF :NEW.NRIMOVELENDERECO IS NOT NULL THEN
            V_ENDERECO := :NEW.DSENDERECO || ' - '|| :NEW.NRIMOVELENDERECO;
          ELSE
            V_ENDERECO := :NEW.DSENDERECO;
          END IF;
          
          INSERT INTO FCT_LOGDADOSPROP 
                      (NRLOGDADOSPROP, 
                       NRSEQORCAMENTO, 
                       NRITEMORCAMENTO, 
                       DSCAMPOALTERADO, 
                       VALORANTIGO, 
                       VALORNOVO, 
                       NRORG, 
                       DTALTERACAO, 
                       CDOPERALTERACAO, 
                       DSVALORANTIGO, 
                       DSVALORNOVO) 
          VALUES      ( V_NRLOGDADOSPROP, 
                       :NEW.NRSEQORCAMENTO, 
                       NULL, 
                       'Endereço Inserido', 
                       NULL, 
                       V_ENDERECO, 
                       :NEW.NRORG, 
                       SYSDATE, 
                       :NEW.CDOPERULTATU, 
                       NULL, 
                       NULL ); 
        ELSE 
          IF DELETING THEN 
            NOVO_CODIGO_SC('FCT_LOGDADOSPROP', V_NRLOGDADOSPROP, 1); 
            IF :OLD.NRIMOVELENDERECO IS NOT NULL THEN
                V_ENDERECO := :OLD.DSENDERECO || ' - '|| :OLD.NRIMOVELENDERECO;
              ELSE
                V_ENDERECO := :OLD.DSENDERECO;
              END IF;
              
            INSERT INTO FCT_LOGDADOSPROP 
                        (NRLOGDADOSPROP, 
                         NRSEQORCAMENTO, 
                         NRITEMORCAMENTO, 
                         DSCAMPOALTERADO, 
                         VALORANTIGO, 
                         VALORNOVO, 
                         NRORG, 
                         DTALTERACAO, 
                         CDOPERALTERACAO, 
                         DSVALORANTIGO, 
                         DSVALORNOVO) 
            VALUES      ( V_NRLOGDADOSPROP, 
                         :OLD.NRSEQORCAMENTO, 
                         NULL, 
                         'Endereço Deletado', 
                         V_ENDERECO, 
                         NULL, 
                         :OLD.NRORG, 
                         SYSDATE, 
                         :OLD.CDOPERULTATU, 
                         NULL, 
                         NULL ); 
          END IF; 
        END IF; 
      END IF; 
    END IF; 
  COMMIT;
END;