CREATE OR REPLACE TRIGGER BLOQUEIA_EXC_AF
BEFORE DELETE ON AUTOFORNE FOR EACH ROW
DECLARE
   V_CDFILDEST  VARCHAR2(4); 
   V_CDFILLANC  VARCHAR2(4);
   V_NRAUTOFORN VARCHAR2(10);
   V_COUNT      INTEGER;
BEGIN
   V_CDFILDEST  := :OLD.CDFILDEST;
   V_CDFILLANC  := :OLD.CDFILLANC;
   V_NRAUTOFORN := :OLD.NRAUTOFORN;
   
   SELECT COUNT(1)
     INTO V_COUNT
     FROM PRODPEDXAF
    WHERE CDFILLANC  = V_CDFILDEST
      AND CDFILDEST  = V_CDFILLANC
      AND NRAUTOFORN = V_NRAUTOFORN;
   
   IF V_COUNT > 0 THEN
      RAISE_APPLICATION_ERROR(-20501, 'N'||CHR(227)||'o foi poss'||CHR(237)||'vel excluir a autoriza'||CHR(231)||CHR(227)||'o de fornecimento porque a 
                                       mesma est'||CHR(225)||' vinculada a um pedido.', True);
   END IF;
   
END;
/

CREATE OR REPLACE TRIGGER BLOQUEIA_ALTERACAO_AF
BEFORE DELETE OR UPDATE OR INSERT ON ITEMAUTF FOR EACH ROW
DECLARE
   V_CDFILDEST  VARCHAR2(4);
   V_CDFILLANC  VARCHAR2(4);
   V_NRAUTOFORN VARCHAR2(10);
   V_COUNT      INTEGER;
BEGIN
   V_CDFILDEST  := :OLD.CDFILDEST;
   V_CDFILLANC  := :OLD.CDFILLANC;
   V_NRAUTOFORN := :OLD.NRAUTOFORN;
   
   SELECT COUNT(1)
     INTO V_COUNT
     FROM PRODPEDXAF
    WHERE CDFILLANC  = V_CDFILDEST
      AND CDFILDEST  = V_CDFILLANC
      AND NRAUTOFORN = V_NRAUTOFORN;
   
   IF V_COUNT > 0 THEN
      RAISE_APPLICATION_ERROR(-20501, 'N'||CHR(227)||'o foi poss'||CHR(237)||'vel alterar a autoriza'||CHR(231)||CHR(227)||'o de fornecimento porque a 
                                       mesma est'||CHR(225)||' vinculada a um pedido.', True);
   END IF;
   
END;
/

CREATE OR REPLACE TRIGGER CANCELA_PED_IMP
BEFORE UPDATE OF IDSITPEDIDO ON PEDIDO FOR EACH ROW
DECLARE
   V_CDFILIAL  VARCHAR2(4);
   V_NRPEDIDO  VARCHAR2(10);
   V_COUNT     INTEGER;
BEGIN
   V_CDFILIAL := :OLD.CDFILIAL;
   V_NRPEDIDO := :OLD.NRPEDIDO;
   
   IF :NEW.IDSITPEDIDO = '4' THEN
      SELECT COUNT(1)
        INTO V_COUNT
        FROM PRODPEDXAF
       WHERE CDFILIAL = V_CDFILIAL
         AND NRPEDIDO = V_NRPEDIDO;
       
      IF V_COUNT > 0 THEN
         DELETE FROM PRODPEDXAF
          WHERE CDFILIAL = V_CDFILIAL
            AND NRPEDIDO = V_NRPEDIDO;
      END IF;   
   END IF;
END;
/

CREATE OR REPLACE
PACKAGE IMPORTA_PEDIDO_AF AS
   V_CDPRODUTO       VARCHAR2(10);
   V_QTPROGENTAF     FLOAT;
   V_VRPREUNIAF      FLOAT;
   V_DTPROGENTAF     DATE;
   V_VRTOTALAF       FLOAT;
   V_CDARVPROD       VARCHAR2(20);
   V_CDMARCA         VARCHAR2(5);
   V_NMPRODUTO       VARCHAR2(50);
   V_CDTIPOOPER      VARCHAR2(2);
   V_CDMODPGTO       VARCHAR2(5);
   V_IDLANCPED       VARCHAR2(1);
   V_CDVENDEDOR      VARCHAR2(4);
   V_IDUTRELACPRODAF VARCHAR2(1);
   V_IDUTVALIPED     VARCHAR2(1);
   V_QTDIAVALIPED    FLOAT;
   V_VALORUNIT       FLOAT;
   /* PARAMETRIZAÇÃO CLIENTE */
   V_CDMODPGTOCLI    VARCHAR2(5);
   V_CDCLIENTE       VARCHAR2(21);
   V_NRINSJURTRAN    VARCHAR2(20);
   V_CDTIPTRANS      VARCHAR2(4);
   V_IDPGFRETTRANCLI VARCHAR2(1);
   /* PREÇO BASE */
   V_PRECOBASE       VARCHAR2(2);
   /* IMPORTACAO */
   V_QTIMPORTA       FLOAT;
   V_OPERADOR        VARCHAR2(12);
   V_CDINSCESTA      VARCHAR2(16);
   V_CDEMPRESA       VARCHAR2(2);
   V_NRINSJUREMPR    VARCHAR2(20);
   V_NRINSCESTA      VARCHAR2(16);
   V_NMCLIENTE       VARCHAR2(100);
   
   PROCEDURE PARAMETRIZACAO(P_CDFILIAL IN VARCHAR2);
   
   PROCEDURE EMPRESA_FILIAL(P_CDFILDEST IN VARCHAR2);
   
   PROCEDURE EMPRESA_INFORMADA(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2);
   
   PROCEDURE CLIENTE_PRINCIPAL(P_CDFILDEST IN VARCHAR2);
   
   PROCEDURE VALIDA_AF_PEDIDO(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2, P_CDFILIMPO IN VARCHAR2, 
                              P_IDTIPOEMITAF IN VARCHAR2, P_CDOPERADOR IN VARCHAR2, P_RESULT OUT VARCHAR2);
   
   PROCEDURE GRAVA_ERRO(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2, P_CDPRODUTO IN VARCHAR2, 
                        P_DTPROGENTAF IN DATE, P_ERRO IN VARCHAR2, P_QTPROGENTAF IN FLOAT, P_VRPREUNIAF IN FLOAT, P_VRITEPREBASE IN FLOAT,
                        P_CDOPERADOR IN VARCHAR2);
   
   PROCEDURE INSERE_PEDIDO_IMP(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2, P_CDVENDEDOR IN VARCHAR2, 
                               P_DTPROGENTAF IN DATE, P_CDFILIAL IN VARCHAR2, P_CDCLIENTE IN VARCHAR2, P_CDMODPGTOCLI IN VARCHAR2, P_CDPRECOBASE IN VARCHAR2,
                               P_CDTIPOOPER IN VARCHAR2, P_DTPEDIDO IN FLOAT, P_NRPEDIDO IN VARCHAR2, P_IDUTRELACPRODAF IN VARCHAR2, P_IDUTVALIPED IN VARCHAR2,
                               P_IDLANCPED IN VARCHAR2);
   
   PROCEDURE INSERE_ITEMPED_IMP(P_CDFILIAL IN VARCHAR2, P_NRPEDIDO IN VARCHAR2, P_CDPRODUTO IN VARCHAR2, P_QTSOLICITA IN FLOAT, P_VRITPREBASE IN FLOAT,
                                P_SEQUENCIAL IN VARCHAR2, P_DTENTITPED IN DATE, P_QTITEMPED2 IN FLOAT, P_CDPRODUTOORI IN VARCHAR2, P_CDMARCA IN VARCHAR2);
   
   PROCEDURE INS_TMP_RELACPRODIMP(P_CDPRODUTO IN VARCHAR2, P_VRTOTALAF IN FLOAT, P_CONTADOR OUT FLOAT);
   
   FUNCTION TOLERANCIA(P_CDFILIAL IN VARCHAR2, P_CDPRODUTO IN VARCHAR2) RETURN FLOAT;
   
   PROCEDURE RAZAOSOCCLI(P_CDCLIENTE IN VARCHAR2);
   
   FUNCTION PRODUTOIMPORTA(P_CDPRODUTO IN VARCHAR2) RETURN VARCHAR2;
   
   FUNCTION CALCULA_DIFERENCA(P_VALORUNIT IN FLOAT, P_VRFATOCONV IN FLOAT, P_VRITEPREBASE IN FLOAT) RETURN BOOLEAN;
   
   PROCEDURE AF_ERRO(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2);
   
   PROCEDURE VERIFICA_TOLERANCIA(P_CDOPERADOR IN VARCHAR2);
END IMPORTA_PEDIDO_AF;
/

create or replace PACKAGE BODY IMPORTA_PEDIDO_AF AS
   PROCEDURE PARAMETRIZACAO(P_CDFILIAL IN VARCHAR2)
   IS
   BEGIN
      SELECT P.CDTIPOOPER, P.CDMODPGTO, NVL(M.IDLANCPEDMOD, P.IDLANCPED) IDLANCPED, NVL(PA.CDVENDEDOR, P.CDVENDEDOR) CDVENDEDOR,
             PA.IDUTRELACPRODAF, P.IDUTVALIPED, NVL(P.QTDIAVALIPED, 0)
        INTO V_CDTIPOOPER, V_CDMODPGTO, V_IDLANCPED, V_CDVENDEDOR,
             V_IDUTRELACPRODAF, V_IDUTVALIPED, V_QTDIAVALIPED
        FROM FILIAL F JOIN PARAMPEDIDO P
                        ON F.CDFILIAL = P.CDFILIAL
                 LEFT JOIN MODPGTO M
                        ON P.CDMODPGTO = M.CDMODPGTO
                 LEFT JOIN PARAMIMPPEDIDO PA
                        ON F.CDFILIAL = PA.CDFILIAL
       WHERE F.CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         RAISE_APPLICATION_ERROR(-20501, 'A filial informada n'||CHR(227)||'o possui parametriza'||CHR(231)||CHR(227)||'o de importa'||CHR(231)||CHR(227)||'o de pedido');
   END PARAMETRIZACAO;
   
   PROCEDURE EMPRESA_FILIAL(P_CDFILDEST IN VARCHAR2)
   IS
   BEGIN
      SELECT CDINSCESTA
        INTO V_CDINSCESTA
        FROM FILIAL
       WHERE CDFILIAL = P_CDFILDEST;
      
      SELECT NVL(CL.CDMODPGTO, ' ') CDMODPGTO, CL.CDCLIENTE, CL.NRINSJURTRAN, CL.CDTIPTRANS, CL.IDPGFRETTRANCLI
        INTO V_CDMODPGTOCLI, V_CDCLIENTE, V_NRINSJURTRAN, V_CDTIPTRANS, V_IDPGFRETTRANCLI
        FROM CLIENTE CL
       WHERE CL.NRINSESTCLIE = V_CDINSCESTA;
   EXCEPTION
      WHEN OTHERS THEN
         V_CDMODPGTOCLI := NULL;
         V_CDCLIENTE    := NULL;
   END EMPRESA_FILIAL;
   
   PROCEDURE EMPRESA_INFORMADA(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2)
   IS
   BEGIN
      SELECT CDEMPRESA
        INTO V_CDEMPRESA
        FROM AUTOFORNE
       WHERE CDFILDEST  = P_CDFILDEST
         AND CDFILLANC  = P_CDFILLANC
         AND NRAUTOFORN = P_NRAUTOFORN;
      
      SELECT NRINSJUREMPR, NRINSCESTA
        INTO V_NRINSJUREMPR, V_NRINSCESTA
        FROM EMPRESA
       WHERE CDEMPRESA = V_CDEMPRESA;
      
      SELECT NVL(CL.CDMODPGTO, ' ') CDMODPGTO, CL.CDCLIENTE, CL.NRINSJURTRAN, CL.CDTIPTRANS, CL.IDPGFRETTRANCLI
        INTO V_CDMODPGTOCLI, V_CDCLIENTE, V_NRINSJURTRAN, V_CDTIPTRANS, V_IDPGFRETTRANCLI
        FROM CLIENTE CL
       WHERE CL.NRINSJURCLIE = V_NRINSJUREMPR
         AND CL.NRINSESTCLIE = V_NRINSCESTA;
   EXCEPTION
      WHEN OTHERS THEN
         V_CDMODPGTOCLI := NULL;
         V_CDCLIENTE    := NULL;
   END EMPRESA_INFORMADA;
   
   PROCEDURE CLIENTE_PRINCIPAL(P_CDFILDEST IN VARCHAR2)
   IS
   BEGIN
      SELECT NVL(CL.CDMODPGTO, ' ') CDMODPGTO, CL.CDCLIENTE, CL.NRINSJURTRAN, CL.CDTIPTRANS, CL.IDPGFRETTRANCLI
        INTO V_CDMODPGTOCLI, V_CDCLIENTE, V_NRINSJURTRAN, V_CDTIPTRANS, V_IDPGFRETTRANCLI  
        FROM FILIAL F JOIN CLIENFILIAL C  
                        ON F.CDFILIAL    = C.CDFILIAL  
                       AND C.IDCLIENPRIN = 'S'  
                      JOIN CLIENTE CL  
                        ON C.CDCLIENTE = CL.CDCLIENTE  
       WHERE F.CDFILIAL = P_CDFILDEST;  
   EXCEPTION  
      WHEN OTHERS THEN  
         V_CDMODPGTOCLI := NULL;  
         V_CDCLIENTE    := NULL;  
   END CLIENTE_PRINCIPAL;  
  
   PROCEDURE VALIDA_AF_PEDIDO(P_CDFILDEST    IN VARCHAR2,  
                              P_CDFILLANC    IN VARCHAR2,   
                              P_NRAUTOFORN   IN VARCHAR2,  
                              P_CDFILIMPO    IN VARCHAR2,   
                              P_IDTIPOEMITAF IN VARCHAR2,  
                              P_CDOPERADOR   IN VARCHAR2,
                              P_RESULT       OUT VARCHAR2)
   IS  
      V_CDPRODUTOIMP VARCHAR2(10);  
      V_VRFATARRED   FLOAT;  
      V_VRFATOCONV   FLOAT;  
      V_FATORCALC    FLOAT;  
      BO_PRECOBASE   BOOLEAN;  
      V_VRITEPREBASE FLOAT;  
      V_CDARVPROD    VARCHAR2(20);  
      V_CONV_TABPR   VARCHAR2(2);  
      BO_CADASTRO    BOOLEAN;  
      V_CDARVPRITEM  VARCHAR2(20);  
      V_SALDO        FLOAT;  
      
      V_CDFILDEST    VARCHAR2(4);  
      V_CDFILLANC    VARCHAR2(4);  
      V_NRAUTOFORN   VARCHAR2(10);  
      V_NRPEDIDO     VARCHAR2(20);  
      V_SEQUENCIAL   INTEGER;  
      V_DATA         DATE;  
      V_CONTADOR     INTEGER;  
      V_QTITEMPED2   FLOAT;  
      V_NRITEMPED    VARCHAR2(10);  
      V_ERRO         VARCHAR2(1000);  
       
      V_SOMA         INTEGER;  
      V_PRODVALIDA   VARCHAR2(10);
      V_INSERIDO     INTEGER;
      V_CDFILIALPED  VARCHAR2(4);
      --V_NRPEDPEDIDO  VARCHAR2(10);
      V_NRAUTOPEDIDO VARCHAR2(10);
       
      CURSOR C_ITEMAUTF(C_CDFILDEST IN VARCHAR2, C_CDFILLANC IN VARCHAR2, C_NRAUTOFORN IN VARCHAR2) IS
         SELECT I.CDPRODUTO, I.QTPROGENTAF, I.VRPREUNIAF, I.DTPROGENTAF,  SUM(P.VRFATOCONV*I.QTPROGENTAF) VRTOTALAF,
                P.CDARVPROD, I.CDMARCA, P.NMPRODUTO, SUM(I.VRPREUNIAF/NVL(P.VRFATOCONV,1)) VALOR
           FROM ITEMAUTF I JOIN PRODUTO P
                             ON I.CDPRODUTO = P.CDPRODUTO
          WHERE (I.CDFILDEST  = C_CDFILDEST)
            AND (I.CDFILLANC  = C_CDFILLANC)
            AND (I.NRAUTOFORN = C_NRAUTOFORN)
            AND (I.IDBAIXITMAF IS NULL)
          GROUP BY I.CDPRODUTO, I.QTPROGENTAF, I.VRPREUNIAF, I.DTPROGENTAF, P.CDARVPROD,I.CDMARCA, P.NMPRODUTO;
      
      CURSOR C_RELAC_PROD_IMP IS
         SELECT CDPRODUTO, ROUND(VRFATARRED, 4), VRFATOCONV, FATORCALC
           FROM TMP_RELACPRODIMP;
         
      CURSOR C_ITEMPRBASE(C_PRECOBASE IN VARCHAR2, C_CDPRODUTOIMP IN VARCHAR2, C_DTPROGENTAF IN DATE) IS
         SELECT (I.VRITEPREBASE/NVL(P.VRFATOCONV, 1)) VRITEPREBASE,  P.CDARVPROD, NVL(P.VRFATOCONV, 1) VRFATOCONV
           FROM ITEMPREBASE I JOIN PRODUTO P
                                ON I.CDPRODUTO = P.CDPRODUTO
          WHERE I.CDPRECOBASE = C_PRECOBASE
            AND P.CDPRODUTO   = C_CDPRODUTOIMP
            AND C_DTPROGENTAF BETWEEN I.DTINIVALIPB AND NVL(I.DTFIMVALIPB,C_DTPROGENTAF+1);
            --AND SYSDATE BETWEEN I.DTINIVALIPB AND NVL(I.DTFIMVALIPB,SYSDATE+1);
   BEGIN
      V_OPERADOR := P_CDOPERADOR;
      FOR C_LOOP IN (SELECT CDFILDEST, CDFILLANC, NRAUTOFORN
                       FROM ITEMAUTF
                       WHERE CDFILDEST  = P_CDFILDEST
                         AND CDFILLANC  = P_CDFILLANC 
                         AND NRAUTOFORN = P_NRAUTOFORN
                         FOR UPDATE) 
      LOOP      
         FOR C_PRODPEDXAF IN (SELECT CDFILIAL, NRPEDIDO
                                FROM PRODPEDXAF
                               WHERE CDFILDEST  = C_LOOP.CDFILDEST
                                 AND CDFILLANC  = C_LOOP.CDFILLANC
                                 AND NRAUTOFORN = C_LOOP.NRAUTOFORN)
         LOOP
            BEGIN
               SELECT CDFILIAL
                 INTO V_CDFILDEST
                 FROM PEDIDO
                WHERE CDFILIAL = C_PRODPEDXAF.CDFILIAL
                  AND NRPEDIDO = C_PRODPEDXAF.NRPEDIDO
                  AND IDSITPEDIDO <> 4;
            EXCEPTION
               WHEN OTHERS THEN
                  V_CDFILDEST := NULL;
            END;
            
            IF (V_CDFILDEST IS NOT NULL) THEN
               V_NRAUTOPEDIDO := TO_CHAR(TO_NUMBER(C_LOOP.NRAUTOFORN));
               RAISE_APPLICATION_ERROR(-20501, 'A AF '||V_NRAUTOPEDIDO||' j'||CHR(225)||' foi importada e gerou o pedido '||C_PRODPEDXAF.NRPEDIDO||' para a filial '||V_CDFILDEST);
            END IF;
         END LOOP;
      END LOOP;
      
      BO_CADASTRO := TRUE;
      PARAMETRIZACAO(P_CDFILIMPO);
      
      IF P_IDTIPOEMITAF = '1' THEN
         EMPRESA_FILIAL(P_CDFILDEST);
      ELSIF P_IDTIPOEMITAF = '2' THEN
         EMPRESA_INFORMADA(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
      ELSE
         CLIENTE_PRINCIPAL(P_CDFILDEST);
      END IF;
      
      IF V_CDCLIENTE IS NULL THEN
         IF P_IDTIPOEMITAF = '1' THEN
            V_ERRO := 'N'||chr(227)||'o h'||chr(225)||' cliente com a inscri'||chr(231)||chr(227)||'o estadual '||V_CDINSCESTA|| ' cadastrada';
         ELSIF P_IDTIPOEMITAF = '2' THEN
            V_ERRO := 'N'||chr(227)||'o h'||chr(225)||' cliente cadastrado para a empresa '||V_CDEMPRESA|| ' com a inscri'||chr(231)||chr(227)||'o jur'||CHR(237)||'dica '||V_NRINSJUREMPR||' e inscri'||chr(231)||chr(227)||'o estadual '||V_NRINSCESTA;
         ELSE
            V_ERRO := 'Cliente principal da filial '||P_CDFILDEST||' n'||chr(227)||'o cadastrado';
         END IF;
         
         GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, '', SYSDATE, V_ERRO, 0, 0, 0, V_OPERADOR);
         BO_CADASTRO := FALSE;
      ELSE
         RAZAOSOCCLI(V_CDCLIENTE);
      END IF;
      
      V_CDMODPGTO := NVL(TRIM(V_CDMODPGTOCLI), V_CDMODPGTO);
      
      IF (V_CDMODPGTO IS NULL) THEN
         V_ERRO := 'Modalidade de pagamento n'||chr(227)||'o definida para a filial '||P_CDFILIMPO;
         
         IF V_CDCLIENTE IS NOT NULL THEN
            V_ERRO := V_ERRO||' nem para o cliente '||V_NMCLIENTE;
         END IF;
         
         GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, '', SYSDATE, V_ERRO, 0, 0, 0, V_OPERADOR);
         BO_CADASTRO := FALSE;
      END IF;
      
      BEGIN
         SELECT MAX(CDPRECOBASE) CDPRECOBASE
           INTO V_PRECOBASE
           FROM PRECOBASECLI
          WHERE CDCLIENTE = V_CDCLIENTE
            AND IDPRBASEPRIN = 'S';
         
         BO_PRECOBASE := TRUE;  
      EXCEPTION  
         WHEN NO_DATA_FOUND THEN  
            BO_PRECOBASE := FALSE;  
      END;
  
      IF NOT(BO_PRECOBASE) THEN  
         BEGIN  
            SELECT CDPRECOBASE  
              INTO V_PRECOBASE
              FROM VENDEDOR  
             WHERE CDVENDEDOR = V_CDVENDEDOR;  
         EXCEPTION  
            WHEN NO_DATA_FOUND THEN  
               BO_PRECOBASE := FALSE;
         END;  
      END IF;
      
      IF (V_PRECOBASE IS NULL) OR NOT(BO_PRECOBASE) THEN
         V_ERRO := 'N'||chr(227)||'o h'||chr(225)||' pre'||chr(231)||'o base parametrizado para o cliente '||V_NMCLIENTE||' nem para o vendedor '||V_CDVENDEDOR;
         GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, '', SYSDATE, V_ERRO, 0, 0, 0, V_OPERADOR);
         BO_CADASTRO := FALSE;
      END IF;
       
      IF (BO_CADASTRO) THEN
         V_DATA       := '30/12/1899';
         V_NRPEDIDO   := ' ';
         V_INSERIDO := 0;
         V_CDFILDEST  := ' ';
         V_CDFILLANC  := ' ';
         V_NRAUTOFORN := ' ';
         
         OPEN C_ITEMAUTF(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
         LOOP
            FETCH C_ITEMAUTF INTO V_CDPRODUTO, V_QTPROGENTAF, V_VRPREUNIAF, V_DTPROGENTAF, V_VRTOTALAF, V_CDARVPROD,
                                  V_CDMARCA, V_NMPRODUTO, V_VALORUNIT;
            EXIT WHEN C_ITEMAUTF%NOTFOUND;
            
            V_QTIMPORTA := 0;
            V_SOMA := 0;
            IF (V_IDUTRELACPRODAF = 'S') THEN
               V_PRODVALIDA := ' ';
               V_SALDO := V_VRTOTALAF;
               WHILE (V_SALDO > 0) LOOP
                  V_QTIMPORTA := 0;
                  V_CONTADOR := 0;
                  DELETE FROM TMP_RELACPRODIMP;
                  INS_TMP_RELACPRODIMP(V_CDPRODUTO, V_SALDO, V_CONTADOR);
                  
                  IF (V_CONTADOR > 0) THEN
                     OPEN C_RELAC_PROD_IMP;
                     LOOP
                        FETCH C_RELAC_PROD_IMP INTO V_CDPRODUTOIMP, V_VRFATARRED, V_VRFATOCONV, V_FATORCALC;
                        EXIT WHEN C_RELAC_PROD_IMP%NOTFOUND OR V_SALDO <= 0;
                        
                        IF (V_PRODVALIDA = V_CDPRODUTOIMP) AND (TRIM(V_PRODVALIDA) IS NOT NULL) THEN
                           FETCH C_RELAC_PROD_IMP INTO V_CDPRODUTOIMP, V_VRFATARRED, V_VRFATOCONV, V_FATORCALC;
                        END IF;
                        
                        IF (V_FATORCALC >= 1) THEN
                           OPEN C_ITEMPRBASE(V_PRECOBASE, V_CDPRODUTOIMP, V_DTPROGENTAF);
                           FETCH C_ITEMPRBASE INTO V_VRITEPREBASE, V_CDARVPRITEM, V_CONV_TABPR;
                           
                           IF (V_CDARVPRITEM IS NOT NULL) THEN
                              IF (P_CDFILDEST <> V_CDFILDEST) AND (P_CDFILLANC <> V_CDFILLANC) AND
                                 (P_NRAUTOFORN <> V_NRAUTOFORN) AND (V_DTPROGENTAF <> V_DATA) THEN
                                    V_CDFILDEST  := P_CDFILDEST;
                                    V_CDFILLANC  := P_CDFILLANC;
                                    V_NRAUTOFORN := P_NRAUTOFORN;
                                    V_DATA       := V_DTPROGENTAF;
                                    V_SEQUENCIAL := 0;
                                    
                                    NOVO_CODIGO('PEDIDO'||P_CDFILIMPO, V_NRPEDIDO, 1);
                                    V_NRPEDIDO := SUBSTR(V_NRPEDIDO, -10);
                                    V_INSERIDO := 1;
                                    
                                    INSERE_PEDIDO_IMP(V_CDFILDEST, V_CDFILLANC, V_NRAUTOFORN, V_CDVENDEDOR,
                                                      V_DTPROGENTAF, P_CDFILIMPO, V_CDCLIENTE, V_CDMODPGTO, V_PRECOBASE,
                                                      V_CDTIPOOPER, V_QTDIAVALIPED, V_NRPEDIDO, V_IDUTRELACPRODAF, V_IDUTVALIPED,
                                                      V_IDLANCPED);
                              END IF;  
                              
                              V_QTIMPORTA := V_QTIMPORTA+(V_FATORCALC * V_VRFATARRED);
                              V_SALDO := V_SALDO - (V_FATORCALC * V_VRFATARRED);
                              
                              IF (V_PRODVALIDA <> V_CDPRODUTOIMP) THEN
                                 V_SEQUENCIAL := V_SEQUENCIAL+1;
                                 V_QTITEMPED2 := V_QTIMPORTA * V_VRFATOCONV;
                                 
                                 SELECT LPAD(TO_CHAR(V_SEQUENCIAL), 10,'0')
                                   INTO V_NRITEMPED
                                   FROM DUAL;
                                 
                                 INSERE_ITEMPED_IMP(P_CDFILIMPO, V_NRPEDIDO, V_CDPRODUTOIMP, V_QTIMPORTA, V_VRITEPREBASE,
                                                    V_NRITEMPED, V_DTPROGENTAF, V_QTITEMPED2, V_CDPRODUTO, V_CDMARCA);
                              END IF;
                              
                              IF NOT(CALCULA_DIFERENCA(V_VALORUNIT, V_VRFATOCONV, V_VRITEPREBASE)) THEN
                                 IF V_PRODVALIDA <> V_CDPRODUTOIMP THEN
                                    V_ERRO := 'O pre'||chr(231)||'o '|| ROUND(V_VRITEPREBASE,2) ||' do produto '|| PRODUTOIMPORTA(V_CDPRODUTOIMP) ||' n'||chr(227)||'o corresponde ao pre'||chr(231)||'o '|| ROUND((V_VALORUNIT * V_VRFATOCONV),2) ||' do produto '|| PRODUTOIMPORTA(V_CDPRODUTO) ||' da AF '|| P_NRAUTOFORN;
                                    GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTOIMP, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                                    V_SOMA := V_SOMA+1;
                                    --V_PRODVALIDA := V_CDPRODUTOIMP;
                                    AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                                 END IF;
                              END IF;
                           ELSE
                              V_ERRO := 'O produto '|| PRODUTOIMPORTA(V_CDPRODUTOIMP) ||' n'||chr(227)||'o tem pre'||chr(231)||'o definido na tabela de pre'||CHR(231)||'o '|| V_PRECOBASE||'. Data de vig'||CHR(234)||'ncia da tabela de preço '||TO_CHAR(V_DTPROGENTAF, 'DD/MM/YYYY');
                              GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTOIMP, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                              AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                              V_SOMA := V_SOMA+1;
                           END IF;
                           CLOSE C_ITEMPRBASE;
                        ELSE
                           LOOP
                              IF C_RELAC_PROD_IMP%ROWCOUNT = V_CONTADOR THEN
                                 IF (V_CDARVPRITEM IS NOT NULL) THEN
                                    IF V_INSERIDO = 0 THEN
                                       IF (P_CDFILDEST <> V_CDFILDEST) AND (P_CDFILLANC <> V_CDFILLANC) AND
                                          (P_NRAUTOFORN <> V_NRAUTOFORN) AND (V_DTPROGENTAF <> V_DATA) THEN
                                          V_CDFILDEST  := P_CDFILDEST;
                                          V_CDFILLANC  := P_CDFILLANC;
                                          V_NRAUTOFORN := P_NRAUTOFORN;
                                          V_DATA       := V_DTPROGENTAF;
                                          
                                          V_SEQUENCIAL := 0;
                                          
                                          NOVO_CODIGO('PEDIDO'||P_CDFILIMPO, V_NRPEDIDO, 1);
                                          V_NRPEDIDO := SUBSTR(V_NRPEDIDO, -10);
                                          
                                          INSERE_PEDIDO_IMP(V_CDFILDEST, V_CDFILLANC, V_NRAUTOFORN, V_CDVENDEDOR,
                                                            V_DTPROGENTAF, P_CDFILIMPO, V_CDCLIENTE, V_CDMODPGTO, V_PRECOBASE,
                                                            V_CDTIPOOPER, V_QTDIAVALIPED, V_NRPEDIDO, V_IDUTRELACPRODAF, V_IDUTVALIPED,
                                                            V_IDLANCPED);
                                       END IF;
                                    END IF;
                                    V_SEQUENCIAL := V_SEQUENCIAL+1;
                                    V_QTIMPORTA  := V_QTIMPORTA + V_VRFATARRED;
                                    V_QTITEMPED2 := V_QTIMPORTA * V_VRFATOCONV;
                                    
                                    SELECT LPAD(TO_CHAR(V_SEQUENCIAL), 10,'0')
                                      INTO V_NRITEMPED
                                      FROM DUAL;
                                    
                                    INSERE_ITEMPED_IMP(P_CDFILIMPO, V_NRPEDIDO, V_CDPRODUTOIMP, V_QTIMPORTA, V_VRITEPREBASE,
                                                       V_NRITEMPED, V_DTPROGENTAF, V_QTITEMPED2, V_CDPRODUTO, V_CDMARCA);
                                    
                                    V_SALDO := V_SALDO - V_QTIMPORTA;
                                    
                                    IF NOT(CALCULA_DIFERENCA(V_VALORUNIT, V_VRFATOCONV, V_VRITEPREBASE)) THEN
                                       IF V_PRODVALIDA <> V_CDPRODUTOIMP THEN
                                          V_ERRO := 'O pre'||chr(231)||'o'|| ROUND(V_VRITEPREBASE,2) ||' do produto '|| PRODUTOIMPORTA(V_CDPRODUTOIMP) ||' n'||chr(227)||'o corresponde ao pre'||chr(231)||'o '|| ROUND((V_VALORUNIT * V_VRFATOCONV),2) ||' do produto '|| PRODUTOIMPORTA(V_CDPRODUTO) ||' da AF'|| P_NRAUTOFORN;
                                          GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTOIMP, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                                          AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                                          V_SOMA := V_SOMA+1;
                                       END IF;
                                    END IF;
                                 ELSE
                                    V_ERRO := 'O produto '|| PRODUTOIMPORTA(V_CDPRODUTOIMP) ||' n'||chr(227)||'o tem pre'||chr(231)||'o definido na tabela de pre'||chr(231)||'o '|| V_PRECOBASE;
                                    GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTOIMP, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                                    AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                                    V_SOMA := V_SOMA+1;
                                    --V_SALDO := 0;
                                 END IF;
                              END IF;
                              
                              FETCH C_RELAC_PROD_IMP INTO V_CDPRODUTOIMP, V_VRFATARRED, V_VRFATOCONV, V_FATORCALC;
                              EXIT WHEN C_RELAC_PROD_IMP%NOTFOUND;
                           END LOOP;
                        END IF;
                        
                        EXIT;
                     END LOOP;
                     CLOSE C_RELAC_PROD_IMP;
                  ELSE
                     V_ERRO := 'O produto '|| PRODUTOIMPORTA(V_CDPRODUTO) ||' n'||chr(227)||'o possui relacionamento na tabela.';
                     GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTO, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                     AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                     V_SOMA := V_SOMA+1;
                     --EXIT;
                  END IF;
                  
                  V_PRODVALIDA := V_CDPRODUTOIMP;
                  IF (V_SOMA > V_CONTADOR) THEN
                     V_SALDO := 0;
                     AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
                     --V_SALDO := 0;
                  END IF;
               END LOOP;
               
               IF C_ITEMPRBASE%ISOPEN THEN
                  CLOSE C_ITEMPRBASE;
               END IF;
            ELSE
               OPEN C_ITEMPRBASE(V_PRECOBASE, V_CDPRODUTO, V_DTPROGENTAF);
               FETCH C_ITEMPRBASE INTO V_VRITEPREBASE,  V_CDARVPRITEM, V_CONV_TABPR;
               
               IF (V_VRITEPREBASE IS NOT NULL) THEN
                  IF (P_CDFILDEST <> V_CDFILDEST) AND (P_CDFILLANC <> V_CDFILLANC) AND
                     (P_NRAUTOFORN <> V_NRAUTOFORN) AND (V_DTPROGENTAF <> V_DATA) THEN
                     V_CDFILDEST  := P_CDFILDEST;
                     V_CDFILLANC  := P_CDFILLANC;
                     V_NRAUTOFORN := P_NRAUTOFORN;
                     V_DATA       := V_DTPROGENTAF;
                     V_SEQUENCIAL := 0;
                     
                     NOVO_CODIGO('PEDIDO'||P_CDFILIMPO, V_NRPEDIDO, 1);
                     V_NRPEDIDO := SUBSTR(V_NRPEDIDO, -10);
                     
                     INSERE_PEDIDO_IMP(V_CDFILDEST, V_CDFILLANC, V_NRAUTOFORN, V_CDVENDEDOR,
                                       V_DTPROGENTAF, P_CDFILIMPO, V_CDCLIENTE, V_CDMODPGTO, V_PRECOBASE,
                                       V_CDTIPOOPER, V_QTDIAVALIPED, V_NRPEDIDO, V_IDUTRELACPRODAF, V_IDUTVALIPED,
                                       V_IDLANCPED);
                  END IF;
                  
                  V_SEQUENCIAL := V_SEQUENCIAL+1;
                  V_QTIMPORTA  := V_QTPROGENTAF;
                  V_QTITEMPED2 := V_QTIMPORTA * V_VRFATOCONV;
  
                  SELECT LPAD(TO_CHAR(V_SEQUENCIAL), 10,'0')
                    INTO V_NRITEMPED
                    FROM DUAL;
                  
                  INSERE_ITEMPED_IMP(P_CDFILIMPO, V_NRPEDIDO, V_CDPRODUTO, V_QTIMPORTA, V_VRITEPREBASE,
                                     V_NRITEMPED, V_DTPROGENTAF, V_QTITEMPED2, V_CDPRODUTO, V_CDMARCA);
               ELSE
                  V_ERRO := 'O produto '|| PRODUTOIMPORTA(V_CDPRODUTO) ||' n'||chr(227)||'o possui valor na tabela de pre'||chr(231)||'o '||V_PRECOBASE;
                  GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTO, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
                  AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
               END IF;
               
               EXIT;
            END IF;
         END LOOP;
         
         COMMIT;
         
         CLOSE C_ITEMAUTF;
      END IF;
      P_RESULT := ' ';
   EXCEPTION
      WHEN OTHERS THEN
         P_RESULT := ' ';
         IF C_ITEMAUTF%ISOPEN THEN
            CLOSE C_ITEMAUTF;
         END IF;
         
         IF C_RELAC_PROD_IMP%ISOPEN THEN
            CLOSE C_RELAC_PROD_IMP;
         END IF;
         
         IF C_ITEMPRBASE%ISOPEN THEN  
            CLOSE C_ITEMPRBASE;
         END IF;
         
         V_ERRO := SQLERRM(SQLCODE);
         
         IF INSTR(V_ERRO, '20501') > 0 THEN
            V_ERRO := SUBSTR(V_ERRO, 11);
         END IF;
         
         GRAVA_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, V_CDPRODUTO, V_DTPROGENTAF, V_ERRO, V_QTPROGENTAF, V_VRPREUNIAF, V_VRITEPREBASE, V_OPERADOR);
         AF_ERRO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN);
         COMMIT;  
         
         IF INSTR(V_ERRO, '20501') > 0 THEN 
            V_ERRO := SUBSTR(V_ERRO, 12);
            P_RESULT := V_ERRO;
         END IF;
   END VALIDA_AF_PEDIDO;  
    
   PROCEDURE GRAVA_ERRO(P_CDFILDEST    IN VARCHAR2,   
                        P_CDFILLANC    IN VARCHAR2,   
                        P_NRAUTOFORN   IN VARCHAR2,   
                        P_CDPRODUTO    IN VARCHAR2,   
                        P_DTPROGENTAF  IN DATE,   
                        P_ERRO         IN VARCHAR2,  
                        P_QTPROGENTAF  IN FLOAT,   
                        P_VRPREUNIAF   IN FLOAT,  
                        P_VRITEPREBASE IN FLOAT,
                        P_CDOPERADOR   IN VARCHAR2)
   IS
   BEGIN
      INSERT INTO IMPORTA_ERRO(CDFILDEST, CDFILLANC, NRAUTOFORN, CDPRODUTO,
                               DTPROGENTAF, ERRO, QTPROGENTAF, VRPREUNIAF, VRITEPREBASE,
                               DATA_ERRO, CDOPERADOR)
      VALUES(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, P_CDPRODUTO,
             P_DTPROGENTAF, P_ERRO, P_QTPROGENTAF, P_VRPREUNIAF, P_VRITEPREBASE,
             SYSDATE, P_CDOPERADOR);
   END GRAVA_ERRO;
  
   PROCEDURE INSERE_PEDIDO_IMP(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2, P_CDVENDEDOR IN VARCHAR2,   
                               P_DTPROGENTAF IN DATE, P_CDFILIAL IN VARCHAR2, P_CDCLIENTE IN VARCHAR2, P_CDMODPGTOCLI IN VARCHAR2, P_CDPRECOBASE IN VARCHAR2,  
                               P_CDTIPOOPER IN VARCHAR2, P_DTPEDIDO IN FLOAT, P_NRPEDIDO IN VARCHAR2, P_IDUTRELACPRODAF IN VARCHAR2, P_IDUTVALIPED IN VARCHAR2,  
                               P_IDLANCPED IN VARCHAR2)  
   IS  
      V_DATA DATE;  
   BEGIN  
      V_DATA := TRUNC(SYSDATE + P_DTPEDIDO);  
  
      INSERT INTO PEDIDO_IMPORTA(CDFILDEST, CDFILLANC, NRAUTOFORN, CDVENDEDOR, DTPROGENTAF, CDFILIAL, CDCLIENTE, CDMODPGTO, CDPRECOBASE, CDTIPOOPER,  
                                 DTPEDIDO, CDOPELANPED, NRPEDIDO, IDUTRELACPRODAF, IDUTVALIPED, NRINSJURTRAN, CDTIPTRANS, IDPGFRETTRANCLI, IDLANCPED)  
      VALUES(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, P_CDVENDEDOR, TRUNC(P_DTPROGENTAF), P_CDFILIAL, P_CDCLIENTE, P_CDMODPGTOCLI, P_CDPRECOBASE, P_CDTIPOOPER,  
             V_DATA, V_OPERADOR, P_NRPEDIDO, P_IDUTRELACPRODAF, P_IDUTVALIPED, V_NRINSJURTRAN, V_CDTIPTRANS, V_IDPGFRETTRANCLI, P_IDLANCPED);  
  
   END INSERE_PEDIDO_IMP;  
  
   PROCEDURE INSERE_ITEMPED_IMP(P_CDFILIAL IN VARCHAR2, P_NRPEDIDO IN VARCHAR2, P_CDPRODUTO IN VARCHAR2, P_QTSOLICITA IN FLOAT, P_VRITPREBASE IN FLOAT,  
                                P_SEQUENCIAL IN VARCHAR2, P_DTENTITPED IN DATE, P_QTITEMPED2 IN FLOAT, P_CDPRODUTOORI IN VARCHAR2, P_CDMARCA IN VARCHAR2)  
   IS
      V_DATA DATE;
   BEGIN  
      V_DATA := P_DTENTITPED+(TO_CHAR(SYSDATE, 'HH24')/24)+(TO_CHAR(SYSDATE, 'MI')/1440);
      
      INSERT INTO ITEMPEDIDO_IMPORTA(CDFILIAL, NRPEDIDO, CDPRODUTO, NRITEMPED, IDSITITEMPED, QTITEMPED, VRPRTABITPED, DTENTITPED, QTITEMPED2, CDOPELANPED, CDPRODUTOORI, CDMARCA)  
      VALUES(P_CDFILIAL, P_NRPEDIDO, P_CDPRODUTO, P_SEQUENCIAL, V_IDLANCPED, P_QTSOLICITA, P_VRITPREBASE, V_DATA, P_QTITEMPED2, V_OPERADOR, P_CDPRODUTOORI, P_CDMARCA);  
   END INSERE_ITEMPED_IMP;  
  
   PROCEDURE INS_TMP_RELACPRODIMP(P_CDPRODUTO IN VARCHAR2, P_VRTOTALAF IN FLOAT, P_CONTADOR OUT FLOAT)  
   IS  
      V_CDPRODUTO  VARCHAR2(10);
      V_VRFATARRED FLOAT;
      V_VRFATOCONV FLOAT;
      V_FATORCALC  FLOAT;
      V_COUNT      INTEGER;
      V_ORDEM      VARCHAR2(1);
      V_PRODUTO    VARCHAR2(10);
  
      CURSOR C_INSERE IS  
         SELECT P.CDPRODUTO, R.VRFATARRED, P.VRFATOCONV,   
                CASE WHEN TRUNC(SUM(P_VRTOTALAF/(NVL(P.VRFATOCONV, 1) * R.VRFATARRED))) > 0  
                     THEN TRUNC(SUM(P_VRTOTALAF/(NVL(P.VRFATOCONV, 1) * R.VRFATARRED)))  
                     ELSE SUM(P_VRTOTALAF/(P.VRFATOCONV * R.VRFATARRED))  
                END AS FATORCALC,  
  
                CASE WHEN TRUNC(SUM(P_VRTOTALAF/(P.VRFATOCONV * R.VRFATARRED))) > 0  
                     THEN 'A'  
                     ELSE 'B'  
                END AS ORDEM                  
           FROM RELACPRODIMPAF R JOIN PRODUTO P  
                                   ON R.CDPRODIMPO = P.CDPRODUTO  
          WHERE R.CDPRODORIG = P_CDPRODUTO  
          GROUP BY P.CDPRODUTO, R.VRFATARRED, P.VRFATOCONV  
          ORDER BY ORDEM, FATORCALC;  
   BEGIN  
      V_COUNT := 0;  
      V_PRODUTO := P_CDPRODUTO;  
      OPEN C_INSERE;  
      LOOP  
         FETCH C_INSERE INTO V_CDPRODUTO, V_VRFATARRED, V_VRFATOCONV, V_FATORCALC, V_ORDEM;  
         EXIT WHEN C_INSERE%NOTFOUND;  
  
         INSERT INTO TMP_RELACPRODIMP(CDPRODUTO, VRFATARRED, VRFATOCONV, FATORCALC, CDPRODUTOORI)  
         VALUES(V_CDPRODUTO, V_VRFATARRED, V_VRFATOCONV, V_FATORCALC, V_PRODUTO);  
  
         V_COUNT := V_COUNT+1;  
      END LOOP;  
      CLOSE C_INSERE;  
  
      P_CONTADOR := V_COUNT;                
   END INS_TMP_RELACPRODIMP;  
  
   FUNCTION TOLERANCIA(P_CDFILIAL IN VARCHAR2, P_CDPRODUTO IN VARCHAR2) RETURN FLOAT  
   IS  
      V_VRPTOLQTITAF FLOAT;  
   BEGIN  
      SELECT NVL(VRPTOLQTITAF, 0) VRPTOLQTITAF  
        INTO V_VRPTOLQTITAF  
        FROM PRODFILI  
       WHERE CDFILIAL  = P_CDFILIAL  
         AND CDPRODUTO = P_CDPRODUTO;  
  
      IF (V_VRPTOLQTITAF = 0) THEN  
         SELECT NVL(VRPETOLEQTAF, 0) VRPETOLEQTAF  
           INTO V_VRPTOLQTITAF  
           FROM PARAMGERAL  
          WHERE CDPARGERAL = '0001';  
      END IF;  
  
      RETURN V_VRPTOLQTITAF;  
   END TOLERANCIA;  
  
   PROCEDURE RAZAOSOCCLI(P_CDCLIENTE IN VARCHAR2)  
   IS  
   BEGIN  
      SELECT NMRAZSOCCLIE  
        INTO V_NMCLIENTE  
        FROM CLIENTE  
       WHERE CDCLIENTE = P_CDCLIENTE;  
   END RAZAOSOCCLI;  
  
   FUNCTION PRODUTOIMPORTA(P_CDPRODUTO IN VARCHAR2) RETURN VARCHAR2  
   IS  
      V_CDARVPROD VARCHAR2(200);  
   BEGIN  
      SELECT CDARVPROD||' - '||NMPRODUTO  
        INTO V_CDARVPROD  
        FROM PRODUTO  
       WHERE CDPRODUTO = P_CDPRODUTO;  
  
      RETURN V_CDARVPROD;  
   END PRODUTOIMPORTA;  
  
   FUNCTION CALCULA_DIFERENCA(P_VALORUNIT IN FLOAT, P_VRFATOCONV IN FLOAT, P_VRITEPREBASE IN FLOAT) RETURN BOOLEAN  
   IS  
      BO_RESULT BOOLEAN;  
      V_CALDIFERENCA FLOAT;  
   BEGIN  
      BO_RESULT := FALSE;  
      V_CALDIFERENCA := ROUND((P_VALORUNIT * P_VRFATOCONV),2) - ROUND(P_VRITEPREBASE,2);  
      BO_RESULT := (ABS(V_CALDIFERENCA) < 0.02);  
  
      RETURN BO_RESULT;  
   END CALCULA_DIFERENCA;  
  
   PROCEDURE AF_ERRO(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2)
   IS
   BEGIN
      INSERT INTO AF_ERRO_IMP(CDFILDEST, CDFILLANC, NRAUTOFORN, IDIMPORTA)
      VALUES(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, 'N');
   END AF_ERRO;
   
   PROCEDURE VERIFICA_TOLERANCIA(P_CDOPERADOR IN VARCHAR2)
   IS
      V_CDFILDEST       VARCHAR2(4);  
      V_CDFILLANC       VARCHAR2(4);  
      V_NRAUTOFORN      VARCHAR2(10);  
      V_DTPROGENTAF     DATE;  
      V_CDFILIAL        VARCHAR2(4);  
      V_NRPEDIDO        VARCHAR2(10);  
      V_CDPRODUTO       VARCHAR2(10);  
      V_VRTOLERA        FLOAT;  
      V_IDUTRELACPRODAF VARCHAR2(1);  
      V_VRFATOCONV      FLOAT;  
      V_CDPRODUTOORI    VARCHAR2(10);  
      V_PRODORIGEM      VARCHAR2(10);  
      V_SOMATORIO       FLOAT;  
      V_QTITEMPED       FLOAT;  
      VRVARIATOLE       FLOAT;  
      V_ERRO            VARCHAR2(2000);  
      V_TOTAL           FLOAT;  
       
      CURSOR C_PEDIDO IS 
         SELECT CDFILDEST, CDFILLANC, NRAUTOFORN, DTPROGENTAF, CDFILIAL, NRPEDIDO, IDUTRELACPRODAF  
           FROM PEDIDO_IMPORTA;
          --WHERE IDIMPORTA IS NULL;
       
      CURSOR C_ITEMPED(C_CDFILIAL IN VARCHAR2, C_NRPEDIDO IN VARCHAR2) IS   
         SELECT CDPRODUTOORI, SUM(QTITEMPED) QTITEMPED  
           FROM ITEMPEDIDO_IMPORTA  
          WHERE CDFILIAL = C_CDFILIAL  
            AND NRPEDIDO = C_NRPEDIDO  
          GROUP BY CDPRODUTOORI;  
        
      CURSOR C_PRODUTO(C_CDPRODORI IN VARCHAR2) IS  
         SELECT CDPRODUTO  
           FROM ITEMPEDIDO_IMPORTA  
          WHERE CDPRODUTOORI = C_CDPRODORI;  
   BEGIN  
      OPEN C_PEDIDO;  
      LOOP  
         FETCH C_PEDIDO INTO V_CDFILDEST, V_CDFILLANC, V_NRAUTOFORN, V_DTPROGENTAF, V_CDFILIAL, V_NRPEDIDO, V_IDUTRELACPRODAF;  
         EXIT WHEN C_PEDIDO%NOTFOUND;  
         V_PRODORIGEM := ' ';  
          
         OPEN C_ITEMPED(V_CDFILIAL, V_NRPEDIDO);  
         LOOP  
            FETCH C_ITEMPED INTO V_CDPRODUTOORI, V_QTITEMPED;
            EXIT WHEN C_ITEMPED%NOTFOUND;  
             
            V_TOTAL := 0;  
            OPEN C_PRODUTO(V_CDPRODUTOORI);  
            LOOP  
               FETCH C_PRODUTO INTO V_CDPRODUTO;  
               EXIT WHEN C_PRODUTO%NOTFOUND;  
                
               V_VRTOLERA := TOLERANCIA(V_CDFILIAL, V_CDPRODUTO);                  
               SELECT VRFATOCONV
                 INTO V_VRFATOCONV  
                 FROM PRODUTO  
                WHERE CDPRODUTO = V_CDPRODUTO;  
                
               IF V_IDUTRELACPRODAF = 'S' THEN  
                  IF V_PRODORIGEM <> V_CDPRODUTOORI THEN  
                     V_PRODORIGEM := V_CDPRODUTOORI;  
                      
                     SELECT SUM(I.QTPROGENTAF * P.VRFATOCONV)  
                       INTO V_SOMATORIO
                       FROM ITEMAUTF I, PRODUTO P  
                      WHERE I.CDPRODUTO  = P.CDPRODUTO  
                        AND I.CDFILDEST  = V_CDFILDEST  
                        AND I.CDFILLANC  = V_CDFILLANC  
                        AND I.NRAUTOFORN = V_NRAUTOFORN  
                        AND P.CDPRODUTO  = V_PRODORIGEM;  
                        
                     V_TOTAL := V_TOTAL+V_SOMATORIO;  
                  END IF;  
               ELSE  
                  IF V_PRODORIGEM <> V_CDPRODUTOORI THEN  
                     V_PRODORIGEM := V_CDPRODUTOORI;  
                      
                     SELECT SUM(I.QTPROGENTAF)  
                       INTO V_SOMATORIO
                       FROM ITEMAUTF I, PRODUTO P  
                      WHERE I.CDPRODUTO  = P.CDPRODUTO  
                        AND I.CDFILDEST  = V_CDFILDEST  
                        AND I.CDFILLANC  = V_CDFILLANC  
                        AND I.NRAUTOFORN = V_NRAUTOFORN  
                        AND P.CDPRODUTO  = V_PRODORIGEM;  
                        
                     V_TOTAL := V_TOTAL+V_SOMATORIO;  
                  END IF;  
               END IF;
               
               --V_PRODORIGEM := V_CDPRODUTOORI;
            END LOOP;  
            CLOSE C_PRODUTO;  
              
            SELECT ABS(100-((V_QTITEMPED*100)/V_TOTAL))  
              INTO VRVARIATOLE  
              FROM DUAL;  
             
            IF (VRVARIATOLE > V_VRTOLERA) THEN  
               UPDATE PEDIDO_IMPORTA
                  SET IDIMPORTA  = 'N'  
                WHERE CDFILDEST  = V_CDFILDEST  
                  AND CDFILLANC  = V_CDFILLANC  
                  AND NRAUTOFORN = V_NRAUTOFORN;  
                
               V_ERRO := 'Houve uma varia'||chr(231)||chr(227)||'o de '|| ROUND(VRVARIATOLE,2) ||'% na quantidade do produto '|| PRODUTOIMPORTA(V_PRODORIGEM)||'. A quantidade original do produto na AF é '||V_TOTAL||' e a quantidade total gerada é igual a '||V_QTITEMPED;
               GRAVA_ERRO(V_CDFILDEST, V_CDFILLANC, V_NRAUTOFORN, V_PRODORIGEM, V_DTPROGENTAF, V_ERRO, '', '', '', P_CDOPERADOR);
            END IF;  
         END LOOP;
          
         CLOSE C_ITEMPED;  
      END LOOP;  
      CLOSE C_PEDIDO;  
   EXCEPTION  
      WHEN OTHERS THEN  
         IF (C_PEDIDO%ISOPEN) THEN  
            CLOSE C_PEDIDO;  
         END IF;  
          
         IF (C_ITEMPED%ISOPEN) THEN  
            CLOSE C_ITEMPED;  
         END IF;  
   END VERIFICA_TOLERANCIA;  
