CREATE OR REPLACE PROCEDURE CUSTO_MANUALCIAM(
  P_CDFILIAL  IN VARCHAR2,
  P_CDCIA     IN VARCHAR2,
  P_CDMANCIA  IN VARCHAR2,
  P_NRSERVICOCIAFILI IN NUMBER,
  P_CDCLASSE IN VARCHAR2,
  P_CDSUBGRU IN VARCHAR2,
  P_NRSEQSUBGRUSEMAM IN NUMBER,
  P_CDCICLO IN VARCHAR2,
  P_DATACUSTO IN DATE,
  P_TIPOCUSTO IN NUMBER,
  P_CDOPERADOR IN VARCHAR2,
  P_NRORG     IN NUMBER DEFAULT 1
 )
IS

   V_CUSTO_PRODUTO_TOTAL FLOAT;
   V_CUSTO_PRODUTO       FLOAT;

   V_CUSTO_RECEITA_TOTAL FLOAT;
   V_CUSTO_RECEITA       FLOAT;

   V_CUSTO_SUBRECEITA_TOTAL FLOAT;
   V_CUSTO_SUBRECEITA    FLOAT;

   V_CUSTO_SUBGRUPO_TOTAL FLOAT;   

   V_CUSTO_SERVICO_TOTAL FLOAT;
   V_CUSTO_SERVICO       FLOAT;

   V_CUSTO_MANUAL_TOTAL FLOAT;
   V_CUSTO_MANUAL       FLOAT;

   V_QTREND FLOAT;

   V_NRGERACAO NUMBER;
   
   V_IDCUSTOPRODZERO VARCHAR2(1);
   V_CDPROD_CUSTOZERO VARCHAR2(10);

   V_CUSTO_CICLOS_TOTAL FLOAT;
