CREATE OR REPLACE PROCEDURE NF_BAIXA_AF(
  	P_CDFILIAL      IN  NOTAFISCAL.CDFILIAL%TYPE,
	P_NRLANCTONF    IN  NOTAFISCAL.NRLANCTONF%TYPE,
   P_NRSEQITPROD   IN  ITEMPRODUTO.NRSEQITPROD%TYPE,
   P_IDSTATUS      IN  VARCHAR2,
   P_NEWCDPRODEMIS IN  ITEMPRODUTO.CDPRODEMIS%TYPE,
   P_OLDCDPRODEMIS IN  ITEMPRODUTO.CDPRODEMIS%TYPE,
   P_NEWCDPRODUTO  IN  ITEMPRODUTO.CDPRODUTO%TYPE,
   P_OLDCDPRODUTO  IN  ITEMPRODUTO.CDPRODUTO%TYPE,
   P_NEWCDMARCA    IN  ITEMPRODUTO.CDMARCA%TYPE,
   P_OLDCDMARCA    IN  ITEMPRODUTO.CDMARCA%TYPE,
   P_NEWQTITEMPROD IN  ITEMPRODUTO.QTITEMPROD%TYPE,
   P_OLDQTITEMPROD IN  ITEMPRODUTO.QTITEMPROD%TYPE,
 	P_IDERRO        OUT VARCHAR2)