END IMPORTA_PEDIDO_AF;
/

CREATE OR REPLACE PROCEDURE IMPORTA_AF_PEDIDO(P_CDFILDEST IN VARCHAR2, P_CDFILLANC IN VARCHAR2, P_NRAUTOFORN IN VARCHAR2, P_CDFILIMPO IN VARCHAR2, 
                                              P_IDTIPOEMITAF IN VARCHAR2, P_CDOPERADOR IN VARCHAR2, P_RESULT OUT VARCHAR2)
IS
   V_RESULT VARCHAR2(500);
BEGIN
   IMPORTA_PEDIDO_AF.VALIDA_AF_PEDIDO(P_CDFILDEST, P_CDFILLANC, P_NRAUTOFORN, P_CDFILIMPO, P_IDTIPOEMITAF, P_CDOPERADOR, V_RESULT);
   P_RESULT := V_RESULT;
EXCEPTION
   WHEN OTHERS THEN
      P_RESULT := SQLERRM(SQLCODE);
END;
/

CREATE OR REPLACE PROCEDURE TOLERANCIA_IMP(P_CDOPERADOR IN VARCHAR2)
IS
BEGIN
   IMPORTA_PEDIDO_AF.VERIFICA_TOLERANCIA(P_CDOPERADOR);
END;