CREATE OR REPLACE PROCEDURE CALC_ESTORNO_FAT(
   P_NRSEQUMAPAPU    IN MAPAAPURAC.NRSEQUMAPAPU%TYPE,
   P_CDEMPRESA       IN MAPAAPURAC.CDEMPRESA%TYPE,
   P_CDIMPOSTO       IN MAPAAPURAC.CDIMPOSTO%TYPE,
   P_INSCRICAO       IN MAPAAPURAC.CDINSCESTA%TYPE)
AS
   V_CDTPOPERESTAPUR   VARCHAR2(500);
   V_CDCFOPESTAPUR     VARCHAR2(500);
   V_VRALIQEFETIVA     FLOAT(126);
   V_VRALIQINTERNA     FLOAT(126);
   V_CDAJUSTESTAPUR    VARCHAR2(20);
   V_DSESTORNODEBAPU   VARCHAR2(250);
   V_VRESTORNO         NUMBER;
   V_VRTOTALSAIDA      NUMBER;
   V_VRNORMDEBI        NUMBER;
   V_VRPERREDBC        NUMBER;
   V_VRBCEFETIVA       NUMBER;
   V_NRSEQITMAPR       NUMBER;
   V_IDSOMAFECP        VARCHAR(01);
   
BEGIN
   V_VRESTORNO := 0;
   
   BEGIN 
      SELECT IDSOMAFECP 
        INTO V_IDSOMAFECP
        FROM AJUSTEFECP
       WHERE CDEMPRESA    = P_CDEMPRESA
         AND CDINSCESTA   = P_INSCRICAO
         AND CDIMPOSTO    = P_CDIMPOSTO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDSOMAFECP := 'S';
   END;    
   V_IDSOMAFECP := NVL(V_IDSOMAFECP,'S');
    
   /******** Busca a parametrização para a geração do estorno da inscrição estadual do mapa ********/
   BEGIN
      SELECT CDTPOPERESTAPUR, CDCFOPESTAPUR, VRALIQEFETIVA,
             VRALIQINTERNA, CDAJUSTESTAPUR, DSESTORNODEBAPU
        INTO V_CDTPOPERESTAPUR, V_CDCFOPESTAPUR, V_VRALIQEFETIVA,
             V_VRALIQINTERNA, V_CDAJUSTESTAPUR, V_DSESTORNODEBAPU
        FROM INSCRESTAD
       WHERE CDEMPRESA    = P_CDEMPRESA
         AND CDINSCESTA   = P_INSCRICAO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDTPOPERESTAPUR := NULL;
         V_CDCFOPESTAPUR   := NULL;
         V_VRALIQEFETIVA   := 0;
         V_VRALIQINTERNA   := 0;
         V_CDAJUSTESTAPUR  := NULL;
         V_DSESTORNODEBAPU := NULL;
   END;

   /******** Calcula o valor do Estorno que deve ser gerado na apuração ********/
   BEGIN
      SELECT NVL(SUM(ROUND(I.VRCONTABILNF,2)),0.0) AS VRTOTALSAIDA,
             NVL(SUM(ROUND(DECODE(I.CDFISCALNF,'1',I.VRIMPOSTONF + DECODE(V_IDSOMAFECP,'S',NVL(I.VRADICFECP,0),0),0),2)),0.0) AS VRNORMDEBI
        INTO V_VRTOTALSAIDA, V_VRNORMDEBI
        FROM IMPOSTONF I, NOTAFISCAL N, IMPOSTO IM
       WHERE I.NRSEQUMAPAPU  = P_NRSEQUMAPAPU
         AND I.CDFILIAL      = N.CDFILIAL
         AND I.NRLANCTONF    = N.NRLANCTONF
         AND I.IDIMPOSTONF   <> '3'
         AND N.IDENTRSAIDOP  = 'S'
         AND I.CDIMPOSTO     = IM.CDIMPOSTO
         AND IM.CDIMPOSTONFE = P_CDIMPOSTO
         AND ((INSTR(V_CDTPOPERESTAPUR, '_' ||N.IDENTRSAIDOP||N.CDTIPOOPER||'_' ) > 0) OR (V_CDTPOPERESTAPUR IS NULL))
         AND ((INSTR(V_CDCFOPESTAPUR, '_' ||I.CDFISCOPERNF||'_') > 0) OR (V_CDCFOPESTAPUR IS NULL));
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_VRTOTALSAIDA := 0;
         V_VRNORMDEBI   := 0;
   END;

   /*Calcula o Percentual de Redução da Base de Cálculo, para obter o imposto efetivo*/
   V_VRPERREDBC  := ROUND(100 - (V_VRALIQEFETIVA * 100 / V_VRALIQINTERNA),2);
   /*Calcula o valor da base de cálculo efetiva, após abater o percentual de redução do faturamento*/
   V_VRBCEFETIVA := V_VRTOTALSAIDA - ROUND(V_VRTOTALSAIDA * V_VRPERREDBC / 100,2);
   /*Calcula o valor do ICMS efetivamente devido*/
   V_VRESTORNO := ROUND(V_VRBCEFETIVA * V_VRALIQINTERNA / 100,2);
   /*O valor do estorno será a diferença entre o valor do débito nas notas fiscais e o débito apurado*/
   V_VRESTORNO  := ROUND(NVL(V_VRNORMDEBI,0) - NVL(V_VRESTORNO,0),2);

   /******** Deleta o item de estorno de débitos gerado pela rotina, evitando erro na reapuração de mapas ********/
   DELETE FROM ITMAPARECUP
    WHERE NRSEQUMAPAPU  = P_NRSEQUMAPAPU
      AND IDTIPOITMAPR  = 'ED'
      AND IDESTORNOAPUR = 'S';

   /******** Verifica se deve ser gerado o item de estorno de débito ********/
   IF V_VRESTORNO > 0 THEN
      /******** Busca o maior sequencial de Estorno de Débitos ********/
      BEGIN
         SELECT NVL(MAX(NRSEQITMAPR),0) AS NRSEQITMAPR
           INTO V_NRSEQITMAPR
           FROM ITMAPARECUP
          WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
            AND IDTIPOITMAPR = 'ED';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRSEQITMAPR := NULL;
      END;

      V_NRSEQITMAPR := NVL(V_NRSEQITMAPR,0)+1;

      /******** Insere o item de estorno de débito com o valor calculado ********/
      INSERT INTO ITMAPARECUP
         (NRSEQUMAPAPU, IDTIPOITMAPR, NRSEQITMAPR, DSITEMMAPR, VRITEMMAPR, CDITEMOCOR, DSITEMOCOR,
          DSFLEGALOCOR, NRLANCTONF, CDFILIAL, CDAJUSTEITMAPA, IDESTORNOAPUR)
      VALUES
         (P_NRSEQUMAPAPU, 'ED', LPAD(V_NRSEQITMAPR,10,'0'), V_DSESTORNODEBAPU, V_VRESTORNO, '', '',
          '', '', '', V_CDAJUSTESTAPUR, 'S');
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALC_ESTORNO_FAT','0.00.000'); END;
/