CREATE OR REPLACE TRIGGER LOG_GOP_IMPOSTOROP
AFTER INSERT OR UPDATE
ON IMPOSTOROP FOR EACH ROW
DECLARE
   V_TIPO                VARCHAR2(1);
   V_DSREMOTEADDR        VARCHAR2(15);
   V_DSREMOTEHOST        VARCHAR2(15);
   V_DSSERVERRDM         VARCHAR2(100);
   V_DSSERVMETHOD        VARCHAR2(4000);
   V_DSREMOTEOPER        VARCHAR2(12);
   V_DESC                VARCHAR2(1000);
   V_DESCUPD             VARCHAR2(4000);
   V_CDFILLOGOPER        VARCHAR2(4);
   V_ITPESQ              VARCHAR2(40);
   V_NMOPERADOR          VARCHAR2(40);
   V_CDOPERADOR          VARCHAR2(12);
   V_CDFILIAL            VARCHAR2(20);
   V_NMFILIAL            VARCHAR2(50);
   V_NMTIPOOPER          VARCHAR2(100);
   V_IDTPIMPOSTOROP      VARCHAR2(100);
   V_IDTPIMPOSTOROP_NOVO VARCHAR2(100);
   V_IDTRATIMPROP        VARCHAR2(100);
   V_IDTRATIMPROP_NOVO   VARCHAR2(100);
   V_SGIMPOSTO           VARCHAR2(100);
   V_NMIMPOSTO           VARCHAR2(100);
   V_UNIDADE             VARCHAR(100);

  PROCEDURE NMOPERADOR (P_CDOPERADOR IN OUT VARCHAR2,
                        P_NMOPERADOR OUT VARCHAR2) AS
  BEGIN
     P_NMOPERADOR := NULL;

     BEGIN
        SELECT CDOPERADOR, NMOPERADOR
          INTO P_CDOPERADOR, P_NMOPERADOR
          FROM OPERADOR
         WHERE CDOPERADOR = P_CDOPERADOR;
     EXCEPTION
        WHEN NO_DATA_FOUND THEN
          P_CDOPERADOR := 'VIA BD';
          P_NMOPERADOR := 'VIA BD';
     END;
  END;
