create or replace PROCEDURE RECALCULA_PEDIDO_EXP(P_CDFILIAL IN VARCHAR2,
                                                  P_NRLANCTONF IN VARCHAR2)
IS
    V_IDSITITEMPED  ITEMPEDIDO.IDSITITEMPED%TYPE;
    V_QTEXPITEMPED  ITEMPEDIDO.QTEXPITEMPED%TYPE;
    V_QTITEMPED     ITEMPEDIDO.QTITEMPED%TYPE;
    V_VRPELIQEXP    PAREXPEDICAO.VRPELIQEXP%TYPE;
    V_NRITENS       INTEGER;
    V_CDOPERADOR    OPERADOR.CDOPERADOR%TYPE;
    V_VRFATOCONV    PRODUTO.VRFATOCONV%TYPE;
    V_QTEXPEDGERAL  ITEMPRODUTO.QTITEMPROD%TYPE;
    V_QTITEMPROD    ITEMPRODUTO.QTITEMPROD%TYPE;
    V_IDGERPRODEST  PAREXPEDICAO.IDGERPRODEST%TYPE;

BEGIN

    FOR C_ITEMPRODUTO IN(
        SELECT I.CDFILIAL, I.NRLANCTONF,
               I.CDFILIALPED, I.NRPEDIDO, I.NRITEMPED,
               SUM(I.QTITEMPROD) QTITEMPROD
         FROM NOTAFISCAL NF, ITEMPRODUTO I
        WHERE NF.CDFILIAL   = I.CDFILIAL
          AND NF.NRLANCTONF = I.NRLANCTONF
          AND I.CDFILIAL    = P_CDFILIAL
          AND I.NRLANCTONF  = P_NRLANCTONF
          GROUP BY
          I.CDFILIAL,I.NRLANCTONF,
          I.CDFILIALPED, I.NRPEDIDO, I.NRITEMPED
    )LOOP

        IF ((NOT (C_ITEMPRODUTO.CDFILIALPED  IS NULL)) AND
           (NOT  (C_ITEMPRODUTO.NRPEDIDO     IS NULL)) AND
           (NOT  (C_ITEMPRODUTO.NRITEMPED    IS NULL))) THEN

            SELECT MAX(I.IDSITITEMPED),MAX(I.QTEXPITEMPED),MAX(I.QTITEMPED),MAX(P.VRPELIQEXP)
             INTO V_IDSITITEMPED,V_QTEXPITEMPED,V_QTITEMPED,V_VRPELIQEXP
             FROM ITEMPEDIDO I, PAREXPEDICAO P
             WHERE ((C_ITEMPRODUTO.CDFILIALPED = I.CDFILIAL)    AND
                    (C_ITEMPRODUTO.NRPEDIDO    = I.NRPEDIDO)    AND
                    (C_ITEMPRODUTO.NRITEMPED   = I.NRITEMPED)   AND
                    (C_ITEMPRODUTO.CDFILIALPED = P.CDFILIAL));

            BEGIN
                SELECT  COUNT(*)
                  INTO V_NRITENS
                  FROM ITEMPEDIDO
                 WHERE (CDFILIAL     =  C_ITEMPRODUTO.CDFILIALPED)
                   AND (NRPEDIDO     =  C_ITEMPRODUTO.NRPEDIDO)
                   AND (NRITEMPED    <> C_ITEMPRODUTO.NRITEMPED)
                   AND (IDSITITEMPED IN ('1','2','3','7'));
            EXCEPTION
            WHEN NO_DATA_FOUND THEN
                V_NRITENS := 0;
            END;

            BEGIN
                SELECT MAX(CDOPERADOR)
                INTO V_CDOPERADOR
                FROM ITEMPEDIDO
                WHERE CDFILIAL = C_ITEMPRODUTO.CDFILIALPED AND
                    NRPEDIDO   = C_ITEMPRODUTO.NRPEDIDO AND
                    NRITEMPED  = C_ITEMPRODUTO.NRITEMPED;
            EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_CDOPERADOR := '';
            END;

            BEGIN
              SELECT IDGERPRODEST
              INTO V_IDGERPRODEST /*Produto do PEDIDO*/
              FROM PAREXPEDICAO
              WHERE CDFILIAL = C_ITEMPRODUTO.CDFILIALPED;
            EXCEPTION
              WHEN NO_DATA_FOUND THEN
                 V_IDGERPRODEST := '1';
            END;

            BEGIN
            SELECT NVL(SUM(QTITEMPROD),0)
              INTO V_QTEXPEDGERAL
              FROM ITEMPRODUTO
              WHERE CDFILIAL   =  C_ITEMPRODUTO.CDFILIAL
                AND NRLANCTONF <> C_ITEMPRODUTO.NRLANCTONF
                AND NRPEDIDO   =  C_ITEMPRODUTO.NRPEDIDO
                AND NRITEMPED  =  C_ITEMPRODUTO.NRITEMPED;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    V_QTEXPEDGERAL := 0;
            END;

            IF (V_IDGERPRODEST = '1') THEN

                IF ((C_ITEMPRODUTO.QTITEMPROD + V_QTEXPEDGERAL) >= V_QTITEMPED) THEN

                    UPDATE ITEMPEDIDO
                    SET  QTEXPITEMPED = V_QTITEMPED
                    WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)   AND
                       (C_ITEMPRODUTO.NRPEDIDO    = NRPEDIDO)   AND
                       (C_ITEMPRODUTO.NRITEMPED   = NRITEMPED));
                ELSE

                    UPDATE ITEMPEDIDO
                    SET QTEXPITEMPED = C_ITEMPRODUTO.QTITEMPROD + V_QTEXPEDGERAL
                    WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL) AND
                      (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO) AND
                      (C_ITEMPRODUTO.NRITEMPED    = NRITEMPED));

                END IF;
            ELSE

                IF (V_IDGERPRODEST = '2') THEN

                    BEGIN
                        SELECT MAX(A.VRFATOCONV)
                        INTO V_VRFATOCONV
                        FROM PRODUTO A, ITEMPEDIDO I
                        WHERE ((A.CDPRODUTO      = I.CDPRODUTO) AND
                              (C_ITEMPRODUTO.CDFILIALPED = I.CDFILIAL ) AND
                              (C_ITEMPRODUTO.NRPEDIDO    = I.NRPEDIDO ) AND
                              (C_ITEMPRODUTO.NRITEMPED   = I.NRITEMPED));
                    EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                      V_VRFATOCONV := '';
                    END;

                    IF V_VRFATOCONV IS NULL THEN
                        V_VRFATOCONV := 0;
                    END IF;

                    IF (V_VRFATOCONV <> 0) THEN


                        IF (( (C_ITEMPRODUTO.QTITEMPROD / V_VRFATOCONV) + V_QTEXPEDGERAL) >= V_QTITEMPED) THEN

                            UPDATE ITEMPEDIDO
                               SET QTEXPITEMPED = (V_QTITEMPED / V_VRFATOCONV)
                            WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)   AND
                                   (C_ITEMPRODUTO.NRPEDIDO    = NRPEDIDO)   AND
                                   (C_ITEMPRODUTO.NRITEMPED   = NRITEMPED));
                        ELSE

                            UPDATE ITEMPEDIDO
                              SET QTEXPITEMPED = (C_ITEMPRODUTO.QTITEMPROD / V_VRFATOCONV) + V_QTEXPEDGERAL
                            WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL) AND
                                  (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO) AND
                                  (C_ITEMPRODUTO.NRITEMPED    = NRITEMPED));
                        END IF;
                    ELSE

                        IF ((C_ITEMPRODUTO.QTITEMPROD + V_QTEXPEDGERAL) >= V_QTITEMPED) THEN
                          UPDATE ITEMPEDIDO
                          SET QTEXPITEMPED = V_QTITEMPED
                          WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)    AND
                                 (C_ITEMPRODUTO.NRPEDIDO    = NRPEDIDO)    AND
                                 (C_ITEMPRODUTO.NRITEMPED   = NRITEMPED));
                        ELSE

                           UPDATE ITEMPEDIDO
                              SET QTEXPITEMPED = (C_ITEMPRODUTO.QTITEMPROD / V_VRFATOCONV) + V_QTEXPEDGERAL
                            WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL) AND
                                  (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO) AND
                                  (C_ITEMPRODUTO.NRITEMPED    = NRITEMPED));

                        END IF;

                    END IF;
                ELSE

                    UPDATE ITEMPEDIDO
                    SET QTEXPITEMPED = 0
                    WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)    AND
                           (C_ITEMPRODUTO.NRPEDIDO    = NRPEDIDO)    AND
                           (C_ITEMPRODUTO.NRITEMPED   = NRITEMPED));
                END IF;
            END IF;

            IF ((C_ITEMPRODUTO.QTITEMPROD + V_QTEXPEDGERAL) >= V_QTITEMPED) THEN

             UPDATE ITEMPEDIDO
                   SET IDSITITEMPED = '4'
                WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)   AND
                       (C_ITEMPRODUTO.NRPEDIDO    = NRPEDIDO)   AND
                       (C_ITEMPRODUTO.NRITEMPED   = NRITEMPED));

                IF V_NRITENS  = 0 THEN
                    /*Se não há outros itens sem liquidação, modifica o PEDIDO para LIQUIDADO*/
                    UPDATE PEDIDO
                       SET IDSITPEDIDO = '3'
                     WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)AND
                           (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO));
                ELSE
                   /*Como há outros itens no pedido não liquidados, modifica o PEDIDO para PARCIALMENTE ATENDIDO*/
                    UPDATE PEDIDO
                       SET IDSITPEDIDO = '6'
                     WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL) AND
                           (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO));
                END IF;
            ELSE
                UPDATE ITEMPEDIDO
                  SET IDSITITEMPED = '7'
                WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL) AND
                      (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO) AND
                      (C_ITEMPRODUTO.NRITEMPED    = NRITEMPED));

                UPDATE PEDIDO
                  SET IDSITPEDIDO = '6'
                WHERE ((C_ITEMPRODUTO.CDFILIALPED = CDFILIAL)AND
                      (C_ITEMPRODUTO.NRPEDIDO     = NRPEDIDO));

            END IF;
        END IF;
    END LOOP;
END;

/