CREATE OR REPLACE TRIGGER ATU_PRODLOJA_PRODLOJANIVEL
AFTER INSERT OR UPDATE OR DELETE
ON PRODLOJANIVEL FOR EACH ROW
DECLARE
   V_COUNT NUMBER;
   V_CDPRODUTO VARCHAR2(20);
   V_CDLOJA VARCHAR2(03);
   V_CDFILIAL VARCHAR2(04);
   V_CDSETOR VARCHAR2(04);
BEGIN
   IF INSERTING THEN
      INSERT INTO PRODLOJANIVELESP
         (CDFILIAL, CDLOJA, CDPRODUTO, NRSEQIMPRPROD, NRSEQIMPRPROD2, NRSEQIMPRPUXA, IDIMPCANITEM, CDSETOR, CDPRODEXCECAO)
      VALUES
         (:NEW.CDFILIAL, :NEW.CDLOJA, :NEW.CDPRODUTO, :NEW.NRSEQIMPRPROD, :NEW.NRSEQIMPRPROD2, :NEW.NRSEQIMPRPUXA, :NEW.IDIMPCANITEM, :NEW.CDSETOR, :NEW.CDPRODEXCECAO);
   ELSIF UPDATING THEN
      UPDATE PRODLOJANIVELESP
         SET NRSEQIMPRPROD = NVL(:NEW.NRSEQIMPRPROD, NRSEQIMPRPROD),
             NRSEQIMPRPROD2 = NVL(:NEW.NRSEQIMPRPROD2, NRSEQIMPRPROD2),
             NRSEQIMPRPUXA = NVL(:NEW.NRSEQIMPRPUXA, NRSEQIMPRPUXA),
             IDIMPCANITEM = NVL(:NEW.IDIMPCANITEM, IDIMPCANITEM),
             CDSETOR = NVL(:NEW.CDSETOR, CDSETOR),
             CDPRODEXCECAO = NVL(:NEW.CDPRODEXCECAO, CDPRODEXCECAO)
       WHERE CDFILIAL = :OLD.CDFILIAL
         AND CDLOJA = :OLD.CDLOJA
         AND CDPRODUTO = :OLD.CDPRODUTO;
   END IF;
   V_CDPRODUTO := NVL(:NEW.CDPRODUTO, :OLD.CDPRODUTO);
   V_CDLOJA := NVL(:NEW.CDLOJA, :OLD.CDLOJA);
   V_CDFILIAL := NVL(:NEW.CDFILIAL, :OLD.CDFILIAL);
   V_CDSETOR := NVL(:NEW.CDSETOR, :OLD.CDSETOR);
   IF UPDATING OR INSERTING THEN
      FOR C_CAD IN
         (SELECT GERAL.CDFILIAL, GERAL.CDLOJA, GERAL.NRSEQIMPRPROD, GERAL.NRSEQIMPRPROD2,
                GERAL.NRSEQIMPRPUXA, GERAL.IDIMPCANITEM, GERAL.CDPRODUTO
           FROM PRODUTO P, (SELECT PL.CDFILIAL, PL.CDLOJA, PL.NRSEQIMPRPROD, PL.NRSEQIMPRPROD2, PL.NRSEQIMPRPUXA, PL.IDIMPCANITEM, PR.CDPRODUTO,
                                  PR.CDARVPROD, NVL(PREXCL.CDARVPROD, 'XXX') CDPRODEXCLUIDO
                              FROM PRODUTO P, PRODUTO PR, PRODLOJANIVELESP PL LEFT JOIN PRODUTO PREXCL
                                                                                     ON PREXCL.CDPRODUTO = PL.CDPRODEXCECAO
                             WHERE PL.CDPRODUTO = P.CDPRODUTO
                               AND PR.CDARVPROD LIKE P.CDARVPROD||'%'
                               AND PL.CDLOJA = V_CDLOJA
                               AND PL.CDFILIAL = V_CDFILIAL
                               AND PL.CDPRODUTO = V_CDPRODUTO
                               AND PR.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
                               AND NOT EXISTS (SELECT CDPRODUTO
                                                 FROM PRODUTO P, (SELECT PD.CDARVPROD
                                                                    FROM PRODUTO PR, PRODUTO PD, PRODLOJANIVELESP PL, PRODLOJANIVELESP PLN
                                                                   WHERE PL.CDPRODUTO = PR.CDPRODUTO
                                                                     AND PD.CDARVPROD LIKE PR.CDARVPROD||'%'
                                                                     AND PD.CDPRODUTO <> PL.CDPRODUTO
                                                                     AND PL.CDPRODUTO = V_CDPRODUTO
                                                                     AND PD.CDPRODUTO = PLN.CDPRODUTO
                                                                     AND PL.CDLOJA = V_CDLOJA
                                                                     AND PL.CDFILIAL = V_CDFILIAL
                                                                     AND PL.CDPRODUTO = V_CDPRODUTO) PLIKE
                                                WHERE P.CDARVPROD LIKE PLIKE.CDARVPROD||'%'
                                                  AND P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
                                                  AND P.CDPRODUTO = PR.CDPRODUTO)) GERAL
          WHERE P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
            AND P.CDPRODUTO = GERAL.CDPRODUTO
            AND P.CDARVPROD NOT LIKE GERAL.CDPRODEXCLUIDO||'%'
           ORDER BY GERAL.CDPRODUTO) LOOP
         V_COUNT := 0;
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM PRODLOJA
             WHERE CDPRODUTO = C_CAD.CDPRODUTO
               AND CDFILIAL = C_CAD.CDFILIAL
               AND CDLOJA = C_CAD.CDLOJA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         IF V_COUNT = 0 THEN
            INSERT INTO PRODLOJA
               (CDFILIAL, CDLOJA, CDPRODUTO, IDIMPCANITEM, NRSEQIMPRPROD,
                NRSEQIMPRPUXA, NRSEQIMPRPROD2, CDPORIMPPROD, CDSETOR,  NRORG)
            VALUES
               (C_CAD.CDFILIAL, C_CAD.CDLOJA, C_CAD.CDPRODUTO, C_CAD.IDIMPCANITEM, C_CAD.NRSEQIMPRPROD,
                C_CAD.NRSEQIMPRPUXA, C_CAD.NRSEQIMPRPROD2, 'COM1', V_CDSETOR, SYS_CONTEXT('nrorg_ctx','nrorg'));
         ELSE
            UPDATE PRODLOJA
               SET IDIMPCANITEM = C_CAD.IDIMPCANITEM,
                   NRSEQIMPRPROD = C_CAD.NRSEQIMPRPROD,
                   NRSEQIMPRPUXA = C_CAD.NRSEQIMPRPUXA,
                   NRSEQIMPRPROD2 = C_CAD.NRSEQIMPRPROD2,
                   CDSETOR = V_CDSETOR
             WHERE CDFILIAL = C_CAD.CDFILIAL
               AND CDLOJA = C_CAD.CDLOJA
               AND CDPRODUTO = C_CAD.CDPRODUTO;
         END IF;
      END LOOP;
   ELSIF DELETING THEN
      FOR C_CAD IN
        (SELECT GERAL.CDFILIAL, GERAL.CDLOJA, GERAL.NRSEQIMPRPROD, GERAL.NRSEQIMPRPROD2,
                GERAL.NRSEQIMPRPUXA, GERAL.IDIMPCANITEM, GERAL.CDPRODUTO
           FROM PRODUTO P, (SELECT PL.CDFILIAL, PL.CDLOJA, PL.NRSEQIMPRPROD, PL.NRSEQIMPRPROD2, PL.NRSEQIMPRPUXA, PL.IDIMPCANITEM, PR.CDPRODUTO,
                                  PR.CDARVPROD, NVL(PREXCL.CDARVPROD, 'XXX') CDPRODEXCLUIDO
                              FROM PRODUTO P, PRODUTO PR, PRODLOJANIVELESP PL LEFT JOIN PRODUTO PREXCL
                                                                                  ON PREXCL.CDPRODUTO = PL.CDPRODEXCECAO
                             WHERE PL.CDPRODUTO = P.CDPRODUTO
                               AND PR.CDARVPROD LIKE P.CDARVPROD||'%'
                               AND PL.CDLOJA = V_CDLOJA
                               AND PL.CDFILIAL = V_CDFILIAL
                               AND PL.CDPRODUTO = V_CDPRODUTO
                               AND PR.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
                               AND NOT EXISTS (SELECT CDPRODUTO
                                                 FROM PRODUTO P, (SELECT PD.CDARVPROD
                                                                    FROM PRODUTO PR, PRODUTO PD, PRODLOJANIVELESP PL, PRODLOJANIVELESP PLN
                                                                   WHERE PL.CDPRODUTO = PR.CDPRODUTO
                                                                     AND PD.CDARVPROD LIKE PR.CDARVPROD||'%'
                                                                     AND PD.CDPRODUTO <> PL.CDPRODUTO
                                                                     AND PL.CDPRODUTO = V_CDPRODUTO
                                                                     AND PD.CDPRODUTO = PLN.CDPRODUTO
                                                                     AND PL.CDLOJA = V_CDLOJA
                                                                     AND PL.CDFILIAL = V_CDFILIAL
                                                                     AND PL.CDPRODUTO = V_CDPRODUTO) PLIKE
                                                WHERE P.CDARVPROD LIKE PLIKE.CDARVPROD||'%'
                                                  AND P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
                                                  AND P.CDPRODUTO = PR.CDPRODUTO)) GERAL
          WHERE P.CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO)
            AND P.CDPRODUTO = GERAL.CDPRODUTO
            AND P.CDARVPROD NOT LIKE GERAL.CDPRODEXCLUIDO||'%'
           ORDER BY GERAL.CDPRODUTO) LOOP
         DELETE
           FROM PRODLOJA
          WHERE CDFILIAL = C_CAD.CDFILIAL
            AND CDLOJA = C_CAD.CDLOJA
            AND CDPRODUTO = C_CAD.CDPRODUTO;
      END LOOP;
      
      DELETE
        FROM PRODLOJANIVELESP
       WHERE CDFILIAL = :OLD.CDFILIAL
         AND CDLOJA = :OLD.CDLOJA
         AND CDPRODUTO = :OLD.CDPRODUTO;
   END IF;
END;
/