CREATE OR REPLACE TRIGGER LOG_GOP_FILIALOPEROP
AFTER UPDATE OR INSERT
ON FILIALOPEROP 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_CDFILLOGOPER    VARCHAR2(4);
   V_ITPESQ          VARCHAR2(40);
   V_NMOPERADOR      VARCHAR2(40);
   V_CDOPERADOR      VARCHAR2(12);
   V_DESCUPD         VARCHAR2(4000);

   /* Nome do grupo e do gerente relacionado */
   V_NMGERENTE       VARCHAR2(50);
   V_NMGRUPGERENTEOP VARCHAR2(40);
   V_NMFILIAL        VARCHAR2(30);
  
  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 = TO_CHAR(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   := '';
   V_CDFILLOGOPER := '';

   WEBTUNNING(V_DSREMOTEADDR,
              V_DSREMOTEHOST,
              V_DSSERVERRDM,
              V_DSSERVMETHOD,
              V_DSREMOTEOPER);

   V_DESCUPD := 'Controle de Unidades por Gerente' || chr(10) || '-> Gerente -> Unidade' || chr(10);
   V_DSSERVERRDM := 'gop00200_controle_de_unidades_por_gerente';

   IF INSERTING THEN
      SELECT MAX(GG.NMGRUPGERENTEOP), MAX(OP.NMOPERADOR), MAX(F.NMFILIAL)
        INTO V_NMGRUPGERENTEOP, V_NMGERENTE, V_NMFILIAL
        FROM OPERADOR OP, GRUPGERENTEOP GG, OPGRUPGERENTEOP GP, FILIAL F
       WHERE GP.CDGRUPGERENTEOP = GG.CDGRUPGERENTEOP
         AND GP.CDOPERADOR = OP.CDOPERADOR
         AND F.CDFILIAL = :NEW.CDFILIAL
         AND GP.CDGRUPGERENTEOP = :NEW.CDGRUPGERENTEOP
         AND OP.CDOPERADOR = :NEW.CDOPERADOR;
         
      IF NVL(:NEW.CDFILIAL, 0) <> NVL(:OLD.CDFILIAL,0) THEN
         V_DESC := V_DESC || chr(10) ||' Grupo de Gerentes: '  || NVL(V_NMGRUPGERENTEOP, ' ');
         V_DESC := V_DESC || chr(10) ||' Gerente: '  || NVL(V_NMGERENTE, ' ');
         V_DESC := V_DESC || chr(10) ||' Unidade: '  || NVL(:NEW.CDFILIAL, ' ')|| ' - ' || NVL(V_NMFILIAL, ' ');
         V_DESC := V_DESC || chr(10) ||' Acesso ao Calculo: '  || NVL(:NEW.IDACESSOCALC, ' ');
         V_DESC := V_DESC || chr(10) ||' Acesso a Aprovacao: '  || NVL(:NEW.IDACESSOAPROV, ' ');
      END IF;

      V_TIPO         := '1';
      V_ITPESQ       := TO_CHAR(:NEW.CDGRUPGERENTEOP) || '/' || TO_CHAR(:NEW.CDOPERADOR) || '/' || TO_CHAR(:NEW.CDFILIAL);
      V_CDOPERADOR   := :NEW.CDOPERINCLUSAO;

      NMOPERADOR(V_CDOPERADOR, V_NMOPERADOR);

   ELSIF UPDATING THEN
      SELECT  MAX(GG.NMGRUPGERENTEOP), MAX(OP.NMOPERADOR), MAX(F.NMFILIAL)
        INTO V_NMGRUPGERENTEOP, V_NMGERENTE, V_NMFILIAL
        FROM OPERADOR OP, GRUPGERENTEOP GG, OPGRUPGERENTEOP GP, FILIAL F
       WHERE GP.CDGRUPGERENTEOP = GG.CDGRUPGERENTEOP
         AND GP.CDOPERADOR = OP.CDOPERADOR
         AND F.CDFILIAL = :OLD.CDFILIAL
         AND GP.CDGRUPGERENTEOP = :OLD.CDGRUPGERENTEOP
         AND OP.CDOPERADOR = :OLD.CDOPERADOR;

      IF (NVL(TO_CHAR(:NEW.IDACESSOCALC),'!') <> NVL(TO_CHAR(:OLD.IDACESSOCALC),'!'))  OR
         (NVL(TO_CHAR(:NEW.IDACESSOAPROV),'!') <> NVL(TO_CHAR(:OLD.IDACESSOAPROV),'!'))  THEN

         V_DESC := chr(10) || 'Grupo de Gerente: ' || V_NMGRUPGERENTEOP;
         V_DESC := V_DESC || chr(10) || 'Gerente: ' || V_NMGERENTE;
         V_DESC := V_DESC || chr(10) || 'Unidade: ' || :NEW.CDFILIAL || ' - ' || NVL(V_NMFILIAL, ' ');

         IF NVL(TO_CHAR(:NEW.IDACESSOCALC),'!') <> NVL(TO_CHAR(:OLD.IDACESSOCALC),'!') THEN
            V_DESC := V_DESC || chr(10) || ' Acesso ao Calculo alterado de: '|| '"' ||TO_CHAR(:OLD.IDACESSOCALC) || '"' ||' para ' || '"' ||TO_CHAR(:NEW.IDACESSOCALC) || '"';
         END IF;
         IF NVL(TO_CHAR(:NEW.IDACESSOAPROV),'!') <> NVL(TO_CHAR(:OLD.IDACESSOAPROV),'!') THEN
            V_DESC := V_DESC || chr(10) || ' Acesso a Aprovacao alterado de: '|| '"' ||TO_CHAR(:OLD.IDACESSOAPROV) || '"' ||' para ' || '"' ||TO_CHAR(:NEW.IDACESSOAPROV) || '"';
         END IF;

         V_TIPO         := '2';
         V_ITPESQ       := TO_CHAR(:OLD.CDGRUPGERENTEOP) || '/' || TO_CHAR(:OLD.CDOPERADOR) || '/' || TO_CHAR(:OLD.CDFILIAL);
         V_CDOPERADOR   := :NEW.CDOPERULTATU;

         NMOPERADOR(V_CDOPERADOR, V_NMOPERADOR);
      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
         ('FILIALOPEROP', 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;
/