BEGIN

   V_CUSTO_PRODUTO_TOTAL := 0;
   V_CUSTO_PRODUTO       := 0;

   V_CUSTO_RECEITA_TOTAL := 0;
   V_CUSTO_RECEITA       := 0;

   V_CUSTO_SUBRECEITA_TOTAL := 0;
   V_CUSTO_SUBRECEITA    := 0;


   V_CUSTO_SUBGRUPO_TOTAL:= 0;

   V_CUSTO_SERVICO_TOTAL := 0;
   V_CUSTO_SERVICO       := 0;

   V_CUSTO_MANUAL_TOTAL  := 0;
   V_CUSTO_MANUAL        := 0;

   V_QTREND := 0;
   
   GERA_ANALISERECEITAM(P_CDFILIAL, V_NRGERACAO, P_CDCIA, P_CDMANCIA, P_DATACUSTO, P_NRORG);
   
   /*Custo total dos itens do manual da filial/comapanhia */
   FOR CUR_SERV IN
      (SELECT SM.NRSERVICOCIAFILI, SM.CDCLASSE
         FROM SERVMANUALM SM
        WHERE SM.CDFILIAL     = P_CDFILIAL
          AND SM.CDCIA        = P_CDCIA
          AND SM.CDMANCIA     = P_CDMANCIA
          AND ((P_NRSERVICOCIAFILI IS NULL) OR (SM.NRSERVICOCIAFILI = P_NRSERVICOCIAFILI))
          AND ((P_CDCLASSE IS NULL) OR (SM.CDCLASSE = P_CDCLASSE)) ) LOOP
                
      V_CUSTO_SUBGRUPO_TOTAL := 0;
      FOR CUR_SUBGRU IN
      (SELECT CDSUBGRU, NRSEQSUBGRUSEMAM
         FROM SUBGRUSEMAM
        WHERE CDFILIAL = P_CDFILIAL
          AND CDCIA = P_CDCIA 
          AND CDMANCIA = P_CDMANCIA
          AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
          AND CDCLASSE = CUR_SERV.CDCLASSE
          AND ((P_CDSUBGRU IS NULL) OR (CDSUBGRU = P_CDSUBGRU))
          AND ((P_NRSEQSUBGRUSEMAM IS NULL) OR (NRSEQSUBGRUSEMAM = P_NRSEQSUBGRUSEMAM)) ) LOOP
        
        V_CUSTO_CICLOS_TOTAL := 0;

        FOR CUR_CICLO IN
           (SELECT C.CDSUBGRU, C.NRSEQSUBGRUSEMAM, C.CDCICLO
              FROM CICLOSUBGRUSEMAM C
             WHERE C.CDFILIAL = P_CDFILIAL
               AND C.CDCIA = P_CDCIA
               AND C.CDMANCIA = P_CDMANCIA
               AND C.NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
               AND C.CDCLASSE = CUR_SERV.CDCLASSE
               AND C.CDSUBGRU = CUR_SUBGRU.CDSUBGRU
               AND C.NRSEQSUBGRUSEMAM = CUR_SUBGRU.NRSEQSUBGRUSEMAM
               AND (( NVL(P_CDCICLO, 'T') = 'T' ) OR (C.CDCICLO = P_CDCICLO)) ) LOOP

           V_CUSTO_RECEITA_TOTAL := 0;           
           /* BUSCA AS RECEITAS DO SUBGRUPO/CICLO DO MANUAL */
           FOR CUR_REC IN
              (SELECT RB.CDRECEITA, FI.NRVARIACAOREC, NVL(RB.QTRECSUMA,0) AS QTRECSUMA,
                      CASE P_TIPOCUSTO WHEN 0 THEN NVL(VRCUSTOMEDBRU, 0.00)
                                       WHEN 1 THEN NVL(VRCUSTOMEDLIQ, 0.00)
                                       WHEN 2 THEN NVL(VRCUSTOCOMBRU, 0.00)
                                       WHEN 3 THEN NVL(VRCUSTOCOMLIQ, 0.00)
                                       ELSE 0.00
                      END AS VRCUSTO
                 FROM RECSUBSEMAM RB, FILIRECEITA FI, ANALISERECMCUSTO C
                WHERE RB.CDFILIAL = P_CDFILIAL
                  AND RB.CDCIA    = P_CDCIA
                  AND RB.CDMANCIA = P_CDMANCIA
                  AND RB.NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
                  AND RB.CDCLASSE         = CUR_SERV.CDCLASSE
                  AND RB.CDSUBGRU         = CUR_CICLO.CDSUBGRU
                  AND RB.NRSEQSUBGRUSEMAM = CUR_CICLO.NRSEQSUBGRUSEMAM
                  AND RB.CDCICLO          = CUR_CICLO.CDCICLO
                  AND RB.CDFILIAL         = FI.CDFILIAL
                  AND RB.CDRECEITA        = FI.CDRECEITA
                  AND C.CDFILIAL(+) = P_CDFILIAL 
                  AND C.NRGERACAO(+) = V_NRGERACAO
                  AND C.IDTIPO(+) = 'R'
                  AND C.CDINSUMO(+) = RB.CDRECEITA
                  AND C.CDCIA(+) = RB.CDCIA) LOOP

              V_CUSTO_SUBRECEITA_TOTAL := NVL(CUR_REC.VRCUSTO, 0) *
                                          NVL(CUR_REC.QTRECSUMA,0);

              IF V_CUSTO_SUBRECEITA_TOTAL > 0 THEN
                 IF ROUND(V_CUSTO_SUBRECEITA_TOTAL, 2) = 0 THEN
                    V_CUSTO_SUBRECEITA_TOTAL := 0.01; 
                 ELSE
                    V_CUSTO_SUBRECEITA_TOTAL := ROUND(V_CUSTO_SUBRECEITA_TOTAL, 2);
                 END IF;
              END IF;                       
              
          UPDATE RECSUBSEMAM
           SET VRCUSRESUBSEMAM = V_CUSTO_SUBRECEITA_TOTAL,
             NRORGULTATU = P_NRORG,
             CDOPERULTATU = P_CDOPERADOR,
             DTULTATU = SYSDATE
           WHERE CDFILIAL = P_CDFILIAL
           AND CDCIA    = P_CDCIA
           AND CDMANCIA = P_CDMANCIA
           AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
           AND CDCLASSE         = CUR_SERV.CDCLASSE
           AND CDSUBGRU         = CUR_CICLO.CDSUBGRU
           AND NRSEQSUBGRUSEMAM = CUR_CICLO.NRSEQSUBGRUSEMAM
           AND CDCICLO          = CUR_CICLO.CDCICLO
           AND CDRECEITA        = CUR_REC.CDRECEITA;

                V_CUSTO_RECEITA_TOTAL := V_CUSTO_RECEITA_TOTAL + V_CUSTO_SUBRECEITA_TOTAL;

          END LOOP;  /* END FOR_REC */

         /* BUSCA OS PRODUTOS DO SUBGRUPO DO MANUAL */
         V_CUSTO_PRODUTO_TOTAL := 0;
         FOR CUR_PROD IN
            (SELECT PR.CDPRODUTO, NVL(PR.QTPRODSUMA,0) AS QTPRODSUMA, NVL(PO.VRPEFATOCORR,0) AS VRPEFATOCORR
               FROM PRODSUBSEMAM PR, PRODUTO PO
              WHERE PR.CDFILIAL = P_CDFILIAL
                AND PR.CDCIA    = P_CDCIA
                AND PR.CDMANCIA = P_CDMANCIA
                AND PR.NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
                AND PR.CDCLASSE         = CUR_SERV.CDCLASSE
                AND PR.CDSUBGRU         = CUR_CICLO.CDSUBGRU
                AND PR.NRSEQSUBGRUSEMAM = CUR_CICLO.NRSEQSUBGRUSEMAM
                AND PR.CDCICLO          = CUR_CICLO.CDCICLO
                AND PR.CDPRODUTO        = PO.CDPRODUTO) LOOP

            /* CHAMA A FUNCAO QUE RETORNA O CUSTO DO PRODUTO */
            IF CUR_PROD.VRPEFATOCORR = 100 THEN
               V_CUSTO_PRODUTO := 0;
            ELSE
              SELECT SUM(CUSTO_PRODUTO_COC(P_CDFILIAL, CUR_PROD.CDPRODUTO, P_DATACUSTO, P_TIPOCUSTO, P_CDCIA) *
                     NVL(CUR_PROD.QTPRODSUMA,0)/(1 - (CUR_PROD.VRPEFATOCORR/100)))
                INTO V_CUSTO_PRODUTO
                FROM DUAL;

              IF V_CUSTO_PRODUTO > 0 THEN
                 IF ROUND(V_CUSTO_PRODUTO, 2) = 0 THEN
                    V_CUSTO_PRODUTO := 0.01; 
                 ELSE
                    V_CUSTO_PRODUTO := ROUND(V_CUSTO_PRODUTO, 2);
                 END IF;
              END IF;

            END IF;

           UPDATE PRODSUBSEMAM
             SET VRCUSPRSUBSEMAM  = V_CUSTO_PRODUTO,
               NRORGULTATU = P_NRORG,
               CDOPERULTATU = P_CDOPERADOR,
               DTULTATU = SYSDATE
             WHERE CDFILIAL = P_CDFILIAL
             AND CDCIA    = P_CDCIA
             AND CDMANCIA = P_CDMANCIA
             AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
             AND CDCLASSE         = CUR_SERV.CDCLASSE
             AND CDSUBGRU         = CUR_CICLO.CDSUBGRU
             AND NRSEQSUBGRUSEMAM = CUR_CICLO.NRSEQSUBGRUSEMAM
             AND CDCICLO          = CUR_CICLO.CDCICLO
             AND CDPRODUTO        = CUR_PROD.CDPRODUTO;
      
            V_CUSTO_PRODUTO_TOTAL := V_CUSTO_PRODUTO_TOTAL + V_CUSTO_PRODUTO;

         END LOOP;  /* END DO CUR_PRO DO SUBGRUPO/CICLO*/
         
         V_CUSTO_CICLOS_TOTAL := V_CUSTO_CICLOS_TOTAL + V_CUSTO_PRODUTO_TOTAL + V_CUSTO_RECEITA_TOTAL;

         /* UPDATE O CUSTO DO SUBGRUPO/CICLO */
         UPDATE CICLOSUBGRUSEMAM
            SET NRORGULTATU = P_NRORG,
                CDOPERULTATU = P_CDOPERADOR,
                DTULTATU = SYSDATE,
                DTCUSTO = P_DATACUSTO,
                IDTIPOCUSTO = P_TIPOCUSTO
          WHERE CDFILIAL = P_CDFILIAL
            AND CDCIA    = P_CDCIA
            AND CDMANCIA = P_CDMANCIA
            AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
            AND CDCLASSE         = CUR_SERV.CDCLASSE
            AND CDSUBGRU         = CUR_CICLO.CDSUBGRU
            AND NRSEQSUBGRUSEMAM = CUR_CICLO.NRSEQSUBGRUSEMAM
            AND CDCICLO          = CUR_CICLO.CDCICLO;

        END LOOP; /* END DO CICLO DO SERVICO */

        V_CUSTO_SUBGRUPO_TOTAL := V_CUSTO_SUBGRUPO_TOTAL + V_CUSTO_CICLOS_TOTAL;

    /*
    UPDATE SUBGRUSEMAM
       SET DTHRCALCCUSTO = SYSDATE,
         CDOPERCALCCUSTO = P_CDOPERADOR,
         NRORGULTATU = P_NRORG,
         CDOPERULTATU = P_CDOPERADOR,
         DTULTATU = SYSDATE,
         VRCUSTO = V_CUSTO_CICLOS_TOTAL
     WHERE CDFILIAL = P_CDFILIAL
       AND CDCIA    = P_CDCIA
       AND CDMANCIA = P_CDMANCIA
       AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
       AND CDCLASSE         = CUR_SERV.CDCLASSE
       AND CDSUBGRU = CUR_SUBGRU.CDSUBGRU
       AND NRSEQSUBGRUSEMAM = CUR_SUBGRU.NRSEQSUBGRUSEMAM;*/

      END LOOP;/* END DO SUBGRUPO DO SERVICO */

      V_CUSTO_SERVICO_TOTAL :=  V_CUSTO_SERVICO_TOTAL + V_CUSTO_SUBGRUPO_TOTAL;

    /* UPDATE O CUSTO DO SERVICO */
    /*UPDATE SERVMANUALM
     SET VRCUSTOSERVM = V_CUSTO_SUBGRUPO_TOTAL,
       NRORGULTATU = P_NRORG,
       CDOPERULTATU = P_CDOPERADOR,
       DTULTATU = SYSDATE
     WHERE CDFILIAL = P_CDFILIAL
     AND CDCIA    = P_CDCIA
     AND CDMANCIA = P_CDMANCIA
     AND NRSERVICOCIAFILI = CUR_SERV.NRSERVICOCIAFILI
     AND CDCLASSE         = CUR_SERV.CDCLASSE;   */   

   END LOOP; /* END DOS SERVICOS DO MANUAL */

   /* UPDATE O CUSTO DO MANUAL */
   IF P_NRSERVICOCIAFILI IS NULL THEN
     UPDATE MANUALCIAM
      SET DTCUSTOMAN = P_DATACUSTO,       
        IDTIPOCUSTOMAN = TO_CHAR(P_TIPOCUSTO),
        DTHRCALCCUSTO = SYSDATE,
        CDOPERCALCCUSTO = P_CDOPERADOR,
        NRORGULTATU = P_NRORG,
        CDOPERULTATU = P_CDOPERADOR,
        DTULTATU = SYSDATE
    WHERE CDFILIAL = P_CDFILIAL
      AND CDCIA    = P_CDCIA
      AND CDMANCIA = P_CDMANCIA;
   END IF;
      
   /* Indica receitas que contem produtos com custo zero*/
   UPDATE RECSUBSEMAM
      SET NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE,
      IDCUSTOPRODZERO = 
   (SELECT MAX(CASE WHEN CASE P_TIPOCUSTO WHEN 0 THEN NVL(VRCUSTOMEDBRU, 0.00)
                                         WHEN 1 THEN NVL(VRCUSTOMEDLIQ, 0.00)
                                         WHEN 2 THEN NVL(VRCUSTOCOMBRU, 0.00)
                                         WHEN 3 THEN NVL(VRCUSTOCOMLIQ, 0.00)
                                         ELSE 0.00
                          END = 0.00 THEN 'S'
                    ELSE 'N'
               END)
              FROM ANALISERECMPROD P
                   LEFT JOIN ANALISERECMCUSTO C ON C.CDFILIAL = P.CDFILIAL AND
                                                   C.NRGERACAO = V_NRGERACAO AND
                                                   C.IDTIPO = 'P' AND
                                                   C.CDINSUMO = P.CDPRODUTO AND
                                                   C.CDCIA = P_CDCIA
             WHERE P.CDFILIAL = P_CDFILIAL AND
                   P.NRGERACAO = V_NRGERACAO AND
                   P.CDRECEITAORI = RECSUBSEMAM.CDRECEITA)
     WHERE CDFILIAL = P_CDFILIAL
       AND CDCIA    = P_CDCIA
       AND CDMANCIA = P_CDMANCIA;
      
   APAGA_ANALISERECEITAM(P_CDFILIAL, V_NRGERACAO);

   COMMIT;
END;
/