CREATE OR REPLACE PROCEDURE RECURSIVE_MANUALCIAM(
P_CDRECEITA IN VARCHAR2,
P_QTDMULTIPLICAVEL IN FLOAT,
P_NRVARIACAOREC IN NUMBER,
P_CDMANCIA IN VARCHAR2,
P_CDFILIAL IN VARCHAR2,
P_NRSERVICOCIAFILI IN NUMBER,
P_CDCLASSE IN VARCHAR2,
P_CDSUBGRU IN VARCHAR2,
P_NRSEQSUBGRUSEMAM IN NUMBER,
P_CDCICLO IN VARCHAR2,
P_CDCONTROLE IN NUMBER,
P_CDCIA IN VARCHAR2,
P_NRORG IN NUMBER,
P_DTCUSTO IN DATE,
P_IDTIPOCUSTO IN NUMBER
)
IS

V_QTDPRODUTO FLOAT;
V_RENDIMENTOREC FLOAT;
V_NRVARIACAOREC NUMBER;
V_IDRECFLEXIVEL VARCHAR2(1);
BEGIN
      SELECT MAX(IDRECFLEXIVEL)
        INTO V_IDRECFLEXIVEL
        FROM RECEITAM
       WHERE CDRECEITA = P_CDRECEITA;
      /*BUSCA A VARIACAO DE RECEITA DA FILIAL
         VARIACAO PADRAO = 1*/
      SELECT MAX(FREC.NRVARIACAOREC) INTO V_NRVARIACAOREC
          FROM FILIRECEITA FREC
        WHERE FREC.CDRECEITA = P_CDRECEITA
          AND FREC.CDFILIAL  = P_CDFILIAL
          AND FREC.NRORG     = P_NRORG;

      /*BUSCA O RENDIMENTO DA RECEITA*/            
      SELECT MAX(VREC.QTRENDIMENTOREC) INTO V_RENDIMENTOREC
         FROM VARIACAOREC VREC
       WHERE VREC.CDRECEITA     = P_CDRECEITA
         AND VREC.NRORG         = P_NRORG
         AND VREC.NRVARIACAOREC = V_NRVARIACAOREC;

      V_RENDIMENTOREC := NVL(V_RENDIMENTOREC, 0.00);
      IF V_RENDIMENTOREC > 0.00 THEN
         V_RENDIMENTOREC:= NVL(P_QTDMULTIPLICAVEL, 1) / NVL(V_RENDIMENTOREC, 1);
      END IF;  

      /*VERIFICA OS PRODUTOS DIRETOS UTILIZADOS NA RECEITA*/
      FOR CUR_SUBPROD IN
        (SELECT PROREC.QTPRODREC, PROREC.CDPRODUTO, 
                CUSTO_PRODUTO_COC(P_CDFILIAL, PROREC.CDPRODUTO, P_DTCUSTO, P_IDTIPOCUSTO, P_CDCIA) AS VRCUSTO
            FROM PRORECEITAM PROREC
          WHERE PROREC.NRVARIACAOREC = V_NRVARIACAOREC
            AND PROREC.CDRECEITA     = P_CDRECEITA
            AND ((V_IDRECFLEXIVEL <> 'P') OR (PROREC.IDPREFERENCIA = 'S'))) LOOP
            
          /* CALCULA A QUANTIDADE DE PRODUTOS POR VARIACAO DE RECEITA*/
          V_QTDPRODUTO := 0;
          V_QTDPRODUTO :=  NVL(V_RENDIMENTOREC, 1) * NVL(CUR_SUBPROD.QTPRODREC, 1);
          
          /*INSERE NA TABELA AUX OS PRODUTOS FILHOS DIRETOS DA RECEITA*/
          INSERT INTO AUX_PRODUTOSMACIA (CDCONTROLE, CDPRODUTO, QTDPRODUTO, CDFILIAL, CDCIA, CDMANCIA, 
                                         NRSERVICOCIAFILI, CDCLASSE, CDSUBGRU, NRSEQSUBGRUSEMAM, CDCICLO,
                                         NRORG, IDPERTENCECIA, VRCUSTOPROD)
            VALUES (P_CDCONTROLE, CUR_SUBPROD.CDPRODUTO, V_QTDPRODUTO, P_CDFILIAL, P_CDCIA, P_CDMANCIA, 
                    P_NRSERVICOCIAFILI, P_CDCLASSE, P_CDSUBGRU, P_NRSEQSUBGRUSEMAM, P_CDCICLO,
                    P_NRORG , 'N', CUR_SUBPROD.VRCUSTO);
            
      END LOOP;
      
      FOR CUR_SUBREC IN
        (SELECT SUBREC.CDSUBRECEITA, SUBREC.QTRENDSUBREC
              FROM SUBRECEITAM SUBREC
            WHERE SUBREC.CDRECEITA     = P_CDRECEITA
              AND SUBREC.NRVARIACAOREC = V_NRVARIACAOREC
              AND SUBREC.NRORG         = P_NRORG
              AND ((V_IDRECFLEXIVEL <> 'P') OR (SUBREC.IDPREFERENCIA = 'S'))) LOOP
              RECURSIVE_MANUALCIAM(CUR_SUBREC.CDSUBRECEITA, V_RENDIMENTOREC * NVL(CUR_SUBREC.QTRENDSUBREC, 0.00), 
                                   V_NRVARIACAOREC, P_CDMANCIA, P_CDFILIAL, P_NRSERVICOCIAFILI, P_CDCLASSE, 
                                   P_CDSUBGRU, P_NRSEQSUBGRUSEMAM, P_CDCICLO,
                                   P_CDCONTROLE, P_CDCIA, P_NRORG, P_DTCUSTO, P_IDTIPOCUSTO);
      END LOOP; 
END;
/