/* Sistemas Integrados TEKNISA
  Controle de Producao

 Nome: Rotina de apropriacao dos Custos da OP

Criacao:
17/10/02 - Fatima

@C:\WEB_619\Sql\End_Conv\Oracle\3900_CDPSTP_CALCULA_CUSTO_OP.sql
*/

create or replace PROCEDURE CALCULA_CUSTO_OP
       (P_CDFILIAL     IN ORDPRODUCAO.CDFILIAL%TYPE,
        P_NRORDPROD    IN ORDPRODUCAO.NRORDPROD%TYPE,
        P_NRSUBORDPROD IN ORDPRODUCAO.NRSUBORDPROD%TYPE,
        P_CDPRODUTO    IN ORDPRODUCAO.CDPRODUTO%TYPE,
        P_NRLOTEESTQ   IN ORDPRODUCAO.NRLOTEESTQ%TYPE,
        P_NRSUBLOTE    IN ORDPRODUCAO.NRSUBLOTE%TYPE) IS

   V_SEQUCUSTO    APRCUSTOP.NRAPRCUSTOP%TYPE;
   V_TIPOCUSTO    VARCHAR2(02);
   V_NMTPCUSTO    VARCHAR2(60);
   V_CDCUSTOINDI  VARCHAR2(03);
   V_CDETAPAPROD  VARCHAR2(10);
   V_IDTPCALCCUSPROD  VARCHAR2(1);
   V_VRFATOCONVES FLOAT;
   V_QTPERDAOP    FLOAT;
   VRCUSTOAMOSTRA FLOAT;
   VRCUSTORECURSO FLOAT;
   VRTOTALANA    FLOAT;
   V_IDSITORDPROD VARCHAR2(1);
