CREATE OR REPLACE PROCEDURE GERA_DEVOLVENDAANTEC
(
P_CDFILIAL IN VARCHAR2,
P_CDCLIENTE IN VARCHAR2,
P_CDSERVFILI IN VARCHAR2,
P_QTDE IN FLOAT,
P_VRSERVICO IN FLOAT,
P_DTDEVOLUCAO IN VARCHAR2,
P_CDTIPOOPER IN VARCHAR2,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_CDFILIALORIG IN VARCHAR,
P_NRLANCTOORIG IN VARCHAR
)
AS
	V_NRAPURACFAT VARCHAR2(10);
	V_NRDEVOLVENDAANTEC NUMBER;
	V_DTDEVOLUCAO DATE;
/* VARIAVEIS PARA CONTROLE DE GRAVACAO DA NOTA FISCAL */
   V_CHAVECST     VARCHAR2(14);
   V_CSTTEMP      VARCHAR2(03);
   V_IDPRODSUBS   VARCHAR2(01);
   V_IDPRODANTE   VARCHAR2(01);
   V_CDPTOVNDFATURTAP VARCHAR2(30);
   
   V_CDSERIE      SERIENF.CDSERIE%TYPE;
   V_CDSERIEVANTECIPA SERIENF.CDSERIE%TYPE;
   V_CDSERIEAUTO  SERIENF.CDSERIE%TYPE;
   V_IDSERIEAUTO  VARCHAR2(01);
   V_TTITENSNF    NUMBER;
   V_CONTITEM     NUMBER;
   V_NRLANCTONF   VARCHAR2(20);   
   V_CDEMPRESA    FILIAL.CDEMPRESA%TYPE;
   V_CDINSCMUNI   FILIAL.CDINSCMUNI%TYPE;
   V_CDINSCESTA   FILIAL.CDINSCESTA%TYPE;
   V_IDTPIJURCLIE CLIENTE.IDTPIJURCLIE%TYPE;
   V_NRINSJURCLIE CLIENTE.NRINSJURCLIE%TYPE;
   v_NRINSJURTRAN CLIENTE.NRINSJURTRAN%TYPE;
   V_IDTPIJURTRAN CLIENTE.IDTPIJURTRAN%TYPE;
   V_IDPGTOFRETE  CLIENTE.IDPGFRETTRANCLI%TYPE;
   V_NRPLACAVEIC  VIATURA.NRPLACA%TYPE;
   V_SGUFVEICULO  VIATURA.SGUFVEICULO%TYPE;
   V_IDNOVANOTA   VARCHAR2(01);
   V_VRNOTAFISC   NUMBER;
   V_PRXLANCESTQ  VARCHAR2(10);
   V_VRCREDIDEBI  NOTAFISCAL.VRNOTAFISC%TYPE;
   
   V_DSAJUCTREC      AJCTRECEBER.DSAJUSTEREC%TYPE;
   V_ENCARGO         ENCARGO.CDENCARGO%TYPE;
   V_IDCOPALTEFEPLA  PARAMFILIAL.IDCOPALTEFEPLA%TYPE;   

   V_CDGRUPOFISC  VARCHAR2(03);
   V_DESCDOTACAO  VARCHAR2(01);
   V_CDAJUSTPADR  VARCHAR2(02);
   V_CDENCREDITO  VARCHAR2(02);
   V_CDENCDEBITO  VARCHAR2(02);
   V_IDUTPROPEMIS VARCHAR2(01);
   V_CDARVPROD    PRODUTO.CDARVPROD%TYPE;
   V_NMPRODUTO    PRODUTO.NMPRODUTO%TYPE;   
   V_MINEFETFAT   VARCHAR2(01);
   V_IDUTILEQUI   VARCHAR2(01);
   V_NREFETAUX    NUMBER;
   V_NREFETAUXGD  NUMBER;
   V_NREFETAUXTU  NUMBER;
   V_VRUNITARIO   NUMBER;
   V_CDTIPOFATUR  PARAMFILIAL.CDTIPOFATUR%TYPE;
   V_IDENDCFOP      VARCHAR2(01);
   V_PAISORIG       VARCHAR2(04);
   V_ESTAORIG       VARCHAR2(02);
   V_MUNIORIG       VARCHAR2(04);   
   V_CDORIGDESTNF   VARCHAR2(21);
   V_IDENDEMIS      VARCHAR2(01);
   V_PAISDEST       VARCHAR2(04);
   V_ESTADEST       VARCHAR2(02);
   V_MUNIDEST       VARCHAR2(04);
   V_CDEMPRESADEST  VARCHAR2(02);
   V_CDINSCESTADEST VARCHAR2(16);
   V_IDINTEREST     VARCHAR2(01);
   V_IDINTERNA      VARCHAR2(01);
         
   V_IDATIVATABCOR VARCHAR2(1);
   V_IDCOREFECLIFILI VARCHAR2(1);
   V_VRAPURFATTABCOR NUMBER;
   V_VRAPURACAOFATU NUMBER;
   V_VRSERVICOCORRI NUMBER;
   
   V_IDUTILADIANT  VARCHAR2(1);
   V_IDCLIENPRIN VARCHAR2(1);
   
   V_DSEMISSAO VARCHAR2(2000);
   V_NREFETIVOS_SERV FLOAT(126);
   V_VRSERVICO_SERV FLOAT(126);
   V_CDCLIENTE VARCHAR2(21);
   V_SEQUENCIAL NUMBER;

   V_NRGRUPONF NUMBER;   
   V_CDGRSERVFAT VARCHAR2(3);   

   V_STIDTIPNFEMP VARCHAR2(1);
   V_STIDMINIEFET VARCHAR2(1);
   V_STIDQTDEPREC VARCHAR2(1);
   V_STIDUTEFEPLA VARCHAR2(1);

   V_CDFORNECED VARCHAR2(21);
   V_IDORIGDESTOP VARCHAR2(1);
   V_QTDE NUMBER;
   V_CDPRODUTO VARCHAR2(10);

   V_NMSERVICO VARCHAR2(40);

   V_CDORIGEM VARCHAR2(21);
   V_NRSEQITPROD VARCHAR2(4);

   V_VRITEM FLOAT;
   V_NRSEQUITNOTA VARCHAR2(3);   
