-- ================================================================================
--  @c:\web_605\sql\end_conv\oracle\3859_PEDSTPO_CUSTO_PROD_COMP_CONS.sql
-- ================================================================================

CREATE OR REPLACE PROCEDURE CUSTO_COMP_PROD_CONS(
P_CDPRODUTO     IN VARCHAR,
P_CDFILIAL      IN VARCHAR,
P_TIPOCUSTO     IN NUMBER,
P_QTPRODUTO     IN NUMBER,
P_VRCUSTO       OUT NUMBER,
P_DATA          IN VARCHAR DEFAULT SYSDATE,
P_NIVEL         IN VARCHAR DEFAULT NULL
)
AS
V_EXISTE_COMP_PADRAO  NUMBER;
V_EXISTE_COMP_LOCAL   NUMBER;
V_VRCUSTO             NUMBER;
V_NRPRODUTOS          NUMBER;
V_LOOP_PADRAO         VARCHAR2(1);
V_LOOP_LOCAL          VARCHAR2(1);
V_RESULT              FILIAL.CDFILIAL%TYPE;
BEGIN

   V_LOOP_PADRAO := 'N';
   V_LOOP_LOCAL  := 'N';
   V_VRCUSTO     := 0;
   /* VERIFICA COMPOSICAO LOCAL */
   SELECT COUNT(*)
   INTO   V_NRPRODUTOS
   FROM   ROTFABLOCAL
   WHERE (CDFILIAL  = P_CDFILIAL ) AND
         (CDPRODUTO = P_CDPRODUTO) AND 
         ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODLOC),TRUNC(SYSDATE))));
   IF V_NRPRODUTOS > 0 THEN
      V_RESULT := P_CDFILIAL;
   ELSE
      V_RESULT := 'P';
   END IF;
   IF V_RESULT = 'P' THEN
      FOR C_PADRAO IN
         (SELECT
            RB.CDPRODUTO,  RB.CDSUBPRODUTO, RB.QTSUBPRODROT,
            RB.NRHRFABPROD,RB.NRSEQPROD, RB.IDIMPPRODROT,
            PT.NMPRODUTO,  PT.SGUNIDADE,  DR.TXROTFAB as TXINSTR
         FROM
            ROTFABRICA RB, PRODUTO PT, DESCROTEIRO DR
         WHERE
            (RB.CDPRODUTO    = P_CDPRODUTO  ) AND
            (RB.CDSUBPRODUTO = PT.CDPRODUTO  ) AND
            (RB.CDPRODUTO    = DR.CDPRODUTO(+) AND
            ((TRUNC(SYSDATE) >= NVL(TRUNC(RB.DTINIVGPRODROT),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(RB.DTFINVGPRODROT),TRUNC(SYSDATE)))) AND
            (PT.CDARVPROD LIKE SUBSTR(PT.CDARVPROD, 1, NVL(P_NIVEL, LENGTH(PT.CDARVPROD)))||'%') )) LOOP

         SELECT COUNT(*)
           INTO   V_EXISTE_COMP_PADRAO
           FROM   ROTFABRICA
          WHERE (CDPRODUTO = C_PADRAO.CDSUBPRODUTO)
            AND ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODROT),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODROT),TRUNC(SYSDATE))));

          IF V_EXISTE_COMP_PADRAO > 0 THEN
             CUSTO_COMP_PROD_CONS(C_PADRAO.CDSUBPRODUTO,P_CDFILIAL,P_TIPOCUSTO,(C_PADRAO.QTSUBPRODROT * P_QTPRODUTO), P_VRCUSTO,SYSDATE);
             V_VRCUSTO := V_VRCUSTO + P_VRCUSTO;
             P_VRCUSTO := ROUND(V_VRCUSTO,4);
          ELSE
             V_VRCUSTO := V_VRCUSTO + ROUND((CUSTO_PRODUTO(P_CDFILIAL,C_PADRAO.CDSUBPRODUTO,P_TIPOCUSTO,SYSDATE, SYSDATE) * C_PADRAO.QTSUBPRODROT * P_QTPRODUTO),4);
             P_VRCUSTO := V_VRCUSTO;
          END IF;
          V_LOOP_PADRAO := 'S';
      END LOOP;
      IF V_LOOP_PADRAO <> 'S' THEN
         V_VRCUSTO := V_VRCUSTO + ROUND((CUSTO_PRODUTO(P_CDFILIAL,P_CDPRODUTO,P_TIPOCUSTO,SYSDATE, SYSDATE) * P_QTPRODUTO),4);
         P_VRCUSTO := V_VRCUSTO;
      END IF;
   ELSE
      FOR C_LOCAL IN
         (SELECT
            RL.CDFILIAL, RL.CDPRODUTO, RL.CDSUBPRODLOC AS CDSUBPRODUTO,
            RL.QTSUBPRODLOC AS QTSUBPRODROT,
            RL.NRHRFABPRLOC AS NRHRFABPROD, RL.IDIMPPROTLOC AS IDIMPPRODROT,
            RL.NRSEQPRODLOC AS NRSEQPROD,
            PT.NMPRODUTO, PT.SGUNIDADE,
            DL.TXROTFABLOC AS TXINSTR
         FROM
            ROTFABLOCAL RL, PRODUTO PT, DESCROTLOCAL DL
         WHERE
            (RL.CDSUBPRODLOC = PT.CDPRODUTO   ) AND
            (RL.CDFILIAL     = DL.CDFILIAL(+) ) AND
            (RL.CDPRODUTO    = DL.CDPRODUTO(+)) AND
            (RL.CDFILIAL     = P_CDFILIAL     ) AND
            (RL.CDPRODUTO    = P_CDPRODUTO    ) AND
            ((TRUNC(SYSDATE) >= NVL(TRUNC(RL.DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(RL.DTFINVGPRODLOC),TRUNC(SYSDATE)))) AND
            (PT.CDARVPROD LIKE SUBSTR(PT.CDARVPROD, 1, NVL(P_NIVEL, LENGTH(PT.CDARVPROD)))||'%'   )) LOOP

         SELECT COUNT(*)
         INTO   V_EXISTE_COMP_LOCAL
         FROM   ROTFABLOCAL
         WHERE (CDFILIAL  = P_CDFILIAL       ) AND
               (CDPRODUTO = C_LOCAL.CDPRODUTO) AND 
               ((TRUNC(SYSDATE) >= NVL(TRUNC(DTINIVGPRODLOC),TRUNC(SYSDATE))) AND (TRUNC(SYSDATE) <= NVL(TRUNC(DTFINVGPRODLOC),TRUNC(SYSDATE))));

         IF V_EXISTE_COMP_LOCAL > 0 THEN
            CUSTO_COMP_PROD_CONS(C_LOCAL.CDSUBPRODUTO,P_CDFILIAL,P_TIPOCUSTO,(C_LOCAL.QTSUBPRODROT * P_QTPRODUTO), P_VRCUSTO,SYSDATE);
            V_VRCUSTO := V_VRCUSTO + P_VRCUSTO;
            P_VRCUSTO := V_VRCUSTO;
         ELSE
            V_VRCUSTO := V_VRCUSTO + ROUND((CUSTO_PRODUTO(P_CDFILIAL,C_LOCAL.CDSUBPRODUTO,P_TIPOCUSTO,SYSDATE, SYSDATE) * C_LOCAL.QTSUBPRODROT * P_QTPRODUTO),4);
            P_VRCUSTO := V_VRCUSTO;
         END IF;
         V_LOOP_LOCAL  := 'S';
      END LOOP;
      IF V_LOOP_LOCAL <> 'S' THEN
         V_VRCUSTO := V_VRCUSTO + ROUND((CUSTO_PRODUTO(P_CDFILIAL,P_CDPRODUTO,P_TIPOCUSTO,SYSDATE, SYSDATE) * P_QTPRODUTO),4);
         P_VRCUSTO := V_VRCUSTO;
      END IF;
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CUSTO_COMP_PROD_CONS','6.39.033'); END;
/
