create or replace
PROCEDURE ORDENA_INGREDIENTES(
   P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
   P_CDPRODUTO     IN ORDPRODUCAO.CDPRODUTO%TYPE,
   P_CDPRODINSUMO  IN ORDPRODUCAO.CDPRODUTO%TYPE,
   P_IDSEMIACABADO IN VARCHAR2)
IS
   V_CDESPEPROD    VARCHAR2(10);
   V_CDTIPOCOMP    VARCHAR2(03);
   V_EXISTE        INTEGER;
   V_QT            FLOAT;
BEGIN
   IF P_IDSEMIACABADO = 'N' THEN
      DELETE INSUMPROD
      WHERE CDFILIAL = P_CDFILIAL
        AND CDPRODUTO = P_CDPRODUTO;
      V_QT := 1;
   ELSE
      V_QT := NULL;
   END IF;

   SELECT MAX(CDESPEPROD)
     INTO V_CDESPEPROD
     FROM ESPEPROD
    WHERE (CDFILIAL = P_CDFILIAL)
      AND (CDPRODUTO  = P_CDPRODINSUMO)
      AND (DTVALESPEPRO = (SELECT MAX(DTVALESPEPRO)
                             FROM ESPEPROD
                            WHERE (CDFILIAL = P_CDFILIAL)
                              AND (CDPRODUTO  = P_CDPRODINSUMO)
                              AND (DTVALESPEPRO < SYSDATE)));
   IF V_CDESPEPROD IS NULL THEN
      SELECT MAX(E1.CDESPEPROD)
        INTO V_CDESPEPROD
        FROM ESPEPROD E1
       WHERE (E1.CDPRODUTO  = P_CDPRODINSUMO)
         AND (E1.DTVALESPEPRO = (SELECT MAX(E2.DTVALESPEPRO)
                                FROM ESPEPROD E2
                               WHERE (E1.CDFILIAL = E2.CDFILIAL)
                                 AND (E1.CDPRODUTO  = E2.CDPRODUTO)
                                 AND (E2.DTVALESPEPRO < SYSDATE)));
   END IF;

   IF V_CDESPEPROD IS NOT NULL THEN
      SELECT MAX(TCOMPPRO.CDTIPOCOMP)
        INTO V_CDTIPOCOMP
        FROM TCOMPPRO, TIPOCOMP
       WHERE (TCOMPPRO.CDPRODUTO  = P_CDPRODINSUMO )
         AND (TCOMPPRO.CDESPEPROD = V_CDESPEPROD)
         AND (TCOMPPRO.CDTIPOCOMP = TIPOCOMP.CDTIPOCOMP)
         AND IDTCOMPPROC = 'S';

      FOR C_INGREDIENTES IN (SELECT C.CDPRODINSUMO, NVL(I.NMTECNICO, P.NMPRODUTO) AS NMPRODUTO, C.QTINSUMO, C.IDSEMIACCOMP , C.NRORDINSUMO
                               FROM COMPPROD C, PRODUTO P, TIPOINSU T ,  INFADICPROD I
                              WHERE (C.CDPRODUTO    = P_CDPRODINSUMO)
                                AND (C.CDESPEPROD   = V_CDESPEPROD)
                                AND (C.CDTIPOCOMP   = V_CDTIPOCOMP)
                                AND (C.CDPRODINSUMO = P.CDPRODUTO)
                                AND (C.CDPRODINSUMO = I.CDPRODUTO(+))
                                AND (C.CDTIPOINSU = T.CDTIPOINSU(+))
                                AND (NVL(T.IDTPMATERIAL, 'XXX') <> 'E')
                             ORDER BY C.QTINSUMO DESC, NRORDINSUMO)
      LOOP
         SELECT COUNT(1)
           INTO V_EXISTE
           FROM INSUMPROD
          WHERE CDPRODUTO = P_CDPRODUTO
            AND CDPRODINSUMO = C_INGREDIENTES.CDPRODINSUMO;
         IF (C_INGREDIENTES.IDSEMIACCOMP = 'S') THEN
            ORDENA_INGREDIENTES(P_CDFILIAL, P_CDPRODUTO, C_INGREDIENTES.CDPRODINSUMO, 'S');
         ELSE
            IF V_EXISTE = 0 THEN
               INSERT INTO INSUMPROD
               (CDFILIAL, CDPRODUTO, CDPRODINSUMO, NRORDINSUMO, QTINSUMO)
               VALUES
               (P_CDFILIAL, P_CDPRODUTO, C_INGREDIENTES.CDPRODINSUMO, C_INGREDIENTES.NRORDINSUMO, C_INGREDIENTES.QTINSUMO);
            ELSE
               UPDATE INSUMPROD
                  SET QTINSUMO = QTINSUMO + C_INGREDIENTES.QTINSUMO
                WHERE CDFILIAL = P_CDFILIAL
                  AND CDPRODUTO = P_CDPRODUTO
                  AND CDPRODINSUMO = C_INGREDIENTES.CDPRODINSUMO;
            END IF;
         END IF;
      END LOOP;
   END IF;
END;
/