BEGIN
/* IDTIPOOPER - 1 - Inclusao, 2 - Alteracao, 3 - Exclusao*/
   V_TIPO         := '0';
   V_DESC         := '';
   V_ITPESQ       := '';
   V_NMOPERADOR   := '';
   V_CDOPERADOR   := NVL(:NEW.CDOPERULTATU,:NEW.CDOPERINCLUSAO);
   V_CDFILLOGOPER := '';
   V_ITPESQ       := TO_CHAR(:NEW.CDIMPOSTO);
   V_UNIDADE      := '';
   WEBTUNNING(V_DSREMOTEADDR,
              V_DSREMOTEHOST,
              V_DSSERVERRDM,
              V_DSSERVMETHOD,
              V_DSREMOTEOPER);
              
   V_DSSERVERRDM := 'ger80200_parametros_resultado_operacional';          
   NMOPERADOR(V_CDOPERADOR, V_NMOPERADOR);
   V_DESCUPD := 'Parametros para Resultado Operacional' || chr(10);

   IF TO_CHAR(:NEW.CDFILIAL) = 'T' OR TO_CHAR(:NEW.CDFILIAL) =  'P' THEN
      V_UNIDADE := chr(10) || 'Unidade: Padrao' || chr(10);
   ELSE
      SELECT MAX(CDFILIAL), MAX(NMFILIAL)
        INTO V_CDFILIAL, V_NMFILIAL
        FROM FILIAL
       WHERE CDFILIAL = :NEW.CDFILIAL;
      V_UNIDADE := chr(10) || 'Unidade: '|| V_CDFILIAL || ' - ' || V_NMFILIAL || chr(10);
   END IF;

   SELECT MAX(SGIMPOSTO), MAX(NMIMPOSTO)
     INTO V_SGIMPOSTO, V_NMIMPOSTO
     FROM IMPOSTO
    WHERE CDIMPOSTO = :NEW.CDIMPOSTO;

   IF INSERTING THEN
      V_TIPO := '1';
      IF :NEW.IDTPIMPOSTOROP = 'CC' OR :NEW.IDTPIMPOSTOROP = 'CS' OR :NEW.IDTPIMPOSTOROP = 'ST' THEN
         V_DESCUPD := V_DESCUPD || 'Apuracao Estoque -> Impostos ' || chr(10) || V_UNIDADE;
         V_IDTPIMPOSTOROP_NOVO := CASE :NEW.IDTPIMPOSTOROP WHEN 'CC' THEN 'Consumo Compras'
                                                           WHEN 'CS' THEN 'Consumo Saida'
                                                           WHEN 'ST' THEN 'Substituicao Tributaria'
                                                           ELSE :NEW.IDTPIMPOSTOROP
                                  END;
         V_IDTRATIMPROP_NOVO := CASE :NEW.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                       WHEN 'D' THEN 'Descontar'
                                                       WHEN 'V' THEN 'Destacar'
                                                       ELSE :NEW.IDTRATIMPROP
                                END;
         V_DESC := 'Imposto: ' || V_SGIMPOSTO || ' - ' || V_NMIMPOSTO || chr(10) || 'Tipo: ' || V_IDTPIMPOSTOROP_NOVO || chr(10) || 'Tp. Faturamento: ' || V_IDTRATIMPROP_NOVO;

      ELSIF :NEW.IDTPIMPOSTOROP = 'FS' OR :NEW.IDTPIMPOSTOROP = 'FE' THEN
         V_DESCUPD :=  V_DESCUPD || 'Faturamento -> Impostos -> Impostos' || chr(10) || V_UNIDADE;

         V_IDTRATIMPROP := CASE :NEW.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                  WHEN 'D' THEN 'Descontar'
                                                  WHEN 'V' THEN 'Destacar'
                                                  ELSE :NEW.IDTRATIMPROP
                           END;
         V_IDTPIMPOSTOROP := CASE :NEW.IDTPIMPOSTOROP WHEN 'FS' THEN 'Faturamento Bruto'
                                                      WHEN 'FE' THEN 'Medicao de Efetivos'
                                                      ELSE :NEW.IDTPIMPOSTOROP
                              END;
         V_DESC := 'Imposto: ' || V_SGIMPOSTO || ' - ' || V_NMIMPOSTO || chr(10) || 'Tratamento: ' || V_IDTRATIMPROP || chr(10) || 'Tipo: ' || V_IDTPIMPOSTOROP;
      END IF;
   ELSIF UPDATING THEN
      V_TIPO := '2';
      IF :OLD.IDTPIMPOSTOROP = 'CC' OR :OLD.IDTPIMPOSTOROP = 'CS' OR :OLD.IDTPIMPOSTOROP = 'ST' THEN
         V_DESCUPD := V_DESCUPD || 'Apuracao Estoque -> Impostos' || chr(10) || V_UNIDADE || 'Imposto: ' || V_SGIMPOSTO || ' - ' || V_NMIMPOSTO;
         IF NVL(:OLD.IDTPIMPOSTOROP, '!') <> NVL(:NEW.IDTPIMPOSTOROP, '!') THEN
            V_IDTPIMPOSTOROP := CASE :OLD.IDTPIMPOSTOROP WHEN 'CC' THEN 'Consumo Compras'
                                                         WHEN 'CS' THEN 'Consumo Saida'
                                                         WHEN 'ST' THEN 'Substituicao Tributaria'
                                                         ELSE :OLD.IDTPIMPOSTOROP
                                END;
            V_IDTPIMPOSTOROP_NOVO := CASE :NEW.IDTPIMPOSTOROP WHEN 'CC' THEN 'Consumo Compras'
                                                              WHEN 'CS' THEN 'Consumo Saida'
                                                              WHEN 'ST' THEN 'Substituicao Tributaria'
                                                              ELSE :NEW.IDTPIMPOSTOROP
                                     END;

            V_DESC := V_DESC || chr(10) || 'Tipo alterado de: ' || V_IDTPIMPOSTOROP || ' para ' || V_IDTPIMPOSTOROP_NOVO;
         END IF;

         IF NVL(:OLD.IDTPIMPOSTOROP, '!') <> NVL(:NEW.IDTPIMPOSTOROP, '!') THEN
            V_IDTRATIMPROP := CASE :OLD.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                     WHEN 'D' THEN 'Descontar'
                                                     WHEN 'V' THEN 'Destacar'
                                                     ELSE :OLD.IDTRATIMPROP
                              END;
            V_IDTRATIMPROP_NOVO := CASE :NEW.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                          WHEN 'D' THEN 'Descontar'
                                                          WHEN 'V' THEN 'Destacar'
                                                          ELSE :NEW.IDTRATIMPROP
                                   END;
            V_DESC := V_DESC || chr(10) || 'Tratamento alterado de ' || V_IDTRATIMPROP || ' para ' || V_IDTRATIMPROP_NOVO;
         END IF;
      ELSIF :OLD.IDTPIMPOSTOROP = 'FS' OR :OLD.IDTPIMPOSTOROP = 'FE' THEN
         V_DESCUPD := V_DESCUPD || 'Faturamento -> Impostos -> Impostos' || chr(10) || V_UNIDADE || 'Imposto: ' || V_SGIMPOSTO || ' - ' || V_NMIMPOSTO;

         IF NVL(:OLD.IDTPIMPOSTOROP, '!') <> NVL(:NEW.IDTPIMPOSTOROP, '!') THEN
            V_IDTPIMPOSTOROP := CASE :OLD.IDTPIMPOSTOROP WHEN 'FS' THEN 'Faturamento Bruto'
                                                         WHEN 'FE' THEN 'Medicao de Efetivos'
                                                         ELSE :OLD.IDTPIMPOSTOROP
                                END;
            V_IDTPIMPOSTOROP_NOVO := CASE :NEW.IDTPIMPOSTOROP WHEN 'FS' THEN 'Faturamento Bruto'
                                                              WHEN 'FE' THEN 'Medicao de Efetivos'
                                                              ELSE :NEW.IDTPIMPOSTOROP
                                     END;
            V_DESC := V_DESC || chr(10) || 'Tp. Faturamento alterado de ' || V_IDTPIMPOSTOROP || ' para ' || V_IDTPIMPOSTOROP_NOVO;
         END IF;

         IF NVL(:OLD.IDTRATIMPROP, '!') <> NVL(:NEW.IDTRATIMPROP, '!') THEN
            V_IDTRATIMPROP := CASE :OLD.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                     WHEN 'D' THEN 'Descontar'
                                                     WHEN 'V' THEN 'Destacar'
                                                      ELSE :OLD.IDTRATIMPROP
                              END;
            V_IDTRATIMPROP_NOVO := CASE :NEW.IDTRATIMPROP WHEN 'A' THEN 'Acrescer'
                                                          WHEN 'D' THEN 'Descontar'
                                                          WHEN 'V' THEN 'Destacar'
                                                          ELSE :NEW.IDTRATIMPROP
                                   END;
            V_DESC := V_DESC || chr(10) || 'Tratamento alterado de ' || V_IDTRATIMPROP || ' para ' || V_IDTRATIMPROP_NOVO;
         END IF;

         IF NVL(:OLD.VRPERFIXCALCIMP, 0) <> NVL(:NEW.VRPERFIXCALCIMP, 0) THEN
            V_DESC := V_DESC || chr(10) || 'Tipo alterado de "' || :OLD.VRPERFIXCALCIMP || '" para "' || :NEW.VRPERFIXCALCIMP || '"';
         END IF;
      END IF;
    END IF;
    IF NOT V_DESC IS NULL THEN
       V_DESC := V_DESCUPD || V_DESC;

       INSERT INTO LOGOPERAGES
                 (NMTABELA,     DTOPERACAO,   NMRESPOPER,  IDTIPOOPER,   DSOPERACAO,  CDPESQITEM,
                  DSRDMUSUOPER, DSENDUSUOPER, DSNMUSUOPER, DSMETUSUOPER, CDORESPOPER, CDFILLOGOPER)
            VALUES
                 ('IMPOSTOROP', SYSDATE, NVL(V_NMOPERADOR,' '), V_TIPO, V_DESC, V_ITPESQ, NVL(V_DSSERVERRDM, ' '),
                  NVL(V_DSREMOTEADDR, ' '), NVL(V_DSREMOTEHOST, ' '), NVL(V_DSSERVMETHOD, ' '), NVL(V_CDOPERADOR, ' '),
                  NVL(V_CDFILLOGOPER, ' '));
    END IF;
END;
/