CREATE OR REPLACE PROCEDURE PROD_MANUALCIAM(
  P_CDCIA IN VARCHAR2,
  P_CDFILIAL IN VARCHAR2,
  P_CDMANCIA IN VARCHAR2,
  P_NRORG IN NUMBER DEFAULT 1,
  P_DTCUSTO IN DATE,
  P_IDTIPOCUSTO IN NUMBER,
  P_CDCONTROLE OUT NUMBER,
  P_NRSERVICOCLASSE IN VARCHAR2 DEFAULT 'T',
  P_NRSEQSUBGRUSEMAM IN VARCHAR2 DEFAULT 'T',
  P_CDCICLO IN VARCHAR2 DEFAULT 'T',
  P_NRITAIRVISION IN VARCHAR2 DEFAULT 'T'
)
IS

V_QTDPRODUTO FLOAT;
V_QTDRECEITA FLOAT;
V_CDTABELAUX NUMBER;
V_QTSUBGRU FLOAT;
V_RENDIMENTOREC FLOAT;
V_NRVARIACAOREC NUMBER;
V_SEQUENCIAL VARCHAR2(20);
V_IDRECFLEXIVEL VARCHAR2(1);
BEGIN
    
    NOVO_CODIGO_NT('AUXPRODUTOSMACIA'||P_CDFILIAL||P_CDCIA, V_SEQUENCIAL);  

    V_CDTABELAUX := TO_NUMBER(V_SEQUENCIAL);    
    P_CDCONTROLE := V_CDTABELAUX;
    
    /*SELECIONA OS PRODUTOS DIRETOS DO MANUAL*/
    FOR CUR_PROD IN 
     (SELECT PRMAM.CDPRODUTO, PRMAM.QTPRODSUMA, PRMAM.NRSERVICOCIAFILI, PRMAM.CDCLASSE, 
             PRMAM.CDSUBGRU, PRMAM.NRSEQSUBGRUSEMAM, PRMAM.CDCICLO,
             CUSTO_PRODUTO_COC(P_CDFILIAL, PRMAM.CDPRODUTO, P_DTCUSTO, P_IDTIPOCUSTO, P_CDCIA) AS VRCUSTO
         FROM PRODSUBSEMAM PRMAM
              INNER JOIN CICLOSUBGRUSEMAM CI ON CI.CDFILIAL = PRMAM.CDFILIAL AND
                                                CI.CDCIA = PRMAM.CDCIA AND
                                                CI.CDMANCIA = PRMAM.CDMANCIA AND
                                                CI.NRSERVICOCIAFILI = PRMAM.NRSERVICOCIAFILI AND
                                                CI.CDCLASSE = PRMAM.CDCLASSE AND
                                                CI.CDSUBGRU = PRMAM.CDSUBGRU AND
                                                CI.NRSEQSUBGRUSEMAM = PRMAM.NRSEQSUBGRUSEMAM AND
                                                CI.CDCICLO = PRMAM.CDCICLO
        WHERE PRMAM.CDCIA     = P_CDCIA
          AND PRMAM.CDMANCIA  = P_CDMANCIA
          AND PRMAM.CDFILIAL  = P_CDFILIAL
          AND PRMAM.NRORG     = P_NRORG
          AND VERIF_VALOR_LISTA(CI.NRSERVICOCIAFILI||'-'||CI.CDCLASSE, P_NRSERVICOCLASSE) IS NOT NULL
          AND VERIF_VALOR_LISTA(TO_CHAR(CI.NRSEQSUBGRUSEMAM), P_NRSEQSUBGRUSEMAM) IS NOT NULL
          AND VERIF_VALOR_LISTA(CI.CDCICLO, P_CDCICLO) IS NOT NULL
          AND VERIF_VALOR_LISTA(CI.NRITAIRVISION||'-'||CI.CDSUBGRU||'-'||CI.NRSEQSUBGRUSEMAM||'-'||CI.CDCICLO, P_NRITAIRVISION) IS NOT NULL ) LOOP
          
      V_QTDPRODUTO := 0;
      
      /*QUANTIDADE DE SUBGRUPOS A SEREM PRODUZIDOS*/
      V_QTSUBGRU := 1;
          
      /*MULTIPLICA A QUANTIDADE DE PRODUTOS PELO NUMERO DE SUBGRUPOS*/              
      V_QTDPRODUTO := V_QTSUBGRU * NVL (CUR_PROD.QTPRODSUMA, 1);
      
      /*INSERE NA TABELA AUXILIAR*/
      INSERT INTO AUX_PRODUTOSMACIA (CDCONTROLE, CDPRODUTO, QTDPRODUTO, CDFILIAL, CDCIA, CDMANCIA, 
                                     NRSERVICOCIAFILI, CDCLASSE, CDSUBGRU, NRSEQSUBGRUSEMAM, CDCICLO,
                                     NRORG, IDPERTENCECIA, VRCUSTOPROD)
        VALUES (V_CDTABELAUX, CUR_PROD.CDPRODUTO, V_QTDPRODUTO, P_CDFILIAL, P_CDCIA, P_CDMANCIA, 
                CUR_PROD.NRSERVICOCIAFILI, CUR_PROD.CDCLASSE, CUR_PROD.CDSUBGRU, CUR_PROD.NRSEQSUBGRUSEMAM, CUR_PROD.CDCICLO,
                P_NRORG , 'N', CUR_PROD.VRCUSTO);
    END LOOP;
    
    /*SELECIONA OS PRODUTOS DA COMPANHIA*/
    FOR CUR_PRODCIA IN
      (SELECT PROCIA.CDPRODUTO, PROCIA.QTPRODUTOCIA, 
              PROCIA.NRSERVICOCIAFILI, PROCIA.CDSUBGRU, PROCIA.CDCLASSE, 
              PROCIA.NRSEQSUBGRUSEMAM,
              CUSTO_PRODUTO_COC(P_CDFILIAL, PROCIA.CDPRODUTO, P_DTCUSTO, P_IDTIPOCUSTO, P_CDCIA) AS VRCUSTO
        FROM PROCIASUBSEMAM PROCIA
        WHERE PROCIA.CDCIA     = P_CDCIA
          AND PROCIA.CDMANCIA  = P_CDMANCIA
          AND PROCIA.CDFILIAL  = P_CDFILIAL
          AND PROCIA.NRORG     = P_NRORG
          AND EXISTS
          (
          SELECT 1
            FROM CICLOSUBGRUSEMAM CI
           WHERE CI.CDFILIAL = PROCIA.CDFILIAL
             AND CI.CDCIA = PROCIA.CDCIA
             AND CI.CDMANCIA = PROCIA.CDMANCIA
             AND CI.NRSERVICOCIAFILI = PROCIA.NRSERVICOCIAFILI
             AND CI.CDCLASSE = PROCIA.CDCLASSE
             AND CI.CDSUBGRU = PROCIA.CDSUBGRU
             AND CI.NRSEQSUBGRUSEMAM = PROCIA.NRSEQSUBGRUSEMAM
             AND VERIF_VALOR_LISTA(CI.NRSERVICOCIAFILI||'-'||CI.CDCLASSE, P_NRSERVICOCLASSE) IS NOT NULL
             AND VERIF_VALOR_LISTA(TO_CHAR(CI.NRSEQSUBGRUSEMAM), P_NRSEQSUBGRUSEMAM) IS NOT NULL
             AND VERIF_VALOR_LISTA(CI.CDCICLO, P_CDCICLO) IS NOT NULL
             AND VERIF_VALOR_LISTA(CI.NRITAIRVISION||'-'||CI.CDSUBGRU||'-'||CI.NRSEQSUBGRUSEMAM||'-'||CI.CDCICLO, P_NRITAIRVISION) IS NOT NULL                 
          )
          ) LOOP
          
      V_QTDPRODUTO := 0;    
          
      /*QUANTIDADE DE SUBGRUPOS A SEREM PRODUZIDOS*/
      V_QTSUBGRU := 1;
          
      /*MULTIPLICA A QUANTIDADE DE PRODUTOS PELO NUMERO DE SUBGRUPOS*/              
      V_QTDPRODUTO := V_QTSUBGRU * NVL (CUR_PRODCIA.QTPRODUTOCIA, 1);
      
    
      /*INSERE NA TABELA AUXILIAR*/
      INSERT INTO AUX_PRODUTOSMACIA (CDCONTROLE, CDPRODUTO, QTDPRODUTO, CDFILIAL, CDCIA, CDMANCIA, 
                                     NRSERVICOCIAFILI, CDCLASSE, CDSUBGRU, NRSEQSUBGRUSEMAM, CDCICLO,
                                     NRORG, IDPERTENCECIA, VRCUSTOPROD)
        VALUES (V_CDTABELAUX, CUR_PRODCIA.CDPRODUTO, V_QTDPRODUTO, P_CDFILIAL, P_CDCIA, P_CDMANCIA, 
                CUR_PRODCIA.NRSERVICOCIAFILI, CUR_PRODCIA.CDCLASSE, CUR_PRODCIA.CDSUBGRU, CUR_PRODCIA.NRSEQSUBGRUSEMAM, NULL,
                P_NRORG , 'S', CUR_PRODCIA.VRCUSTO);
    END LOOP;
    
    /*SELECIONA OS PRODUTOS DENTRO DE RECEITAS DO MANUAL*/
    FOR CUR_REC IN 
     (SELECT RECSUB.NRSERVICOCIAFILI, RECSUB.CDCLASSE, RECSUB.CDSUBGRU, RECSUB.NRSEQSUBGRUSEMAM, RECSUB.CDCICLO, RECSUB.CDRECEITA, RECSUB.QTRECSUMA
         FROM RECSUBSEMAM RECSUB
              INNER JOIN CICLOSUBGRUSEMAM CI ON CI.CDFILIAL = RECSUB.CDFILIAL AND
                                                CI.CDCIA = RECSUB.CDCIA AND
                                                CI.CDMANCIA = RECSUB.CDMANCIA AND
                                                CI.NRSERVICOCIAFILI = RECSUB.NRSERVICOCIAFILI AND
                                                CI.CDCLASSE = RECSUB.CDCLASSE AND
                                                CI.CDSUBGRU = RECSUB.CDSUBGRU AND
                                                CI.NRSEQSUBGRUSEMAM = RECSUB.NRSEQSUBGRUSEMAM AND
                                                CI.CDCICLO = RECSUB.CDCICLO
        WHERE RECSUB.CDCIA     = P_CDCIA
          AND RECSUB.CDMANCIA  = P_CDMANCIA
          AND RECSUB.CDFILIAL  = P_CDFILIAL
          AND RECSUB.NRORG     = P_NRORG
          AND VERIF_VALOR_LISTA(CI.NRSERVICOCIAFILI||'-'||CI.CDCLASSE, P_NRSERVICOCLASSE) IS NOT NULL
          AND VERIF_VALOR_LISTA(TO_CHAR(CI.NRSEQSUBGRUSEMAM), P_NRSEQSUBGRUSEMAM) IS NOT NULL
          AND VERIF_VALOR_LISTA(CI.CDCICLO, P_CDCICLO) IS NOT NULL
          AND VERIF_VALOR_LISTA(CI.NRITAIRVISION||'-'||CI.CDSUBGRU||'-'||CI.NRSEQSUBGRUSEMAM||'-'||CI.CDCICLO, P_NRITAIRVISION) IS NOT NULL ) LOOP
          
      /*QUANTIDADE DE SUBGRUPOS A SEREM PRODUZIDOS*/          
        V_QTSUBGRU   := 1;

        SELECT MAX(IDRECFLEXIVEL)
          INTO V_IDRECFLEXIVEL
          FROM RECEITAM
         WHERE CDRECEITA = CUR_REC.CDRECEITA;
        
        /*BUSCA A VARIACAO DE RECEITA DA FILIAL
         VARIACAO PADRAO = 1*/
        SELECT MAX(FREC.NRVARIACAOREC) INTO V_NRVARIACAOREC
            FROM FILIRECEITA FREC
          WHERE FREC.CDRECEITA = CUR_REC.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     = CUR_REC.CDRECEITA
            AND VREC.NRORG         = P_NRORG
            AND VREC.NRVARIACAOREC = V_NRVARIACAOREC;
        V_RENDIMENTOREC := NVL(V_RENDIMENTOREC, 0.00);
        IF V_RENDIMENTOREC > 0 THEN
          V_RENDIMENTOREC := V_QTSUBGRU * NVL(CUR_REC.QTRECSUMA, 1) / V_RENDIMENTOREC;
        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     = CUR_REC.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 (V_CDTABELAUX, CUR_SUBPROD.CDPRODUTO, V_QTDPRODUTO, P_CDFILIAL, P_CDCIA, P_CDMANCIA, 
                      CUR_REC.NRSERVICOCIAFILI, CUR_REC.CDCLASSE, CUR_REC.CDSUBGRU, CUR_REC.NRSEQSUBGRUSEMAM, CUR_REC.CDCICLO,
                      P_NRORG , 'N', CUR_SUBPROD.VRCUSTO);
        END LOOP;
        
        /*VERIFICA AS SUBRECEITAS DA RECEITA*/
        FOR CUR_SUBREC IN
          (SELECT SUBREC.CDSUBRECEITA, SUBREC.QTRENDSUBREC
              FROM SUBRECEITAM SUBREC
            WHERE SUBREC.CDRECEITA     = CUR_REC.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, NVL(V_RENDIMENTOREC, 1) * NVL(CUR_SUBREC.QTRENDSUBREC, 1), 
                               V_NRVARIACAOREC, P_CDMANCIA, P_CDFILIAL, CUR_REC.NRSERVICOCIAFILI, CUR_REC.CDCLASSE, 
                               CUR_REC.CDSUBGRU, CUR_REC.NRSEQSUBGRUSEMAM, CUR_REC.CDCICLO,
                               V_CDTABELAUX, P_CDCIA, P_NRORG,P_DTCUSTO, P_IDTIPOCUSTO);
        END LOOP;
        
    END LOOP;
END;
/