CREATE OR REPLACE PROCEDURE BUSCA_COMISSAO(
   P_CDFILIAL     IN ITEMPEDIDO.CDFILIAL%TYPE,
   P_CDVENDEDOR   IN VENDITEMPED.CDVENDEDOR%TYPE,
   P_CDPRODUTO    IN ITEMPEDIDO.CDPRODUTO%TYPE,
   P_VRPREUNITPED IN ITEMPEDIDO.VRPREUNITPED%TYPE,
   P_VRPECOMISSAO OUT ITCOMISSAO.VRPECOMIVEND%TYPE,
   P_IDITPEDDIFER IN ITEMPEDIDO.IDITPEDDIFER%TYPE,
   P_CDCLIENTE IN CLIENTE.CDCLIENTE%TYPE,
   P_IDCTRLVENEXP IN PAREXPEDICAO.IDCTRLVENEXP%TYPE,
   P_CDPRECOBASE  IN PRECOBASE.CDPRECOBASE%TYPE DEFAULT '',
   P_VRDESCCOMISS IN ITEMPEDIDO.VRDESCCOMISS%TYPE

) IS
   V_CTPEPROD  NUMBER;
   V_CTPEVEND  NUMBER;
   V_CTPEFILI  NUMBER;
   V_CTPEEMPR  NUMBER;
   V_CDCOMISSAO COMISSAO.CDCOMISSAO%TYPE;
   V_IDCOMISTABPRECO VARCHAR2(1);
BEGIN
   P_VRPECOMISSAO := 0;