BEGIN
	V_DTDEVOLUCAO := NVL(V_DTDEVOLUCAO, TRUNC(SYSDATE));
	/* Apuração do retroativo */
   V_NRAPURACFAT := RETORNA_NOVO_CODIGO('APURACFATUR' || P_CDFILIAL, 1, 10);
   INSERT INTO CTRLAPURFAT
   (CDFILIAL, NRAPURACFAT, CDFILIAPUR,
    CDCLIENTE, DTINIAPURAC, DTFIMAPURAC)
   VALUES
   (P_CDFILIAL,V_NRAPURACFAT, P_CDFILIAL,
    P_CDCLIENTE, V_DTDEVOLUCAO, V_DTDEVOLUCAO);
	/* Insere nova devolução*/
	V_NRDEVOLVENDAANTEC := TO_NUMBER(RETORNA_NOVO_CODIGO('DEVOLVENDAANTEC', 1));
   INSERT INTO DEVOLVENDAANTEC
   (NRDEVOLVENDAANTEC, CDFILIAL, CDCLIENTE,
    DTDEVOLUCAO, CDSERVFILI,
    QTREFEICOES, VRSERVICO,
    IDENTRSAIDOP, CDTIPOOPER, NRAPURACFAT,    
    NRORG, NRORGINCLUSAO, NRORGULTATU,
    DTINCLUSAO, DTULTATU,
    CDOPERINCLUSAO, CDOPERULTATU)
   VALUES
   (V_NRDEVOLVENDAANTEC, P_CDFILIAL, P_CDCLIENTE,
    V_DTDEVOLUCAO, P_CDSERVFILI,
    P_QTDE, P_VRSERVICO,
    'E', P_CDTIPOOPER, V_NRAPURACFAT,    
    P_NRORG, P_NRORG, P_NRORG,
    SYSDATE, SYSDATE,
    P_CDOPERADOR, P_CDOPERADOR);

   /* Busca dados para geração da nota fiscal*/

   /* BUSCA AS INFORMAÇÕES PARA CADASTRAMENTO DA NOTA FISCAL */
   SELECT MAX(CDEMPRESA), MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE), MAX(CDSERIEVANTECIPA)
   INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA, V_CDSERIE, V_CDSERIEVANTECIPA
   FROM FILIAL
   WHERE CDFILIAL = P_CDFILIAL;

   SELECT MAX(IDORIGDESTOP), NVL(MAX(IDSERIEAUTO), 'N')
   INTO V_IDORIGDESTOP, V_IDSERIEAUTO
   FROM TIPOOPERAC
   WHERE CDTIPOOPER   = P_CDTIPOOPER AND
         IDENTRSAIDOP = 'E';
   
   V_IDORIGDESTOP := NVL(V_IDORIGDESTOP, 'F');

   IF V_IDSERIEAUTO = 'S' THEN
      SELECT MAX(P.CDSERIE)
        INTO V_CDSERIEAUTO
        FROM PARAMSERIE P, FILIAL F, CLIENTE C
       WHERE F.CDFILIAL      = P_CDFILIAL AND
            NVL(F.CDFILIFISC, F.CDFILIAL) = P.CDFILIAL   AND
            P.CDEMPRESA     = V_CDEMPRESA  AND
            P.CDINSCESTA    = V_CDINSCESTA AND
            P.CDINSCMUNI    = V_CDINSCMUNI AND
            P.CDTIPOOPER    = P_CDTIPOOPER AND
            C.CDCLIENTE     = P_CDCLIENTE  AND
            P.CDCONDICAOIVA = C.CDCONDIVACLI AND
            P.IDENTRSAIDOP  = 'S';
   END IF;

   IF V_CDSERIEAUTO IS NOT NULL THEN      
     V_CDSERIE := V_CDSERIEAUTO;
   END IF;

   /* Verifica se a série padrão adastrada possui correspondência nas séries de entrada:*/
   SELECT COUNT(1)
     INTO V_QTDE
     FROM SERIEENTR
    WHERE CDSERIEENTR = V_CDSERIE;

   IF V_QTDE = 0 THEN
   	RAISE_APPLICATION_ERROR(-20000, 'SERIE_PADRAO_N_CAD_SERIEENTR');
   END IF;

   IF V_IDORIGDESTOP = 'F' THEN   	
   	SELECT MAX(CDFORNECED)   	
	     INTO V_CDFORNECED
	     FROM CLIENFILIAL 
	    WHERE CDFILIAL = P_CDFILIAL
	      AND CDCLIENTE = P_CDCLIENTE;
	   IF V_CDFORNECED IS NULL THEN
	   	RAISE_APPLICATION_ERROR(-20000, 'FORNECEDOR_CLIENTE_N_CAD');
	   END IF;
   END IF;

   /*DADOS DO EMITENTE*/
   SELECT NVL(MAX(IDENDCFOPFIL),'I'), MAX(CDEMPRESA), MAX(CDINSCESTA)
   INTO   V_IDENDCFOP,                V_CDEMPRESA,    V_CDINSCESTA
   FROM   FILIAL
   WHERE  (CDFILIAL = P_CDFILIAL);

   IF V_IDENDCFOP = 'I' THEN
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISORIG,  V_ESTAORIG,    V_MUNIORIG
      FROM   INSCRESTAD
      WHERE  CDEMPRESA  = V_CDEMPRESA AND
             CDINSCESTA = V_CDINSCESTA;
   ELSE
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISORIG,  V_ESTAORIG,    V_MUNIORIG
      FROM   ENDEFILI
      WHERE  (CDFILIAL     = P_CDFILIAL) AND
             (IDTPENDEFILI = V_IDENDCFOP);
   END IF;
   

   IF V_IDORIGDESTOP = 'L' THEN /*QUANDO O DESTINATARIO É UMA FILIAL */
      SELECT NVL(MAX(IDENDEMISFIL),'I'), MAX(CDEMPRESA), MAX(CDINSCESTA)
      INTO   V_IDENDEMIS,                V_CDEMPRESADEST,    V_CDINSCESTADEST
      FROM   FILIAL
      WHERE  (CDFILIAL = P_CDFILIAL);

      IF V_IDENDEMIS = 'I' THEN
         SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
         INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
         FROM   INSCRESTAD
         WHERE  CDEMPRESA  = V_CDEMPRESADEST AND
                CDINSCESTA = V_CDINSCESTADEST;
      ELSE
         SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
         INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
         FROM   ENDEFILI
         WHERE  CDFILIAL     = P_CDFILIAL AND
                IDTPENDEFILI = V_IDENDEMIS;
      END IF;

      V_CDORIGEM := P_CDFILIAL;
      
   ELSIF V_IDORIGDESTOP = 'F' THEN /*QUANDO O DESTINATARIO É UM FORNECEDOR*/
      SELECT NVL(MAX(IDENDEMISFOR),'P')
      INTO   V_IDENDEMIS
      FROM   FORNECEDOR
      WHERE  (CDFORNECED = V_CDFORNECED);

      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
      FROM   ENDEFORN
      WHERE  (CDFORNECED   = V_CDFORNECED) AND
             (IDTPENDEFORN = V_IDENDEMIS);

      V_CDORIGEM := V_CDFORNECED;
   ELSE /*QUANDO O DESTINATARIO é UM CLIENTE*/
      SELECT NVL(MAX(IDENDEMISCLI),'P')
      INTO   V_IDENDEMIS
      FROM   CLIENTE
      WHERE  (CDCLIENTE = P_CDCLIENTE);

      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
      FROM   ENDECLIE
      WHERE  (CDCLIENTE    = P_CDCLIENTE) AND
             (IDTPENDECLIE = V_IDENDEMIS);

      V_CDORIGEM := P_CDCLIENTE;
   END IF;

   CONSULTA_GRUPOFISCAL(V_IDORIGDESTOP, V_CDORIGEM, P_CDFILIAL, 'E', P_CDTIPOOPER, V_CDGRUPOFISC);

   /*VERIFICANDO OS PARAMETROS INTERESTADUAL E INTERNACIONAL*/
   V_IDINTEREST := 'N';
   V_IDINTERNA  := 'N';
   IF ((V_PAISDEST = V_PAISORIG) AND (V_ESTADEST <> V_ESTAORIG)) THEN
      V_IDINTEREST := 'S';
   ELSIF (V_PAISDEST <> V_PAISORIG) THEN
      V_IDINTERNA := 'S';
   END IF;

   /* BUSCA OS PARAMETROS DA PARAMGERAL*/
   SELECT NVL(MAX(IDUTPROPEMIS),'N')
   INTO V_IDUTPROPEMIS
   FROM PARAMGERAL;

   SELECT MAX(P.CDPRODUTO), MAX(P.CDARVPROD), MAX(P.NMPRODUTO), MAX(S.NMSERVICO)
     INTO V_CDPRODUTO, V_CDARVPROD, V_NMPRODUTO, V_NMSERVICO
     FROM SERVICO S
          LEFT JOIN PRODUTO P ON P.CDPRODUTO = S.CDPRODUTO
    WHERE S.CDFILIAL = P_CDFILIAL
      AND S.CDSERVFILI = P_CDSERVFILI;

	/* Insere cabeçalho da nota fiscal	*/
   V_NRLANCTONF := RETORNA_NOVO_CODIGO('LANCNF/FILIAL' || P_CDFILIAL, 1, 10);

   GERA_NOTAFISCAL_CORPO_ENTRADA
   (P_CDFILIAL, P_CDFILIAL, V_CDEMPRESA,
    P_CDTIPOOPER, V_CDSERIE,
    V_CDORIGEM, V_DTDEVOLUCAO,
    'DFE',
    0, V_NRLANCTONF, V_PRXLANCESTQ, 
    'N', V_NRAPURACFAT, V_NRLANCTONF,
    NULL, NULL, /*JURTRAN*/
    NULL, NULL, NULL, /*VEIC*/
    NULL, NULL, NULL, /*VOLU*/
    NULL, NULL, NULL, /*VOLU*/    
    V_PRXLANCESTQ, NULL, V_DTDEVOLUCAO,
    NULL, V_DTDEVOLUCAO, NULL, NULL);

   /* Insere produto na nota fiscal*/
   GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL, V_NRLANCTONF, V_CDPRODUTO,
                           V_CDARVPROD, V_NMPRODUTO , P_QTDE,
                           P_VRSERVICO, 0, NULL,
                           NULL, NULL, NULL,
                           NULL, NULL, NULL,
                           NULL, NULL, NULL,
                           'S', NULL, 0,
                           P_CDSERVFILI);
   V_VRITEM := P_QTDE * P_VRSERVICO;
	/* Insere impostos do item*/
   IMPOSTO_ENTRADA_PRODUTO(V_CDEMPRESA, V_CDINSCESTA, P_CDTIPOOPER, V_CDFORNECED, P_CDFILIAL, V_NRLANCTONF,
                           V_DTDEVOLUCAO, 'E', P_CDOPERADOR, V_CDGRUPOFISC, V_IDINTEREST, V_CDARVPROD,
                           '', V_IDORIGDESTOP, P_CDFILIAL, NULL, NULL, V_VRITEM);
	
	V_NRSEQITPROD := '0001';

	FOR C_ALIQITEM IN(SELECT IM.CDIMPOSTO, IM.SGIMPOSTO, IM.IDTRATIMPO, IM.IDPREIMPENTR,
                            I.CDFISCTEMP, NVL(AL.VRALIQUTMP, 0) AS VRALIQUOTA,
                            NVL(AL.VRADICALIQFECP, 0) AS VRADICALIQFECP
                       FROM INCITEMP I, IMPOSTO IM, ALIQTEMPPROD AL
                      WHERE I.CDIMPOTEMP  = IM.CDIMPOSTO
                        AND I.NRINCITEMP  = P_CDFILIAL||V_NRLANCTONF
                        AND I.NRINCITEMP  = AL.NRALIQTEMP(+)
                        AND I.CDIMPOTEMP  = AL.CDIMPOTEMP(+)
                        AND IM.IDPRODNOTA <> 'C') LOOP

      INSERT INTO TRABITPROIMPOS
         (CDFILIMPOIT, NRLANCIMPOIT, NRSEQIMPOIT, CDIMPOSTOIT, VRCONTIMPOIT,
         VRREDBCIMPOIT, VRBCALCIMPOIT, VRALIQIMPOIT, VRPDEDIMPOIT, VRIMPOSIT,
         CDFISCIMPOIT,  NRSEQITPRO, IDVALORINFO,
         VR1REDBCIMPOIT, IDTRIMPSTTI, VRIMPOSVISUIT, VRADICALIQFECP)

      VALUES
         (P_CDFILIAL, V_NRLANCTONF, V_NRSEQITPROD, C_ALIQITEM.CDIMPOSTO, V_VRITEM,
          0, V_VRITEM, C_ALIQITEM.VRALIQUOTA, 0, 0,
          C_ALIQITEM.CDFISCTEMP, '1', 'N',
          0, '0', 0, C_ALIQITEM.VRADICALIQFECP);
   END LOOP;

   DELETE
     FROM ALIQTEMPPROD
    WHERE NRALIQTEMP = P_CDFILIAL||V_NRLANCTONF;

   DELETE
     FROM INCITEMP
    WHERE NRINCITEMP = P_CDFILIAL||V_NRLANCTONF;

   /*insere nota fiscal de origem na ITEMNOTAFISC*/
   SELECT MAX(NRSEQUITNOTA)
     INTO V_NRSEQUITNOTA
     FROM ITEMNOTAFISC 
    WHERE CDFILIALIT = P_CDFILIALORIG AND
          NRLANCTONFIT = P_NRLANCTOORIG; 
   
   INSERT INTO ITEMNOTAFISC(CDFILIAL, NRLANCTONF, NRSEQUITNOTA, CDFILIALIT, NRLANCTONFIT) VALUES
                           (P_CDFILIAL, V_NRLANCTONF, LPAD(NVL(V_NRSEQUITNOTA,'000') + 1,3,'0'),P_CDFILIALORIG,P_NRLANCTOORIG);

	/* Fecha nota fiscal*/
	GERA_FECHAMENTO_NFENTRADA(P_CDFILIAL, V_NRLANCTONF,
                             P_DTDEVOLUCAO, V_PRXLANCESTQ,
                             P_CDOPERADOR);
END;
/

