-- ========================================================================
-- TABLE: TRABNECECOMP 
-- ========================================================================
CREATE TABLE ITEMSOLIRELACAF (
   NRITEMSOLIRELACAF   	INTEGER 		NOT NULL,
   CDFILSOLI         		VARCHAR2(4)	NOT NULL ,    
   CDFILLAN          		 VARCHAR2(4) 	NOT NULL ,    
   NRSOLICMP         		VARCHAR2(10)  	NOT NULL ,   
   CDPRODUTO          	VARCHAR2(10) 	NOT NULL ,   
   DTPROGENTR         	DATE 		NOT NULL , 
   CDFILDEST          		VARCHAR2(4)  	NOT NULL ,    
   CDFILLANC            	VARCHAR2(4) 	NOT NULL ,     
   NRAUTOFORN           	VARCHAR2(10) 	NOT NULL ,   
   CDMARCAAF              	VARCHAR2(5) 	NOT NULL ,    
   CDPRODUTOAF            	VARCHAR2(10) 	NOT NULL ,   
   DTPROGENTAF          	DATE 		NOT NULL ,
   DTENTRITMSOL                  	DATE,
   CDCENTITMAP    		VARCHAR2(4)  	NOT NULL,    
   NRSEQITMAP     		VARCHAR2(10) 	NOT NULL ,
   NRORG                       	NUMBER 		DEFAULT SYS_CONTEXT('nrorg_ctx','nrorg') NOT NULL,
   IDATIVO                    	VARCHAR2(1)     	DEFAULT 'S' NOT NULL
      CONSTRAINT CKC_IDATIVO_ITEMSOLIRELACAF  CHECK (IDATIVO IN ('S','N')),
   DTINCLUSAO             	DATE                  	NULL,
   DTULTATU                  	DATE                  	NULL,
   NRORGINCLUSAO      	NUMBER 		DEFAULT SYS_CONTEXT('nrorg_ctx','nrorg')  NULL,
   CDOPERINCLUSAO    	VARCHAR2(12)  	DEFAULT '1' NULL,
   NRORGULTATU          	NUMBER 		DEFAULT  SYS_CONTEXT('nrorg_ctx','nrorg') NULL,
   CDOPERULTATU        	VARCHAR2(12)  	DEFAULT '1',
	CONSTRAINT PK_ITEMSOLIRELACAF PRIMARY KEY (NRITEMSOLIRELACAF),
	CONSTRAINT UN_ITEMSOLIRELACAF UNIQUE (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR, CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF)
)
/

CREATE INDEX CMP00593_FK ON ITEMSOLIRELACAF (CDFILSOLI ASC, CDFILLAN ASC, NRSOLICMP ASC, CDPRODUTO ASC, DTPROGENTR ASC)
/

ALTER TABLE ITEMSOLIRELACAF ADD
	CONSTRAINT FKCMP00593ITEMSOLI  FOREIGN KEY (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR) 
                             REFERENCES ITEMSOLI (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR) ON DELETE CASCADE
/

CREATE INDEX CMP00594_FK ON ITEMSOLIRELACAF  (CDFILDEST ASC, CDFILLANC ASC, NRAUTOFORN ASC, CDMARCAAF ASC, CDPRODUTOAF ASC, DTPROGENTAF ASC) 
/

ALTER TABLE ITEMSOLIRELACAF ADD
	CONSTRAINT  FKCMP00594ITEMAUTF  FOREIGN KEY (CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF) 
                             REFERENCES ITEMAUTF (CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCA, CDPRODUTO, DTPROGENTAF) ON DELETE CASCADE
/

CREATE SEQUENCE SEQ_NRITEMSOLIRELACAF INCREMENT BY 1 MINVALUE 1
/

-- ========================================================================
-- TABLE: ITEMSOLIRELACAPU
-- ========================================================================
CREATE TABLE ITEMSOLIRELACAPU (
   NRITEMSOLIRELACAPU   	INTEGER 		NOT NULL,
   CDFILSOLI          		VARCHAR2(4) 	NOT NULL,    
   CDFILLAN           		VARCHAR2(4) 	NOT NULL,    
   NRSOLICMP         		VARCHAR2(10)  	NOT NULL,   
   CDPRODUTO          	VARCHAR2(10) 	NOT NULL,   
   DTPROGENTR         	DATE NOT 	NULL, 
   CDFILCENTCMP    	VARCHAR2(4)  	NOT NULL,    
   NRAPURPREC     		VARCHAR2(10) 	NOT NULL,
   NRORG                       	NUMBER 		DEFAULT SYS_CONTEXT('nrorg_ctx','nrorg') NOT NULL,
   IDATIVO                    	VARCHAR2(1)     	DEFAULT 'S' NOT NULL
      CONSTRAINT CKC_IDATIVO_ITEMSOLIRELACAPU  CHECK (IDATIVO IN ('S','N')),
   DTINCLUSAO             	DATE                  	NULL,
   DTULTATU                  	DATE                  	NULL,
   NRORGINCLUSAO      	NUMBER 		DEFAULT SYS_CONTEXT('nrorg_ctx','nrorg')  NULL,
   CDOPERINCLUSAO    	VARCHAR2(12)  	DEFAULT '1' NULL,
   NRORGULTATU          	NUMBER 		DEFAULT  SYS_CONTEXT('nrorg_ctx','nrorg') NULL,
   CDOPERULTATU        	VARCHAR2(12)  	DEFAULT '1',
	CONSTRAINT PK_ITEMSOLIRELACAPU PRIMARY KEY (NRITEMSOLIRELACAPU),
	CONSTRAINT UN_ITEMSOLIRELACAPU UNIQUE (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR, CDFILCENTCMP, NRAPURPREC)
 )
/

CREATE INDEX CMP00595_FK ON ITEMSOLIRELACAPU (CDFILSOLI ASC, CDFILLAN ASC, NRSOLICMP ASC, CDPRODUTO ASC, DTPROGENTR ASC) 
/

ALTER TABLE ITEMSOLIRELACAPU ADD
	CONSTRAINT FKCMP00595ITEMSOLI  FOREIGN KEY (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR) 
                             REFERENCES ITEMSOLI (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR) ON DELETE CASCADE
/

CREATE INDEX CMP00596_FK ON ITEMSOLIRELACAPU (CDFILCENTCMP ASC, NRAPURPREC ASC) 
/

ALTER TABLE ITEMSOLIRELACAPU ADD
	CONSTRAINT FKCMP00596APURPRECO FOREIGN KEY (CDFILCENTCMP, NRAPURPREC) 
                             REFERENCES APURPRECO (CDFILCENTCMP, NRAPURPREC) ON DELETE CASCADE
/

CREATE SEQUENCE SEQ_NRITEMSOLIRELACAPU INCREMENT BY 1 MINVALUE 1
/

-- ========================================================================
-- TABLE: LOGCORTEOL 
-- ========================================================================
ALTER TABLE LOGCORTEOL MODIFY  DTINICIAL DATE NULL    
/      

ALTER TABLE LOGCORTEOL MODIFY  DTFINAL   DATE  NULL 
/

DROP TRIGGER ATUSALDO_EMPPED
/

/* Sistemas Integrados TEKNISA
   Compras e Suprimentos

Nome: 8510_SUPSTPO.sql

Descrição:
Efetivação de AFs.

Criação:
27/08/2000 Alexis Tolentino
*/

CREATE OR REPLACE PROCEDURE EFETIVAR_AF
                     (P_CDOPERADOR  IN VARCHAR2,
                      P_DTAUTOFORN  IN ITMAPURPREC.DTENTRAPUT%TYPE,
                      P_CDCENTCMP   IN ITMAPURPREC.CDCENTITMAP%TYPE,
                      P_NRSEQAPUR   IN ITMAPURPREC.NRSEQITMAP%TYPE,
                      P_CDFILLANC   IN AUTOFORNE.CDFILLANC%TYPE)
IS
   V_NRITEMAF NUMBER;
   V_CODIGO VARCHAR2(20);
   V_CODIGO_AUX VARCHAR2(20);
   V_CONT INT;
   V_OBSSOL VARCHAR2(2000);
   V_CDINSCESTA VARCHAR2(16);
   V_DTPROGENTAF DATE;
   V_VRPRODUTO NUMBER;
   V_VRDESCONTO NUMBER;
   V_VRIMPOSTO NUMBER;
   V_VRDESCITMAF NUMBER(15,5);
   V_NRLOTEESTQ VARCHAR2(20);
   V_NRSUBLOTE VARCHAR2(4);
   V_CDPRODPROD VARCHAR2(10);
   V_NMPRODPROD VARCHAR2(50);

   V_DIAPGTO VARCHAR2(3);
   V_DSPGTO VARCHAR2(1000);
   V_VRPGTO VARCHAR2(20);

   V_DSANTERIOR VARCHAR2(10000);
   V_DSANTERIOR_AUX VARCHAR2(10000);
   V_DSATUAL    VARCHAR2(10000);

   V_ANTCODIGO       VARCHAR2(10);
   V_ANTCDFILDEST    VARCHAR2(4);
   V_ANTCDFILLANC    VARCHAR2(4);
   V_ANTCDFORNECED   VARCHAR2(21);
   V_ANTIDTPFORPGTAF VARCHAR2(1);
   V_ANTCDTIPCOB     VARCHAR2(2);
   V_ANTIDTIPOEMITAF VARCHAR2(1);
   V_ANTCDEMPRESA    VARCHAR2(2);
   V_ANTIDTIPOFRETAF VARCHAR2(1);
   V_ANTCDFORMPGTO   VARCHAR2(2);
   V_ANTNRPARCPGTOAF VARCHAR2(3);
   V_ANTNRDIAPGFIXAF VARCHAR2(3);
   V_ANTIDUTDIAPGTAF VARCHAR2(1);
   V_ANTDSPZOPGTCONC VARCHAR2(1000);
   V_ANTCONC_KEY     VARCHAR2(1000);

   V_IDCOMPRA        VARCHAR2(1);
   V_IDGERAAF        VARCHAR2(1);
   V_DIENTREGA       VARCHAR2(3);

   V_NOVOCODIGO  VARCHAR2(20);
   V_REGANTERIOR VARCHAR2(255);
   V_ITEMAUTF_ANTERIOR VARCHAR2(255);
   V_AFANTERIOR  VARCHAR2(255);
   V_SUMPERCPZO  PRAZOPGTAF.VRPERCPGTOAF%TYPE;

   V_COUNT_AUX    NUMBER;
   V_VRPRECUNIITM NUMBER;

   V_IDUTQTDEVOLU VARCHAR2(1);
   V_QTVOLUITEMSO NUMBER;

   V_NRSOLCOMP    VARCHAR2(200);
   V_QTSOLIPROD   FLOAT;
   V_DTAUX        DATE;

   V_VRFATOCONV   FLOAT;

   V_DTENTRITMSOL DATE;
   V_ANTQTSOLIPROD FLOAT;
   V_VRARREDEMPE  PRODFORNCOMP.VRARREDEMPE%TYPE;
   V_QTPROGENTAF  ITEMAUTF.QTPROGENTAF%TYPE;
   V_IDUTEMPENHAF PARASUPRI.IDUTEMPENHAF%TYPE;
   V_IDUTILCONSSOLIOL PARASUPRI.IDUTILCONSSOLIOL%TYPE;
   V_EMPRESA      AUTOFORNE.CDEMPRESA%TYPE;
   V_CDTPCTPAGAR  AUTOFORNE.CDTPCTPAGAR%TYPE;
   V_MARCAPADRAO  PARASUPRI.CDMARCA%TYPE;
   V_MARCAITEM    MARCA.CDMARCA%TYPE;
   V_PRODUTOOL    PRODUTO.CDPRODUTO%TYPE;
   V_IDUTQTDISPGERAL PARASUPRI.IDUTQTDISPGERAL%TYPE;
   V_NRPEDIDOCOL  PEDCOLGERAL.NRPEDIDOCOL%TYPE;

   V_IDCONSOLAPUEFET  APURPRECO.IDCONSOLAPUEFET%TYPE;
   V_EXTRA            AUTOFORNE.IDAUTOFORNEX%TYPE;

   V_VRPERAJFORNFIL  AJUSTEPRFORNFIL.VRPERAJFORNFIL%TYPE;
   V_IDCONSPERPIAJPR  AJUSTEPRFORNFIL.IDCONSPERPIAJPR%TYPE;
   V_PIDSV            FORNECEDOR.VRPERPIFORN%TYPE;
   V_CDFILIOPELOG     FILIAL.CDFILIAL%TYPE;
   V_IDAFOPERLOG      PARASUPRI.IDUTQTDISPGERAL%TYPE;
   V_IDSISDOS         PARAMGERAL.IDSISDOS%TYPE;
   V_NRLOGCORTEOL     LOGCORTEOL.NRLOGCORTEOL%TYPE;
   V_QTEMPENHADA      FLOAT;
   V_IDUTLPRCMPATIVO  PARASUPRI.IDUTLPRCMPATIVO%TYPE;

   V_IDARREDCMPAMENOS PARASUPRI.IDARREDCMPAMENOS%TYPE;
   V_IDQTFRACIONADO   APURPRECO.IDQTFRACIONADO%TYPE;
   V_CONTADOR         FLOAT := 0;
   V_IDUTLPRARVOLCMP  PARASUPRI.IDUTLPRARVOLCMP%TYPE;
   V_CDPRARVORIG      RELACPRODOL.CDPRARVORIG%TYPE;
   V_EXISTE_ITEMAUTF  NUMBER;
   V_INCLUSAORELAC    NUMBER;
