/*Tabela INVEROTA: Inventário Rotativo*/
/*Descrição: A trigger insere registros na tabela LOGOPERA a partir de alterações na tabela INVEROTA */
/*Objetivo: Gerar um log que vai registrar as alterações na tabela Inventário Rotativo,
             utilizando a tabela Geral de Logs de Operações */
/*Criação: 12/06/2012 - Tarcísio Dias Pereira*/

CREATE OR REPLACE TRIGGER HIST_INVEROTA_EST
AFTER DELETE OR INSERT OR UPDATE
ON INVEROTA FOR EACH ROW
DECLARE
  V_USUARIO         VARCHAR2(40);
  V_TIPO            VARCHAR2(1);
  V_ITPESQ          VARCHAR2(80);
  V_DESC            VARCHAR2(400);
  V_CDFILLOGOPER    VARCHAR2(4);
  V_DTOPER          DATE;
  V_CDARVPROD       VARCHAR2(20);
BEGIN
   V_DESC     := '';
   V_TIPO     := '0';
   V_CDFILLOGOPER := '';

   NMUSUARIO(V_USUARIO);
   IF NOT V_USUARIO IS NULL THEN
      IF DELETING  THEN
         V_TIPO := '3';

         SELECT CDARVPROD INTO V_CDARVPROD
           FROM PRODUTO
          WHERE CDPRODUTO = :OLD.CDPRODUTO;

         V_DESC := 'Filial ' || :OLD.CDFILIAL || 
                   ' Dt. Inv. ' || TO_CHAR(:OLD.DTINVEROTA, 'DD/MM/YYYY') || 
                   ' Prod. ' || V_CDARVPROD;

         IF (:OLD.CDALMOXARIFE <> ' ') THEN
            V_DESC := V_DESC || ' Almox. ' || :OLD.CDALMOXARIFE; 
         END IF;

         IF (:OLD.CDLOCALESTOQ <> ' ') THEN
            V_DESC := V_DESC || ' Local. ' || :OLD.CDLOCALESTOQ; 
         END IF;

         V_DESC := V_DESC || ' Qtd. Inv. ' || TO_CHAR(:OLD.QTINVEROTA) 
                          || ' Qtd. Est. ' || TO_CHAR(:OLD.QTESTOQUE);

         IF :OLD.IDINVENTOK IS NOT NULL THEN
            V_DESC := V_DESC || ' Inv. Ok ' || :OLD.IDINVENTOK;
         END IF;

         V_ITPESQ  := :OLD.CDFILIAL||TO_CHAR(:OLD.DTINVEROTA, 'DDMMYYYY')||:OLD.CDPRODUTO|| CASE :OLD.CDALMOXARIFE WHEN ' ' THEN '' ELSE :OLD.CDALMOXARIFE END||
                      CASE :OLD.CDLOCALESTOQ WHEN ' ' THEN '' ELSE :OLD.CDLOCALESTOQ END;

         V_CDFILLOGOPER := :OLD.CDFILIAL;
      ELSE
         IF UPDATING THEN
            IF (:OLD.QTINVEROTA <> :NEW.QTINVEROTA) OR (:OLD.QTESTOQUE <> :NEW.QTESTOQUE) OR
               (:OLD.IDINVENTOK <> :NEW.IDINVENTOK) THEN
               V_TIPO := '2';

               SELECT CDARVPROD INTO V_CDARVPROD
                 FROM PRODUTO
                WHERE CDPRODUTO = :OLD.CDPRODUTO;

               V_DESC := 'Filial ' || :OLD.CDFILIAL || 
                         ' Dt. Inv. ' || TO_CHAR(:OLD.DTINVEROTA, 'DD/MM/YYYY') || 
                         ' Prod. ' || V_CDARVPROD;

               IF (:OLD.CDALMOXARIFE <> ' ') THEN
                  V_DESC := V_DESC || ' Almox. ' || :OLD.CDALMOXARIFE; 
               END IF;

               IF (:OLD.CDLOCALESTOQ <> ' ') THEN
                  V_DESC := V_DESC || ' Local. ' || :OLD.CDLOCALESTOQ; 
               END IF;

               V_DESC := V_DESC || ' Alterado:';

               IF (:OLD.QTINVEROTA <> :NEW.QTINVEROTA) THEN
                  V_DESC := V_DESC || ' Qtd. Inv. - De ' || :OLD.QTINVEROTA || ' Para ' || :NEW.QTINVEROTA;
               END IF;

               IF (:OLD.QTESTOQUE <> :NEW.QTESTOQUE) THEN
                  V_DESC := V_DESC || ' Qtd. Est. - De ' || :OLD.QTESTOQUE || ' Para ' || :NEW.QTESTOQUE;
               END IF;            

               IF (:OLD.IDINVENTOK <> :NEW.IDINVENTOK) THEN
                  IF (:OLD.IDINVENTOK IS NULL) THEN
                     V_DESC := V_DESC || ' Inv. OK ' || :NEW.IDINVENTOK;
                  ELSE
                     V_DESC := V_DESC || ' Inv. OK - De ' || :OLD.IDINVENTOK || ' Para '|| :NEW.IDINVENTOK;
                  END IF;
               END IF;

               V_ITPESQ  := :OLD.CDFILIAL||TO_CHAR(:OLD.DTINVEROTA, 'DDMMYYYY')||:OLD.CDPRODUTO||CASE :OLD.CDALMOXARIFE WHEN ' ' THEN '' ELSE :OLD.CDALMOXARIFE END||
                            CASE :OLD.CDLOCALESTOQ WHEN ' ' THEN '' ELSE :OLD.CDLOCALESTOQ END;

               V_CDFILLOGOPER := :OLD.CDFILIAL;
            END IF;
         ELSE
            V_TIPO := '1';

            SELECT CDARVPROD INTO V_CDARVPROD
              FROM PRODUTO
             WHERE CDPRODUTO = :NEW.CDPRODUTO;

            V_DESC := 'Filial ' || :NEW.CDFILIAL || 
                      ' Dt. Inv. ' || TO_CHAR(:NEW.DTINVEROTA, 'DD/MM/YYYY') || 
                      ' Prod. ' || V_CDARVPROD;

            IF (:NEW.CDALMOXARIFE <> ' ') THEN
               V_DESC := V_DESC || ' Almox. ' || :NEW.CDALMOXARIFE; 
            END IF;

            IF (:NEW.CDLOCALESTOQ <> ' ') THEN
               V_DESC := V_DESC || ' Local. ' || :NEW.CDLOCALESTOQ; 
            END IF;

            IF :NEW.QTINVEROTA IS NOT NULL THEN
               V_DESC := V_DESC || ' Qtd. Inv. ' || TO_CHAR(:NEW.QTINVEROTA);
            END IF;

            IF :NEW.QTESTOQUE IS NOT NULL THEN
               V_DESC := V_DESC || ' Qtd. Est. '|| TO_CHAR(:NEW.QTESTOQUE);
            END IF;

            IF :NEW.IDINVENTOK IS NOT NULL THEN
               V_DESC := V_DESC || ' Inv. Ok ' || :NEW.IDINVENTOK;
            END IF;

            V_ITPESQ  := :NEW.CDFILIAL||TO_CHAR(:NEW.DTINVEROTA, 'DDMMYYYY')||:NEW.CDPRODUTO|| CASE :NEW.CDALMOXARIFE WHEN ' ' THEN '' ELSE :NEW.CDALMOXARIFE END||
                         CASE :NEW.CDLOCALESTOQ WHEN ' ' THEN '' ELSE :NEW.CDLOCALESTOQ END;

            V_CDFILLOGOPER := :NEW.CDFILIAL;
         END IF;
      END IF;

      IF V_TIPO <> '0' THEN
         IF NOT V_DESC IS NULL THEN
            V_DTOPER := SYSDATE;

            INSERT INTO LOGOPERA
               (NMTABELA, DTOPERACAO, NMRESPOPER, IDTIPOOPER, CDPESQITEM, DSOPERACAO, CDFILLOGOPER)
            VALUES
               ('INVEROTA', V_DTOPER, V_USUARIO, V_TIPO, V_ITPESQ, V_DESC, V_CDFILLOGOPER);

         END IF;
      END IF;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('HIST_INVEROTA_EST','5.45.005'); END;
/