BEGIN
   SELECT MAX(IDSITORDPROD)
     INTO V_IDSITORDPROD
     FROM ORDPRODUCAO
    WHERE CDFILIAL     = P_CDFILIAL      AND
          NRORDPROD    = P_NRORDPROD     AND
          NRSUBORDPROD = P_NRSUBORDPROD;

   IF V_IDSITORDPROD <> '3' THEN
      DELETE
      FROM APRCUSTOP
      WHERE CDFILIAL     = P_CDFILIAL      AND
            NRORDPROD    = P_NRORDPROD     AND
            NRSUBORDPROD = P_NRSUBORDPROD;

      V_SEQUCUSTO := 0;

      SELECT
         MIN(CDETAPAPROD) INTO V_CDETAPAPROD
      FROM
         ETAFABRICOP
      WHERE
         CDFILIAL     = P_CDFILIAL AND
         NRORDPROD    = P_NRORDPROD AND
         NRSUBORDPROD = P_NRSUBORDPROD;

      FOR C_SUBPROD IN
         (SELECT
             NRLOTEESTQ,
             NRSUBLOTE
          FROM SUBPRETAPAOP
          WHERE
             CDFILIAL     = P_CDFILIAL  AND
             NRORDPROD    = P_NRORDPROD AND
             NRSUBORDPROD = P_NRSUBORDPROD

      ) LOOP

         /* So ira gerar custo para o lote da OP  */

         IF (C_SUBPROD.NRLOTEESTQ = P_NRLOTEESTQ) AND
            (C_SUBPROD.NRSUBLOTE  = P_NRSUBLOTE) THEN

           /* Gera os custos para o lote principal da OP */

            FOR C_CUSTCALC IN
               (SELECT
                   AUDITORIA.CDETAPAPROD,
                   AUDITORIA.NRLOTEESTQ,
                   AUDITORIA.NRSUBLOTE,
                   AUDITORIA.IDORIGAUDIT,
                   AUDITORIA.NRAUDITORIA
                FROM AUDITORIA
                WHERE AUDITORIA.CDFILIAL     = P_CDFILIAL  AND
                      AUDITORIA.NRORDPROD    = P_NRORDPROD AND
                      AUDITORIA.NRSUBORDPROD = P_NRSUBORDPROD

            ) LOOP

               FOR C_INSPECAO IN
                  (SELECT
                      INSPECAO.IDORIGINSPEC,
                      INSPECAO.CDINSPECAO,
                      INSPECAO.NMINSPECAO,
                      ROUND(INSPECAO.VRCUSTOINSP, 5) AS VRCUSTOINSP,
                      NVL(IDCOMPOECUSTO, 'N') AS IDCOMPOECUSTO,
                      INSPECAUDIT.NRAUDITORIA,
                      INSPECAUDIT.NRINSPECAUDI
                   FROM INSPECAO, INSPECAUDIT
                   WHERE INSPECAUDIT.CDFILIAL    = P_CDFILIAL             AND
                         INSPECAUDIT.NRAUDITORIA = C_CUSTCALC.NRAUDITORIA AND
                         INSPECAUDIT.CDINSPECAO  = INSPECAO.CDINSPECAO
               ) LOOP

                 /* apuracao de Custo Real da Inspecao, Analise, Mao de Obra E Equipamentos */

                  V_NMTPCUSTO := SUBSTR(C_INSPECAO.NMINSPECAO,1,60);

                  IF  C_INSPECAO.IDORIGINSPEC = 'QUA'  THEN

                     SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
                     FROM  CUSTOINDI
                     WHERE CDFUNCUSTO = '005';

                     IF NOT V_CDCUSTOINDI IS NULL THEN

                        V_SEQUCUSTO := V_SEQUCUSTO + 1;

                        INSERT INTO APRCUSTOP
                           (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, CDPRODUTO,
                            NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO,
                            NRLOTEESTQ, NRSUBLOTE, CDAPRCUSTOP, NMAPRCUSTOP,
                            QTAPRCUSTOP, VRAPRCUSTOP, QTHRAPRCUST)
                        VALUES
                           (P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD,  C_CUSTCALC.CDETAPAPROD, P_CDPRODUTO,
                            LPAD(V_SEQUCUSTO, 10, '0'), V_CDCUSTOINDI, '005',
                            C_CUSTCALC.NRLOTEESTQ, C_CUSTCALC.NRSUBLOTE, C_INSPECAO.CDINSPECAO,
                            V_NMTPCUSTO, 1 , C_INSPECAO.VRCUSTOINSP, 0);
                     END IF;
                  ELSE
                     IF  C_INSPECAO.IDORIGINSPEC = 'ANA'  THEN
                        -- Custo real da analise
                        VRTOTALANA := 0;
                        SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
                        FROM  CUSTOINDI
                        WHERE CDFUNCUSTO = '004';

                        IF NOT V_CDCUSTOINDI IS NULL THEN

                           V_SEQUCUSTO := V_SEQUCUSTO + 1;

                           IF C_INSPECAO.IDCOMPOECUSTO = 'S' THEN

                              SELECT SUM(NVL(VRCUSTOAMOSTRA, 0)) AS VRCUSTOAMOSTRA
                                INTO VRCUSTOAMOSTRA
                                FROM FORMULAUDITANA F
                               WHERE F.CDFILIAL    = P_CDFILIAL
                                 AND F.NRAUDITORIA = C_INSPECAO.NRAUDITORIA
                                 AND F.NRLANCTOESTQ IS NOT NULL;

                              SELECT SUM(NVL(VRCUSTORECURSO, 0)) AS VRCUSTORECURSO
                                INTO VRCUSTORECURSO
                                FROM RECURAUDITANA R
                               WHERE R.CDFILIAL    = P_CDFILIAL
                                 AND R.NRAUDITORIA = C_INSPECAO.NRAUDITORIA;

                              VRTOTALANA := ROUND(NVL(VRCUSTOAMOSTRA,0) + NVL(VRCUSTORECURSO,0),5);

                              IF VRTOTALANA <> 0 THEN
                                 INSERT INTO APRCUSTOP
                                    (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, CDPRODUTO,
                                     NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO,
                                     NRLOTEESTQ, NRSUBLOTE, CDAPRCUSTOP, NMAPRCUSTOP,
                                     QTAPRCUSTOP, VRAPRCUSTOP, QTHRAPRCUST)
                                 VALUES
                                    (P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, C_CUSTCALC.CDETAPAPROD, P_CDPRODUTO,
                                     LPAD(V_SEQUCUSTO, 10, '0'), V_CDCUSTOINDI, '004',
                                     C_CUSTCALC.NRLOTEESTQ, C_CUSTCALC.NRSUBLOTE, C_INSPECAO.CDINSPECAO,
                                     V_NMTPCUSTO, 1 , VRTOTALANA, 0);
                              END IF;
                           END IF;
                           V_SEQUCUSTO := V_SEQUCUSTO + 1;

                           INSERT INTO APRCUSTOP
                              (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, CDPRODUTO,
                               NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO,
                               NRLOTEESTQ, NRSUBLOTE, CDAPRCUSTOP, NMAPRCUSTOP,
                               QTAPRCUSTOP, VRAPRCUSTOP, QTHRAPRCUST)
                           VALUES
                              (P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, C_CUSTCALC.CDETAPAPROD, P_CDPRODUTO,
                               LPAD(V_SEQUCUSTO, 10, '0'), V_CDCUSTOINDI, '004',
                               C_CUSTCALC.NRLOTEESTQ, C_CUSTCALC.NRSUBLOTE, C_INSPECAO.CDINSPECAO,
                               V_NMTPCUSTO, 1 , C_INSPECAO.VRCUSTOINSP, 0);
                        END IF;
                     ELSE
                        IF C_INSPECAO.IDORIGINSPEC = 'TAR' THEN
                           FOR C_RECURSO IN
                              (SELECT
                                  RECURETAPAOP.CDEQUIPPRO AS CDRECURSO,
                                  EQUIPAPROD.NMEQUIPPRO AS NMTPCUSTO,
                                  '003' AS CDFUNCUSTO,
                                  ROUND(RECURETAPAOP.QTHRREARECOP, 5) AS QTHRREARECOP,
                                  ROUND(VRCUSTOEQUIP, 5) AS VRCUSTO, RECURETAPAOP.QTOPERADORES
                               FROM   RECURETAPAOP, EQUIPAPROD
                               WHERE  RECURETAPAOP.CDFILIAL      = P_CDFILIAL              AND
                                      RECURETAPAOP.NRAUDITORIA   = C_INSPECAO.NRAUDITORIA  AND
                                      RECURETAPAOP.NRINSPECAUDI  = C_INSPECAO.NRINSPECAUDI AND
                                      RECURETAPAOP.IDRECURETAOP  = 'E'          AND
                                      RECURETAPAOP.CDEQUIPPRO    = EQUIPAPROD.CDEQUIPPRO

                               UNION ALL

                               SELECT
                                  RECURETAPAOP.CDHABILIDADE AS CDRECURSO,
                                  HABILIDADE.NMHABILIDADE AS NMTPCUSTO,
                                  '002' AS CDFUNCUSTO,
                                  ROUND(RECURETAPAOP.QTHRREARECOP, 5) AS QTHRREARECOP,
                                  ROUND(VRCUSHRHABIL, 5) AS VRCUSTO, RECURETAPAOP.QTOPERADORES
                               FROM   RECURETAPAOP, HABILIDADE
                               WHERE  RECURETAPAOP.CDFILIAL      = P_CDFILIAL              AND
                                      RECURETAPAOP.NRAUDITORIA   = C_INSPECAO.NRAUDITORIA  AND
                                      RECURETAPAOP.NRINSPECAUDI  = C_INSPECAO.NRINSPECAUDI AND
                                      RECURETAPAOP.IDRECURETAOP  = 'H'          AND
                                      RECURETAPAOP.CDHABILIDADE  = HABILIDADE.CDHABILIDADE

                           )LOOP

                              SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
                              FROM  CUSTOINDI
                              WHERE CDFUNCUSTO = C_RECURSO.CDFUNCUSTO;

                              IF NOT V_CDCUSTOINDI IS NULL THEN

                                 V_SEQUCUSTO := V_SEQUCUSTO + 1;

                                 INSERT INTO APRCUSTOP
                                    (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, CDPRODUTO,
                                     NRAPRCUSTOP, CDCUSTOINDI, CDFUNCUSTO,
                                     NRLOTEESTQ, NRSUBLOTE, CDAPRCUSTOP, NMAPRCUSTOP,
                                     QTAPRCUSTOP, VRAPRCUSTOP, QTHRAPRCUST)
                                 VALUES
                                    (P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, C_CUSTCALC.CDETAPAPROD, P_CDPRODUTO,
                                     LPAD(V_SEQUCUSTO, 10, '0'), V_CDCUSTOINDI, C_RECURSO.CDFUNCUSTO,
                                     C_CUSTCALC.NRLOTEESTQ, C_CUSTCALC.NRSUBLOTE, C_RECURSO.CDRECURSO,
                                     C_RECURSO.NMTPCUSTO, NVL(C_RECURSO.QTOPERADORES,1) , C_RECURSO.VRCUSTO, NVL(C_RECURSO.QTHRREARECOP,0));

                                 IF C_RECURSO.CDFUNCUSTO = '002' THEN
                                    CUSTO_HABILIDADE(P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, C_RECURSO.CDRECURSO, LPAD(V_SEQUCUSTO, 10, '0'), C_CUSTCALC.CDETAPAPROD);
                                 END IF;

                              END IF;

                           END LOOP;  /* TAREFAS        */
                        END IF;       /* IDORIG = 'TAR' */
                     END IF;          /* IDORIG = 'ANA' */
                  END IF;             /* IDORIG = 'QUA' */
               END LOOP;              /* C_INSPECAO     */
            END LOOP; /* C_CUSTCALC     */
         ELSE

            SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
            FROM  CUSTOINDI
            WHERE CDFUNCUSTO = '099';

            IF (NOT V_CDCUSTOINDI IS NULL) AND (NOT V_CDETAPAPROD IS NULL) THEN

               V_SEQUCUSTO := V_SEQUCUSTO + 1;

               INSERT INTO APRCUSTOP
                  (CDFILIAL, NRORDPROD, NRSUBORDPROD, CDETAPAPROD, CDPRODUTO, NRAPRCUSTOP,
                   NRLOTEESTQ, NRSUBLOTE, CDCUSTOINDI, CDFUNCUSTO)
               VALUES
                  (P_CDFILIAL, P_NRORDPROD, P_NRSUBORDPROD, V_CDETAPAPROD, P_CDPRODUTO,
                   LPAD(V_SEQUCUSTO, 10, '0'), C_SUBPROD.NRLOTEESTQ, C_SUBPROD.NRSUBLOTE,
                    V_CDCUSTOINDI, '099');
            END IF;
         END IF; /* Lote da OP */
      END LOOP; /* C_SUBPROD*/

      SELECT MAX(NRTPCUSTOOP), MAX(IDTPCALCCUSPROD)
      INTO  V_TIPOCUSTO, V_IDTPCALCCUSPROD
      FROM
         PARAMAN
      WHERE
         CDFILIAL = P_CDFILIAL;

      SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
                FROM CUSTOINDI
                WHERE CDFUNCUSTO = '001';

      IF NOT V_CDCUSTOINDI IS NULL THEN

   /* Insumos  */

         FOR C_RETIRADA IN
            (SELECT CDCENTCUST, DTLANCRETDEV, CDPRODUTO, NMPRODUTO, CDETAPAPROD,
                    QTRETI, IDTPRETEST, VRCUSTPROD
              FROM (SELECT RETIRADAESTO.CDCENTCUST, LOTITRETIEST.DTLANCRETDEV,
                           LOTITRETIEST.CDPRODUTO, PRODUTO.NMPRODUTO, RETIRADAESTO.CDETAPAPROD,
                           DECODE( NVL(V_IDTPCALCCUSPROD, '1'), '1', ROUND(LOTITRETIEST.QTRETLIQPROD, 5), ROUND(ITEMRETIEST.QTPRERETPROD, 5)) AS QTRETI,
                           LOTITRETIEST.IDTPRETEST,
                           ROUND(CUSTO_PRODUTO_LCEST(P_CDFILIAL, ITEMRETIEST.CDPRODUTO, V_TIPOCUSTO,
                                 SYSDATE, SYSDATE, LOTITRETIEST.CDALMOXARIFE, LOTITRETIEST.CDLOCALESTOQ,
                                 LOTITRETIEST.NRLOTEESTQ, LOTITRETIEST.NRSUBLOTE), 5) AS VRCUSTPROD
                      FROM
                         PRODUTO, RETIRADAESTO, ITEMRETIEST, LOTITRETIEST, PARAMAN
                     WHERE
                        RETIRADAESTO.CDFILIAL      = P_CDFILIAL                AND
                        RETIRADAESTO.NRORDPROD     = P_NRORDPROD               AND
                        RETIRADAESTO.NRSUBORDPROD  = P_NRSUBORDPROD            AND
                        RETIRADAESTO.CDFILIAL      = ITEMRETIEST.CDFILIAL      AND
                        RETIRADAESTO.NRRETEST      = ITEMRETIEST.NRRETEST      AND
                        ITEMRETIEST.CDFILIAL       = LOTITRETIEST.CDFILIAL     AND
                        ITEMRETIEST.NRRETEST       = LOTITRETIEST.NRRETEST     AND
                        ITEMRETIEST.NRSEQRETPROD   = LOTITRETIEST.NRSEQRETPROD AND
                        ITEMRETIEST.CDPRODUTO      = LOTITRETIEST.CDPRODUTO    AND
                        RETIRADAESTO.CDFILIAL      = PARAMAN.CDFILIAL          AND
                        (((ITEMRETIEST.CDPRODUTO <> PARAMAN.CDPRODAGUA)        OR 
                          (PARAMAN.CDPRODAGUA IS NULL))                        AND
                           ITEMRETIEST.CDPRODUTO NOT IN (SELECT CDPRODUTO
                                                           FROM MULTPRODUTOS
                                                          WHERE CDFILIAL = P_CDFILIAL)) AND 
                        
                        ITEMRETIEST.CDPRODUTO      = PRODUTO.CDPRODUTO         AND
                        ITEMRETIEST.CDTIPORETI     NOT IN (SELECT CDTIPORETI
                                                            FROM TIPORETI
                                                           WHERE (CDFUNCUSTO = '099'))
                    UNION

                    SELECT RETIRADAESTO.CDCENTCUST, ITEMRETIEST.DTRETPROD,
                           ITEMRETIEST.CDPRODUTO, PRODUTO.NMPRODUTO, RETIRADAESTO.CDETAPAPROD,
                           ROUND(ITEMRETIEST.QTPRERETPROD, 5) AS QTRETI,
                           'R' AS IDTPRETEST,
                           (((ROUND(ITEMRETIEST.QTPRERETPROD, 5) / 1000) * PM.VRPRODAGUA) / ITEMRETIEST.QTPRERETPROD) AS VRCUSTOPROD
                      FROM PRODUTO, RETIRADAESTO, ITEMRETIEST, PARAMAN PM
                     WHERE RETIRADAESTO.CDFILIAL      = P_CDFILIAL
                       AND RETIRADAESTO.NRORDPROD     = P_NRORDPROD
                       AND RETIRADAESTO.NRSUBORDPROD  = P_NRSUBORDPROD
                       AND RETIRADAESTO.CDFILIAL      = ITEMRETIEST.CDFILIAL
                       AND RETIRADAESTO.NRRETEST      = ITEMRETIEST.NRRETEST
                       AND ITEMRETIEST.CDPRODUTO      = PRODUTO.CDPRODUTO
                       AND ITEMRETIEST.CDFILIAL       = PM.CDFILIAL
                       AND ITEMRETIEST.CDPRODUTO      = PM.CDPRODAGUA
                       AND PM.IDPRODUTOUNICO          = 'S'
                       AND ITEMRETIEST.CDTIPORETI     NOT IN (SELECT CDTIPORETI
                                                                FROM TIPORETI
                                                               WHERE (CDFUNCUSTO = '099')
                                                              )
                    UNION

                    SELECT RETIRADAESTO.CDCENTCUST, ITEMRETIEST.DTRETPROD,
                           ITEMRETIEST.CDPRODUTO, PRODUTO.NMPRODUTO, RETIRADAESTO.CDETAPAPROD,
                           ROUND(ITEMRETIEST.QTPRERETPROD, 5) AS QTRETI,
                           'R' AS IDTPRETEST,
                           (((ROUND(ITEMRETIEST.QTPRERETPROD, 5) / 1000) * MP1.VRPRODAGUA) / ITEMRETIEST.QTPRERETPROD) AS VRCUSTOPROD
                      FROM PRODUTO, RETIRADAESTO, ITEMRETIEST, PARAMAN PM, MULTPRODUTOS MP1
                     WHERE RETIRADAESTO.CDFILIAL      = P_CDFILIAL
                       AND RETIRADAESTO.NRORDPROD     = P_NRORDPROD
                       AND RETIRADAESTO.NRSUBORDPROD  = P_NRSUBORDPROD
                       AND RETIRADAESTO.CDFILIAL      = ITEMRETIEST.CDFILIAL
                       AND RETIRADAESTO.NRRETEST      = ITEMRETIEST.NRRETEST
                       AND ITEMRETIEST.CDPRODUTO      = PRODUTO.CDPRODUTO
                       AND RETIRADAESTO.CDFILIAL      = PM.CDFILIAL
                       AND ITEMRETIEST.CDPRODUTO      IN (SELECT CDPRODUTO
                                                            FROM MULTPRODUTOS MP2
                                                           WHERE CDFILIAL = P_CDFILIAL
                                                             AND MP2.CDPRODUTO = MP1.CDPRODUTO
                                                             AND MP2.CDFILIAL = MP1.CDFILIAL)
                       AND PM.IDMULTPRODUTOS          = 'S'
                       AND ITEMRETIEST.CDFILIAL       = MP1.CDFILIAL
                       AND ITEMRETIEST.CDTIPORETI     NOT IN (SELECT CDTIPORETI
                                                                FROM TIPORETI
                                                               WHERE (CDFUNCUSTO = '099')
                                                              )
                   )
             )
         LOOP

            V_SEQUCUSTO := V_SEQUCUSTO + 1;

            IF C_RETIRADA.IDTPRETEST = 'D' THEN
               C_RETIRADA.QTRETI := C_RETIRADA.QTRETI * -1;
            END IF;

            INSERT INTO APRCUSTOP
               (CDFILIAL,
                NRORDPROD,
                NRSUBORDPROD,
                CDETAPAPROD,
                CDPRODUTO,
                NRAPRCUSTOP,
                CDCUSTOINDI,
                CDFUNCUSTO,
                NRLOTEESTQ,
                NRSUBLOTE,
                CDAPRCUSTOP,
                NMAPRCUSTOP,
                QTAPRCUSTOP,
                VRAPRCUSTOP,
                CDCENTCUST,
                DTLANCRETDEV)
            VALUES
               (P_CDFILIAL,
                P_NRORDPROD,
                P_NRSUBORDPROD,
                C_RETIRADA.CDETAPAPROD,
                P_CDPRODUTO,  /* Produto de Producao */
                LPAD(V_SEQUCUSTO, 10, '0'),
                V_CDCUSTOINDI,
                '001',
                P_NRLOTEESTQ,
                P_NRSUBLOTE,
                C_RETIRADA.CDPRODUTO, /* Materia Prima / Insumos */
                C_RETIRADA.NMPRODUTO,
                C_RETIRADA.QTRETI,
                C_RETIRADA.VRCUSTPROD,
                C_RETIRADA.CDCENTCUST,
                C_RETIRADA.DTLANCRETDEV);

         END LOOP;
      END IF;

      SELECT MAX(CDCUSTOINDI) INTO V_CDCUSTOINDI
                FROM CUSTOINDI
                WHERE CDFUNCUSTO = '099';

   /* Perdas da Producao  */

      IF NOT V_CDCUSTOINDI IS NULL THEN

         FOR C_PERDAS IN
            (SELECT
                P.CDPRODPERDA,
                PROD.NMPRODUTO,
                PROD.SGUNIDADE,
                P.CDETAPAPROD,
                ROUND(P.QTPERDAOP, 5) AS QTPERDAOP,
                P.CDTIPOPERDA,
                P.SGUNIDADE AS SGUNIDADIC,
                ROUND(CUSTO_PRODUTO(P_CDFILIAL, P.CDPRODPERDA, V_TIPOCUSTO, SYSDATE, SYSDATE), 5) AS VRCUSTPROD
             FROM
                PRODUTO PROD,
                PERDAOP P
             WHERE
               P.CDFILIAL     = P_CDFILIAL     AND
               P.NRORDPROD    = P_NRORDPROD    AND
               P.NRSUBORDPROD = P_NRSUBORDPROD AND
               P.CDPRODPERDA  = PROD.CDPRODUTO
         ) LOOP

            IF NOT C_PERDAS.SGUNIDADIC IS NULL THEN
               IF (C_PERDAS.SGUNIDADIC <> C_PERDAS.SGUNIDADE) THEN

                  /* Verifica o fator de conversao (caso possua unidade adicional) */

                  SELECT
                     MIN(VRFATOCONVES)
                  INTO
                     V_VRFATOCONVES
                  FROM
                     (SELECT
                         VRFATOCONVES
                      FROM CONVPRODUTO
                      WHERE
                         (CDPRODUTO = C_PERDAS.CDPRODPERDA) AND
                         (SGUNIDADE = C_PERDAS.SGUNIDADIC)

                      UNION ALL

                      SELECT
                          VRFTCONVER VRFATOCONVES
                      FROM
                         CONVUNID
                      WHERE
                         (SGUNIDPARA = C_PERDAS.SGUNIDADE)  AND
                         (SGUNIDDE   = C_PERDAS.SGUNIDADIC) AND
                         (NOT EXISTS(SELECT
                                        SGUNIDADE
                                     FROM
                                        CONVPRODUTO
                                     WHERE
                                       (CDPRODUTO = C_PERDAS.CDPRODPERDA) AND
                                       (SGUNIDADE = SGUNIDDE)
                                    ))
                     );


                  V_QTPERDAOP := C_PERDAS.QTPERDAOP * V_VRFATOCONVES;
               END IF;
            ELSE
               V_QTPERDAOP := C_PERDAS.QTPERDAOP;
            END IF;

            V_SEQUCUSTO := V_SEQUCUSTO + 1;

            INSERT INTO APRCUSTOP
               (CDFILIAL    ,
                NRORDPROD   ,
                NRSUBORDPROD,
                CDETAPAPROD ,
                CDPRODUTO   ,
                NRAPRCUSTOP ,
                CDCUSTOINDI ,
                CDFUNCUSTO  ,
                NRLOTEESTQ  ,
                NRSUBLOTE   ,
                CDAPRCUSTOP ,
                NMAPRCUSTOP ,
                QTAPRCUSTOP ,
                VRAPRCUSTOP ,
                CDTIPOPERDA)
            VALUES
               (P_CDFILIAL           ,
                P_NRORDPROD          ,
                P_NRSUBORDPROD       ,
                C_PERDAS.CDETAPAPROD ,
                P_CDPRODUTO          ,
                LPAD(V_SEQUCUSTO, 10, '0'),
                V_CDCUSTOINDI        ,
                '099'                ,
                P_NRLOTEESTQ         ,
                P_NRSUBLOTE          ,
                C_PERDAS.CDPRODPERDA ,
                C_PERDAS.NMPRODUTO   ,
                V_QTPERDAOP          ,
                C_PERDAS.VRCUSTPROD  ,
                C_PERDAS.CDTIPOPERDA);
         END LOOP; /* Perda */
      END IF;
   END IF;   
END;