IS
   V_DTENTRSAID   NOTAFISCAL.DTENTRSAID%TYPE;
   V_IDBAIXAAF    AUTOFORNE.IDBAIXAAF%TYPE;
   V_IDBAIXITMAF  ITEMAUTF.IDBAIXITMAF%TYPE;

   V_TOTALITEM    NUMBER;
   V_BAIXATOTAL   NUMBER;
   V_BAIXAMANUAL  NUMBER;
   V_EMABERTO     NUMBER;
   V_BAIXAPARCIAL NUMBER;
   V_VRFATOCONV   NUMBER;

   V_IDENTRSAIDOP NOTAFISCAL.IDENTRSAIDOP%TYPE;
   V_CDFILIEMIT   NOTAFISCAL.CDFILIEMIT%TYPE;
   V_CDFILIRECE   NOTAFISCAL.CDFILIRECE%TYPE;
   V_NRSOLICMP    NFRELACSOLI.NRSOLICMP%TYPE;

   V_CDPRODCNV    CNVPRODUNEST.CDPRUNEST%TYPE;
   V_VRFATUNEST   CNVPRODUNEST.VRFATUNEST%TYPE;

   V_QTRESTNF     NUMBER; --QUANTIDADE QUE IRA AUMENTAR OU DIMINUIR NA BAIXA DAS AFS
   V_QTBAIXAAF    NUMBER; --QUANTIDADE NECESSARIA PARA COMPLETAR A BAIXA DO ITEM DA AF
   V_QTUPITEMAF   NUMBER; --QUANTIDADE QUE SERA AUMENTADA OU DIMINUIDA DA BAIXA DO ITEM DA AF
   V_QTNEWREST    NUMBER; --QUANTIDADE DO PRODUTO NA NOTA FISCAL REDUZIDA DAS BAIXAS EFETUADAS.
   V_QTJABAIXNF   NUMBER; --QUANTIDADE DO PRODUTO JA BAIXADA EM OUTRAS NOTAS FISCAIS

   V_QTEFETENTRAF ITEMAUTF.QTEFETENTRAF%TYPE;

   V_PRODUTO      ITEMAUTF.CDPRODUTO%TYPE;
   V_CDPRODEMIS   ITEMAUTF.CDPRODUTO%TYPE;
   V_NRLANCTONF   ITEMAUTF.NRLANCTONF%TYPE;
   V_MAXPRODUTO   ITEMAUTF.CDPRODUTO%TYPE;

   C_CDFILDEST    ITEMAUTF.CDFILDEST%TYPE;
   C_CDFILLANC    ITEMAUTF.CDFILLANC%TYPE;
   C_NRAUTOFORN   ITEMAUTF.NRAUTOFORN%TYPE;
   C_CDMARCA      ITEMAUTF.CDMARCA%TYPE;
   C_CDPRODUTO    ITEMAUTF.CDPRODUTO%TYPE;
   C_DTPROGENTAF  ITEMAUTF.DTPROGENTAF%TYPE;
   C_QTPROGENTAF  ITEMAUTF.QTPROGENTAF%TYPE;
   C_QTEFETENTRAF ITEMAUTF.QTEFETENTRAF%TYPE;
   C_IDBAIXITMAF  ITEMAUTF.IDBAIXITMAF%TYPE;
   C_IDUTILITEM   VARCHAR2(1);
   V_QTITEMPROD   ITEMPRODUTO.QTITEMPROD%TYPE;

   C_CDFILIAL     NOTAFISCAL.CDFILIAL%TYPE;
   C_NRLANCTONF   NOTAFISCAL.NRLANCTONF%TYPE;
   C_QTNFEFETAF   NFRELACAF.QTNFEFETAF%TYPE;

   V_IDBLOQNFSAF  PARAMCMPPROD.IDBLOQNFSAF%TYPE;

   V_CDFILIRECEO  FILIAL.CDFILIAL%TYPE;
   V_CDARVPRODO   PRODUTO.CDARVPROD%TYPE;

   V_CDTIPOOPERO  TIPOOPERAC.CDTIPOOPER%TYPE;

   V_QTJABAIXADA  NUMBER;

   V_IDUTILDTPROC    CHAR(1);
   V_IDBAIXITMFUTURA CHAR(1);
   V_DTPROCESSA      DATE;
   V_CDMARCA         VARCHAR2(5);

   CURSOR C_ITEMAUF_INSERT IS
      SELECT
         ITEMAUTF.CDFILDEST,
         ITEMAUTF.CDFILLANC,
         ITEMAUTF.NRAUTOFORN,
         ITEMAUTF.CDMARCA,
         ITEMAUTF.CDPRODUTO,
         ITEMAUTF.DTPROGENTAF,
         ITEMAUTF.QTPROGENTAF,
         NVL(ITEMAUTF.QTEFETENTRAF, 0) AS QTEFETENTRAF,
         ITEMAUTF.IDBAIXITMAF,
         NFRELACAF.CDFILIAL,
         NFRELACAF.NRLANCTONF
      FROM
         ITEMAUTF,
         NFRELACAF
      WHERE
         NFRELACAF.CDFILIAL    = P_CDFILIAL           AND
         NFRELACAF.NRLANCTONF  = P_NRLANCTONF         AND
         NFRELACAF.CDFILDEST   = ITEMAUTF.CDFILDEST   AND
         NFRELACAF.CDFILLANC   = ITEMAUTF.CDFILLANC   AND
         NFRELACAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN  AND
         NFRELACAF.CDMARCA     = ITEMAUTF.CDMARCA     AND
         NFRELACAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO   AND
         NFRELACAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF AND
         ((NFRELACAF.CDMARCA   = V_CDMARCA) OR (V_CDMARCA = 'T')) AND
         NFRELACAF.CDPRODUTO   = V_PRODUTO
      ORDER BY
         1, 2, 6, 3;

   CURSOR C_ITEMAUF IS
      SELECT
         ITEMAUTF.CDFILDEST,
         ITEMAUTF.CDFILLANC,
         ITEMAUTF.NRAUTOFORN,
         ITEMAUTF.CDMARCA,
         ITEMAUTF.CDPRODUTO,
         ITEMAUTF.DTPROGENTAF,
         ITEMAUTF.QTPROGENTAF,
         NVL(ITEMAUTF.QTEFETENTRAF, 0) AS QTEFETENTRAF,
         ITEMAUTF.IDBAIXITMAF,
         NFRELACAF.CDFILIAL,
         NFRELACAF.NRLANCTONF,
         NFRELACAF.QTNFEFETAF
      FROM
         ITEMAUTF,
         NFRELACAF
      WHERE
         NFRELACAF.CDFILIAL    = P_CDFILIAL           AND
         NFRELACAF.NRLANCTONF  = P_NRLANCTONF         AND
         NFRELACAF.CDFILDEST   = ITEMAUTF.CDFILDEST   AND
         NFRELACAF.CDFILLANC   = ITEMAUTF.CDFILLANC   AND
         NFRELACAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN  AND
         NFRELACAF.CDMARCA     = ITEMAUTF.CDMARCA     AND
         NFRELACAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO   AND
         NFRELACAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF AND
         ((NFRELACAF.CDMARCA     = V_CDMARCA) OR (V_CDMARCA = 'T')) AND
         NFRELACAF.CDPRODUTO   = V_PRODUTO
      ORDER BY
         1, 2, 6 DESC, 3 DESC;

