CREATE OR REPLACE PROCEDURE GERA_ANALISERECEITAM
(
 P_CDFILIAL IN VARCHAR2,
 P_NRGERACAO OUT NUMBER,   
 P_CDCIA IN VARCHAR2 DEFAULT NULL,
 P_CDMANCIA IN VARCHAR2 DEFAULT NULL,
 P_DTCUSTO IN DATE DEFAULT NULL,
 P_NRORG IN NUMBER DEFAULT 1
)
AS
   V_SEQUENCIAL VARCHAR2(20);
   V_MAX_SEQ NUMBER;
   V_PROX_SEQ NUMBER;
   V_QTNIVEIS NUMBER;
   V_EXISTE_A_PROCESSAR NUMBER;   
   V_NRNIVEL_CORRENTE NUMBER;
BEGIN
   NOVO_CODIGO('ANALISERECM' ||P_CDFILIAL, V_SEQUENCIAL);
   
   P_NRGERACAO := TO_NUMBER(V_SEQUENCIAL);
            
   IF P_CDMANCIA IS NOT NULL THEN
     INSERT INTO ANALISERECM
     (CDFILIAL, NRGERACAO, CDRECEITAORI, NRVARIACAORECORI, QTRENDIMENTORECORI, 
      NRANALISERECM, CDRECEITA, NRVARIACAOREC, QTRENDIMENTOREC,    
      QTREQPORRECPAI, QTREQUERIDAREC, QTRECEITA,   
      IDSTATUSPROC, NRNIVEL,   
      DSHIERARQUIA,
      NRORG, DTGERACAO)
     SELECT CDFILIAL, P_NRGERACAO, R.CDRECEITA AS CDRECEITAORI, VR.NRVARIACAOREC AS NRVARIACAORECORI, VR.QTRENDIMENTOREC AS QTRENDIMENTORECORI,
            ROWNUM AS NRANALISERECM, R.CDRECEITA, VR.NRVARIACAOREC, VR.QTRENDIMENTOREC,
            1.00 AS QTREQPORRECPAI, 1.00 AS QTREQUERIDAREC, 1.00 AS QTRECEITA,
            'PROCESSANDO' AS IDSTATUSPROC, 0 AS NRNIVEL,
            'R' || R.CDRECEITA AS DSHIERARQUIA,
            P_NRORG AS NRORG, SYSDATE
       FROM (SELECT DISTINCT R.CDRECEITA
               FROM RECSUBSEMAM R                    
              WHERE R.CDFILIAL = P_CDFILIAL
                AND R.CDCIA = P_CDCIA
                AND R.CDMANCIA = P_CDMANCIA) RM
            INNER JOIN RECEITAM R ON R.CDRECEITA = RM.CDRECEITA
            INNER JOIN VARIACAOREC VR ON VR.CDRECEITA = R.CDRECEITA
            INNER JOIN FILIRECEITA FR ON FR.CDRECEITA = VR.CDRECEITA AND
                                         FR.NRVARIACAOREC = VR.NRVARIACAOREC AND
                                         FR.CDFILIAL = P_CDFILIAL;   
   ELSE   
      INSERT INTO ANALISERECM
     (CDFILIAL, NRGERACAO, CDRECEITAORI, NRVARIACAORECORI, QTRENDIMENTORECORI, 
      NRANALISERECM, CDRECEITA, NRVARIACAOREC, QTRENDIMENTOREC,    
      QTREQPORRECPAI, QTREQUERIDAREC, QTRECEITA,   
      IDSTATUSPROC, NRNIVEL,   
      DSHIERARQUIA,
      NRORG, DTGERACAO)
     SELECT CDFILIAL, P_NRGERACAO, R.CDRECEITA AS CDRECEITAORI, VR.NRVARIACAOREC AS NRVARIACAORECORI, VR.QTRENDIMENTOREC AS QTRENDIMENTORECORI,
            ROWNUM AS NRANALISERECM, R.CDRECEITA, VR.NRVARIACAOREC, VR.QTRENDIMENTOREC,
            1.00 AS QTREQPORRECPAI, 1.00 AS QTREQUERIDAREC, 1.00 AS QTRECEITA,
            'PROCESSANDO' AS IDSTATUSPROC, 0 AS NRNIVEL,
            'R' || R.CDRECEITA AS DSHIERARQUIA,
            P_NRORG AS NRORG, SYSDATE
       FROM FILIRECEITA FR
            INNER JOIN VARIACAOREC VR ON VR.CDRECEITA = FR.CDRECEITA AND
                                         VR.NRVARIACAOREC = FR.NRVARIACAOREC
            INNER JOIN RECEITAM R ON R.CDRECEITA = VR.CDRECEITA         
      WHERE FR.CDFILIAL = P_CDFILIAL;
   END IF;
   
   V_NRNIVEL_CORRENTE := 0;
   LOOP
      /* Proximo sequencial das receitas */
      SELECT MAX(NRANALISERECM)
        INTO V_MAX_SEQ
        FROM ANALISERECM
       WHERE CDFILIAL = P_CDFILIAL
         AND NRGERACAO = P_NRGERACAO
         AND NRNIVEL = V_NRNIVEL_CORRENTE;
      
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_NRNIVEL_CORRENTE));
      
      EXIT WHEN V_MAX_SEQ IS NULL;
      
      V_PROX_SEQ := NVL(V_MAX_SEQ, 0);
      /* Insere subreceitas */
      INSERT INTO ANALISERECM
     (CDFILIAL, NRGERACAO, CDRECEITAORI, NRVARIACAORECORI, QTRENDIMENTORECORI, 
      NRANALISERECM, CDRECEITA, NRVARIACAOREC, QTRENDIMENTOREC,
      QTREQPORRECPAI, QTREQUERIDAREC, QTRECEITA,
      IDSTATUSPROC, NRNIVEL,         
      DSHIERARQUIA, NRANALISERECMPAI, 
      CDRECEITA01, NRVARIACAOREC01,
      CDRECEITA02, NRVARIACAOREC02,
      CDRECEITA03, NRVARIACAOREC03,
      CDRECEITA04, NRVARIACAOREC04,
      CDRECEITA05, NRVARIACAOREC05,
      CDRECEITA06, NRVARIACAOREC06,
      CDRECEITA07, NRVARIACAOREC07,
      NRORG, DTGERACAO)      
      SELECT R.CDFILIAL, R.NRGERACAO, R.CDRECEITAORI, R.NRVARIACAORECORI, R.QTRENDIMENTORECORI,
             V_PROX_SEQ + ROWNUM AS NRANALISERECM, SR.CDSUBRECEITA AS CDRECEITA, FR.NRVARIACAOREC, VR.QTRENDIMENTOREC,
             SR.QTRENDSUBREC AS QTREQPORRECPAI, R.QTRECEITA * SR.QTRENDSUBREC AS QTREQUERIDAREC, 
             CASE WHEN VR.QTRENDIMENTOREC = 0.00 THEN 0.00 
                  ELSE R.QTRECEITA * SR.QTRENDSUBREC/VR.QTRENDIMENTOREC 
             END AS QTRECEITA,
             'A_PROCESSAR' AS IDSTATUSPROC, R.NRNIVEL + 1 AS NRNIVEL,
             /* Seta os campos de hierarquia, dependendo do nivel atual */
             R.DSHIERARQUIA|| ' -> ' || R.CDRECEITA AS DSHIERARQUIA, R.NRANALISERECM AS NRANALISERECMPAI,
             CASE WHEN R.NRNIVEL + 1 = 1 THEN R.CDRECEITA ELSE R.CDRECEITA01 END AS CDRECEITA01,              
             CASE WHEN R.NRNIVEL + 1 = 1 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC01 END AS NRVARIACAOREC01,
             CASE WHEN R.NRNIVEL + 1 = 2 THEN R.CDRECEITA ELSE R.CDRECEITA02 END AS CDRECEITA02,              
             CASE WHEN R.NRNIVEL + 1 = 2 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC02 END AS NRVARIACAOREC02,
             CASE WHEN R.NRNIVEL + 1 = 3 THEN R.CDRECEITA ELSE R.CDRECEITA03 END AS CDRECEITA03,              
             CASE WHEN R.NRNIVEL + 1 = 3 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC03 END AS NRVARIACAOREC03,
             CASE WHEN R.NRNIVEL + 1 = 4 THEN R.CDRECEITA ELSE R.CDRECEITA04 END AS CDRECEITA04,              
             CASE WHEN R.NRNIVEL + 1 = 4 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC04 END AS NRVARIACAOREC04,
             CASE WHEN R.NRNIVEL + 1 = 5 THEN R.CDRECEITA ELSE R.CDRECEITA05 END AS CDRECEITA05,              
             CASE WHEN R.NRNIVEL + 1 = 5 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC05 END AS NRVARIACAOREC05,
             CASE WHEN R.NRNIVEL + 1 = 6 THEN R.CDRECEITA ELSE R.CDRECEITA06 END AS CDRECEITA06,            
             CASE WHEN R.NRNIVEL + 1 = 6 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC06 END AS NRVARIACAOREC06,
             CASE WHEN R.NRNIVEL + 1 = 7 THEN R.CDRECEITA ELSE R.CDRECEITA07 END AS CDRECEITA07,              
             CASE WHEN R.NRNIVEL + 1 = 7 THEN R.NRVARIACAOREC ELSE R.NRVARIACAOREC07 END AS NRVARIACAOREC07,
             R.NRORG, SYSDATE
        FROM ANALISERECM R
             INNER JOIN RECEITAM REC ON REC.CDRECEITA = R.CDRECEITA
             INNER JOIN SUBRECEITAM SR ON SR.CDRECEITA = R.CDRECEITA AND
                                          SR.NRVARIACAOREC = R.NRVARIACAOREC AND
                                          ((REC.IDRECFLEXIVEL <> 'P') OR (SR.IDPREFERENCIA = 'S'))
             INNER JOIN VARIACAOREC VR ON VR.CDRECEITA = SR.CDSUBRECEITA
             INNER JOIN FILIRECEITA FR ON FR.CDRECEITA = VR.CDRECEITA AND
                                          FR.NRVARIACAOREC = VR.NRVARIACAOREC AND
                                          FR.CDFILIAL = R.CDFILIAL
       WHERE R.CDFILIAL = P_CDFILIAL
         AND R.NRGERACAO = P_NRGERACAO
         AND R.NRNIVEL = V_NRNIVEL_CORRENTE;

      V_NRNIVEL_CORRENTE := V_NRNIVEL_CORRENTE + 1;      
   END LOOP;
   
   INSERT INTO ANALISERECMPROD
   (CDFILIAL, NRGERACAO,CDRECEITAORI, NRVARIACAORECORI, QTRENDIMENTORECORI, NRANALISERECM,       
    DSHIERARQUIA, 
    CDPRODUTO, VRPEYIELD, QTPRODPORRECBRU, QTPRODPORRECLIQ, QTPRODBRU, QTPRODLIQ,
    NRORG, DTGERACAO)
   SELECT R.CDFILIAL, R.NRGERACAO, R.CDRECEITAORI, R.NRVARIACAORECORI, R.QTRENDIMENTORECORI, R.NRANALISERECM,
          R.DSHIERARQUIA || ' -> ' || R.CDRECEITA AS DSHIERARQUIA,
          P.CDPRODUTO, 100.00 - NVL(PT.VRPEFATOCORR, 0) AS VRPEYIELD, P.QTPRODREC * 1/(1 - NVL(PT.VRPEFATOCORR, 0)/100) AS QTPRODPORRECBRU, P.QTPRODREC AS QTPRODPORRECLIQ,
          R.QTRECEITA * P.QTPRODREC * 1/(1 - NVL(PT.VRPEFATOCORR, 0)/100) AS QTPRODBRU, R.QTRECEITA * P.QTPRODREC AS QTPRODLIQ,
          R.NRORG, SYSDATE
     FROM ANALISERECM R
          INNER JOIN RECEITAM REC ON REC.CDRECEITA = R.CDRECEITA
          INNER JOIN PRORECEITAM P ON P.CDRECEITA = R.CDRECEITA AND
                                      P.NRVARIACAOREC = R.NRVARIACAOREC AND
                                      ((REC.IDRECFLEXIVEL <> 'P') OR (P.IDPREFERENCIA = 'S'))
          INNER JOIN PRODUTO PT ON PT.CDPRODUTO = P.CDPRODUTO
    WHERE R.CDFILIAL = P_CDFILIAL
      AND R.NRGERACAO = P_NRGERACAO;
   
   IF P_DTCUSTO IS NOT NULL THEN      
      INSERT INTO ANALISERECMCUSTO
      (CDFILIAL, NRGERACAO,
       CDCIA, IDTIPO, CDINSUMO,
       VRCUSTOMEDBRU, VRCUSTOMEDLIQ,
       VRCUSTOCOMBRU, VRCUSTOCOMLIQ,
       NRORG, DTGERACAO
      )
      SELECT P_CDFILIAL, P_NRGERACAO, 
             C.CDCIA, 'P', P.CDPRODUTO,
             CUSTO_PRODUTO_COC(C.CDFILIAL, P.CDPRODUTO, P_DTCUSTO, 0, C.CDCIA) AS VRCUSTOMEDBRU, 
             CUSTO_PRODUTO_COC(C.CDFILIAL, P.CDPRODUTO, P_DTCUSTO, 1, C.CDCIA) AS VRCUSTOMEDLIQ, 
             CUSTO_PRODUTO_COC(C.CDFILIAL, P.CDPRODUTO, P_DTCUSTO, 2, C.CDCIA) AS VRCUSTOCOMBRU,
             CUSTO_PRODUTO_COC(C.CDFILIAL, P.CDPRODUTO, P_DTCUSTO, 3, C.CDCIA) AS VRCUSTOCOMLIQ,
             P_NRORG, SYSDATE
        FROM (SELECT CDPRODUTO
               FROM ANALISERECMPROD 
              WHERE CDFILIAL = P_CDFILIAL 
                AND NRGERACAO = P_NRGERACAO
               GROUP BY CDPRODUTO) P 
             CROSS JOIN (SELECT DISTINCT CDFILIAL, CDCIA FROM MANUALCIAM 
                          WHERE CDFILIAL = P_CDFILIAL
                            AND ((NVL(P_CDCIA, 'T') = 'T') OR (CDCIA = P_CDCIA))) C;

      INSERT INTO ANALISERECMCUSTO
      (CDFILIAL, NRGERACAO,
       CDCIA, IDTIPO, CDINSUMO,
       VRCUSTOMEDBRU, VRCUSTOMEDLIQ,
       VRCUSTOCOMBRU, VRCUSTOCOMLIQ,
       NRORG, DTGERACAO
      )
      SELECT P_CDFILIAL, P_NRGERACAO, 
             C.CDCIA, 'R', R.CDRECEITA,
             CUSTO_RECEITAM_COC(C.CDFILIAL, R.CDRECEITA, R.NRVARIACAOREC, P_DTCUSTO, 0, C.CDCIA) AS VRCUSTOMEDBRU, 
             CUSTO_RECEITAM_COC(C.CDFILIAL, R.CDRECEITA, R.NRVARIACAOREC, P_DTCUSTO, 1, C.CDCIA) AS VRCUSTOMEDLIQ, 
             CUSTO_RECEITAM_COC(C.CDFILIAL, R.CDRECEITA, R.NRVARIACAOREC, P_DTCUSTO, 2, C.CDCIA) AS VRCUSTOCOMBRU,
             CUSTO_RECEITAM_COC(C.CDFILIAL, R.CDRECEITA, R.NRVARIACAOREC, P_DTCUSTO, 3, C.CDCIA) AS VRCUSTOCOMLIQ,
             P_NRORG, SYSDATE
        FROM (SELECT CDRECEITA, MAX(NRVARIACAOREC) AS NRVARIACAOREC
               FROM ANALISERECM
              WHERE CDFILIAL = P_CDFILIAL 
                AND NRGERACAO = P_NRGERACAO
              GROUP BY CDRECEITA) R 
             CROSS JOIN (SELECT DISTINCT CDFILIAL, CDCIA FROM MANUALCIAM 
                          WHERE CDFILIAL = P_CDFILIAL
                            AND ((NVL(P_CDCIA, 'T') = 'T') OR (CDCIA = P_CDCIA))) C;
      
      
   END IF;
END;
/