/* COMISSAO DO VENDEDOR PARA PRECO NORMAL, PERSONALIZADO, E OUTROS*/
   IF P_IDITPEDDIFER IN ('N', 'S', 'O') THEN
         /**** PRODUTO ****/

      IF P_IDCTRLVENEXP = 'S' THEN
         P_VRPECOMISSAO := 0;

         /* VERIFICA SE EXISTE PARAMETRIZACAO DE COMISSAO POR TABELA DE PRECO BASE E SE POSSUI ALGUMA TABELA DE COMISSAO ATRELADA AO PRECO BASE*/
         BEGIN
            SELECT NVL(V.IDCOMISTABPRECO, 'N'), C.CDCOMISSAO
              INTO V_IDCOMISTABPRECO, V_CDCOMISSAO
              FROM VENDEDOR V, COMISPREBRASE C, COMISSAO CO
             WHERE V.CDVENDEDOR  = P_CDVENDEDOR
               AND V.CDVENDEDOR  = C.CDVENDEDOR
               AND C.CDPRECOBASE = P_CDPRECOBASE
               AND C.CDCOMISSAO  = CO.CDCOMISSAO
               AND TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDCOMISTABPRECO := NULL;
               V_CDCOMISSAO      := NULL;
         END;


         IF (V_CDCOMISSAO IS NOT NULL) THEN
            BEGIN
               SELECT NVL(MAX(IC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
                 INTO P_VRPECOMISSAO
                 FROM ITCOMISSAO IC, COMISSAO CO
                WHERE
                     (IC.CDFILIAL   = P_CDFILIAL   ) AND
                     (IC.CDCOMISSAO = CO.CDCOMISSAO) AND
                     (IC.CDPRODUTO  = P_CDPRODUTO  ) AND
                     (V_CDCOMISSAO  = CO.CDCOMISSAO) AND
                     (P_VRPREUNITPED BETWEEN IC.VRINICVENDA AND IC.VRFINAVENDA) AND
                     TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  P_VRPECOMISSAO := 0;
            END;
         ELSE

            /* BUSCA O PERCENTUAL DA TABELA DE COMISSAO */
            BEGIN
               SELECT NVL(MAX(IC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
                 INTO P_VRPECOMISSAO
                 FROM ITCOMISSAO IC, VENDEDOR VD, COMISSAO CO
                WHERE
                     (VD.CDVENDEDOR = P_CDVENDEDOR ) AND
                     (IC.CDFILIAL   = P_CDFILIAL   ) AND
                     (IC.CDCOMISSAO = VD.CDCOMISSAO) AND
                     (IC.CDCOMISSAO = CO.CDCOMISSAO) AND
                     (IC.CDPRODUTO  = P_CDPRODUTO  ) AND
                     (P_VRPREUNITPED BETWEEN IC.VRINICVENDA AND IC.VRFINAVENDA) AND
                     TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  P_VRPECOMISSAO := 0;
            END;
         END IF;
      ELSIF P_IDCTRLVENEXP = 'I' THEN
         BEGIN
            SELECT NVL(MAX(PC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM PEDPERCOMISSAO PC, VENDEDOR VD
             WHERE (VD.CDVENDEDOR = P_CDVENDEDOR )
               AND (PC.CDCOMISSAO = VD.CDCOMISSAO)
               AND (P_VRPREUNITPED BETWEEN PC.VRINIPERVEND AND PC.VRFINPERVEND);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      ELSIF P_IDCTRLVENEXP = 'R' THEN
         BEGIN
            SELECT NVL(MAX(I.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS,0)
              INTO P_VRPECOMISSAO
              FROM TABCOMRAATIVCLI T, CLIENTE C, ITCOMISSAO I, COMISSAO CO
             WHERE
                C.CDCLIENTE  = P_CDCLIENTE AND
                T.CDVENDEDOR = P_CDVENDEDOR AND
                T.CDFILIAL = P_CDFILIAL AND
                T.CDATIVCLI = C.CDATIVCLI AND
                I.CDFILIAL = P_CDFILIAL AND
                T.CDCOMISSAO = I.CDCOMISSAO AND
                T.CDCOMISSAO = CO.CDCOMISSAO AND
                I.CDPRODUTO = P_CDPRODUTO AND
                TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE) AND
                (P_VRPREUNITPED BETWEEN I.VRINICVENDA AND I.VRFINAVENDA);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      END IF;


      IF P_VRPECOMISSAO <= 0 THEN
         /**** VENDEDOR ****/
         BEGIN
            SELECT NVL(VRPECOMVEN, 0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM VENDEDOR
             WHERE (CDVENDEDOR = P_CDVENDEDOR);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      END IF;


      IF P_VRPECOMISSAO <= 0 THEN
         /**** FILIAL ****/
         BEGIN
            SELECT NVL(VRPECOVENFIL, 0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM FILIAL
             WHERE CDFILIAL = P_CDFILIAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
            END;

         IF P_VRPECOMISSAO <= 0 THEN
   /**** EMPRESA ****/
            BEGIN
               SELECT NVL(E.VRPECOVENEMP, 0) - NVL(P_VRDESCCOMISS, 0)
                 INTO P_VRPECOMISSAO
               FROM FILIAL F, EMPRESA E
               WHERE F.CDFILIAL  = P_CDFILIAL
                 AND E.CDEMPRESA = F.CDEMPRESA;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  P_VRPECOMISSAO := 0;
               END;

         END IF;
      END IF;
   ELSE
/* COMISSAO DO VENDEDOR PARA PRECO PROMOCIONAL E GRUPO PROMOCIONAL*/

      IF P_IDCTRLVENEXP = 'S' THEN
         P_VRPECOMISSAO := 0;

         /* VERIFICA SE EXISTE PARAMETRIZACAO DE COMISSAO POR TABELA DE PRECO BASE E SE POSSUI ALGUMA TABELA DE COMISSAO ATRELADA AO PRECO BASE*/
         BEGIN
            SELECT NVL(V.IDCOMISTABPRECO, 'N'), C.CDCOMISSAO
              INTO V_IDCOMISTABPRECO, V_CDCOMISSAO
              FROM VENDEDOR V, COMISPREBRASE C, COMISSAO CO
             WHERE V.CDVENDEDOR  = P_CDVENDEDOR
               AND V.CDVENDEDOR  = C.CDVENDEDOR
               AND C.CDPRECOBASE = P_CDPRECOBASE
               AND C.CDCOMISSAO  = CO.CDCOMISSAO
               AND TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDCOMISTABPRECO := NULL;
               V_CDCOMISSAO      := NULL;
         END;


         IF (V_CDCOMISSAO IS NOT NULL) THEN
            BEGIN
               SELECT NVL(MAX(IC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
                 INTO P_VRPECOMISSAO
                 FROM ITCOMISSAO IC, COMISSAO CO
                WHERE
                     (IC.CDFILIAL   = P_CDFILIAL   ) AND
                     (IC.CDCOMISSAO = CO.CDCOMISSAO) AND
                     (IC.CDPRODUTO  = P_CDPRODUTO  ) AND
                     (V_CDCOMISSAO  = CO.CDCOMISSAO) AND
                     (P_VRPREUNITPED BETWEEN IC.VRINICVENDA AND IC.VRFINAVENDA) AND
                     TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  P_VRPECOMISSAO := 0;
            END;
         ELSE

            /* BUSCA O PERCENTUAL DA TABELA DE COMISSAO */
            BEGIN
               SELECT NVL(MAX(IC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
                 INTO P_VRPECOMISSAO
                 FROM ITCOMISSAO IC, VENDEDOR VD, COMISSAO CO
                WHERE
                     (VD.CDVENDEDOR = P_CDVENDEDOR ) AND
                     (IC.CDFILIAL   = P_CDFILIAL   ) AND
                     (IC.CDCOMISSAO = VD.CDCOMISSAO) AND
                     (IC.CDCOMISSAO = CO.CDCOMISSAO) AND
                     (IC.CDPRODUTO  = P_CDPRODUTO  ) AND
                     TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE) AND
                     (P_VRPREUNITPED BETWEEN IC.VRINICVENDA AND IC.VRFINAVENDA);
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  P_VRPECOMISSAO := 0;
            END;
         END IF;
      ELSIF P_IDCTRLVENEXP = 'I' THEN
         BEGIN
            SELECT NVL(MAX(PC.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM PEDPERCOMISSAO PC, VENDEDOR VD
             WHERE (VD.CDVENDEDOR = P_CDVENDEDOR )
               AND (PC.CDCOMISSAO = VD.CDCOMISSAO)
               AND (P_VRPREUNITPED BETWEEN PC.VRINIPERVEND AND PC.VRFINPERVEND);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      ELSIF P_IDCTRLVENEXP = 'R' THEN
         BEGIN
            SELECT NVL(MAX(I.VRPECOMIVEND), 0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM TABCOMRAATIVCLI T, CLIENTE C, ITCOMISSAO I, COMISSAO CO
             WHERE
                C.CDCLIENTE  = P_CDCLIENTE AND
                T.CDVENDEDOR = P_CDVENDEDOR AND
                T.CDFILIAL = P_CDFILIAL AND
                T.CDATIVCLI = C.CDATIVCLI AND
                I.CDFILIAL = P_CDFILIAL AND
                T.CDCOMISSAO = I.CDCOMISSAO AND
                T.CDCOMISSAO = CO.CDCOMISSAO AND
                I.CDPRODUTO = P_CDPRODUTO AND
                TRUNC(NVL(CO.DTVALIDADE, SYSDATE)) >= TRUNC(SYSDATE) AND
                (P_VRPREUNITPED BETWEEN I.VRINICVENDA AND I.VRFINAVENDA);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      END IF;

      IF P_VRPECOMISSAO <= 0 THEN
         BEGIN
            SELECT NVL(VRCOMPROVEND,0) - NVL(P_VRDESCCOMISS, 0)
              INTO P_VRPECOMISSAO
              FROM VENDEDOR
             WHERE
               CDVENDEDOR = P_CDVENDEDOR;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               P_VRPECOMISSAO := 0;
         END;
      END IF;
   END IF;
END;

/