CREATE OR REPLACE TRIGGER ATUALIZA_PRODLOJA_PRODUTO
AFTER INSERT OR UPDATE OR DELETE
ON PRODUTO FOR EACH ROW
DECLARE
   V_COUNT NUMBER;
   V_TAMPROD NUMBER;
   V_TAMPRODALTERADO NUMBER;
   V_CDPRODUTO VARCHAR2(20);
BEGIN
   IF INSERTING THEN
      INSERT INTO PRODUTOESP
         (CDPRODUTO, CDARVPROD, IDPRODATIVPR)
      VALUES
         (:NEW.CDPRODUTO, :NEW.CDARVPROD, :NEW.IDPRODATIVPR);
   ELSIF UPDATING THEN
      UPDATE PRODUTOESP
         SET CDARVPROD = NVL(:NEW.CDARVPROD, CDARVPROD),
             IDPRODATIVPR = NVL(:NEW.IDPRODATIVPR, IDPRODATIVPR)
       WHERE CDPRODUTO = :OLD.CDPRODUTO;
   ELSE
      DELETE
        FROM PRODUTOESP
       WHERE CDPRODUTO = :OLD.CDPRODUTO;
   END IF;

   IF UPDATING OR INSERTING THEN
      V_CDPRODUTO := NVL(:NEW.CDPRODUTO, :OLD.CDPRODUTO);
      BEGIN
         SELECT LENGTH(REPLACE(CDPICTPROD, '.', '')) INTO V_TAMPROD FROM PARAMGERAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_TAMPROD := -1;
      END;
      V_TAMPRODALTERADO := LENGTH(NVL(:NEW.CDARVPROD, :OLD.CDARVPROD));
      IF V_TAMPROD = V_TAMPRODALTERADO THEN
         IF (:NEW.IDPRODATIVPR = 'S') OR (:NEW.IDPRODATIVPR IS NULL AND :OLD.IDPRODATIVPR = 'S') THEN
            FOR C_CAD IN
               (SELECT PL.CDFILIAL, PL.CDLOJA, PL.NRSEQIMPRPROD, PL.NRSEQIMPRPROD2, PL.NRSEQIMPRPUXA, PL.IDIMPCANITEM
                  FROM PRODLOJANIVEL PL, (SELECT P.CDFILIAL, P.CDLOJA, MAX(P.CDPRODUTO) CDPRODUTO
                                            FROM (SELECT P.CDFILIAL, P.CDLOJA, P.CDPRODUTO, PD.CDARVPROD, NVL(PR.CDARVPROD, 'XXX') CDARVEXCE
                                                    FROM PRODLOJANIVEL P LEFT JOIN PRODUTOESP PR
                                                                                ON PR.CDPRODUTO = P.CDPRODEXCECAO
                                                                         JOIN PRODUTOESP PD
                                                                           ON PD.CDPRODUTO = P.CDPRODUTO) P, PRODUTOESP PR
                                           WHERE PR.CDPRODUTO = V_CDPRODUTO
                                             AND PR.CDARVPROD NOT LIKE P.CDARVEXCE ||'%'
                                             AND PR.CDARVPROD LIKE P.CDARVPROD||'%'
                                           GROUP BY P.CDFILIAL, P.CDLOJA) P
                 WHERE PL.CDFILIAL = P.CDFILIAL
                   AND PL.CDLOJA = P.CDLOJA
                   AND PL.CDPRODUTO = P.CDPRODUTO) LOOP
               V_COUNT := 0;
               BEGIN
                  SELECT COUNT(*)
                    INTO V_COUNT
                    FROM PRODLOJA
                   WHERE CDPRODUTO = V_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)
                  VALUES
                     (C_CAD.CDFILIAL, C_CAD.CDLOJA, V_CDPRODUTO, C_CAD.IDIMPCANITEM, C_CAD.NRSEQIMPRPROD,
                      C_CAD.NRSEQIMPRPUXA, C_CAD.NRSEQIMPRPROD2, 'COM1');
               ELSE
                  UPDATE PRODLOJA
                     SET IDIMPCANITEM = C_CAD.IDIMPCANITEM,
                         NRSEQIMPRPROD = C_CAD.NRSEQIMPRPROD,
                         NRSEQIMPRPUXA = C_CAD.NRSEQIMPRPUXA,
                         NRSEQIMPRPROD2 = C_CAD.NRSEQIMPRPROD2
                   WHERE CDFILIAL = C_CAD.CDFILIAL
                     AND CDLOJA = C_CAD.CDLOJA
                     AND CDPRODUTO = V_CDPRODUTO;
               END IF;
            END LOOP;
         END IF;
      END IF;
   ELSE
      DELETE
        FROM PRODLOJA
       WHERE CDPRODUTO = :OLD.CDPRODUTO; 
   END IF;
END;
/