BEGIN
   P_IDERRO := 'N';

   IF LENGTH(NVL(P_OLDCDMARCA, P_NEWCDMARCA)) <> 5 THEN
      V_CDMARCA := 'T';
   ELSE
      V_CDMARCA := NVL(P_OLDCDMARCA, P_NEWCDMARCA);
   END IF;

   BEGIN
     SELECT NVL(IDUTILDTPROC, 'N')
     INTO V_IDUTILDTPROC
     FROM PARAMGERAL;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN BEGIN
       V_IDUTILDTPROC:= 'N';
     END;
   END;

   BEGIN
      SELECT N.CDTIPOOPER, N.CDFILIRECE, P.CDARVPROD
        INTO V_CDTIPOOPERO, V_CDFILIRECEO, V_CDARVPRODO
        FROM NOTAFISCAL N, ITEMPRODUTO I, PRODUTO P
       WHERE N.CDFILIAL     = P_CDFILIAL
         AND N.NRLANCTONF   = P_NRLANCTONF
         AND I.CDFILIAL     = N.CDFILIAL
         AND I.NRLANCTONF   = N.NRLANCTONF
         AND I.NRSEQITPROD  = P_NRSEQITPROD
         AND P.CDPRODUTO    = I.CDPRODUTO
         AND N.IDORIGDESTNF = 'F'
         AND NOT EXISTS (SELECT CDFILIAL
                           FROM NFRELACAF R, PRODUTO P1
                          WHERE R.CDFILIAL    = I.CDFILIAL
                            AND R.NRLANCTONF  = I.NRLANCTONF
                            AND R.CDPRODUTO   = P1.CDPRODUTO
                            AND P1.CDPRODESTO = P.CDPRODESTO);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_CDTIPOOPERO := NULL;
         V_CDFILIRECEO := NULL;
         V_CDARVPRODO  := NULL;
      END;
   END;

   IF (V_CDARVPRODO IS NOT NULL) THEN
      /* Verificacao de produtos oriundos da AF */
      IF (P_IDSTATUS = 'I') THEN
         V_IDBLOQNFSAF := NULL;
         V_MAXPRODUTO  := NULL;

         BEGIN
            SELECT MAX(CDPRODUTO)
              INTO V_MAXPRODUTO
              FROM PARAMCMPPROD
             WHERE CDFILIAL = V_CDFILIRECEO
               AND INSTR(V_CDARVPRODO, CDPRODUTO) = 1;
         EXCEPTION
            When No_Data_Found Then
               V_MAXPRODUTO := NULL;
         END;

         IF (V_MAXPRODUTO IS NOT NULL) THEN
            BEGIN
               SELECT IDBLOQNFSAF
                 INTO V_IDBLOQNFSAF
                 FROM PARAMCMPPROD
                WHERE CDFILIAL  = V_CDFILIRECEO
                  AND CDPRODUTO = V_MAXPRODUTO;
            EXCEPTION
               When No_Data_Found Then
                  V_IDBLOQNFSAF := NULL;
            END;
         END IF;   

         /* Se o produto da nota fiscal necessitar ser oriundo de AF e nao possuir relacionamento com a AF
            sera retornado erro */

         IF V_IDBLOQNFSAF = 'S' THEN
            P_IDERRO := 'S';
         END IF;
      END IF;
   END IF;

   IF P_IDERRO <> 'S' THEN

      IF P_IDSTATUS = 'I' THEN -- SE ESTIVER INSERINDO UM ITEM DA NF
         SELECT
            MAX(CDPRODUTO) INTO V_CDPRODEMIS
         FROM
            PRODUTO
         WHERE
            CDARVPROD = P_NEWCDPRODEMIS;

         IF P_NEWCDPRODUTO <> V_CDPRODEMIS THEN
            V_PRODUTO := V_CDPRODEMIS;
         ELSE
            V_PRODUTO := P_NEWCDPRODUTO;
         END IF;
      END IF;

      IF P_IDSTATUS = 'A' THEN
         SELECT
            MAX(CDPRODUTO) INTO V_CDPRODEMIS
         FROM
            PRODUTO
         WHERE
            CDARVPROD = P_OLDCDPRODEMIS;

         IF P_OLDCDPRODUTO <> V_CDPRODEMIS THEN
            V_PRODUTO := V_CDPRODEMIS;
         ELSE
            V_PRODUTO := P_OLDCDPRODUTO;
         END IF;
         IF V_PRODUTO IS NULL THEN
            SELECT
               MAX(CDPRODUTO) INTO V_CDPRODEMIS
            FROM
               PRODUTO
            WHERE
               CDARVPROD = P_NEWCDPRODEMIS;

            IF P_NEWCDPRODUTO <> V_CDPRODEMIS THEN
               V_PRODUTO := V_CDPRODEMIS;
            ELSE
               V_PRODUTO := P_NEWCDPRODUTO;
            END IF;
         END IF;
      END IF;

      IF P_IDSTATUS = 'E' THEN
         SELECT
            MAX(CDPRODUTO) INTO V_CDPRODEMIS
         FROM
            PRODUTO
         WHERE
            CDARVPROD = P_OLDCDPRODEMIS;

         IF P_OLDCDPRODUTO <> V_CDPRODEMIS THEN
            V_PRODUTO := V_CDPRODEMIS;
         ELSE
            V_PRODUTO := P_OLDCDPRODUTO;
         END IF;
      END IF;

      SELECT
        MAX(DTENTRSAID),
        MAX(IDENTRSAIDOP),
        MAX(CDFILIEMIT),
        MAX(CDFILIRECE) INTO V_DTENTRSAID,
                             V_IDENTRSAIDOP,
                             V_CDFILIEMIT,
                             V_CDFILIRECE
      FROM NOTAFISCAL
      WHERE CDFILIAL = P_CDFILIAL
        AND NRLANCTONF = P_NRLANCTONF;

      IF V_IDENTRSAIDOP = 'E' THEN
         IF P_IDSTATUS = 'I' THEN   -- SE ESTIVER INSERINDO UM ITEM DA NF
            V_QTRESTNF   := P_NEWQTITEMPROD;
            V_QTITEMPROD := P_NEWQTITEMPROD;
         END IF;
         IF P_IDSTATUS = 'A' THEN
            V_QTRESTNF   := P_NEWQTITEMPROD - P_OLDQTITEMPROD;
            V_QTITEMPROD := P_NEWQTITEMPROD - P_OLDQTITEMPROD;
         END IF;
         IF P_IDSTATUS = 'E' THEN
            V_QTRESTNF   := - P_OLDQTITEMPROD;
            V_QTITEMPROD := P_OLDQTITEMPROD;
         END IF;

         IF P_IDSTATUS = 'I' THEN  -- SE ESTIVER INSERINDO UM ITEM DA NF
            OPEN C_ITEMAUF_INSERT;
         ELSE
            OPEN C_ITEMAUF;
         END IF;

         LOOP
            IF P_IDSTATUS = 'I' THEN   -- SE ESTIVER INSERINDO UM ITEM DA NF
               FETCH C_ITEMAUF_INSERT INTO C_CDFILDEST,
                                           C_CDFILLANC,
                                           C_NRAUTOFORN,
                                           C_CDMARCA,
                                           C_CDPRODUTO,
                                           C_DTPROGENTAF,
                                           C_QTPROGENTAF,
                                           C_QTEFETENTRAF,
                                           C_IDBAIXITMAF,
                                           C_CDFILIAL,
                                           C_NRLANCTONF;
               EXIT WHEN C_ITEMAUF_INSERT%NOTFOUND;
            ELSE
               FETCH C_ITEMAUF INTO C_CDFILDEST,
                                    C_CDFILLANC,
                                    C_NRAUTOFORN,
                                    C_CDMARCA,
                                    C_CDPRODUTO,
                                    C_DTPROGENTAF,
                                    C_QTPROGENTAF,
                                    C_QTEFETENTRAF,
                                    C_IDBAIXITMAF,
                                    C_CDFILIAL,
                                    C_NRLANCTONF,
                                    C_QTNFEFETAF;

               EXIT WHEN C_ITEMAUF%NOTFOUND;

               -- Verifica quantidade ja baixada em outras AFs do produto

               V_QTJABAIXADA := 0;

               SELECT NVL(SUM(IT.QTEFETENTRAF), 0)
                 INTO V_QTJABAIXADA
                 FROM ITEMAUTF IT, NFRELACAF NF
                WHERE NF.CDFILIAL = P_CDFILIAL
                  AND NF.NRLANCTONF = P_NRLANCTONF
                  AND NF.CDFILDEST = IT.CDFILDEST
                  AND NF.CDFILLANC = IT.CDFILLANC
                  AND NF.NRAUTOFORN = IT.NRAUTOFORN
                  AND NF.CDMARCA = IT.CDMARCA
                  AND NF.CDPRODUTO = IT.CDPRODUTO
                  AND NF.DTPROGENTAF = IT.DTPROGENTAF
                  AND ((NF.CDMARCA = V_CDMARCA) OR (V_CDMARCA = 'T'))
                  AND NF.CDPRODUTO = P_NEWCDPRODUTO
                  AND (NF.CDFILLANC||NF.CDFILDEST||NF.NRAUTOFORN) <> C_CDFILLANC||C_CDFILDEST||C_NRAUTOFORN;

               V_QTNEWREST := P_NEWQTITEMPROD - V_QTJABAIXADA;

               -- Verifica quantidade ja baixada em outras notas fiscais

               V_QTJABAIXNF := 0;

               SELECT NVL(SUM(IT.QTITEMPROD), 0)
                 INTO V_QTJABAIXNF
                 FROM ITEMPRODUTO IT, NFRELACAF NF
                WHERE NF.CDFILLANC = C_CDFILLANC
                  AND NF.CDFILDEST = C_CDFILDEST
                  AND NF.NRAUTOFORN = C_NRAUTOFORN
                  AND NF.CDPRODUTO = P_NEWCDPRODUTO
                  AND NF.DTPROGENTAF = C_DTPROGENTAF
                  AND IT.CDFILIAL = NF.CDFILIAL
                  AND IT.NRLANCTONF = NF.NRLANCTONF
                  AND IT.CDPRODUTO = NF.CDPRODUTO
                  AND (NF.CDFILIAL||NF.NRLANCTONF) <> P_CDFILIAL||P_NRLANCTONF;

               V_QTNEWREST := V_QTNEWREST + V_QTJABAIXNF;
            END IF;

            V_QTBAIXAAF := C_QTPROGENTAF - C_QTEFETENTRAF;  -- QUNATIDADE NECESSARIA PARA COMPLETAR O CAMPO QTEFETENTRAF

            IF (V_QTRESTNF <> 0) THEN --SE O ITEM NAO ESTA BAIXADO TOTALMENTE E HOVER QUANTIDADE A SER ATUALIZADA NA BAIXA DO...

               V_QTUPITEMAF := V_QTRESTNF;

               IF P_IDSTATUS = 'A' THEN
                  IF V_QTRESTNF > 0 THEN                        /* ################################################ */
                     IF V_QTRESTNF > V_QTBAIXAAF THEN           /* AJUSTE DA QUANTIDATE A SER SOMADA NA BAIXA DA AF */
                        V_QTUPITEMAF := V_QTBAIXAAF;            /* ################################################ */
                     END IF;
                  ELSE
                     IF ((V_QTNEWREST < C_QTEFETENTRAF) AND
                         (C_QTEFETENTRAF <> 0))         THEN

                        IF ABS(C_QTEFETENTRAF-V_QTNEWREST) >= C_QTEFETENTRAF THEN
                           V_QTUPITEMAF := C_QTEFETENTRAF * (-1);
                        ELSE                                                     /* ################################################ */
                           V_QTUPITEMAF := (C_QTEFETENTRAF-V_QTNEWREST) * (-1);  /* AJUSTE DA QUANTIDATE A SER SOMADA NA BAIXA DA AF */
                        END IF;                                                  /* ################################################ */
                     ELSE
                        V_QTUPITEMAF := 0;
                     END IF;
                  END IF;

                  V_QTNEWREST := V_QTNEWREST - V_QTUPITEMAF;
               ELSE
                  IF P_IDSTATUS = 'I' THEN
                     IF V_QTRESTNF > 0 THEN                        /* ################################################ */
                        IF V_QTRESTNF > V_QTBAIXAAF THEN           /* AJUSTE DA QUANTIDATE A SER SOMADA NA BAIXA DA AF */
                           V_QTUPITEMAF := V_QTBAIXAAF;            /* ################################################ */
                        END IF;
                     ELSE                                                    /* ################################################ */
                        IF ABS(V_QTRESTNF) >= C_QTEFETENTRAF THEN   /* AJUSTE DA QUANTIDATE A SER SOMADA NA BAIXA DA AF */
                           V_QTUPITEMAF := (C_QTEFETENTRAF - V_QTJABAIXNF) * (-1);  /* ################################################ */
                        END IF;
                     END IF;
                  ELSE
                     V_QTUPITEMAF := NVL(- C_QTNFEFETAF, 0);  /* ################################################ */
                  END IF;
               END IF;

               V_QTRESTNF := V_QTRESTNF - V_QTUPITEMAF;

               IF ROUND(C_QTPROGENTAF,5) <= ROUND(C_QTEFETENTRAF + V_QTUPITEMAF,5) THEN /* ################################################ */
                  V_IDBAIXITMAF := '2';                                                   /* AJUSTE DO IDENTIFICADOR DE BAIXA DO ITEM DA AF   */
               ELSE
                  V_IDBAIXITMAF := '1';
               END IF;


               IF C_QTEFETENTRAF + V_QTUPITEMAF = 0 THEN
                  V_IDBAIXITMAF := NULL;
                  V_DTENTRSAID  := NULL;
               END IF;

               V_QTEFETENTRAF := C_QTEFETENTRAF + V_QTUPITEMAF;

               IF V_QTEFETENTRAF = 0 THEN
                  V_QTEFETENTRAF := NULL;
               END IF;

               IF V_DTENTRSAID IS NOT NULL THEN
                  BEGIN
                     SELECT DECODE(V_IDUTILDTPROC,'S', NVL(PF.DTPROCESSA, TRUNC(SYSDATE)), TRUNC(SYSDATE)) DTPROCESSA
                       INTO V_DTPROCESSA
                       FROM PARAMFILIAL PF
                      WHERE PF.CDFILIAL = C_CDFILDEST;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN BEGIN
                        V_DTPROCESSA:= V_DTENTRSAID;
                     END;
                  END;
                  IF V_DTENTRSAID > V_DTPROCESSA THEN
                     V_IDBAIXITMFUTURA := 'S';
                  ELSE
                     V_IDBAIXITMFUTURA := 'N';
                  END IF;
               ELSE
                  V_IDBAIXITMFUTURA := 'X';
               END IF;

               IF (P_IDSTATUS = 'I') THEN
                  UPDATE NFRELACAF
                     SET QTNFEFETAF  = (NVL(QTNFEFETAF, 0) + (NVL(V_QTUPITEMAF, 0))),
                         NRSEQITPRODREL = P_NRSEQITPROD
                   WHERE CDFILDEST   = C_CDFILDEST
                     AND CDFILLANC   = C_CDFILLANC
                     AND NRAUTOFORN  = C_NRAUTOFORN
                     AND CDPRODUTO   = C_CDPRODUTO
                     AND CDMARCA     = C_CDMARCA
                     AND DTPROGENTAF = C_DTPROGENTAF
                     AND CDFILIAL    = P_CDFILIAL
                     AND NRLANCTONF  = P_NRLANCTONF;
               END IF;

               IF (P_IDSTATUS = 'A') THEN
                  UPDATE NFRELACAF
                     SET QTNFEFETAF  = (NVL(QTNFEFETAF, 0) + (NVL(V_QTUPITEMAF, 0))),
                         NRSEQITPRODREL = P_NRSEQITPROD
                   WHERE CDFILDEST   = C_CDFILDEST
                     AND CDFILLANC   = C_CDFILLANC
                     AND NRAUTOFORN  = C_NRAUTOFORN
                     AND CDPRODUTO   = C_CDPRODUTO
                     AND CDMARCA     = C_CDMARCA
                     AND DTPROGENTAF = C_DTPROGENTAF
                     AND CDFILIAL    = P_CDFILIAL
                     AND NRLANCTONF  = P_NRLANCTONF;
               END IF;

               UPDATE ITEMAUTF
               SET  IDBAIXITMAF  = V_IDBAIXITMAF,
                    QTEFETENTRAF = V_QTEFETENTRAF,
                    DTEFETENTAF  = V_DTENTRSAID,
                    CDOPERBAIXA  = NULL,
                    DTBAIXITMAF  = NULL,
                    IDBAIXITMFUTURA = V_IDBAIXITMFUTURA
               WHERE
                C_CDFILDEST   = ITEMAUTF.CDFILDEST AND
                C_CDFILLANC   = ITEMAUTF.CDFILLANC AND
                C_NRAUTOFORN  = ITEMAUTF.NRAUTOFORN AND
                C_CDPRODUTO   = ITEMAUTF.CDPRODUTO AND
                C_CDMARCA     = ITEMAUTF.CDMARCA AND
                C_DTPROGENTAF = ITEMAUTF.DTPROGENTAF;

                IF V_IDBAIXITMAF IS NULL THEN
                   IF P_IDSTATUS = 'E' THEN

                      DELETE FROM NFRELACAF
                      WHERE
                       C_CDFILDEST   = CDFILDEST AND
                       C_CDFILLANC   = CDFILLANC AND
                       C_NRAUTOFORN  = NRAUTOFORN AND
                       C_CDPRODUTO   = CDPRODUTO AND
                       C_CDMARCA     = CDMARCA AND
                       C_DTPROGENTAF = DTPROGENTAF AND
                       C_CDFILIAL    = CDFILIAL AND
                       C_NRLANCTONF  = NRLANCTONF;
                   END IF;
                END IF;
            END IF;

            V_TOTALITEM    := 0;
            V_BAIXATOTAL   := 0;
            V_BAIXAMANUAL  := 0;
            V_EMABERTO     := 0;
            V_BAIXAPARCIAL := 0;


            SELECT COUNT(*) INTO V_TOTALITEM -- BUSCA O TOTAL DE ITENS DA AF
            FROM ITEMAUTF
            WHERE
               C_CDFILDEST  = ITEMAUTF.CDFILDEST AND
               C_CDFILLANC  = ITEMAUTF.CDFILLANC AND
               C_NRAUTOFORN = ITEMAUTF.NRAUTOFORN;

            SELECT COUNT(*) INTO V_EMABERTO  -- BUSCA O TOTAL DE ITENS DA AF EM ABERTO
            FROM ITEMAUTF
            WHERE
               C_CDFILDEST  = ITEMAUTF.CDFILDEST AND
               C_CDFILLANC  = ITEMAUTF.CDFILLANC AND
               C_NRAUTOFORN = ITEMAUTF.NRAUTOFORN AND
               ITEMAUTF.IDBAIXITMAF IS NULL;

            SELECT COUNT(*) INTO V_BAIXAPARCIAL -- BUSCA O TOTAL DE ITENS DA AF COM BAIXA PARCIAL
            FROM ITEMAUTF
            WHERE
               C_CDFILDEST  = ITEMAUTF.CDFILDEST AND
               C_CDFILLANC  = ITEMAUTF.CDFILLANC AND
               C_NRAUTOFORN = ITEMAUTF.NRAUTOFORN AND
               ITEMAUTF.IDBAIXITMAF = '1';

            SELECT COUNT(*) INTO V_BAIXATOTAL -- BUSCA O TOTAL DE ITENS DA AF COM BAIXA TOTAL
            FROM ITEMAUTF
            WHERE
               C_CDFILDEST  = ITEMAUTF.CDFILDEST AND
               C_CDFILLANC  = ITEMAUTF.CDFILLANC AND
               C_NRAUTOFORN = ITEMAUTF.NRAUTOFORN AND
               ITEMAUTF.IDBAIXITMAF = '2';

            SELECT COUNT(*) INTO V_BAIXAMANUAL -- BUSCA O TOTAL DE ITENS DA AF COM BAIXA MANUAL
            FROM ITEMAUTF
            WHERE
               C_CDFILDEST  = ITEMAUTF.CDFILDEST AND
               C_CDFILLANC  = ITEMAUTF.CDFILLANC AND
               C_NRAUTOFORN = ITEMAUTF.NRAUTOFORN AND
               ITEMAUTF.IDBAIXITMAF = '3';

            IF V_TOTALITEM = V_EMABERTO THEN
               V_IDBAIXAAF := NULL;  -- AF EM ABERTO
            END IF;
            IF V_TOTALITEM = V_BAIXATOTAL THEN
               V_IDBAIXAAF := '2';   -- AF COM BAIXA TOTAL
            END IF;
            IF V_BAIXAPARCIAL > 0 THEN
               V_IDBAIXAAF := '1';   -- AF COM BAIXA PARCIAL
            END IF;
            IF (V_TOTALITEM = V_BAIXATOTAL + V_BAIXAMANUAL) AND
               (V_BAIXAMANUAL > 0) THEN
               V_IDBAIXAAF := '3';   -- AF COM BAIXA MANUAL
            END IF;
            IF (V_TOTALITEM = V_BAIXATOTAL + V_BAIXAMANUAL + V_EMABERTO) AND
               (V_EMABERTO > 0) AND (V_EMABERTO < V_TOTALITEM) THEN
               V_IDBAIXAAF := '1';   -- AF COM BAIXA PARCIAL
            END IF;

            UPDATE AUTOFORNE  -- ALTERA O ID DE BAIXA DA AF
            SET IDBAIXAAF = V_IDBAIXAAF
            WHERE
               C_CDFILDEST  = AUTOFORNE.CDFILDEST AND
               C_CDFILLANC  = AUTOFORNE.CDFILLANC AND
               C_NRAUTOFORN = AUTOFORNE.NRAUTOFORN;

         END LOOP;

         IF P_IDSTATUS = 'I' THEN   -- SE ESTIVER INSERINDO UM ITEM DA NF
            CLOSE C_ITEMAUF_INSERT;
         ELSE
            CLOSE C_ITEMAUF;
         END IF;
      END IF;
   END IF;
END;
/