BEGIN
   INSERT INTO USR_NRSEQAPUR_TMP (NRSEQAPUR) VALUES (P_NRSEQAPUR);
   SELECT
      MAX(IDCONSOLAPUEFET)
   INTO V_IDCONSOLAPUEFET
   FROM APURPRECO
   WHERE CDFILCENTCMP = P_CDCENTCMP
     AND NRAPURPREC = P_NRSEQAPUR;

   IF V_IDCONSOLAPUEFET = 'S' THEN
      V_EXTRA := 'S';
   ELSE
      V_EXTRA := 'N';
   END IF;

   V_QTSOLIPROD := 0;

   V_DSANTERIOR := NULL;

   V_ANTCODIGO       := NULL;
   V_ANTCDFILDEST    := NULL;
   V_ANTCDFILLANC    := NULL;
   V_ANTCDFORNECED   := NULL;
   V_ANTIDTPFORPGTAF := NULL;
   V_ANTCDTIPCOB     := NULL;
   V_ANTIDTIPOEMITAF := NULL;
   V_ANTCDEMPRESA    := NULL;
   V_ANTIDTIPOFRETAF := NULL;
   V_ANTCDFORMPGTO   := NULL;
   V_ANTNRPARCPGTOAF := NULL;
   V_ANTNRDIAPGFIXAF := NULL;
   V_ANTIDUTDIAPGTAF := NULL;
   V_ANTDSPZOPGTCONC := NULL;
   V_ANTCONC_KEY     := NULL;

   SELECT
      MAX(IDUTQTDEVOLU),
      MAX(IDUTEMPENHAF),
      NVL(MAX(IDUTILCONSSOLIOL), 'N'),
      MAX(CDMARCA),
      NVL(MAX(IDUTQTDISPGERAL), 'N'),
      NVL(MAX(IDUTLPRCMPATIVO), 'N'),
      NVL(MAX(IDARREDCMPAMENOS), 'N'),
      NVL(MAX(IDUTLPRARVOLCMP), 'N')
   INTO
      V_IDUTQTDEVOLU,
      V_IDUTEMPENHAF,
      V_IDUTILCONSSOLIOL,
      V_MARCAPADRAO,
      V_IDUTQTDISPGERAL,
      V_IDUTLPRCMPATIVO,
      V_IDARREDCMPAMENOS,  /* Grava quantidade a comprar com valor arredondado para menos */
      V_IDUTLPRARVOLCMP
   FROM
      PARASUPRI
   WHERE
      CDFILIAL = P_CDCENTCMP;

   V_EMPRESA      := NULL;
   V_CDTPCTPAGAR  := NULL;

   SELECT
      MAX(CDEMPRESA),
      MAX(CDTPCTPAGAR)
   INTO
      V_EMPRESA,
      V_CDTPCTPAGAR
   FROM
      COMPRA
   WHERE
      EXISTS (SELECT 1
              FROM ITMAPURPREC
              WHERE ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP AND
                    ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR AND
                    ITMAPURPREC.NRCOMPRA    = COMPRA.NRCOMPRA);

   IF V_EMPRESA IS NOT NULL THEN
      V_IDCOMPRA := 'S';
   ELSE
      V_IDCOMPRA := 'N';
   END IF;
   SELECT NVL(MAX(IDSISDOS), '1')
     INTO V_IDSISDOS
     FROM PARAMGERAL;

   SELECT NVL(MAX(NRLOGCORTEOL), 0)
     INTO V_NRLOGCORTEOL
     FROM APURPRECO
    WHERE CDFILCENTCMP = P_CDCENTCMP
      AND NRAPURPREC   = P_NRSEQAPUR;

   IF V_NRLOGCORTEOL <> 0 THEN
      V_IDUTILCONSSOLIOL := 'S';
   END IF;     
   FOR C_AUTOFORN IN (
      SELECT
         DECODE(FORNECEDOR.IDGERAFDTENT,
                'S', CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT),
                NULL) AS DTENTRAPUT,
         CASE V_IDSISDOS
            WHEN '3'
            THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT)
            ELSE NVL(ITMAPURPREC.DTPROGENTRAP, CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT))
         END AS DTNEWENTAF,
         SUM(QTSOLACOMP) OVER (PARTITION BY CDFORNITMAP,
                                            CDFILIAP,
                                            CDPRODITMAP,
                                            CASE FORNECEDOR.IDGERAFDTENT
                                               WHEN 'S'
                                               THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT)
                                               ELSE NULL
                                            END,
                                            CASE '1'
                                               WHEN '3'
                                               THEN CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT)
                                               ELSE NVL(ITMAPURPREC.DTPROGENTRAP, CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT))
                                            END) QTEMPENHADA,
         ITMAPURPREC.CDMARCITMAP   AS CDMARCA,
         ITMAPURPREC.CDSEGMARCCOL  AS CDSEGMARCA,
         ITMAPURPREC.CDFILIAP      AS CDFILDEST,
         NVL(FILIAL.IDFUNCAOFILI, 'NULL') AS IDFUNCAOFILI,
         P_CDFILLANC               AS CDFILLANC,
         ITMAPURPREC.CDFORNITMAP   AS CDFORNECED,
         ITMAPURPREC.IDTPFORPGTAP,
         FORNECEDOR.CDTIPCOB,
         ITMAPURPREC.DTENTRAPUT    AS DTPROGENTAF,
         ITMAPURPREC.QTSOLACOMP    AS QTSOLIPROD,
         ITMAPURPREC.QTACOMP       AS QTPROGENTAF,
         ITMAPURPREC.VRPRECUNIAP   AS VRPREUNIAF,
         ITMAPURPREC.QTDISPPRODMARC,
         ITMAPURPREC.VRPERDESIAP   AS VRPERDESAF,
         ITMAPURPREC.CDPRODITMAP   AS CDPRODUTO,
         ITMAPURPREC.IDTIPOEMITAP,
         ITMAPURPREC.CDEMPRESAAP   AS CDEMPRESA,
         ITMAPURPREC.IDTIPOFRETAP ,
         ITMAPURPREC.CDFORMPGTOAP  AS CDFORMPGTO,
         ITMAPURPREC.NRPARCPGTOAP,
         ITMAPURPREC.NRDIAPGFIAP   AS NRDIAPGFIXAF,
         ITMAPURPREC.IDULTDIAPGTAF AS IDUTDIAPGTAF,
         ITMAPURPREC.DSPZOPGTCOAP,
         ITMAPURPREC.CONCKEYAP     AS CONC_KEY,
         DECODE(SUBSTR(ITMAPURPREC.CONCKEYAP, -1, 1),
               'X', NULL,
               '2') AS IDAFOPERLOG,
         SUBSTR(ITMAPURPREC.CONCKEYAP, -2, 1) AS IDPRODWEB,
         ITMAPURPREC.CDCENTITMAP,
         ITMAPURPREC.CDREGITMAP,
         PRODUTO.VRFATOCONV,
         PRODUTO.CDARVPROD,
         ITMAPURPREC.IDMOTIVPRESC,
         ITMAPURPREC.NRCOLEITMAP,
         ITMAPURPREC.NRLISTAITMAP,
         FORNECEDOR.IDUTQTDISPFORN,
         ITMAPURPREC.NRCOMPRA
      FROM
         ITMAPURPREC, FORNECEDOR, PRODUTO, FILIAL
      WHERE
         ITMAPURPREC.CDFILIAP     = FILIAL.CDFILIAL       AND
         ITMAPURPREC.CDPRODITMAP  = PRODUTO.CDPRODUTO     AND
         ITMAPURPREC.IDITMSELAPUR = 'S'                   AND
         ITMAPURPREC.CDFORNITMAP  = FORNECEDOR.CDFORNECED AND
         ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR           AND
         ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
      ORDER BY
         ITMAPURPREC.CDFILIAP,   ITMAPURPREC.CDCENTITMAP,
         ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.IDTPFORPGTAP,
         FORNECEDOR.CDTIPCOB,
         DECODE(FORNECEDOR.IDGERAFDTENT,
                'S',  CARREGA_PERIFORN_FUN(ITMAPURPREC.CDFILIAP, ITMAPURPREC.CDFORNITMAP, ITMAPURPREC.DTENTRAPUT),
                NULL),
         ITMAPURPREC.IDTIPOEMITAP, ITMAPURPREC.CDEMPRESAAP,
         ITMAPURPREC.IDTIPOFRETAP,  ITMAPURPREC.CDFORMPGTOAP,
         ITMAPURPREC.NRPARCPGTOAP, ITMAPURPREC.NRDIAPGFIAP,
         ITMAPURPREC.IDULTDIAPGTAF, ITMAPURPREC.DSPZOPGTCOAP,
         ITMAPURPREC.CONCKEYAP,
         ITMAPURPREC.DTENTRAPUT)
      LOOP

      IF V_IDCOMPRA = 'N' THEN
         V_EMPRESA := C_AUTOFORN.CDEMPRESA;
      END IF;
      V_MARCAITEM   := '';
      V_CDPRARVORIG := NULL;
      IF (V_IDUTILCONSSOLIOL = 'S') AND (C_AUTOFORN.IDFUNCAOFILI = 'O') THEN
         --V_MARCAITEM := V_MARCAPADRAO;
         SELECT
            MAX(CDPRODARVOL)
         INTO
            V_PRODUTOOL
         FROM
            RELACPRODOL
         WHERE RELACPRODOL.CDPRARVORIG = C_AUTOFORN.CDPRODUTO
           AND RELACPRODOL.CDMARCA     = C_AUTOFORN.CDMARCA;

         IF ((V_NRLOGCORTEOL <> 0) AND (V_PRODUTOOL IS NULL)) THEN
            SELECT
               MAX(CDPRODARVOL)
            INTO
               V_PRODUTOOL
            FROM
               RELACPRODOL
            WHERE RELACPRODOL.CDPRARVORIG = C_AUTOFORN.CDPRODUTO
              AND RELACPRODOL.CDMARCA     = V_MARCAPADRAO;
         END IF;

         IF V_PRODUTOOL IS NULL THEN
            V_IDGERAAF := 'N';
         ELSE
            V_IDGERAAF := 'S';
         END IF;
         IF V_IDUTLPRARVOLCMP = 'S' THEN
            SELECT NVL(MAX(RELACPRODOL.CDPRARVORIG), C_AUTOFORN.CDPRODUTO)
              INTO V_CDPRARVORIG
              FROM PRODUTO, RELACPRODOL
             WHERE CDPRODUTO = V_PRODUTOOL
               AND RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODESTO;
         END IF;
      ELSE
         V_MARCAITEM  := NULL;
         V_IDGERAAF   := 'S';
         V_PRODUTOOL  := NULL;
      END IF;

      IF V_IDGERAAF = 'S' THEN
         V_QTPROGENTAF := C_AUTOFORN.QTPROGENTAF;

         IF V_IDUTEMPENHAF = 'S' THEN
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_AUTOFORN.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_AUTOFORN.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  DECODE(MAX(VRARREDEMPE), NULL, 0, MAX(VRARREDEMPE)) INTO V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                  CDFORNECED  = C_AUTOFORN.CDFORNECED;
            END IF;

            IF (MOD(V_QTPROGENTAF, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
               V_QTPROGENTAF := CEIL(V_QTPROGENTAF / V_VRARREDEMPE) * V_VRARREDEMPE;
            END IF;
         END IF;

         IF C_AUTOFORN.DTENTRAPUT IS NULL THEN
            V_DSATUAL := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                         C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                         C_AUTOFORN.CDTIPCOB     || NULL                    ||
                         C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                         C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                         C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                         C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                         C_AUTOFORN.CONC_KEY;
         ELSE
            V_DSATUAL := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                         C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                         C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                         C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                         C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                         C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                         C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                         C_AUTOFORN.CONC_KEY;
         END IF;

         IF V_IDARREDCMPAMENOS = 'S' THEN
            SELECT MAX(C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                       C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                       C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                       C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                       C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                       C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                       C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                       C_AUTOFORN.CONC_KEY), MAX(AUTOFORNE.NRAUTOFORN)
              INTO V_DSANTERIOR_AUX, V_CODIGO_AUX
              FROM AUTOFORNE, APURPRECO, ITMAPURPREC, ITEMAUTF
             WHERE APURPRECO.CDFILCENTCMP   = ITMAPURPREC.CDCENTITMAP
               AND APURPRECO.NRAPURPREC     = ITMAPURPREC.NRSEQITMAP
               AND APURPRECO.NRAPURPREC     = AUTOFORNE.NRSEQAPURAF
               AND APURPRECO.CDFILLANC      = AUTOFORNE.CDFILLANC
               AND AUTOFORNE.CDFILDEST      = ITMAPURPREC.CDFILIAP
               AND AUTOFORNE.CDFORNECED     = C_AUTOFORN.CDFORNECED
               AND AUTOFORNE.CDFILDEST      = C_AUTOFORN.CDFILDEST

               AND AUTOFORNE.CDFILDEST      = ITEMAUTF.CDFILDEST
               AND AUTOFORNE.CDFILLANC      = ITEMAUTF.CDFILLANC
               AND AUTOFORNE.NRAUTOFORN     = ITEMAUTF.NRAUTOFORN

               AND C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                   C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                   C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                   C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                   C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                   C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                   C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                   C_AUTOFORN.CONC_KEY      = V_DSATUAL
               AND ITMAPURPREC.IDITMSELAPUR = 'S'
               AND APURPRECO.CDFILCENTCMP   = P_CDCENTCMP
               AND APURPRECO.NRAPURPREC     = P_NRSEQAPUR
               AND ITEMAUTF.DTENTRITMSOL    = C_AUTOFORN.DTPROGENTAF;

            IF ((V_DSANTERIOR_AUX IS NOT NULL) AND (V_CODIGO_AUX IS NOT NULL)) THEN
               V_DSANTERIOR := V_DSANTERIOR_AUX;
               V_CODIGO     := V_CODIGO_AUX;
            END IF;
         END IF;

         IF (V_DSATUAL <> V_DSANTERIOR) OR (V_DSANTERIOR IS NULL) THEN
            DBMS_OUTPUT.PUT_LINE('ATUAL = ' ||V_DSATUAL||' ANTERIOR = ' ||V_DSANTERIOR);

            SELECT NVL(MAX(NRITEMAF), 0) INTO V_NRITEMAF
            FROM FORNECEDOR
            WHERE CDFORNECED = C_AUTOFORN.CDFORNECED;

            V_CONT := 1;
            NOVO_CODIGO('AUTOFORNE', V_CODIGO, 1);
            V_CODIGO := SUBSTR(V_CODIGO, 11, 10);

            V_CDFILIOPELOG := '';
            V_IDAFOPERLOG  := '';
            IF NVL(C_AUTOFORN.IDAFOPERLOG, '1') = '2' THEN
               SELECT MAX(P.CDFILIOPELOG) CDFILIOPELOG
                 INTO V_CDFILIOPELOG
                 FROM PARAMPRODSUP P
                WHERE P.CDFILIAL     = C_AUTOFORN.CDFILDEST
                  AND P.CDFILIOPELOG IS NOT NULL
                  AND EXISTS (SELECT 1
                                FROM ITMAPURPREC
                               WHERE ITMAPURPREC.CDPRODITMAP  = P.CDPRODUTO
                                 AND ITMAPURPREC.IDITMSELAPUR = 'S'
                                 AND ITMAPURPREC.CDFORNITMAP  = C_AUTOFORN.CDFORNECED
                                 AND ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR
                                 AND ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
                                 AND ITMAPURPREC.CDFILIAP     = P.CDFILIAL);
               IF NVL(V_CDFILIOPELOG, 'O') = 'O' THEN
                  V_IDAFOPERLOG := '1';
               ELSE
                  V_IDAFOPERLOG := '2';
               END IF;
            END IF;

            INSERT INTO AUTOFORNE
            (CDFILDEST,    CDFILLANC,    NRAUTOFORN,   CDOPERADOR,   DTAUTOFORN,
             IDTPFORPGTAF, IDTIPOEMITAF, IDTIPOFRETAF, NRPARCPGTOAF, NRDIAPGFIXAF,
             IDUTDIAPGTAF, CDTIPCOB,     CDEMPRESA,    CDFORMPGTO,   CDFORNECED,
             NRSEQAPURAF,  IDAFPRODWEB,  IDAFOPERLOG, IDTIPOLANCAF,IDBAIXAAF, IDAFCONS, DSCONCKEYAF, CDTPCTPAGAR,
             IDAUTOFORNEX, NRCOMPRAF, CDFILIOPELOG)
            VALUES
            (C_AUTOFORN.CDFILDEST,    C_AUTOFORN.CDFILLANC,    V_CODIGO,
             P_CDOPERADOR,            P_DTAUTOFORN,            C_AUTOFORN.IDTPFORPGTAP,
             C_AUTOFORN.IDTIPOEMITAP, C_AUTOFORN.IDTIPOFRETAP, C_AUTOFORN.NRPARCPGTOAP,
             C_AUTOFORN.NRDIAPGFIXAF, C_AUTOFORN.IDUTDIAPGTAF, C_AUTOFORN.CDTIPCOB,
             V_EMPRESA,    C_AUTOFORN.CDFORMPGTO,   C_AUTOFORN.CDFORNECED,
             P_NRSEQAPUR,             C_AUTOFORN.IDPRODWEB,    V_IDAFOPERLOG, 'A', '6', 'N', C_AUTOFORN.CONC_KEY, V_CDTPCTPAGAR,
             V_EXTRA, C_AUTOFORN.NRCOMPRA, V_CDFILIOPELOG);
         ELSE
            V_CONT := V_CONT + 1;

            IF (V_CONT > V_NRITEMAF) AND (V_NRITEMAF > 0) THEN

               -- GERAR PARA O ANTERIOR
               V_DSPGTO := V_ANTDSPZOPGTCONC;
               WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
                  V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
                  V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

                  V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
                  V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

                  INSERT INTO PRAZOPGTAF
                     (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
                  VALUES
                      (V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO);
               END LOOP;

               /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
               IF V_IDARREDCMPAMENOS = 'S' THEN
                  SELECT NVL(MAX('S'), 'N')
                    INTO V_IDQTFRACIONADO
                    FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
                   WHERE I.CDFILDEST   = A.CDFILDEST
                     AND I.CDFILLANC   = A.CDFILLANC
                     AND I.NRAUTOFORN  = A.NRAUTOFORN
                     AND A.CDFILDEST   = F.CDFILIAL
                     AND A.NRSEQAPURAF = P_NRSEQAPUR
                     AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
                     AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

                  IF V_IDQTFRACIONADO = 'S' THEN
                     V_CONTADOR := V_CONTADOR + 1;
                  END IF;
               END IF;

               -- FECHAMENTO_AF;
               -- GERA-PARCELAS

               UPDATE ITEMAUTF
               SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                             FROM ITEMAUTF ITEM
                                            WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                              AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                              AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                              AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF)),
                   ITEMAUTF.QTPROGENTAF = CASE V_IDARREDCMPAMENOS
                                             WHEN 'S'
                                             THEN CASE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                                     WHEN 0
                                                     THEN ITEMAUTF.QTPROGENTAF
                                                     ELSE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                                  END
                                             ELSE ITEMAUTF.QTPROGENTAF
                                          END
               WHERE
                  (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
                  (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
                  (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);
                     --------
               SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
               FROM INSCRESTAD
               WHERE (CDEMPRESA = V_ANTCDEMPRESA);

               SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
               FROM ITEMAUTF
               WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
                     (CDFILLANC  = V_ANTCDFILLANC)  AND
                     (NRAUTOFORN = V_ANTCODIGO);

               IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                              V_CDINSCESTA,
                              V_ANTCDFORNECED,
                              V_ANTCDFILDEST,
                              V_ANTCDFILLANC,
                              V_ANTCODIGO,
                              V_DTPROGENTAF);

               -- qryValor_AF

               SELECT
                  SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
                  SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
                  INTO V_VRPRODUTO, V_VRDESCONTO
               FROM
                  ITEMAUTF
               WHERE
                  (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
                  (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
                  (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

               SELECT
                  NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
               FROM
                  IMPITMAF,
                  ITEMAUTF,
                  IMPOSTO
               WHERE
                  (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
                  (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
                  (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
                  (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
                  (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
                  (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
                  (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
                  (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
                  (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
                  (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
                   NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

               UPDATE AUTOFORNE
               SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
               WHERE
                  (CDFILDEST   = V_ANTCDFILDEST) AND
                  (CDFILLANC   = V_ANTCDFILLANC) AND
                  (NRAUTOFORN  = V_ANTCODIGO);

               NOVO_CODIGO('AUTOFORNE', V_CODIGO, 1);
               V_CODIGO := SUBSTR(V_CODIGO, 11, 10);

               V_CDFILIOPELOG := '';
               V_IDAFOPERLOG  := '';

               IF NVL(C_AUTOFORN.IDAFOPERLOG, '1') = '2' THEN
                  SELECT MAX(P.CDFILIOPELOG) CDFILIOPELOG
                    INTO V_CDFILIOPELOG
                    FROM PARAMPRODSUP P
                   WHERE P.CDFILIAL     = C_AUTOFORN.CDFILDEST
                     AND P.CDFILIOPELOG IS NOT NULL
                     AND EXISTS (SELECT 1
                                   FROM ITMAPURPREC
                                  WHERE ITMAPURPREC.CDPRODITMAP  = P.CDPRODUTO
                                    AND ITMAPURPREC.IDITMSELAPUR = 'S'
                                    AND ITMAPURPREC.CDFORNITMAP  = C_AUTOFORN.CDFORNECED
                                    AND ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR
                                    AND ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP
                                    AND ITMAPURPREC.CDFILIAP     = P.CDFILIAL);
                  IF NVL(V_CDFILIOPELOG, 'O') = 'O' THEN
                     V_IDAFOPERLOG := '1';
                  ELSE
                     V_IDAFOPERLOG := '2';
                  END IF;
               END IF;

               INSERT INTO AUTOFORNE
               (CDFILDEST,    CDFILLANC,    NRAUTOFORN,   CDOPERADOR,   DTAUTOFORN,
                IDTPFORPGTAF, IDTIPOEMITAF, IDTIPOFRETAF, NRPARCPGTOAF, NRDIAPGFIXAF,
                IDUTDIAPGTAF, CDTIPCOB,     CDEMPRESA,    CDFORMPGTO,   CDFORNECED,
                NRSEQAPURAF,  IDAFPRODWEB,  IDAFOPERLOG, IDTIPOLANCAF, IDBAIXAAF, IDAFCONS, DSCONCKEYAF, CDTPCTPAGAR,
                IDAUTOFORNEX, CDFILIOPELOG)
               VALUES
               (C_AUTOFORN.CDFILDEST,    C_AUTOFORN.CDFILLANC,    V_CODIGO,
                P_CDOPERADOR,            P_DTAUTOFORN,            C_AUTOFORN.IDTPFORPGTAP,
                C_AUTOFORN.IDTIPOEMITAP, C_AUTOFORN.IDTIPOFRETAP, C_AUTOFORN.NRPARCPGTOAP,
                C_AUTOFORN.NRDIAPGFIXAF, C_AUTOFORN.IDUTDIAPGTAF, C_AUTOFORN.CDTIPCOB,
                V_EMPRESA,    C_AUTOFORN.CDFORMPGTO,   C_AUTOFORN.CDFORNECED,
                P_NRSEQAPUR,             C_AUTOFORN.IDPRODWEB,    V_IDAFOPERLOG, 'A', '6', 'N',C_AUTOFORN.CONC_KEY, V_CDTPCTPAGAR,
                V_EXTRA, V_CDFILIOPELOG);

                V_CONT := 1;
            END IF;
         END IF;

         V_OBSSOL := '';

         FOR C_OBSERVA IN (SELECT ITEMSOLI.TXOBSITMSOL, ITEMSOLI.NRLOTEESTQ,
                                  ITEMSOLI.NRSUBLOTE, ITEMSOLI.CDPRODPROD,
                                  PRODUTO.NMPRODUTO
                            FROM ITEMSOLI, PRODUTO
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_AUTOFORN.CDFILDEST) AND
                              (ITEMSOLI.CDPRODUTO  = C_AUTOFORN.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_AUTOFORN.DTPROGENTAF) AND
                              ITEMSOLI.CDPRODPROD  = PRODUTO.CDPRODUTO(+)) LOOP

            V_OBSSOL := V_OBSSOL || C_OBSERVA.TXOBSITMSOL;
            V_NRLOTEESTQ := C_OBSERVA.NRLOTEESTQ;
            V_NRSUBLOTE  := C_OBSERVA.NRSUBLOTE;
            V_CDPRODPROD := C_OBSERVA.CDPRODPROD;
            V_NMPRODPROD := C_OBSERVA.NMPRODUTO;
         END LOOP;

         IF V_NRLOTEESTQ||V_NRSUBLOTE||V_NMPRODPROD IS NOT NULL THEN/*INFORMAÇÕES DO LOTE NA OBSERVAÇÃO*/
            V_OBSSOL := 'Lote: '||V_NRLOTEESTQ||' SubLote: '||V_NRSUBLOTE||' Produto: '||V_NMPRODPROD||CHR(13)||CHR(10)||V_OBSSOL;
         END IF;

         SELECT COUNT(*), MAX(DTENTRITMSOL) INTO V_COUNT_AUX, V_DTENTRITMSOL
         FROM ITEMAUTF
         WHERE CDFILDEST   = C_AUTOFORN.CDFILDEST                   AND
               CDFILLANC   = C_AUTOFORN.CDFILLANC                   AND
               NRAUTOFORN  = V_CODIGO                               AND
               CDPRODUTO   = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
               ((CDMARCA    = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)) OR
               (VRPREUNIAF  = C_AUTOFORN.VRPREUNIAF))   AND
               DTPROGENTAF = C_AUTOFORN.DTNEWENTAF;

         IF V_COUNT_AUX = 0 THEN
            IF C_AUTOFORN.DTPROGENTAF <> C_AUTOFORN.DTNEWENTAF THEN
               SELECT MIN(VRPRECUNIITM) INTO V_VRPRECUNIITM
               FROM ITEMCOLE
               WHERE
                  CDFILIAL     = C_AUTOFORN.CDCENTITMAP AND
                  CDREGIAO     = C_AUTOFORN.CDREGITMAP AND
                  CDFORNECED   = C_AUTOFORN.CDFORNECED AND
                  CDPRODUTO    = C_AUTOFORN.CDPRODUTO AND
                  CDMARCA      = C_AUTOFORN.CDMARCA AND
                  IDITMLISPREC = DECODE(SUBSTR(C_AUTOFORN.IDMOTIVPRESC,5,1), '1', 'S', IDITMLISPREC) AND
                  C_AUTOFORN.DTNEWENTAF BETWEEN DTINIVALITM AND DTFINVALITM;
               IF NVL(V_VRPRECUNIITM, 0) = 0 THEN
                  V_VRPRECUNIITM := C_AUTOFORN.VRPREUNIAF;
               END IF;
            ELSE
               V_VRPRECUNIITM := C_AUTOFORN.VRPREUNIAF;
            END IF;

            V_VRDESCITMAF := 0;
            V_VRDESCITMAF := (V_QTPROGENTAF * V_VRPRECUNIITM * C_AUTOFORN.VRPERDESAF)/100;

            V_QTVOLUITEMSO := 0;

            IF V_IDUTQTDEVOLU = 'S' THEN
               SELECT SUM(QTVOLUITEMSO) INTO V_QTVOLUITEMSO
               FROM ITEMSOLI
               WHERE CDFILSOLI  = C_AUTOFORN.CDFILDEST AND
                     DTPROGENTR = C_AUTOFORN.DTPROGENTAF AND
                     CDPRODUTO  = C_AUTOFORN.CDPRODUTO AND
                     IDITMCONS  = 'N';
            END IF;

            V_VRPERAJFORNFIL := NULL;
            V_IDCONSPERPIAJPR := 'N';

            SELECT
               MAX(VRPERAJFORNFIL),
               MAX(IDCONSPERPIAJPR)
            INTO V_VRPERAJFORNFIL, V_IDCONSPERPIAJPR
            FROM AJUSTEPRFORNFIL
            WHERE AJUSTEPRFORNFIL.CDFORNECED = C_AUTOFORN.CDFORNECED
              AND AJUSTEPRFORNFIL.CDFILIAL = C_AUTOFORN.CDFILDEST
              AND AJUSTEPRFORNFIL.DTINIAJPRFORFIL = (SELECT MAX(A.DTINIAJPRFORFIL)
                                                     FROM AJUSTEPRFORNFIL A
                                                     WHERE A.CDFORNECED = C_AUTOFORN.CDFORNECED
                                                       AND A.CDFILIAL = C_AUTOFORN.CDFILDEST
                                                       AND TRUNC(SYSDATE) BETWEEN A.DTINIAJPRFORFIL AND NVL(A.DTFINAJPRFORFIL, TRUNC(SYSDATE)));

            V_PIDSV := NULL;

            IF V_IDCONSPERPIAJPR = 'S' THEN
               SELECT
                  MAX(VRPERPIPRFO)
               INTO V_PIDSV
               FROM PRODFORNCOMP
               WHERE PRODFORNCOMP.CDFORNECED  = C_AUTOFORN.CDFORNECED
                 AND PRODFORNCOMP.CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO);

               IF V_PIDSV IS NULL THEN
                  SELECT MAX(VRPERPIFORN)
                  INTO V_PIDSV
                  FROM FORNECEDOR
                  WHERE FORNECEDOR.CDFORNECED = C_AUTOFORN.CDFORNECED;
               END IF;
            END IF;

            IF V_PIDSV IS NULL THEN
               V_PIDSV := 0;
            END IF;
            IF V_VRPERAJFORNFIL IS NULL THEN
               V_VRPERAJFORNFIL := 0;
            END IF;

            V_VRPRECUNIITM := V_VRPRECUNIITM - (V_VRPRECUNIITM * V_PIDSV/100) + (V_VRPRECUNIITM * V_VRPERAJFORNFIL/100);

            INSERT
              INTO ITEMAUTF_CLONE (CDFILDEST,   CDFILLANC,  CDMARCA, CDPRODUTO,
                                   DTPROGENTAF, CDFORNECED, QTPROGENTAF,
                                   NRSEQAPURAF, DTAUTOFORN, NRAUTOFORN, DTNEWENTAF, DTENTRAPUT)
            VALUES (C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                    NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO),
                    C_AUTOFORN.DTPROGENTAF, C_AUTOFORN.CDFORNECED, V_QTPROGENTAF,
                    P_NRSEQAPUR, TRUNC(P_DTAUTOFORN), V_CODIGO, C_AUTOFORN.DTNEWENTAF, C_AUTOFORN.DTNEWENTAF);
            /*Inicio da implementação da solicitação 166404*/
            V_INCLUSAORELAC := 0;
            SELECT COUNT(1)
              INTO V_EXISTE_ITEMAUTF
              FROM ITEMAUTF, AUTOFORNE
             WHERE ITEMAUTF.CDFILDEST    = AUTOFORNE.CDFILDEST
               AND ITEMAUTF.CDFILLANC    = AUTOFORNE.CDFILLANC
               AND ITEMAUTF.NRAUTOFORN   = AUTOFORNE.NRAUTOFORN
               AND ITEMAUTF.CDFILDEST    = C_AUTOFORN.CDFILDEST
               AND ITEMAUTF.CDFILLANC    = C_AUTOFORN.CDFILLANC
               AND ITEMAUTF.CDPRODUTO    = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO)
               AND ITEMAUTF.CDMARCA      = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)
               AND ITEMAUTF.DTPROGENTAF  = C_AUTOFORN.DTNEWENTAF
               AND ITEMAUTF.QTPROGENTAF  = V_QTPROGENTAF
               AND AUTOFORNE.CDFORNECED  = C_AUTOFORN.CDFORNECED
               AND AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR;
            /*Continuação da implementação da solicitação 166404*/
            IF V_EXISTE_ITEMAUTF = 0 THEN
               INSERT
                 INTO ITEMAUTF
                      (CDFILDEST,  CDFILLANC,   NRAUTOFORN, CDPRODUTO,
                      CDMARCA,    DTPROGENTAF, CDSEGMARCA, QTPROGENTAF,
                      VRPREUNIAF, VRPERDESAF,  TXOBSITMAF, VRDESCITMAF,
                      NRLOTEESTQ, NRSUBLOTE,   CDPRODPRODAF, DTENTRITMSOL,
                      QTVOLUITEMAF, IDMOTPRESCAF, IDTPLANITEAF, CDFILCOTITAF,
                      NRCOTPREITAF, CDMARCOTITAF, CDREGCOTITAF, CDFORCOTITAF,
                      CDPROCOTITAF, NRLISTAITAF, QTDISPPRODMARC)
               VALUES (C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC,   V_CODIGO, NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO),
                      NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),   C_AUTOFORN.DTNEWENTAF, C_AUTOFORN.CDSEGMARCA, V_QTPROGENTAF,
                      V_VRPRECUNIITM, C_AUTOFORN.VRPERDESAF,  V_OBSSOL, V_VRDESCITMAF,
                      V_NRLOTEESTQ, V_NRSUBLOTE, V_CDPRODPROD, C_AUTOFORN.DTPROGENTAF,
                      V_QTVOLUITEMSO, C_AUTOFORN.IDMOTIVPRESC, 'A', C_AUTOFORN.CDCENTITMAP,
                      C_AUTOFORN.NRCOLEITMAP, C_AUTOFORN.CDMARCA, C_AUTOFORN.CDREGITMAP,
                      C_AUTOFORN.CDFORNECED, C_AUTOFORN.CDPRODUTO, C_AUTOFORN.NRLISTAITMAP,
                      C_AUTOFORN.QTDISPPRODMARC);
               /*Continuação da implementação da solicitação 166404*/
               FOR C_ITEMSOLI IN (SELECT ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP, ITEMSOLI.CDPRODUTO, ITEMSOLI.DTPROGENTR,
                                         COUNT(ITEMSOLI.NRSOLICMP) OVER (PARTITION BY ITEMSOLI.CDFILSOLI
                                                                             ORDER BY ITEMSOLI.CDFILSOLI)  CONTA_ITEMSOLI,
                                         COUNT(ITEMSOLIRELACAF.NRSOLICMP) OVER (PARTITION BY ITEMSOLI.CDFILSOLI
                                                                             ORDER BY ITEMSOLI.CDFILSOLI)  CONTA_ITEMSOLIRELAC,
                                         NVL(ITEMSOLIRELACAF.NRSOLICMP, 'N') NRSOLICMPRELAC
                                    FROM ITEMSOLI, SOLICITA, PRODUTO, PRODUTO PRODESTO, ITEMSOLIRELACAF
                                   WHERE ITEMSOLI.CDFILSOLI = SOLICITA.CDFILSOLI
                                     AND ITEMSOLI.CDFILLAN  = SOLICITA.CDFILLANCA
                                     AND ITEMSOLI.NRSOLICMP = SOLICITA.NRSOLICMP
                                     AND ITEMSOLI.IDITMCONS  = 'N'
                                     AND ITEMSOLI.CDFILIOPELOG IS NULL
                                     AND ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
                                     AND NVL(ITEMSOLI.QTSOLIPROD, 0) > 0
                                     AND PRODUTO.CDPRODESTO = PRODESTO.CDPRODESTO
                                     AND ITEMSOLI.CDFILSOLI = C_AUTOFORN.CDFILDEST
                                     AND ITEMSOLI.DTPROGENTR = C_AUTOFORN.DTPROGENTAF
                                     AND PRODESTO.CDPRODUTO = C_AUTOFORN.CDPRODUTO
                                     AND NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S'
                                     AND ITEMSOLI.IDITMSOLEXTRA = CASE V_EXTRA
                                                                     WHEN 'S'
                                                                     THEN 'S'
                                                                     ELSE ITEMSOLI.IDITMSOLEXTRA
                                                                  END
                                     AND ITEMSOLIRELACAF.CDFILSOLI(+)  = ITEMSOLI.CDFILSOLI
                                     AND ITEMSOLIRELACAF.CDFILLAN(+)   = ITEMSOLI.CDFILLAN
                                     AND ITEMSOLIRELACAF.NRSOLICMP(+)  = ITEMSOLI.NRSOLICMP
                                     AND ITEMSOLIRELACAF.CDPRODUTO(+)  = ITEMSOLI.CDPRODUTO
                                     AND ITEMSOLIRELACAF.DTPROGENTR(+) = ITEMSOLI.DTPROGENTR)
               LOOP
                  IF C_ITEMSOLI.CONTA_ITEMSOLI = 1 THEN
                     V_INCLUSAORELAC := V_INCLUSAORELAC+1;
                     INSERT
                       INTO ITEMSOLIRELACAF(NRITEMSOLIRELACAF, CDFILSOLI, CDFILLAN, NRSOLICMP,
                                             CDPRODUTO, DTPROGENTR, CDCENTITMAP, NRSEQITMAP,
                                             CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF)
                     VALUES (SEQ_NRITEMSOLIRELACAF.NEXTVAL, C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                            C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, P_CDCENTCMP, P_NRSEQAPUR,
                            C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, V_CODIGO, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                            NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO), C_AUTOFORN.DTNEWENTAF);
                  ELSE
                     IF C_ITEMSOLI.CONTA_ITEMSOLI = C_ITEMSOLI.CONTA_ITEMSOLIRELAC THEN
                        V_INCLUSAORELAC := V_INCLUSAORELAC+1;
                        INSERT
                          INTO ITEMSOLIRELACAF(NRITEMSOLIRELACAF, CDFILSOLI, CDFILLAN, NRSOLICMP,
                               CDPRODUTO, DTPROGENTR, CDCENTITMAP, NRSEQITMAP,
                               CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF)
                         VALUES (SEQ_NRITEMSOLIRELACAF.NEXTVAL, C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                                C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, P_CDCENTCMP, P_NRSEQAPUR,
                                C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, V_CODIGO, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                                NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO), C_AUTOFORN.DTNEWENTAF);
                     ELSE
                        IF C_ITEMSOLI.NRSOLICMPRELAC = 'N' THEN
                           V_INCLUSAORELAC := V_INCLUSAORELAC+1;
                           INSERT
                             INTO ITEMSOLIRELACAF(NRITEMSOLIRELACAF, CDFILSOLI, CDFILLAN, NRSOLICMP,
                                  CDPRODUTO, DTPROGENTR, CDCENTITMAP, NRSEQITMAP,
                                  CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF)
                            VALUES (SEQ_NRITEMSOLIRELACAF.NEXTVAL, C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                                   C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, P_CDCENTCMP, P_NRSEQAPUR,
                                   C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, V_CODIGO, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                                   NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO), C_AUTOFORN.DTNEWENTAF);
                        END IF;
                     END IF;
                  END IF;
               END LOOP;
               /*Continuação da implementação da solicitação 166404*/
               IF V_INCLUSAORELAC = 0 THEN
                  FOR C_ITEMSOLI IN (SELECT ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP, ITEMSOLI.CDPRODUTO, ITEMSOLI.DTPROGENTR
                                       FROM ITEMSOLI, SOLICITA, PRODUTO, PRODUTO PRODESTO, ITEMSOLIRELACAF
                                      WHERE ITEMSOLI.CDFILSOLI = SOLICITA.CDFILSOLI
                                        AND ITEMSOLI.CDFILLAN  = SOLICITA.CDFILLANCA
                                        AND ITEMSOLI.NRSOLICMP = SOLICITA.NRSOLICMP
                                        AND ITEMSOLI.IDITMCONS  = 'N'
                                        AND ITEMSOLI.CDFILIOPELOG IS NULL
                                        AND ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
                                        AND NVL(ITEMSOLI.QTSOLIPROD, 0) > 0
                                        AND PRODUTO.CDPRODESTO = PRODESTO.CDPRODESTO
                                        AND ITEMSOLI.CDFILSOLI = C_AUTOFORN.CDFILDEST
                                        AND ITEMSOLI.DTPROGENTR = C_AUTOFORN.DTPROGENTAF
                                        AND PRODESTO.CDPRODUTO = C_AUTOFORN.CDPRODUTO
                                        AND NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S'
                                        AND ITEMSOLI.IDITMSOLEXTRA = CASE V_EXTRA
                                                                        WHEN 'S'
                                                                        THEN 'S'
                                                                        ELSE ITEMSOLI.IDITMSOLEXTRA
                                                                     END
                                        AND ITEMSOLIRELACAF.CDFILSOLI(+)  = ITEMSOLI.CDFILSOLI
                                        AND ITEMSOLIRELACAF.CDFILLAN(+)   = ITEMSOLI.CDFILLAN
                                        AND ITEMSOLIRELACAF.NRSOLICMP(+)  = ITEMSOLI.NRSOLICMP
                                        AND ITEMSOLIRELACAF.CDPRODUTO(+)  = ITEMSOLI.CDPRODUTO
                                        AND ITEMSOLIRELACAF.DTPROGENTR(+) = ITEMSOLI.DTPROGENTR)
                  LOOP
                     INSERT
                       INTO ITEMSOLIRELACAF(NRITEMSOLIRELACAF, CDFILSOLI, CDFILLAN, NRSOLICMP,
                                             CDPRODUTO, DTPROGENTR, CDCENTITMAP, NRSEQITMAP,
                                             CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCAAF, CDPRODUTOAF, DTPROGENTAF)
                     VALUES (SEQ_NRITEMSOLIRELACAF.NEXTVAL, C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                            C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, P_CDCENTCMP, P_NRSEQAPUR,
                            C_AUTOFORN.CDFILDEST, C_AUTOFORN.CDFILLANC, V_CODIGO, NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA),
                            NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO), C_AUTOFORN.DTNEWENTAF);

                  END LOOP;
                  /*Fim da implementação da solicitação 166404 para gravar registros na tabela de relacionamento que será utilizaedo no empenho*/
               END IF;
            END IF;
            V_NRPEDIDOCOL := NULL;
            SELECT MAX(NRPEDIDOCOL)
            INTO V_NRPEDIDOCOL
            FROM ITEMCOLE
            WHERE ITEMCOLE.CDFILIAL    = C_AUTOFORN.CDCENTITMAP
              AND ITEMCOLE.NRCOLEPRECO = C_AUTOFORN.NRCOLEITMAP
              AND ITEMCOLE.CDMARCA     = C_AUTOFORN.CDMARCA
              AND ITEMCOLE.CDREGIAO    = C_AUTOFORN.CDREGITMAP
              AND ITEMCOLE.CDFORNECED  = C_AUTOFORN.CDFORNECED
              AND ITEMCOLE.CDPRODUTO   = C_AUTOFORN.CDPRODUTO;

            IF V_NRPEDIDOCOL IS NOT NULL THEN
               IF V_IDUTQTDISPGERAL = 'S' AND C_AUTOFORN.IDUTQTDISPFORN = 'S' THEN
                  UPDATE PRMARCPEDCOL
                  SET QTDISPPRODMARC = DECODE(QTDISPPRODMARC - V_QTPROGENTAF,
                                              ABS(QTDISPPRODMARC - V_QTPROGENTAF),
                                              QTDISPPRODMARC - V_QTPROGENTAF,
                                              0)
                  WHERE PRMARCPEDCOL.CDFILIAL       = C_AUTOFORN.CDCENTITMAP
                    AND PRMARCPEDCOL.NRPEDIDOCOL    = V_NRPEDIDOCOL
                    AND PRMARCPEDCOL.CDPRODUTO      = C_AUTOFORN.CDPRODUTO
                    AND PRMARCPEDCOL.CDMARCA        = C_AUTOFORN.CDMARCA
                    AND PRMARCPEDCOL.QTDISPPRODMARC IS NOT NULL;
               END IF;
            END IF;
         ELSE
            V_NRPEDIDOCOL := NULL;
            SELECT MAX(NRPEDIDOCOL)
            INTO V_NRPEDIDOCOL
            FROM ITEMCOLE
            WHERE ITEMCOLE.CDFILIAL    = C_AUTOFORN.CDCENTITMAP
              AND ITEMCOLE.NRCOLEPRECO = C_AUTOFORN.NRCOLEITMAP
              AND ITEMCOLE.CDMARCA     = C_AUTOFORN.CDMARCA
              AND ITEMCOLE.CDREGIAO    = C_AUTOFORN.CDREGITMAP
              AND ITEMCOLE.CDFORNECED  = C_AUTOFORN.CDFORNECED
              AND ITEMCOLE.CDPRODUTO   = C_AUTOFORN.CDPRODUTO;

            IF V_NRPEDIDOCOL IS NOT NULL THEN
               IF V_IDUTQTDISPGERAL = 'S' AND C_AUTOFORN.IDUTQTDISPFORN = 'S' THEN
                  UPDATE PRMARCPEDCOL
                  SET QTDISPPRODMARC = DECODE(QTDISPPRODMARC - V_QTPROGENTAF,
                                              ABS(QTDISPPRODMARC - V_QTPROGENTAF),
                                              QTDISPPRODMARC - V_QTPROGENTAF,
                                              0)
                  WHERE PRMARCPEDCOL.CDFILIAL       = C_AUTOFORN.CDCENTITMAP
                    AND PRMARCPEDCOL.NRPEDIDOCOL    = V_NRPEDIDOCOL
                    AND PRMARCPEDCOL.CDPRODUTO      = C_AUTOFORN.CDPRODUTO
                    AND PRMARCPEDCOL.CDMARCA        = C_AUTOFORN.CDMARCA
                    AND PRMARCPEDCOL.QTDISPPRODMARC IS NOT NULL;
               END IF;
            END IF;

            IF C_AUTOFORN.DTPROGENTAF <> V_DTENTRITMSOL THEN
              /* Solicitação de Compras da Entrega não antecipada */
              SELECT
                MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
              FROM
                ITEMSOLI,
                PRODUTO PRODSOLI,
                PRODUTO
              WHERE
                ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                ITEMSOLI.DTPROGENTR  = C_AUTOFORN.DTPROGENTAF AND
                PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                          WHEN 'O'
                                          THEN CASE V_IDUTLPRCMPATIVO
                                                  WHEN 'S'
                                                  THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                  ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                               END
                                          ELSE ITEMSOLI.CDPRODUTO
                                       END                                  AND
              EXISTS (SELECT 1
                        FROM ITEMSOLIRELACAF
                       WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                         AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                         AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                         AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                         AND ITEMSOLIRELACAF.DTPROGENTR   = V_DTENTRITMSOL
                         AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDCENTCMP
                         AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
              /*Executa a consulta desconsiderando a implementação da solicitação 166404*/
              IF V_NRSOLCOMP IS NULL THEN
                 /* Solicitação de Compras da Entrega não antecipada */
                 SELECT
                   MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                 FROM
                   ITEMSOLI,
                   PRODUTO PRODSOLI,
                   PRODUTO
                 WHERE
                   ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                   ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                   ITEMSOLI.DTPROGENTR  = C_AUTOFORN.DTPROGENTAF AND
                   PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                   PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                   ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                             WHEN 'O'
                                             THEN CASE V_IDUTLPRCMPATIVO
                                                     WHEN 'S'
                                                     THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                     ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                                  END
                                             ELSE ITEMSOLI.CDPRODUTO
                                          END AND
                   ITEMSOLI.IDITMCONS  = 'N'  AND
                   ITEMSOLI.CDFILIOPELOG IS NULL AND
              EXISTS (SELECT 1
                        FROM ITEMSOLIRELACAF
                       WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                         AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                         AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                         AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                         AND ITEMSOLIRELACAF.DTPROGENTR   = V_DTENTRITMSOL
                         AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDCENTCMP
                         AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
              END IF;
              SELECT NVL(SUM(QTSOLIPROD),0) INTO V_ANTQTSOLIPROD
                FROM ITEMSOLI
               WHERE
                CDFILSOLI  = C_AUTOFORN.CDFILDEST           AND
                CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)     AND
                CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)    AND
                DTPROGENTR = C_AUTOFORN.DTPROGENTAF         AND
                EXISTS (SELECT 1
                        FROM ITEMSOLIRELACAF
                       WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                         AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                         AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                         AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                         AND ITEMSOLIRELACAF.DTPROGENTR   = V_DTENTRITMSOL
                         AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDCENTCMP
                         AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
              SELECT
                MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
              FROM
                ITEMSOLI,
                PRODUTO PRODSOLI,
                PRODUTO
              WHERE
                ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                ITEMSOLI.DTPROGENTR  = V_DTENTRITMSOL         AND
                PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                          WHEN 'O'
                                          THEN CASE V_IDUTLPRCMPATIVO
                                                  WHEN 'S'
                                                  THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                  ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                               END
                                          ELSE ITEMSOLI.CDPRODUTO
                                       END AND
              EXISTS (SELECT 1
                        FROM ITEMSOLIRELACAF
                       WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                         AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                         AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                         AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                         AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                         AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDCENTCMP
                         AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
              IF V_NRSOLCOMP IS NULL THEN
                 SELECT
                   MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                 FROM
                   ITEMSOLI,
                   PRODUTO PRODSOLI,
                   PRODUTO
                 WHERE
                   ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                   ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                   ITEMSOLI.DTPROGENTR  = V_DTENTRITMSOL         AND
                   PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                   PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                   ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                             WHEN 'O'
                                             THEN CASE V_IDUTLPRCMPATIVO
                                                     WHEN 'S'
                                                     THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                     ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                                  END
                                             ELSE ITEMSOLI.CDPRODUTO
                                          END AND
                   ITEMSOLI.IDITMCONS  = 'N'  AND
                   ITEMSOLI.CDFILIOPELOG IS NULL;
              END IF;
              /* Log de Alteração */
              INSERT INTO MOVOPSOL
               (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                CDPRODUTO, DTENTROPER, DTOPERSOL,
                CDOPERADOR, QTANTOPER, QTDEPOPER,
                DSJUSTOPER)
              SELECT
                ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP,
                ITEMSOLI.CDPRODUTO, V_DTENTRITMSOL, SYSDATE,
                P_CDOPERADOR, ITEMSOLI.QTSOLIPROD, ITEMSOLI.QTSOLIPROD + V_ANTQTSOLIPROD,
                'Ef.AF -Entr. Antecipada de '||C_AUTOFORN.DTPROGENTAF
              FROM
                ITEMSOLI
              WHERE
                ITEMSOLI.CDFILSOLI  = C_AUTOFORN.CDFILDEST AND
                ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)  AND
                ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10)  AND
                ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10) AND
                ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL;

              V_DTAUX := SYSDATE;
              WHILE V_DTAUX = SYSDATE LOOP
                 V_DTAUX := V_DTAUX;
              END LOOP;

              UPDATE ITEMSOLI
              SET QTSOLIPROD = QTSOLIPROD + V_ANTQTSOLIPROD
              WHERE
                CDFILSOLI  = C_AUTOFORN.CDFILDEST           AND
                CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4)  AND
                NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10)  AND
                CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10) AND
                DTPROGENTR = V_DTENTRITMSOL;

              V_QTSOLIPROD := 0;

              /* Retirar quantidade da antiga solicitação */
              FOR C_ITEMSOLI IN
               (SELECT
                  ITEMSOLI.CDFILSOLI,
                  ITEMSOLI.CDFILLAN,
                  ITEMSOLI.NRSOLICMP,
                  ITEMSOLI.CDPRODUTO,
                  ITEMSOLI.DTPROGENTR,
                  ITEMSOLI.QTSOLIPROD,
                  PRODSOLI.VRFATOCONV
                FROM
                  ITEMSOLI,
                  PRODUTO PRODSOLI,
                  PRODUTO
                WHERE
                  ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO     AND
                  ITEMSOLI.CDFILSOLI   = C_AUTOFORN.CDFILDEST   AND
                  ITEMSOLI.DTPROGENTR  = C_AUTOFORN.DTPROGENTAF AND
                  PRODUTO.CDPRODUTO    = C_AUTOFORN.CDPRODUTO   AND
                  PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO     AND
                  ITEMSOLI.CDPRODUTO   = CASE C_AUTOFORN.IDFUNCAOFILI
                                            WHEN 'O'
                                            THEN CASE V_IDUTLPRCMPATIVO
                                                    WHEN 'S'
                                                    THEN NVL(V_CDPRARVORIG, ITEMSOLI.CDPRODUTO)
                                                    ELSE NVL(V_CDPRARVORIG, C_AUTOFORN.CDPRODUTO)
                                                 END
                                            ELSE ITEMSOLI.CDPRODUTO
                                         END AND
                  EXISTS (SELECT 1
                        FROM ITEMSOLIRELACAF
                       WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                         AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                         AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                         AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                         AND ITEMSOLIRELACAF.DTPROGENTR   = V_DTENTRITMSOL
                         AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDCENTCMP
                         AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
              LOOP
                IF V_QTSOLIPROD = 0 THEN
                  V_QTSOLIPROD := V_ANTQTSOLIPROD - C_ITEMSOLI.QTSOLIPROD;
                ELSE
                  V_QTSOLIPROD := V_QTSOLIPROD - C_ITEMSOLI.QTSOLIPROD;
                END IF;
                IF V_QTSOLIPROD >= 0 THEN
                   DELETE FROM ITEMSOLI
                   WHERE
                     CDFILSOLI  = C_ITEMSOLI.CDFILSOLI  AND
                     CDFILLAN   = C_ITEMSOLI.CDFILLAN   AND
                     NRSOLICMP  = C_ITEMSOLI.NRSOLICMP  AND
                     CDPRODUTO  = C_ITEMSOLI.CDPRODUTO  AND
                     DTPROGENTR = C_ITEMSOLI.DTPROGENTR;

                   /* LOG DE ALTERAÇÃO */
                   INSERT INTO MOVOPSOL
                    (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                     CDPRODUTO, DTENTROPER, DTOPERSOL,
                     CDOPERADOR, QTANTOPER, QTDEPOPER,
                     DSJUSTOPER)
                   VALUES
                    (C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                     C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, SYSDATE,
                     P_CDOPERADOR, C_ITEMSOLI.QTSOLIPROD, 0,
                    'EF.AF -ENTR. ANTECIPADA P/ '||V_DTENTRITMSOL);

                   V_DTAUX := SYSDATE;
                   WHILE V_DTAUX = SYSDATE LOOP
                      V_DTAUX := V_DTAUX;
                   END LOOP;

                   IF V_QTSOLIPROD = 0 THEN
                      EXIT;
                   END IF;
                ELSE
                   IF V_QTSOLIPROD < 0 THEN
                     UPDATE ITEMSOLI
                     SET
                       QTSOLIPROD = ABS(V_QTSOLIPROD)
                     WHERE
                       CDFILSOLI  = C_ITEMSOLI.CDFILSOLI  AND
                       CDFILLAN   = C_ITEMSOLI.CDFILLAN   AND
                       NRSOLICMP  = C_ITEMSOLI.NRSOLICMP  AND
                       CDPRODUTO  = C_ITEMSOLI.CDPRODUTO  AND
                       DTPROGENTR = C_ITEMSOLI.DTPROGENTR;

                     /* LOG DE ALTERAÇÃO */
                     INSERT INTO MOVOPSOL
                      (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV,
                       CDPRODUTO, DTENTROPER, DTOPERSOL,
                       CDOPERADOR, QTANTOPER, QTDEPOPER,
                       DSJUSTOPER)
                     VALUES
                      (C_ITEMSOLI.CDFILSOLI, C_ITEMSOLI.CDFILLAN, C_ITEMSOLI.NRSOLICMP,
                       C_ITEMSOLI.CDPRODUTO, C_ITEMSOLI.DTPROGENTR, SYSDATE,
                       P_CDOPERADOR, C_ITEMSOLI.QTSOLIPROD, ABS(V_QTSOLIPROD),
                      'EF.AF -ENTR. ANTECIPADA P/ '||V_DTENTRITMSOL);

                     V_DTAUX := SYSDATE;
                     WHILE V_DTAUX = SYSDATE LOOP
                        V_DTAUX := V_DTAUX;
                     END LOOP;

                     EXIT;
                   END IF;
                END IF;
              END LOOP;
              IF V_IDUTEMPENHAF = 'S' THEN
                 SELECT
                    NVL(MAX(VRARREDEMPMAR), 0)
                  INTO
                     V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
                  FROM
                     MARCPROD
                  WHERE
                     (CDMARCA   = C_AUTOFORN.CDMARCA) AND
                     (CDPRODUTO IN (SELECT
                                       P.CDPRODUTO
                                    FROM
                                       PRODUTO P
                                    WHERE
                                       P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                       C_AUTOFORN.CDARVPROD LIKE P.CDARVPROD || '%') );
                 IF V_VRARREDEMPE = 0 THEN
                    SELECT
                       DECODE(MAX(VRARREDEMPE), NULL, 0, MAX(VRARREDEMPE)) INTO V_VRARREDEMPE
                    FROM
                       PRODFORNCOMP
                    WHERE
                       CDPRODCOMPL = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                       CDFORNECED  = C_AUTOFORN.CDFORNECED;
                  END IF;
                  IF (MOD(V_QTPROGENTAF, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
                     V_QTPROGENTAF := CEIL(V_QTPROGENTAF / V_VRARREDEMPE) * V_VRARREDEMPE;
                  END IF;
              END IF;
              V_QTEMPENHADA := 0;
              IF V_IDUTEMPENHAF = 'S' THEN
                 IF (MOD(C_AUTOFORN.QTEMPENHADA, V_VRARREDEMPE) <> 0) AND V_VRARREDEMPE > 0 THEN
                    V_QTEMPENHADA := NVL(CEIL(C_AUTOFORN.QTEMPENHADA / V_VRARREDEMPE) * V_VRARREDEMPE, 0);
                 END IF;
              END IF;
              IF V_QTEMPENHADA = 0 THEN
              /* E O UPDATE NA ITEMAUTF QUE TEM NO ANTES DESSE IF*/
              /*ALTERAÇÃO PARA ALIBRAS QUANDO FORNECEDOR TEM PERIODICIDADE E ARREDONDAMENTO DE EMPENHO
                MAIOR QUE 1 E O SISTEMA COMPRA PARA MAIS OU PARA MENNOS DO QUE DESEJA DO NO PERIODO*/
                 UPDATE ITEMAUTF
                    SET QTPROGENTAF   = QTPROGENTAF + V_QTPROGENTAF
                  WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                        CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                        NRAUTOFORN    = V_CODIGO                               AND
                        CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                        CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                        DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF;
              ELSE
                 UPDATE ITEMAUTF
                    SET QTPROGENTAF   = QTPROGENTAF + V_QTPROGENTAF
                  WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                        CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                        NRAUTOFORN    = V_CODIGO                               AND
                        CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                        CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                        DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF                  AND
                        (QTPROGENTAF + V_QTPROGENTAF) <= V_QTEMPENHADA;
                 IF SQL%NOTFOUND THEN
                    UPDATE ITEMAUTF
                       SET QTPROGENTAF   = V_QTEMPENHADA
                     WHERE CDFILDEST     = C_AUTOFORN.CDFILDEST                   AND
                           CDFILLANC     = C_AUTOFORN.CDFILLANC                   AND
                           NRAUTOFORN    = V_CODIGO                               AND
                           CDPRODUTO     = NVL(V_PRODUTOOL, C_AUTOFORN.CDPRODUTO) AND
                           CDMARCA       = NVL(V_MARCAITEM, C_AUTOFORN.CDMARCA)   AND
                           DTPROGENTAF   = C_AUTOFORN.DTNEWENTAF                  AND
                           QTPROGENTAF   < V_QTEMPENHADA;
                 END IF;
              END IF;
            END IF;
         END IF;

         IF (V_DSATUAL <> V_DSANTERIOR) AND (NOT V_DSANTERIOR IS NULL) THEN
            V_DSPGTO := V_ANTDSPZOPGTCONC;
            WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
               V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
               V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

               V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
               V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

               INSERT INTO PRAZOPGTAF
                  (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
               VALUES
                   (V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO);
            END LOOP;

            /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
            IF V_IDARREDCMPAMENOS = 'S' THEN
               SELECT NVL(MAX('S'), 'N')
                 INTO V_IDQTFRACIONADO
                 FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
                WHERE I.CDFILDEST   = A.CDFILDEST
                  AND I.CDFILLANC   = A.CDFILLANC
                  AND I.NRAUTOFORN  = A.NRAUTOFORN
                  AND A.CDFILDEST   = F.CDFILIAL
                  AND A.NRSEQAPURAF = P_NRSEQAPUR
                  AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
                  AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

               IF V_IDQTFRACIONADO = 'S' THEN
                  V_CONTADOR := V_CONTADOR + 1;
               END IF;
            END IF;

            -- FECHAMENTO_AF;
            -- GERA-PARCELAS

            UPDATE ITEMAUTF
               SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                             FROM ITEMAUTF ITEM
                                            WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                              AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                              AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                              AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF)),
                   ITEMAUTF.QTPROGENTAF = CASE V_IDARREDCMPAMENOS
                                             WHEN 'S'
                                             THEN CASE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                                     WHEN 0
                                                     THEN ITEMAUTF.QTPROGENTAF
                                                     ELSE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                                  END
                                             ELSE ITEMAUTF.QTPROGENTAF
                                          END
            WHERE
               (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
               (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
               (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);
                  --------
            SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
            FROM INSCRESTAD
            WHERE (CDEMPRESA = V_ANTCDEMPRESA);

            SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
            FROM ITEMAUTF
            WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
                  (CDFILLANC  = V_ANTCDFILLANC)  AND
                  (NRAUTOFORN = V_ANTCODIGO);

            IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                           V_CDINSCESTA,
                           V_ANTCDFORNECED,
                           V_ANTCDFILDEST,
                           V_ANTCDFILLANC,
                           V_ANTCODIGO,
                           V_DTPROGENTAF);

            -- qryValor_AF

            SELECT
               SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
               SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
               INTO V_VRPRODUTO, V_VRDESCONTO
            FROM
               ITEMAUTF
            WHERE
               (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
               (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
               (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

            SELECT
               NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
            FROM
               IMPITMAF,
               ITEMAUTF,
               IMPOSTO
            WHERE
               (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
               (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
               (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
               (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
               (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
               (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
               (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
               (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
               (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
               (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
                NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

            UPDATE AUTOFORNE
            SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
            WHERE
               (CDFILDEST   = V_ANTCDFILDEST) AND
               (CDFILLANC   = V_ANTCDFILLANC) AND
               (NRAUTOFORN  = V_ANTCODIGO);
         END IF;

            -- qryLimite_AF
            -- qryConsAF

         IF C_AUTOFORN.DTENTRAPUT IS NULL THEN
            V_DSANTERIOR := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                            C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                            C_AUTOFORN.CDTIPCOB     || NULL                    ||
                            C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                            C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                            C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                            C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                            C_AUTOFORN.CONC_KEY;
         ELSE
            V_DSANTERIOR := C_AUTOFORN.CDFILDEST    || C_AUTOFORN.CDFILLANC    ||
                            C_AUTOFORN.CDFORNECED   || C_AUTOFORN.IDTPFORPGTAP ||
                            C_AUTOFORN.CDTIPCOB     || C_AUTOFORN.DTENTRAPUT   ||
                            C_AUTOFORN.IDTIPOEMITAP || V_EMPRESA               ||
                            C_AUTOFORN.IDTIPOFRETAP || C_AUTOFORN.CDFORMPGTO   ||
                            C_AUTOFORN.NRPARCPGTOAP || C_AUTOFORN.NRDIAPGFIXAF ||
                            C_AUTOFORN.IDUTDIAPGTAF || C_AUTOFORN.DSPZOPGTCOAP ||
                            C_AUTOFORN.CONC_KEY;
         END IF;

       --  DBMS_OUTPUT.PUT_LINE('CONC_KEY = '||C_AUTOFORN.CONC_KEY);

         V_ANTCODIGO       := V_CODIGO;
         V_ANTCDFILDEST    := C_AUTOFORN.CDFILDEST;
         V_ANTCDFILLANC    := C_AUTOFORN.CDFILLANC;
         V_ANTCDFORNECED   := C_AUTOFORN.CDFORNECED;
         V_ANTIDTPFORPGTAF := C_AUTOFORN.IDTPFORPGTAP;
         V_ANTCDTIPCOB     := C_AUTOFORN.CDTIPCOB;
         V_ANTIDTIPOEMITAF := C_AUTOFORN.IDTIPOEMITAP;
         V_ANTCDEMPRESA    := V_EMPRESA;
         V_ANTIDTIPOFRETAF := C_AUTOFORN.IDTIPOFRETAP;
         V_ANTCDFORMPGTO   := C_AUTOFORN.CDFORMPGTO;
         V_ANTNRPARCPGTOAF := C_AUTOFORN.NRPARCPGTOAP;
         V_ANTNRDIAPGFIXAF := C_AUTOFORN.NRDIAPGFIXAF;
         V_ANTIDUTDIAPGTAF := C_AUTOFORN.IDUTDIAPGTAF;
         V_ANTDSPZOPGTCONC := C_AUTOFORN.DSPZOPGTCOAP;
         V_ANTCONC_KEY     := C_AUTOFORN.CONC_KEY;
      END IF;

   END LOOP;

   -- GERAR PARA O ULTIMO ITEM

   V_DSPGTO := V_ANTDSPZOPGTCONC;

   WHILE INSTR(V_DSPGTO, '_') > 0 LOOP
      V_DIAPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '*')-1);
      V_DSPGTO  := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '*')+1, LENGTH(V_DSPGTO));

      V_VRPGTO := SUBSTR(V_DSPGTO, 1, INSTR(V_DSPGTO, '_')-1);
      V_DSPGTO := SUBSTR(V_DSPGTO, INSTR(V_DSPGTO, '_')+1, LENGTH(V_DSPGTO));

      INSERT INTO PRAZOPGTAF
         (CDFILDEST, CDFILLANC, NRAUTOFORN, NRDIASPGTOAF, VRPERCPGTOAF)
      (SELECT V_ANTCDFILDEST, V_ANTCDFILLANC, V_ANTCODIGO, V_DIAPGTO, V_VRPGTO
         FROM DUAL
        WHERE NOT EXISTS (SELECT 1
                            FROM PRAZOPGTAF
                           WHERE CDFILDEST    = V_ANTCDFILDEST
                             AND CDFILLANC    = V_ANTCDFILLANC
                             AND NRAUTOFORN   = V_ANTCODIGO
                             AND NRDIASPGTOAF = V_DIAPGTO));
   END LOOP;

   /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
   IF V_IDARREDCMPAMENOS = 'S' THEN
      SELECT NVL(MAX('S'), 'N')
        INTO V_IDQTFRACIONADO
        FROM AUTOFORNE A, ITEMAUTF I, FILIAL F
       WHERE I.CDFILDEST   = A.CDFILDEST
         AND I.CDFILLANC   = A.CDFILLANC
         AND I.NRAUTOFORN  = A.NRAUTOFORN
         AND A.CDFILDEST   = F.CDFILIAL
         AND A.NRSEQAPURAF = P_NRSEQAPUR
         AND DECODE(F.CDFILCENTCMP, NULL, F.CDFILIAL, F.CDFILCENTCMP) = P_CDCENTCMP
         AND FLOOR(I.QTPROGENTAF) <> I.QTPROGENTAF;

      IF V_IDQTFRACIONADO = 'S' THEN
         V_CONTADOR := V_CONTADOR + 1;
      END IF;
   END IF;

   -- FECHAMENTO_AF;
   -- GERA-PARCELAS

   UPDATE ITEMAUTF
      SET ITEMAUTF.NRPARCITMAF = (SELECT LPAD(TO_CHAR(COUNT(DISTINCT ITEM.DTPROGENTAF)),2,'0')
                                    FROM ITEMAUTF ITEM
                                   WHERE (ITEM.CDFILDEST   = V_ANTCDFILDEST)
                                     AND (ITEM.CDFILLANC   = V_ANTCDFILLANC)
                                     AND (ITEM.NRAUTOFORN  = V_ANTCODIGO)
                                     AND (ITEM.DTPROGENTAF <= ITEMAUTF.DTPROGENTAF)),
          ITEMAUTF.QTPROGENTAF = CASE V_IDARREDCMPAMENOS
                                    WHEN 'S'
                                    THEN CASE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                            WHEN 0
                                            THEN ITEMAUTF.QTPROGENTAF
                                            ELSE NVL(FLOOR(ITEMAUTF.QTPROGENTAF), 1)
                                         END
                                    ELSE ITEMAUTF.QTPROGENTAF
                                 END
   WHERE
      (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
      (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
      (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

   SELECT MIN(CDINSCESTA) INTO V_CDINSCESTA
   FROM INSCRESTAD
   WHERE (CDEMPRESA = V_ANTCDEMPRESA);

   SELECT MIN(DTPROGENTAF) INTO V_DTPROGENTAF
   FROM ITEMAUTF
   WHERE (CDFILDEST  = V_ANTCDFILDEST)  AND
         (CDFILLANC  = V_ANTCDFILLANC)  AND
         (NRAUTOFORN = V_ANTCODIGO);

   IMPOSTO_ITEMAF(V_ANTCDEMPRESA,
                  V_CDINSCESTA,
                  V_ANTCDFORNECED,
                  V_ANTCDFILDEST,
                  V_ANTCDFILLANC,
                  V_ANTCODIGO,
                  V_DTPROGENTAF);

   -- qryValor_AF

   SELECT
      SUM(ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF),
      SUM((ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF * NVL(ITEMAUTF.VRPERDESAF, 0)) / 100)
      INTO V_VRPRODUTO, V_VRDESCONTO
   FROM
      ITEMAUTF
   WHERE
      (ITEMAUTF.CDFILDEST  = V_ANTCDFILDEST) AND
      (ITEMAUTF.CDFILLANC  = V_ANTCDFILLANC) AND
      (ITEMAUTF.NRAUTOFORN = V_ANTCODIGO);

   SELECT
      NVL(SUM(IMPITMAF.VRADIMPAF), 0) INTO V_VRIMPOSTO
   FROM
      IMPITMAF,
      ITEMAUTF,
      IMPOSTO
   WHERE
      (IMPITMAF.CDFILDEST   = V_ANTCDFILDEST)       AND
      (IMPITMAF.CDFILLANC   = V_ANTCDFILLANC)       AND
      (IMPITMAF.NRAUTOFORN  = V_ANTCODIGO)          AND
      (IMPITMAF.CDFILDEST   = ITEMAUTF.CDFILDEST)   AND
      (IMPITMAF.CDFILLANC   = ITEMAUTF.CDFILLANC)   AND
      (IMPITMAF.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN)  AND
      (IMPITMAF.CDPRODUTO   = ITEMAUTF.CDPRODUTO)   AND
      (IMPITMAF.CDMARCA     = ITEMAUTF.CDMARCA)     AND
      (IMPITMAF.DTPROGENTAF = ITEMAUTF.DTPROGENTAF) AND
      (IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO)    AND
       NVL(IMPOSTO.IDACRPRODENTRNF, 'N') = 'N';

   UPDATE AUTOFORNE
   SET VRTOTALAF = V_VRPRODUTO - V_VRDESCONTO + V_VRIMPOSTO
   WHERE
      (CDFILDEST   = V_ANTCDFILDEST) AND
      (CDFILLANC   = V_ANTCDFILLANC) AND
      (NRAUTOFORN  = V_ANTCODIGO);

   /* SE ALGUM PRODUTO FOR FRACIONADO, UPDATA A APURAÇÃO PARA HABILITAR O BOTÃO DE APURAR NOVAMENTE */
   IF V_IDARREDCMPAMENOS = 'S' THEN
      IF V_CONTADOR = 0 THEN
         UPDATE APURPRECO
            SET IDQTFRACIONADO = 'N'
          WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
            AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR;
      ELSE
         UPDATE APURPRECO
            SET IDQTFRACIONADO = 'S'
          WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
            AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR;
      END IF;
   END IF;

   UPDATE APURPRECO
      SET CDCOMPRADOR = P_CDOPERADOR
    WHERE APURPRECO.CDFILCENTCMP = P_CDCENTCMP
      AND APURPRECO.NRAPURPREC   = P_NRSEQAPUR
      AND CDCOMPRADOR IS NULL;

   DELETE FROM USR_NRSEQAPUR_TMP
    WHERE NRSEQAPUR = P_NRSEQAPUR;
END;
/

/* Sistemas Integrados TEKNISA
   Compras e Suprimentos

Nome: 8530_SUPSTPS.sql

Descrição:
Remaneja AF's de acordo com o arredondamento para empenho.

Criação:
20/07/2004 - João Fernando dos Reis Corrêa
*/

CREATE OR REPLACE
PROCEDURE EMPENHAR_AF
  (P_NRSEQAPUR    IN AUTOFORNE.NRSEQAPURAF%TYPE,
   P_CDFILLANC    IN AUTOFORNE.CDFILLANC%TYPE,
   P_CDFILCENTCMP IN FILIAL.CDFILIAL%TYPE,
   P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE)
IS
   V_IDCONSPRSOL  VARCHAR2(1);

   V_QTAEMPENHAR  FLOAT; /* QUANTIDADE NA UNIDADE DE ESTOQUE QUE ESTA SOBRANDO NAS AF'S POR PRODUTO/FILIAL */
   V_QTARETIRAR   FLOAT; /* QUANTIDADE QUE SERA RETIRADA DO(S) PROXIMO(S) ITEM DE SOLICITACAO */

   V_NRSOLCOMP    VARCHAR2(200);
   V_QTSOLIPROD   FLOAT; /* QUANTIDADE DA SOLICITACAO DE COMPRAS */
   V_VRFATOCONV   FLOAT; /* FATOR DE CONVERSAO DO ITEM SOLICITADO */
   V_VRARREDEMPE  FLOAT; /* ARREDONDAMENTO PARA EMPENHO NA AF */
   V_QTARRED      FLOAT; /* QUANTIDADE SOLICITADA ARREDONDADA PARA BAIXO */
   V_QTDISPONIVEL FLOAT; /* QUANTIDADE DISPONIVEL PARA REMANEJAMENTO */
   V_DTULTENTR    DATE;  /* ULTIMA ENTREGA NA APURACAO DO PRODUTO */

   V_LISTA_AFS    VARCHAR2(20);
   V_LISTA_AF_AUX NUMBER;

   V_EXTRA        VARCHAR2(1);

   V_REJEICAO     FLOAT; /* PORCENTAGEM DE REJEIÇÃO*/
   V_QTDFINAL     FLOAT; /* RECEBE O RESTO INTEIRO DA DIVISÃO, PARA CONFERIR COM A QUANTIDADE DA SOLICITAÇÃO*/
   V_QTDINTDIV    FLOAT;
   V_PERCENTUAL   FLOAT;
   V_NRSOLCOMP_AUX VARCHAR2(200);
   V_COUNT        FLOAT := 0;
   V_DTPULTENTR    DATE;  /* PENULTIMA ENTREGA NA APURACAO DO PRODUTO */
   V_IDSISDOS     VARCHAR2(1);
   V_QTSOLIPRODF  FLOAT; /* QUANTIDADE DA SOLICITACAO DE COMPRAS FINAL*/
   V_QTPROGENTAF  FLOAT; /* QUANTIDADE NA UNIDADE DE ESTOQUE DO ÚLTIMO ITEM DE EMPENHO*/
   V_DTENTRITMSOL_MAX DATE; /*MAIOR ÚLTIMA DATA DE ENTREGA EXITENTE*/
   V_QTOUTRASAFS  FLOAT;    /*QUANTIDADE DE OUTRAS APURAÇÕES*/
   V_NRLOGCORTEOL NUMERIC; /*EMPENHAR PARA FILIAL OL GRSA*/
BEGIN

   SELECT
      NVL(MAX(IDCONSPRSOL), 'N')
   INTO
      V_IDCONSPRSOL
   FROM
      PARASUPRI
   WHERE
      (CDFILIAL = P_CDFILCENTCMP);

   SELECT MAX(IDCONSOLAPUEFET)
   INTO V_EXTRA
   FROM APURPRECO
   WHERE CDFILCENTCMP = P_CDFILCENTCMP
     AND NRAPURPREC = P_NRSEQAPUR;

   NOVO_CODIGO('LISTA', V_LISTA_AFS, 1);
   V_LISTA_AFS := SUBSTR(V_LISTA_AFS, 11, 10);
   SELECT NVL(MAX(IDSISDOS), '1')
     INTO V_IDSISDOS
     FROM PARAMGERAL;
   SELECT NVL(MAX(NRLOGCORTEOL), 0)
     INTO V_NRLOGCORTEOL 
     FROM APURPRECO
    WHERE CDFILCENTCMP = P_CDFILCENTCMP
      AND NRAPURPREC   = P_NRSEQAPUR;
   IF ((V_IDCONSPRSOL = 'N') AND (V_NRLOGCORTEOL = 0))THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODESTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                PRODUTO.CDPRODESTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV)-
                SUM((SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD*P.VRFATOCONV), 0)
                     FROM
                        PRODUTO P,
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                        (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                        (ITEMSOLI.IDITMCONS  = 'N')                   AND
                        ITEMSOLI.CDFILIOPELOG IS NULL                 AND
                        (ITEMSOLI.CDPRODUTO  = P.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))-
                    (SELECT
                        NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                     FROM
                        PRODUTO P,
                        ITEMAUTF I,
                        AUTOFORNE A
                     WHERE
                        (A.CDFILDEST    = I.CDFILDEST)  AND
                        (A.CDFILLANC    = I.CDFILLANC)  AND
                        (A.NRAUTOFORN   = I.NRAUTOFORN) AND
                        (I.CDPRODUTO    = P.CDPRODUTO)   AND
                        (PRODUTO.CDPRODESTO  = P.CDPRODESTO)     AND
                        (I.CDFILDEST    = ITEMAUTF.CDFILDEST)    AND
                        (I.DTENTRITMSOL = ITEMAUTF.DTENTRITMSOL) AND
                        (I.CDMARCA      = ITEMAUTF.CDMARCA)      AND
                        ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (NVL(A.IDBAIXAAF,'0') <> '5')          AND
                        NOT EXISTS (SELECT 1
                                      FROM ITEMSOLIRELACAF
                                     WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                       AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                       AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                       AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                       AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                       AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                       AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                       AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)) ) AS QTDECOMP
                 FROM
                    PRODUTO,
                    ITEMAUTF,
                    AUTOFORNE
                 WHERE
                    (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)  AND
                    (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)  AND
                    (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN) AND
                    (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)   AND
                    ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')          AND
                    (AUTOFORNE.CDFILLANC    = P_CDFILLANC)      AND
                    (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)      AND
                    EXISTS (SELECT 1
                              FROM ITEMSOLIRELACAF
                             WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                               AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                               AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                               AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                               AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                               AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                               AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                               AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)
                 GROUP BY
                    ITEMAUTF.CDFILDEST,
                    PRODUTO.CDPRODESTO,
                    ITEMAUTF.DTENTRITMSOL
                HAVING
                   SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV) >
                   SUM((SELECT
                           NVL(SUM(ITEMSOLI.QTSOLIPROD*P.VRFATOCONV), 0)
                        FROM
                           PRODUTO P,
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                           (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                           (ITEMSOLI.IDITMCONS  = 'N')                   AND
                           ITEMSOLI.CDFILIOPELOG IS NULL                 AND
                           (ITEMSOLI.CDPRODUTO  = P.CDPRODUTO)           AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                           EXISTS (SELECT 1
                                     FROM ITEMSOLIRELACAF
                                    WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                      AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                      AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                      AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                      AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                      AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                      AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))-
                       (SELECT
                           NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                        FROM
                           PRODUTO P,
                           ITEMAUTF I,
                           AUTOFORNE A
                        WHERE
                           (A.CDFILDEST    = I.CDFILDEST)  AND
                           (A.CDFILLANC    = I.CDFILLANC)  AND
                           (A.NRAUTOFORN   = I.NRAUTOFORN) AND
                           (I.CDPRODUTO     = P.CDPRODUTO)   AND
                           (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                           (I.CDFILDEST    = ITEMAUTF.CDFILDEST)  AND
                           (I.DTENTRITMSOL = ITEMAUTF.DTENTRITMSOL) AND
                           (I.CDMARCA = ITEMAUTF.CDMARCA) AND
                           ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (NVL(A.IDBAIXAAF,'0') <> '5')          AND
                           NOT EXISTS (SELECT 1
                                         FROM ITEMSOLIRELACAF
                                        WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                          AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                          AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                          AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                          AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                          AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)) ))
         GROUP BY
            CDFILIAL,
            CDPRODESTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               NVL(PRODUTO.VRFATOCONV, 1) VRFATOCONV,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD,
               MAX(ITEMAUTF.DTPROGENTAF)  OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTPROGENTAF_MAX,
               MIN(ITEMAUTF.DTENTRITMSOL) OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTENTRITMSOL_MIN,
               MAX(ITEMAUTF.DTENTRITMSOL) OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTENTRITMSOL_MAX
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)         AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)         AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)        AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)   AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)          AND
               (PRODUTO.CDPRODESTO     = C_PRODAEMPENHAR.CDPRODESTO) AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                      AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                        AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')         AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)        AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)        AND
               EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                          AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                          AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                          AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                          AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                          AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)
            ORDER BY
               ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP

            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            SELECT NVL(MAX(VRMINEMPENHOAF), 0)
              INTO V_REJEICAO
              FROM PRODFILI
             WHERE CDFILIAL  = C_PRODAEMPENHAR.CDFILIAL
               AND CDPRODUTO = C_ITEMAUTF.CDPRODUTO;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO) AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementação da solicitação 166404*/           
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                           MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO) AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')  AND

                           ITEMSOLI.IDITMCONS  = 'N'              AND
                           ITEMSOLI.CDFILIOPELOG IS NULL;
                  END IF;

                  SELECT NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                    INTO V_QTOUTRASAFS
                    FROM PRODUTO P, ITEMAUTF I, AUTOFORNE A
                   WHERE (A.CDFILDEST    = I.CDFILDEST)
                     AND (A.CDFILLANC    = I.CDFILLANC)
                     AND (A.NRAUTOFORN   = I.NRAUTOFORN)
                     AND (I.CDPRODUTO    = P.CDPRODUTO)
                     AND (P.CDPRODESTO   = C_PRODAEMPENHAR.CDPRODESTO)
                     AND (I.CDFILDEST    = C_PRODAEMPENHAR.CDFILIAL)
                     AND (I.DTENTRITMSOL = C_ITEMAUTF.DTENTRITMSOL)
                     --AND (I.CDMARCA      = ITEMAUTF.CDMARCA)
                     AND ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X'))
                     AND (NVL(A.IDBAIXAAF,'0') <> '5')
                     AND NOT EXISTS (SELECT 1
                                       FROM ITEMSOLIRELACAF
                                      WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                        AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                        AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                        AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                        AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                        AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                        AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                        AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                  SELECT
                     NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  V_QTSOLIPROD := V_QTSOLIPROD - V_QTOUTRASAFS;
                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI,
                                           PRODUTO
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        /* Log de Alteração */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        VALUES
                          (C_PRODAEMPENHAR.CDFILIAL,
                           C_ITEMSOLI.CDFILLAN,
                           C_ITEMSOLI.NRSOLICMP,
                           C_ITEMSOLI.CDPRODUTO,
                           C_ITEMAUTF.DTENTRITMSOL,
                           SYSDATE,
                           P_CDOPERADOR,
                           C_ITEMSOLI.QTSOLIPROD,
                           0,
                           'Empenho de AF');

                        DELETE FROM ITEMSOLI
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                           (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                           (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                           (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');
                     END LOOP;
                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - ( (C_ITEMAUTF.QTPROGENTAF * C_ITEMAUTF.VRFATOCONV));
                  ELSE
                     FOR C_ITEMSOLI IN(SELECT
                                          ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO,
                                          PRODUTO.VRFATOCONV, (ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV) QTSOLIPROD
                                       FROM
                                          ITEMSOLI,
                                          PRODUTO
                                       WHERE
                                          (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                                          (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                          (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                          ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                          (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                                          (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                       EXISTS (SELECT 1
                                                 FROM ITEMSOLIRELACAF
                                                WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                  AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                  AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                  AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                  AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                  AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                  AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)
                                       ORDER BY QTSOLIPROD)
                     LOOP
                        IF ((C_ITEMSOLI.QTSOLIPROD > V_QTARETIRAR) AND (V_QTARETIRAR > 0)) THEN
                           /* Log de Alteração */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           SELECT
                              ITEMSOLI.CDFILSOLI,
                              ITEMSOLI.CDFILLAN,
                              ITEMSOLI.NRSOLICMP,
                              ITEMSOLI.CDPRODUTO,
                              ITEMSOLI.DTPROGENTR,
                              SYSDATE,
                              P_CDOPERADOR,
                              ITEMSOLI.QTSOLIPROD,
                              ITEMSOLI.QTSOLIPROD - V_QTARETIRAR / C_ITEMSOLI.VRFATOCONV,
                              'Empenho de AF'
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (ITEMSOLI.CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (ITEMSOLI.NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (ITEMSOLI.CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR/C_ITEMSOLI.VRFATOCONV
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := 0;
                           EXIT;
                        ELSE
                           /* Log de Alteração */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           VALUES
                             (C_PRODAEMPENHAR.CDFILIAL,
                              C_ITEMSOLI.CDFILLAN,
                              C_ITEMSOLI.NRSOLICMP,
                              C_ITEMSOLI.CDPRODUTO,
                              C_ITEMAUTF.DTENTRITMSOL,
                              SYSDATE,
                              P_CDOPERADOR,
                              C_ITEMSOLI.QTSOLIPROD/C_ITEMSOLI.VRFATOCONV,
                              0,
                              'Empenho de AF');

                           DELETE FROM ITEMSOLI
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := V_QTARETIRAR-C_ITEMSOLI.QTSOLIPROD;
                        END IF;
                     END LOOP;
                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementação da solicitação 166404*/
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULL          AND
                        NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S';

                  END IF;
                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                       INTO V_QTOUTRASAFS
                       FROM PRODUTO P, ITEMAUTF I, AUTOFORNE A
                      WHERE (A.CDFILDEST    = I.CDFILDEST)
                        AND (A.CDFILLANC    = I.CDFILLANC)
                        AND (A.NRAUTOFORN   = I.NRAUTOFORN)
                        AND (I.CDPRODUTO    = P.CDPRODUTO)
                        AND (P.CDPRODESTO   = C_PRODAEMPENHAR.CDPRODESTO)
                        AND (I.CDFILDEST    = C_PRODAEMPENHAR.CDFILIAL)
                        AND (I.DTENTRITMSOL = C_ITEMAUTF.DTENTRITMSOL)
                        --AND (I.CDMARCA      = ITEMAUTF.CDMARCA)
                        AND ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X'))
                        AND (NVL(A.IDBAIXAAF,'0') <> '5')
                        AND NOT EXISTS (SELECT 1
                                          FROM ITEMSOLIRELACAF
                                         WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                           AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                           AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                           AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                           AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                           AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                           AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                           AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     V_QTSOLIPROD := V_QTSOLIPROD - V_QTOUTRASAFS;
                     V_QTARETIRAR := (C_ITEMAUTF.QTPROGENTAF * C_ITEMAUTF.VRFATOCONV) - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF,
                           AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)      AND
                           (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)      AND
                           (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN)    AND
                           (ITEMAUTF.CDPRODUTO = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                AND
                           (AUTOFORNE.IDAFFORALIM = 'N')                   AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')           AND
                           (AUTOFORNE.CDFILLANC = P_CDFILLANC)             AND
                           (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL)   AND
                           (PRODUTO.CDPRODESTO  =  C_PRODAEMPENHAR.CDPRODESTO) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)    AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)                AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  PRODUTO.CDPRODUTO)          AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')    AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                        IF V_QTDISPONIVEL IS NULL THEN
                           SELECT
                              SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV) INTO V_QTDISPONIVEL
                           FROM
                              ITEMSOLI,
                              PRODUTO
                           WHERE
                              (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL)   AND
                              (PRODUTO.CDPRODESTO  =  C_PRODAEMPENHAR.CDPRODESTO) AND
                              (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)    AND
                              (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)                AND
                              ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                              (ITEMSOLI.CDPRODUTO  =  PRODUTO.CDPRODUTO)          AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND

                              (ITEMSOLI.IDITMCONS  = 'N')                   AND
                               ITEMSOLI.CDFILIOPELOG IS NULL;
                        END IF;
                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR/C_ITEMAUTF.VRFATOCONV;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                        V_LISTA_AF_AUX := 0;

                        SELECT
                           COUNT(*) INTO V_LISTA_AF_AUX
                        FROM
                           LISTA
                        WHERE
                           NRLISTA = V_LISTA_AFS AND
                           CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                        IF V_LISTA_AF_AUX = 0 THEN
                           INSERT INTO LISTA
                           (NRLISTA, CDLISTA)
                           VALUES
                           (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                        END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED * C_ITEMAUTF.VRFATOCONV);
                           V_QTARETIRAR  := V_QTARETIRAR - (V_QTARRED * C_ITEMAUTF.VRFATOCONV);
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR)  THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              SELECT
                                 MAX(PRODUTO.VRFATOCONV) INTO V_VRFATOCONV
                              FROM
                                 ITEMSOLI,
                                 PRODUTO
                              WHERE
                                 (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              /* Log de Alteração */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR / V_VRFATOCONV,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                              IF ((V_REJEICAO = 0) OR ((V_REJEICAO > 0) AND (C_ITEMAUTF.DTPROGENTAF_MAX <> C_ITEMAUTF.DTPROGENTAF))) THEN
                                 UPDATE ITEMSOLI
                                 SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR/V_VRFATOCONV
                                 WHERE
                                    (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                    (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                    (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                    (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                    (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                    (NVL(IDSOLIAPROV,'S') = 'S');
                              END IF;
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
               /* Inicio % de Rejeição */
               IF V_NRSOLCOMP IS NOT NULL THEN
                  V_NRSOLCOMP_AUX := V_NRSOLCOMP;
               END IF;
               IF (C_ITEMAUTF.DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF_MAX) THEN
                  V_NRSOLCOMP := V_NRSOLCOMP_AUX;
                  IF V_REJEICAO > 0 THEN
                     SELECT
                          COUNT(*)
                       INTO
                          V_COUNT
                       FROM
                          ITEMSOLI
                       WHERE
                          (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                          (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                          (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                          (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                          (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                          (ITEMSOLI.DTPROGENTR BETWEEN C_ITEMAUTF.DTENTRITMSOL_MIN AND C_ITEMAUTF.DTENTRITMSOL_MAX);

                     IF ((V_COUNT > 1) OR ((V_QTSOLIPROD > C_ITEMAUTF.VRFATOCONV) AND (V_COUNT = 1))) THEN
                        SELECT MAX(ITEMSOLI.DTPROGENTR)
                          INTO V_DTPULTENTR
                          FROM ITEMSOLI
                         WHERE (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)
                           AND (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))
                           AND (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))
                           AND (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10))
                           AND (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')
                           AND (ITEMSOLI.DTPROGENTR BETWEEN C_ITEMAUTF.DTENTRITMSOL_MIN AND C_ITEMAUTF.DTENTRITMSOL_MAX);

                        SELECT NVL(MAX(MOD(ITEMSOLI.QTSOLIPROD, C_ITEMAUTF.VRFATOCONV)), 0),
                               NVL(MAX(ITEMSOLI.QTSOLIPROD), 0)
                          INTO V_QTDFINAL,
                               V_QTDINTDIV
                          FROM ITEMSOLI
                         WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                               (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                               (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                               (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                               (DTPROGENTR = V_DTPULTENTR)     AND
                               (NVL(IDSOLIAPROV,'S') = 'S');

                        V_PERCENTUAL := V_REJEICAO*C_ITEMAUTF.VRFATOCONV/100;
                        IF (V_QTDFINAL > 0) AND (V_QTDFINAL < (V_PERCENTUAL)) THEN
                           INSERT INTO MOVOPSOL
                                      (CDFILSOLMOV,
                                       CDFILLANMOV,
                                       NRSOLIMOV,
                                       CDPRODUTO,
                                       DTENTROPER,
                                       DTOPERSOL,
                                       CDOPERADOR,
                                       QTANTOPER,
                                       QTDEPOPER,
                                       DSJUSTOPER)
                                    SELECT
                                       ITEMSOLI.CDFILSOLI,
                                       ITEMSOLI.CDFILLAN,
                                       ITEMSOLI.NRSOLICMP,
                                       ITEMSOLI.CDPRODUTO,
                                       ITEMSOLI.DTPROGENTR,
                                       SYSDATE,
                                       P_CDOPERADOR,
                                       (ITEMSOLI.QTSOLIPROD),
                                       (ITEMSOLI.QTSOLIPROD - V_QTDFINAL),
                                       'Empenho de AF com % de rejeição'
                                    FROM ITEMSOLI
                                    WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                          (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                          (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                          (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                          (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL);

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTDFINAL
                           WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                               (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                               (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                               (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                               (DTPROGENTR = V_DTPULTENTR)     AND
                               (NVL(IDSOLIAPROV,'S') = 'S')               AND
                               (QTSOLIPROD - V_QTDFINAL) > 0;
                           IF SQL%NOTFOUND THEN
                              DELETE
                                FROM  ITEMSOLI
                              WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                                  (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                  (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                  (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                  (DTPROGENTR = V_DTPULTENTR)     AND
                                  (NVL(IDSOLIAPROV,'S') = 'S');
                           END IF;

                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - 1
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTENTRITMSOL  = V_DTPULTENTR)   AND
                              (QTPROGENTAF > 1);
                           IF SQL%NOTFOUND THEN    /*Caso o update acima não altere nada, será excluido a AF, isso ocrre quando a quantidade da AF é igual ou menor que as qntidades ja empenhadas (16-03-2016 Alibras)*/
                              DELETE FROM ITEMAUTF
                              WHERE
                                 (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                                 (CDFILLANC   = P_CDFILLANC)              AND
                                 (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                                 (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                                 (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                                 (DTENTRITMSOL  = V_DTPULTENTR);
                           END IF;
                        END IF;
                     END IF;
                  END IF;
                  /*INICIO SOLICITAÇÃO 182441 PARA AJUSTAR EMPENHO DA ÚLTIMA ENTREGA*/
                  IF ((V_IDSISDOS = '3') AND (C_ITEMAUTF.DTENTRITMSOL_MAX = C_ITEMAUTF.DTENTRITMSOL)) THEN
                     SELECT
                        MAX(ITEMSOLI.DTPROGENTR) INTO V_DTENTRITMSOL_MAX
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR <= C_ITEMAUTF.DTENTRITMSOL)    AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)  AND
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     SELECT NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                       INTO V_QTOUTRASAFS
                       FROM PRODUTO P, ITEMAUTF I, AUTOFORNE A
                      WHERE (A.CDFILDEST    = I.CDFILDEST)
                        AND (A.CDFILLANC    = I.CDFILLANC)
                        AND (A.NRAUTOFORN   = I.NRAUTOFORN)
                        AND (I.CDPRODUTO    = P.CDPRODUTO)
                        AND (P.CDPRODESTO   = C_PRODAEMPENHAR.CDPRODESTO)
                        AND (I.CDFILDEST    = C_PRODAEMPENHAR.CDFILIAL)
                        AND (I.DTENTRITMSOL = V_DTENTRITMSOL_MAX)
                        --AND (I.CDMARCA      = ITEMAUTF.CDMARCA)
                        AND ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X'))
                        AND (NVL(A.IDBAIXAAF,'0') <> '5')
                        AND NOT EXISTS (SELECT 1
                                          FROM ITEMSOLIRELACAF
                                         WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                           AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                           AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                           AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                           AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                           AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                           AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                           AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPRODF
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)  AND
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     V_QTSOLIPRODF := V_QTSOLIPRODF - V_QTOUTRASAFS;
                     
                     SELECT SUM(ITEMAUTF.QTPROGENTAF*C_ITEMAUTF.VRFATOCONV)
                       INTO V_QTPROGENTAF
                       FROM ITEMAUTF, AUTOFORNE
                      WHERE
                         (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)         AND
                         (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)         AND
                         (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)        AND
                         (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)                AND
                         ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                         (NVL(AUTOFORNE.IDBAIXAAF,'0') = '6')             AND
                         (ITEMAUTF.CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                         (ITEMAUTF.CDFILLANC   = P_CDFILLANC)              AND
                         (ITEMAUTF.CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                         (ITEMAUTF.CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                         (ITEMAUTF.DTENTRITMSOL  = V_DTENTRITMSOL_MAX)     AND
                         (ITEMAUTF.QTPROGENTAF > 1) AND
                      EXISTS (SELECT 1
                                FROM ITEMSOLIRELACAF
                               WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                                 AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                                 AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                                 AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                                 AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                                 AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                                 AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                 AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     IF (V_QTPROGENTAF - V_QTSOLIPRODF) > 0 THEN
                        SELECT
                           MAX(PRODUTO.VRFATOCONV) INTO V_VRFATOCONV
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                        /* Log de Altera¿¿o */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        SELECT
                           ITEMSOLI.CDFILSOLI,
                           ITEMSOLI.CDFILLAN,
                           ITEMSOLI.NRSOLICMP,
                           ITEMSOLI.CDPRODUTO,
                           ITEMSOLI.DTPROGENTR,
                           SYSDATE,
                           P_CDOPERADOR,
                           ITEMSOLI.QTSOLIPROD,
                           V_QTPROGENTAF / V_VRFATOCONV,
                           'Empenho de AF'
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                        UPDATE ITEMSOLI
                        SET QTSOLIPROD = QTSOLIPROD+((V_QTPROGENTAF-V_QTSOLIPRODF)/ V_VRFATOCONV)
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');
                     END IF;
                  END IF;
                  /*FIM SOLICITAÇÃO 182441 PARA AJUSTAR EMPENHO DA ÚLTIMA ENTREGA*/
               END IF;
               /* Fim do % de Rejeição*/
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   IF ((V_IDCONSPRSOL = 'S') AND (V_NRLOGCORTEOL = 0))THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODUTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                ITEMAUTF.CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF) -
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (ITEMSOLI.CDPRODUTO  = ITEMAUTF.CDPRODUTO)    AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                    EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                          AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                          AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                          AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                          AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)) AS QTDECOMP
             FROM
                ITEMAUTF,
                AUTOFORNE
             WHERE
                (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)   AND
                (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)   AND
                (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
                ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                --(AUTOFORNE.IDSITUATUAAF IS NULL)             AND
                --(AUTOFORNE.IDAFFORALIM = 'N')                AND
                (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')        AND
                (AUTOFORNE.CDFILLANC = P_CDFILLANC)          AND
                (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR)
             GROUP BY
                ITEMAUTF.CDFILDEST,
                ITEMAUTF.CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL
             HAVING
                SUM(ITEMAUTF.QTPROGENTAF) >
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    (ITEMSOLI.CDPRODUTO  = ITEMAUTF.CDPRODUTO)    AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                    EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                          AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                          AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                          AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                          AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)))
         GROUP BY
            CDFILIAL,
            CDPRODUTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)        AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)        AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)       AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)               AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)               AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)  AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)         AND
               (PRODUTO.CDPRODUTO      = C_PRODAEMPENHAR.CDPRODUTO) AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                     AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                       AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')
            ORDER BY
               ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementação da solicitação 166404*/
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULL;
                  END IF;

                  SELECT NVL(SUM(I.QTPROGENTAF), 0)
                    INTO V_QTOUTRASAFS
                    FROM ITEMAUTF I, AUTOFORNE A
                   WHERE (A.CDFILDEST    = I.CDFILDEST)
                     AND (A.CDFILLANC    = I.CDFILLANC)
                     AND (A.NRAUTOFORN   = I.NRAUTOFORN)
                     AND (I.CDPRODUTO    = C_PRODAEMPENHAR.CDPRODUTO)
                     AND (I.CDFILDEST    = C_PRODAEMPENHAR.CDFILIAL)
                     AND (I.DTENTRITMSOL = C_ITEMAUTF.DTENTRITMSOL)
                     --AND (I.CDMARCA      = ITEMAUTF.CDMARCA)
                     AND ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X'))
                     AND (NVL(A.IDBAIXAAF,'0') <> '5')
                     AND NOT EXISTS (SELECT 1
                                       FROM ITEMSOLIRELACAF
                                      WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                        AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                        AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                        AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                        AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                        AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                        AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                        AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                  SELECT
                     NVL(SUM(ITEMSOLI.QTSOLIPROD), 0) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)   AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  V_QTOUTRASAFS := V_QTOUTRASAFS - V_QTOUTRASAFS;
                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        /* Log de Alteração */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        VALUES
                          (C_PRODAEMPENHAR.CDFILIAL,
                           C_ITEMSOLI.CDFILLAN,
                           C_ITEMSOLI.NRSOLICMP,
                           C_ITEMSOLI.CDPRODUTO,
                           C_ITEMAUTF.DTENTRITMSOL,
                           SYSDATE,
                           P_CDOPERADOR,
                           C_ITEMSOLI.QTSOLIPROD,
                           0,
                           'Empenho de AF');

                        DELETE FROM ITEMSOLI
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                           (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                           (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                           (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');
                     END LOOP;
                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);


                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - C_ITEMAUTF.QTPROGENTAF;
                  ELSE
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        IF ((C_ITEMSOLI.QTSOLIPROD > V_QTARETIRAR) AND (V_QTARETIRAR > 0)) THEN
                           /* Log de Alteração */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           SELECT
                              ITEMSOLI.CDFILSOLI,
                              ITEMSOLI.CDFILLAN,
                              ITEMSOLI.NRSOLICMP,
                              ITEMSOLI.CDPRODUTO,
                              ITEMSOLI.DTPROGENTR,
                              SYSDATE,
                              P_CDOPERADOR,
                              ITEMSOLI.QTSOLIPROD,
                              ITEMSOLI.QTSOLIPROD - V_QTARETIRAR,
                              'Empenho de AF'
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (ITEMSOLI.CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (ITEMSOLI.NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (ITEMSOLI.CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := 0;
                           EXIT;
                        ELSE
                           /* Log de Alteração */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           VALUES
                             (C_PRODAEMPENHAR.CDFILIAL,
                              C_ITEMSOLI.CDFILLAN,
                              C_ITEMSOLI.NRSOLICMP,
                              C_ITEMSOLI.CDPRODUTO,
                              C_ITEMAUTF.DTENTRITMSOL,
                              SYSDATE,
                              P_CDOPERADOR,
                              C_ITEMSOLI.QTSOLIPROD,
                              0,
                              'Empenho de AF');

                           DELETE FROM ITEMSOLI
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := V_QTARETIRAR-C_ITEMSOLI.QTSOLIPROD;
                        END IF;
                     END LOOP;
                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementação da solicitação 166404*/           
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')  AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULl;
                  END IF;

                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT NVL(SUM(I.QTPROGENTAF), 0)
                       INTO V_QTOUTRASAFS
                       FROM ITEMAUTF I, AUTOFORNE A
                      WHERE (A.CDFILDEST    = I.CDFILDEST)
                        AND (A.CDFILLANC    = I.CDFILLANC)
                        AND (A.NRAUTOFORN   = I.NRAUTOFORN)
                        AND (I.CDPRODUTO    = C_PRODAEMPENHAR.CDPRODUTO)
                        AND (I.CDFILDEST    = C_PRODAEMPENHAR.CDFILIAL)
                        AND (I.DTENTRITMSOL = C_ITEMAUTF.DTENTRITMSOL)
                        --AND (I.CDMARCA      = ITEMAUTF.CDMARCA)
                        AND ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X'))
                        AND (NVL(A.IDBAIXAAF,'0') <> '5')
                        AND NOT EXISTS (SELECT 1
                                          FROM ITEMSOLIRELACAF
                                         WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                           AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                           AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                           AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                           AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                           AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                           AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                           AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     SELECT
                        SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)   AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     V_QTSOLIPROD := V_QTSOLIPROD - V_QTOUTRASAFS;
                     V_QTARETIRAR := C_ITEMAUTF.QTPROGENTAF - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF, AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)       AND
                           (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)       AND
                           (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)      AND
                           (ITEMAUTF.CDPRODUTO     = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                    AND
                           (AUTOFORNE.IDAFFORALIM  = 'N')                      AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')               AND
                           (AUTOFORNE.CDFILLANC    = P_CDFILLANC)              AND
                           (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                        IF V_QTDISPONIVEL IS NULL THEN
                           SELECT
                              SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                              (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                              (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                              ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                              (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                              ITEMSOLI.IDITMCONS  = 'N'  AND
                              ITEMSOLI.CDFILIOPELOG IS NULL;
                        END IF;
                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                           V_LISTA_AF_AUX := 0;

                           SELECT
                              COUNT(*) INTO V_LISTA_AF_AUX
                           FROM
                              LISTA
                           WHERE
                              NRLISTA = V_LISTA_AFS AND
                              CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                           IF V_LISTA_AF_AUX = 0 THEN
                              INSERT INTO LISTA
                              (NRLISTA, CDLISTA)
                              VALUES
                              (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                           END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED);
                           V_QTARETIRAR := V_QTARETIRAR - (V_QTARRED);
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              /* Log de Alteração */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              UPDATE ITEMSOLI
                              SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR
                              WHERE
                                 (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(IDSOLIAPROV,'S') = 'S');
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   IF (V_NRLOGCORTEOL > 0) THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODUTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                RELACPRODOL.CDPRARVORIG CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF) -
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (ITEMSOLI.CDPRODUTO  = RELACPRODOL.CDPRARVORIG)   AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')) AS QTDECOMP
             FROM
                ITEMAUTF,
                AUTOFORNE,
                RELACPRODOL
             WHERE
                (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)   AND
                (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)   AND
                (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
                ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                --(AUTOFORNE.IDSITUATUAAF IS NULL)             AND
                --(AUTOFORNE.IDAFFORALIM = 'N')                AND
                (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')        AND
                (AUTOFORNE.CDFILLANC = P_CDFILLANC)          AND
                (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR)   AND
                RELACPRODOL.CDPRODARVOL = ITEMAUTF.CDPRODUTO
             GROUP BY
                ITEMAUTF.CDFILDEST,
                RELACPRODOL.CDPRARVORIG,
                ITEMAUTF.DTENTRITMSOL
             HAVING
                SUM(ITEMAUTF.QTPROGENTAF) >
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    (ITEMSOLI.CDPRODUTO  = RELACPRODOL.CDPRARVORIG)    AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')))
         GROUP BY
            CDFILIAL,
            CDPRODUTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO,
               RELACPRODOL
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)        AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)        AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)       AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)               AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)               AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)  AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)         AND
               --(PRODUTO.CDPRODUTO      = C_PRODAEMPENHAR.CDPRODUTO) AND
                (ITEMAUTF.CDPRODUTO     = RELACPRODOL.CDPRODARVOL)         AND
               RELACPRODOL.CDPRARVORIG = C_PRODAEMPENHAR.CDPRODUTO  AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                     AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                       AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')
            ORDER BY
               ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  SELECT
                     MAX(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                     (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                     (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                     (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     /* Log de Alteração */
                     INSERT INTO MOVOPSOL
                       (CDFILSOLMOV,
                        CDFILLANMOV,
                        NRSOLIMOV,
                        CDPRODUTO,
                        DTENTROPER,
                        DTOPERSOL,
                        CDOPERADOR,
                        QTANTOPER,
                        QTDEPOPER,
                        DSJUSTOPER)
                     VALUES
                       (C_PRODAEMPENHAR.CDFILIAL,
                        SUBSTR(V_NRSOLCOMP, 11, 4),
                        SUBSTR(V_NRSOLCOMP, 1, 10),
                        SUBSTR(V_NRSOLCOMP, 15, 10),
                        C_ITEMAUTF.DTENTRITMSOL,
                        SYSDATE,
                        P_CDOPERADOR,
                        V_QTSOLIPROD,
                        0,
                        'Empenho de AF');

                     DELETE FROM ITEMSOLI
                     WHERE
                        (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(IDSOLIAPROV,'S') = 'S');

                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);


                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - C_ITEMAUTF.QTPROGENTAF;
                  ELSE
                     /* Log de Alteração */
                     INSERT INTO MOVOPSOL
                       (CDFILSOLMOV,
                        CDFILLANMOV,
                        NRSOLIMOV,
                        CDPRODUTO,
                        DTENTROPER,
                        DTOPERSOL,
                        CDOPERADOR,
                        QTANTOPER,
                        QTDEPOPER,
                        DSJUSTOPER)
                     SELECT
                        ITEMSOLI.CDFILSOLI,
                        ITEMSOLI.CDFILLAN,
                        ITEMSOLI.NRSOLICMP,
                        ITEMSOLI.CDPRODUTO,
                        ITEMSOLI.DTPROGENTR,
                        SYSDATE,
                        P_CDOPERADOR,
                        ITEMSOLI.QTSOLIPROD,
                        ITEMSOLI.QTSOLIPROD - V_QTARETIRAR,
                        'Empenho de AF'
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                     UPDATE ITEMSOLI
                     SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR
                     WHERE
                        (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(IDSOLIAPROV,'S') = 'S');

                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT
                        MAX(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                     V_QTARETIRAR := C_ITEMAUTF.QTPROGENTAF - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF, AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)       AND
                           (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)       AND
                           (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)      AND
                           (ITEMAUTF.CDPRODUTO     = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                    AND
                           (AUTOFORNE.IDAFFORALIM  = 'N')                      AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')               AND
                           (AUTOFORNE.CDFILLANC    = P_CDFILLANC)              AND
                           (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                           V_LISTA_AF_AUX := 0;

                           SELECT
                              COUNT(*) INTO V_LISTA_AF_AUX
                           FROM
                              LISTA
                           WHERE
                              NRLISTA = V_LISTA_AFS AND
                              CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                           IF V_LISTA_AF_AUX = 0 THEN
                              INSERT INTO LISTA
                              (NRLISTA, CDLISTA)
                              VALUES
                              (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                           END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED);
                           V_QTARETIRAR := V_QTARETIRAR - (V_QTARRED);
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              /* Log de Alteração */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              UPDATE ITEMSOLI
                              SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR
                              WHERE
                                 (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(IDSOLIAPROV,'S') = 'S');
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   /* #################### FECHAMENTO DAS AF'S ALTERADAS #####################*/
   DELETE FROM AUTOFORNE
   WHERE
      (CDFILLANC   = P_CDFILLANC) AND
      (NRSEQAPURAF = P_NRSEQAPUR) AND
      (NOT EXISTS (SELECT
                      ITEMAUTF.CDFILDEST
                   FROM
                      ITEMAUTF
                   WHERE
                      (AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST) AND
                      (AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC) AND
                      (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN)));


   FOR C_AUTOFORNE IN
     (SELECT
         CDFILDEST,
         NRAUTOFORN
      FROM
         AUTOFORNE,
         LISTA
      WHERE
         (CDFILLANC = P_CDFILLANC) AND
         (NRLISTA = V_LISTA_AFS)   AND
         (CDLISTA = CDFILDEST || NRAUTOFORN) )
   LOOP
      FECHAMENTO_AF(C_AUTOFORNE.CDFILDEST, P_CDFILLANC, C_AUTOFORNE.NRAUTOFORN);
   END LOOP;

   DELETE FROM LISTA WHERE NRLISTA = V_LISTA_AFS;
   COMMIT;
END;
/

CREATE OR REPLACE FUNCTION CARREGA_LIMISEGU_OL
(
   P_CDFILIAL        IN FILIAL.CDFILIAL%TYPE,
   P_CDARVPROD       IN PRODUTO.CDARVPROD%TYPE,
   P_DTENTREGA       IN DATE,
   P_NRLIMISEGU      IN LIMISEGPROD.NRLIMISEGU%TYPE DEFAULT NULL,
   P_CDPERIENTR      IN PERFILPROD.CDPERIENTR%TYPE DEFAULT NULL,
   P_MAXCDARVPROD    IN PRODUTO.CDARVPROD%TYPE     DEFAULT NULL
)  RETURN NUMBER
IS
   V_NRLIMISEGU             LIMISEGPROD.NRLIMISEGU%TYPE := P_NRLIMISEGU;
   V_NRLIMISEGCAD           LIMISEGPROD.NRLIMISEGU%TYPE;
   V_CDPERIENTR             PERIENTR.CDPERIENTR%TYPE := P_CDPERIENTR;
   V_IDDNULIMSEG            PERIENTR.IDDNULIMSEGP%TYPE;
   V_COUNT                  NUMBER := 0;
   V_NFERICOMP              NUMBER := 0;
   V_NRLIMISEGU_UTIL        NUMBER := 0;
   V_CDARVPROD              PRODUTO.CDARVPROD%TYPE;
BEGIN
   IF P_CDARVPROD IS NOT NULL THEN
      IF P_MAXCDARVPROD IS NULL THEN
         SELECT MAX(CDARVPROD)
           INTO V_CDARVPROD
           FROM LIMISEGPROD A, PRODUTO B
          WHERE (A.CDPRODUTO = B.CDPRODUTO)
            AND (A.CDFILIAL  = P_CDFILIAL)
            AND (INSTR(P_CDARVPROD, B.CDARVPROD) = 1);
      ELSE
         V_CDARVPROD := P_MAXCDARVPROD;
      END IF;
      IF V_CDARVPROD IS NOT NULL THEN
         SELECT NVL(MAX(TO_NUMBER(NRLIMISEGU)), 0)
           INTO V_NRLIMISEGU
           FROM LIMISEGPROD, PRODUTO
          WHERE (LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO)
            AND (LIMISEGPROD.CDFILIAL  = P_CDFILIAL)
            AND (PRODUTO.CDARVPROD     = V_CDARVPROD);
      END IF;
      IF V_NRLIMISEGU > 0 THEN
         SELECT NVL(MAX(CDPERIENTR), 'XX')
           INTO V_CDPERIENTR
           FROM PERFILPROD
          WHERE CDFILIAL = P_CDFILIAL
            AND CDPRODUTO = (SELECT MAX(B.CDARVPROD)
                               FROM PERFILPROD A, PRODUTO B
                              WHERE A.CDPRODUTO = B.CDPRODUTO
                                AND A.CDFILIAL  = P_CDFILIAL
                                AND INSTR(V_CDARVPROD, B.CDARVPROD) = 1);
      END IF;
   END IF;
   IF V_NRLIMISEGU > 0 THEN
      IF V_CDPERIENTR <> 'XX' THEN
         SELECT NVL(MAX(PERIENTR.IDDIANUTIL), 'N')
           INTO V_IDDNULIMSEG
           FROM PERIENTR
          WHERE PERIENTR.CDPERIENTR = V_CDPERIENTR;
      END IF;
      IF V_IDDNULIMSEG IS NULL THEN
         SELECT NVL(MAX(PARASUPRI.IDDNULIMSEG), 'N')
           INTO V_IDDNULIMSEG
           FROM PARASUPRI, FILIAL
          WHERE FILIAL.CDFILIAL    = P_CDFILIAL
            AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
      END IF;
      IF V_IDDNULIMSEG = 'S' THEN
         FOR C_DATA IN (SELECT DTDATA
                          FROM DATA
                         WHERE DTDATA <= P_DTENTREGA
                         ORDER BY DTDATA DESC) LOOP

            SELECT COUNT(*)
              INTO V_COUNT
              FROM FERICOMP
             WHERE CDFILIAL   = P_CDFILIAL
               AND DTFERICOMP = C_DATA.DTDATA AND
               NOT EXISTS (SELECT /*+ FIRST_ROWS(1)*/
                                  1
                             FROM CALECOMP
                            WHERE CALECOMP.CDFILIAL   = P_CDFILIAL
                              AND CALECOMP.DTENTREGA  = DTFERICOMP
                              AND CALECOMP.CDPERIENTR = V_CDPERIENTR);

            IF V_COUNT = 0 THEN
               V_NFERICOMP := V_NFERICOMP + 1;
            END IF;

            V_NRLIMISEGU_UTIL := V_NRLIMISEGU_UTIL + 1;
            IF V_NFERICOMP = V_NRLIMISEGU THEN
               V_NRLIMISEGU := V_NRLIMISEGU_UTIL;
               EXIT;
            END IF;
         END LOOP;
      END IF;
   END IF;
   RETURN(NVL(V_NRLIMISEGU, 0));
END;