CREATE OR REPLACE PROCEDURE GERA_ICMS_INTERESTADUAL(
   P_CDFILIAL    IN VARCHAR2,
   P_NRLANCTONF  IN VARCHAR2,
   P_NRSEQITPROD IN VARCHAR2,
   P_DTINIVALID  IN DATE)
AS
   V_ALIQTEMP VARCHAR2(18);
   V_EXISTENOTA VARCHAR2(14);
   V_IDORIGDESTNF VARCHAR2(01);
   V_CDFILIEMIT VARCHAR2(04);
   V_CDCLIENTE VARCHAR2(21);
   V_CDFORNECED VARCHAR2(21);
   V_IDENDEMISFIL VARCHAR2(01);
   V_IDENDEMISCLI VARCHAR2(01);
   V_IDENDEMISFOR VARCHAR2(01);
   V_CDPAISEMIT VARCHAR2(04);
   V_SGESTADOEMIT VARCHAR2(02);
   V_CDMUNICIPIOEMIT VARCHAR2(04);
   V_CDPAISDEST VARCHAR2(04);
   V_SGESTADODEST VARCHAR2(02);
   V_CDMUNICIPIODEST VARCHAR2(04);
   V_IDOPERINTEREST VARCHAR2(01);
   V_IDCONSFINAL VARCHAR2(01);
   V_NRINSESTDESNF VARCHAR2(20);
   V_IDCONTRIBICMS VARCHAR2(01);
   V_IDCONTRIBICMSAUX VARCHAR2(01);
   V_EXISTEISSQN FLOAT;
   V_EXISTEIMPOSTO VARCHAR2(18);
   V_CDIMPOSTO VARCHAR2(02);
   V_CDEMPRESA VARCHAR2(02);
   V_CDINSCESTA VARCHAR2(16);
   V_IDENTRSAIDOP VARCHAR2(01);
   V_CDTIPOOPER VARCHAR2(02);
   V_DTEMISSAO DATE;
   V_DTINIVALID DATE;
   V_IDUTMUNIORIG VARCHAR2(01);
   V_CDDESTNF VARCHAR2(21);
   V_CDGRUPOFISC  VARCHAR2(03);
   V_ALIQICMSDEST FLOAT;
   V_VRPERREDDEST FLOAT;
   V_ALIQFECPDEST FLOAT;
   V_IMPOQFECPDEST FLOAT;
   V_VRBASECALCDEST FLOAT;
   V_VRBASECALCREME FLOAT;
   V_VRALIQITEM FLOAT;
   V_VRBASECALCIT FLOAT;
   V_VRPERCPARTILHA FLOAT;
   V_VRIMPOSTODEST FLOAT;
   V_DIFPARTILHAICMS FLOAT;
   V_VRIMPOSTOIT FLOAT;
   V_VRIMPOSTOORIG FLOAT;
   V_VRIMPOPARTDEST FLOAT;
   V_VRIMPOPARTREME FLOAT;
   V_VRIMPOPARTDESTINO VARCHAR2(16);
   V_VRALIQPARTDESTINO VARCHAR2(06);
   V_VRIMPOPARTORIGEM VARCHAR2(16);
   V_VRIMPOFCPDESTINO VARCHAR2(16);
   V_VRALIQFCPDESTINO VARCHAR2(06);
   V_CDSITUTRIBITNFE VARCHAR2(02);
   V_CDSITUCRT VARCHAR2(01);
   V_CDIMPOSTOFECP VARCHAR2(02);
   V_CDFISCALIT VARCHAR2(01);
   V_NRDADOADIC VARCHAR2(03);
   V_MSGDADOSADIC VARCHAR2(255);
   V_IDPRESENCIAL VARCHAR2(01);
   V_IDCALCDIFALDENT VARCHAR2(01);
   V_CFOPRETORNOMERCADORIA VARCHAR2(4000);
   V_IDCENARIO             VARCHAR2(20);
   V_IDUTPARFISCENT        VARCHAR2(01);
BEGIN
   --CFOP's de Retorno de Mercadoria
   V_CFOPRETORNOMERCADORIA := '_1414_1415_1451_1452_1554_1664_1902_1903_1904_1906
                               _1907_1909_1913_1914_1916_1921_1925_2414_2415_2554
                               _2664_2902_2903_2904_2906_2907_2909_2913_2914_2916
                               _2921_2925_5664_5665_5902_5903_5906_5907_5909_5913
                               _5916_5925_6664_6665_6902_6903_6906_6907_6909_6913
                               _6916_6925_6107_6108_5107_5108_6105_6106_6949';
   V_ALIQTEMP := P_CDFILIAL||P_NRLANCTONF;
   DELETE
     FROM ALIQTEMP
    WHERE NRALIQTEMP = V_ALIQTEMP;
   UPDATE ITEMPROIMPOS
      SET VRBASECALCDEST = NULL,
          VRALIQINTEDEST = NULL,
          VRALIQINTEREST = NULL,
          VRPERCPARTILHA = NULL,
          VRIMPOPARTDEST = NULL,
          VRIMPOPARTREME = NULL,
          VRALIQFCP = NULL,
          VRIMPOFCP = NULL,
          VRBASECALCREME = NULL
    WHERE CDFILIAL = P_CDFILIAL
      AND NRLANCTONF = P_NRLANCTONF
      AND NRSEQITPROD = P_NRSEQITPROD;
   DELETE
     FROM DADOSADIC
    WHERE CDFILIAL = P_CDFILIAL
      AND NRLANCTONF = P_NRLANCTONF
      AND DSDADOADIC LIKE 'Valores totais do ICMS Interestadual%';
   BEGIN
      SELECT N.CDFILIAL||N.NRLANCTONF AS EXISTENOTA,
             N.IDORIGDESTNF,
             CASE N.IDENTRSAIDOP WHEN 'S' THEN N.CDFILIEMIT ELSE N.CDFILIRECE END AS CDFILIEMIT,
             N.CDCLIENTE,
             N.CDFORNECED,
             N.CDEMPRESA,
             N.CDINSCESTA,
             N.IDENTRSAIDOP,
             N.CDTIPOOPER,
             N.DTEMISSAO,
             NVL(N.IDPRESENCIAL, '9'),
             NVL(T.IDCALCDIFALDENT, 'N'),
             NVL(IDUTPARFISCENT, 'S') AS IDUTPARFISCENT
        INTO V_EXISTENOTA,
             V_IDORIGDESTNF,
             V_CDFILIEMIT,
             V_CDCLIENTE,
             V_CDFORNECED,
             V_CDEMPRESA,
             V_CDINSCESTA,
             V_IDENTRSAIDOP,
             V_CDTIPOOPER,
             V_DTEMISSAO,
             V_IDPRESENCIAL,
             V_IDCALCDIFALDENT,
             V_IDUTPARFISCENT
        FROM NOTAFISCAL N, TIPOOPERAC T
       WHERE N.IDENTRSAIDOP = T.IDENTRSAIDOP
         AND N.CDTIPOOPER = T.CDTIPOOPER
         AND N.CDFILIAL = P_CDFILIAL
         AND N.NRLANCTONF = P_NRLANCTONF;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_EXISTENOTA := NULL;
         V_IDORIGDESTNF := NULL;
         V_CDFILIEMIT := NULL;
         V_CDCLIENTE := NULL;
         V_CDFORNECED := NULL;
         V_CDEMPRESA := NULL;
         V_CDINSCESTA := NULL;
         V_IDENTRSAIDOP := NULL;
         V_CDTIPOOPER := NULL;
         V_DTEMISSAO := NULL;
         V_IDPRESENCIAL := '9';
         V_IDCALCDIFALDENT := 'N';
   END;
   BEGIN
      SELECT NVL(CDSITUCRT, '3')
        INTO V_CDSITUCRT
        FROM PARAMEMPRESA
       WHERE CDEMPRESA = V_CDEMPRESA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDSITUCRT := '3';
   END;
   IF P_DTINIVALID IS NULL THEN
      V_DTINIVALID := TRUNC(SYSDATE);
   ELSE
      V_DTINIVALID := TRUNC(P_DTINIVALID);
   END IF;
   IF V_DTEMISSAO IS NULL THEN
      V_DTEMISSAO := TRUNC(SYSDATE);
   END IF;
   -- VERIFICANDO SE EXISTE A NOTAFISCAL E SE O DESTINO DA NOTA E UM CLIENTE OU FORNECEDOR
   IF (V_EXISTENOTA IS NOT NULL) AND (V_IDORIGDESTNF IN ('C', 'F')) THEN
      BEGIN
         SELECT NVL(IDENDEMISFIL, 'I') AS IDENDEMISFIL
           INTO V_IDENDEMISFIL
           FROM FILIAL
          WHERE CDFILIAL = V_CDFILIEMIT;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDEMISFIL := 'I';
      END;
      IF V_IDENDEMISFIL = 'I' THEN
         BEGIN
            SELECT CDPAIS,
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_CDPAISEMIT,
                   V_SGESTADOEMIT,
                   V_CDMUNICIPIOEMIT
              FROM INSCRESTAD
             WHERE CDEMPRESA = V_CDEMPRESA
               AND CDINSCESTA = V_CDINSCESTA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPAISEMIT := NULL;
               V_SGESTADOEMIT := NULL;
               V_CDMUNICIPIOEMIT := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDPAIS,
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_CDPAISEMIT,
                   V_SGESTADOEMIT,
                   V_CDMUNICIPIOEMIT
              FROM ENDEFILI
             WHERE CDFILIAL = V_CDFILIEMIT
               AND IDTPENDEFILI = V_IDENDEMISFIL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPAISEMIT := NULL;
               V_SGESTADOEMIT := NULL;
               V_CDMUNICIPIOEMIT := NULL;
         END;
      END IF;
      IF V_IDORIGDESTNF = 'C' THEN --CLIENTE
         BEGIN
            SELECT NVL(IDENDEMISCLI, 'P') AS IDENDEMISCLI,
                   NVL(IDCONSFINAL, 'N') AS IDCONSFINAL,
                   NRINSESTCLIE,
                   NVL(IDCONTRIBICMS, 'N') AS IDCONTRIBICMS
              INTO V_IDENDEMISCLI,
                   V_IDCONSFINAL,
                   V_NRINSESTDESNF,
                   V_IDCONTRIBICMS
              FROM CLIENTE
             WHERE CDCLIENTE = V_CDCLIENTE;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDENDEMISCLI := 'P';
               V_IDCONSFINAL := 'N';
               V_NRINSESTDESNF := NULL;
               V_IDCONTRIBICMS := 'N';
         END;
         BEGIN
            SELECT CDPAIS, 
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_CDPAISDEST,
                   V_SGESTADODEST,
                   V_CDMUNICIPIODEST
              FROM ENDECLIE
             WHERE CDCLIENTE = V_CDCLIENTE
               AND IDTPENDECLIE = V_IDENDEMISCLI;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPAISDEST := NULL;
               V_SGESTADODEST := NULL;
               V_CDMUNICIPIODEST := NULL;
         END;
         V_CDDESTNF := V_CDCLIENTE;
      ELSIF V_IDORIGDESTNF = 'F' THEN --FORNECEDOR
         BEGIN 
            SELECT NVL(IDENDEMISFOR, 'P') AS IDENDEMISFOR,
                   NVL(IDCONSFINAL, 'N') AS IDCONSFINAL,
                   NRINSESTFORN,
                   NVL(IDCONTRIBICMS, 'N') AS IDCONTRIBICMS
              INTO V_IDENDEMISFOR,
                   V_IDCONSFINAL,
                   V_NRINSESTDESNF,
                   V_IDCONTRIBICMS
              FROM FORNECEDOR
             WHERE CDFORNECED = V_CDFORNECED;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDENDEMISFOR := 'P';
               V_IDCONSFINAL := 'N';
               V_NRINSESTDESNF := NULL;
               V_IDCONTRIBICMS := 'N';
         END;
         BEGIN
            SELECT CDPAIS, 
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_CDPAISDEST,
                   V_SGESTADODEST,
                   V_CDMUNICIPIODEST
              FROM ENDEFORN
             WHERE CDFORNECED = V_CDFORNECED
               AND IDTPENDEFORN = V_IDENDEMISFOR;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPAISDEST := NULL;
               V_SGESTADODEST := NULL;
               V_CDMUNICIPIODEST := NULL;
         END;
         V_CDDESTNF := V_CDFORNECED;
      END IF;
      IF (V_NRINSESTDESNF IS NULL) OR (V_NRINSESTDESNF = '') THEN
         V_IDCONTRIBICMSAUX := 'N';
      ELSE
         V_IDCONTRIBICMSAUX := V_IDCONTRIBICMS;
      END IF;
      V_IDOPERINTEREST := 'N';
      --VERIFICANDO SE O ENDERECO DO EMITENTE DA NOTA FISCAL NAO E NULO
      IF (V_CDPAISEMIT IS NOT NULL) AND (V_SGESTADOEMIT IS NOT NULL) THEN
         --VERIFICANDO SE O ENDERECO DO DESTINATARIO DA NOTA FISCAL NAO E NULO
         IF (V_CDPAISDEST IS NOT NULL) AND (V_SGESTADODEST IS NOT NULL) THEN
            IF (V_CDPAISEMIT = V_CDPAISDEST) AND (V_SGESTADOEMIT <> V_SGESTADODEST) THEN
               V_IDOPERINTEREST := 'S';
            END IF;
          END IF;
      END IF;
      --REALIZANDO AS SEGUINTES VERIFICACOES:
      -- => VERIFICANDO SE A OPERACAO E INTERESTADUAL
      -- => VERIFICANDO SE O DESTINO DA NOTA E UM CONSUMIDOR FINAL 
      -- => VERIFICANDO SE O DESTINO DA NOTA NAO E CONTRIBUINTE DO ICMS, OU SEJA, NAO POSSUI INSCRICAO ESTADUAL CADASTRADA OU O PARAMETRO IDCONTRIBICMS ESTA COMO 'N'
      -- => VERIFICANDO SE A OPERACAO NAO E PRESENCIAL
      IF (V_IDOPERINTEREST = 'S') AND (V_IDCONSFINAL = 'S') AND (V_IDCONTRIBICMSAUX = 'N') AND (V_IDPRESENCIAL <> '1') THEN
         FOR C_ITEMPRODUTO IN (SELECT IT.NRSEQITPROD, 
                                      P.CDARVPROD,
                                      IT.VRTOTAITEM,
                                      IT.VRDESCITEM,
                                      IT.IDORIGEMPROD,
                                      IT.CDFISCOPERSN,
                                      IT.CDFISOPEITEM,
									  IT.VRBRUTITEM
                                 FROM ITEMPRODUTO IT, PRODUTO P
                                WHERE IT.CDPRODUTO = P.CDPRODUTO
                                  AND IT.CDFILIAL = P_CDFILIAL
                                  AND IT.NRLANCTONF = P_NRLANCTONF
                                  AND IT.NRSEQITPROD = P_NRSEQITPROD)
         LOOP
            IF INSTR(V_CFOPRETORNOMERCADORIA, '_' || C_ITEMPRODUTO.CDFISOPEITEM) = 0 THEN         
               DELETE
                 FROM ALIQTEMP
                WHERE NRALIQTEMP = V_ALIQTEMP;
               BEGIN
                  SELECT NVL(COUNT(*), 0)
                    INTO V_EXISTEISSQN
                    FROM ITEMPROIMPOS IT, IMPOSTO I
                   WHERE IT.CDIMPOSTO = I.CDIMPOSTO
                     AND IT.CDFILIAL = P_CDFILIAL
                     AND IT.NRLANCTONF = P_NRLANCTONF
                     AND IT.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                     AND I.CDIMPOSTONFE = '31';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_EXISTEISSQN := 0;
               END;
               --VERIFICANDO SE O ITEM NAO TEM INCIDENCIA DO IMPOSTO ISSQN
               IF V_EXISTEISSQN = 0 THEN
                  V_IDCENARIO := NULL;
                  BEGIN
                     SELECT IT.CDFILIAL||IT.NRLANCTONF||IT.NRSEQITPROD,
                            I.CDIMPOSTO,
                            I.IDUTMUNIORIG,
                            IT.VRALIQITEM,
                            IT.VRBASECALCIT,
                            IT.VRIMPOSTOIT,
                            IT.CDSITUTRIBITNFE,
                            IT.CDFISCALIT,
                            SUBSTR(IT.CDREGRAIT, 4, LENGTH(CDREGRAIT) - 3) AS IDCENARIO
                       INTO V_EXISTEIMPOSTO,
                            V_CDIMPOSTO,
                            V_IDUTMUNIORIG,
                            V_VRALIQITEM,
                            V_VRBASECALCIT,
                            V_VRIMPOSTOIT,
                            V_CDSITUTRIBITNFE,
                            V_CDFISCALIT,
                            V_IDCENARIO
                       FROM ITEMPROIMPOS IT, IMPOSTO I
                      WHERE IT.CDIMPOSTO = CASE V_CDSITUCRT WHEN '1' THEN I.CDIMPOSREGNORMA ELSE I.CDIMPOSTO END
                        AND IT.CDFILIAL = P_CDFILIAL
                        AND IT.NRLANCTONF = P_NRLANCTONF
                        AND IT.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                        AND IT.NRITPROIMPOS = '1'
                        AND I.CDIMPOSTONFE = '00';
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_EXISTEIMPOSTO := NULL;
                        V_CDIMPOSTO := NULL;
                        V_IDUTMUNIORIG := NULL;
                        V_VRALIQITEM := NULL;
                        V_VRBASECALCIT := NULL;
                        V_VRIMPOSTOIT := NULL;
                        V_CDSITUTRIBITNFE := NULL;
                        V_CDFISCALIT := NULL;
                        V_IDCENARIO  := NULL;
                  END;
                  --VERIFICANDO SE EXISTE A INCIDENCIA DE ICMS PARA O PRODUTO
                  IF (V_EXISTEIMPOSTO IS NOT NULL) THEN
                     --OS VALORES DO PERCENTUAL PROVISORIO DE PARTILHA ENTRE OS ESTADOS SAO DEFINIDOS DE ACORDO COM A NOTA TECNICA 2015/003
                     SELECT CASE TO_CHAR(V_DTEMISSAO, 'YYYY')
                            WHEN '2016'
                               THEN 40
                            ELSE
                               CASE TO_CHAR(V_DTEMISSAO, 'YYYY')
                               WHEN '2017'
                                  THEN 60
                               ELSE
                                  CASE TO_CHAR(V_DTEMISSAO, 'YYYY')
                                  WHEN '2018'
                                     THEN 80
                                  ELSE
                                     100
                                  END
                               END
                            END
                       INTO V_VRPERCPARTILHA
                       FROM DUAL;

                     IF (V_IDUTPARFISCENT = 'S') THEN
                        CONSULTA_GRUPOFISCAL(V_IDORIGDESTNF,
                                             V_CDDESTNF,
                                             V_CDFILIEMIT,
                                             V_IDENTRSAIDOP,
                                             V_CDTIPOOPER,
                                             V_CDGRUPOFISC);
                        IF V_IDUTMUNIORIG = 'D' THEN
                           /* CONSIDERA O MUNICIPIO DE DESTINO */
                           CONSULTA_ALIQUOTA(V_CDIMPOSTO,
                                             V_IDENTRSAIDOP,
                                             V_CDEMPRESA,
                                             C_ITEMPRODUTO.CDARVPROD,
                                             V_CDINSCESTA,
                                             V_CDPAISDEST,
                                             V_SGESTADODEST,
                                             V_CDPAISDEST,
                                             V_SGESTADODEST,
                                             V_CDMUNICIPIODEST,
                                             (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                                             V_DTINIVALID,
                                             P_CDFILIAL,
                                             P_NRLANCTONF,
                                             V_CDGRUPOFISC,
                                             V_CDTIPOOPER,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             C_ITEMPRODUTO.IDORIGEMPROD);
                        ELSE
                           /* CONSIDERA O MUNICIPIO DE ORIGEM */
                           CONSULTA_ALIQUOTA(V_CDIMPOSTO,
                                             V_IDENTRSAIDOP,
                                             V_CDEMPRESA,
                                             C_ITEMPRODUTO.CDARVPROD,
                                             V_CDINSCESTA,
                                             V_CDPAISDEST,
                                             V_SGESTADODEST,
                                             V_CDPAISDEST,
                                             V_SGESTADODEST,
                                             V_CDMUNICIPIOEMIT,
                                             (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                                             V_DTINIVALID,
                                             P_CDFILIAL,
                                             P_NRLANCTONF,
                                             V_CDGRUPOFISC,
                                             V_CDTIPOOPER,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             NULL,
                                             C_ITEMPRODUTO.IDORIGEMPROD);
                        END IF;
                        BEGIN
                           SELECT MAX(VRALIQUTMP),
                                  NVL(MAX(VRPREDBCTMP), 0),
                                  NVL(MAX(VRADICALIQFECP), 0)
                             INTO V_ALIQICMSDEST,
                                  V_VRPERREDDEST,
                                  V_ALIQFECPDEST
                             FROM ALIQTEMP
                            WHERE NRALIQTEMP = V_ALIQTEMP;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_ALIQICMSDEST := NULL;
                              V_VRPERREDDEST := 0;
                              V_ALIQFECPDEST := 0;
                        END;
                     ELSE /* Systax */
                        BEGIN
                           SELECT MAX(ALIQ_INT_UF_DEST),
                                  NVL(MAX(RED_BC_ST_UF_DEST), 0),
                                  NVL(MAX(FCP_UF_DEST), 0)
                             INTO V_ALIQICMSDEST,
                                  V_VRPERREDDEST,
                                  V_ALIQFECPDEST
                             FROM SYS_ICMS
                            WHERE ID_CENARIO = V_IDCENARIO
                              AND COD_PROD   = C_ITEMPRODUTO.CDARVPROD;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_ALIQICMSDEST := NULL;
                              V_VRPERREDDEST := 0;
                              V_ALIQFECPDEST := 0;
                        END;
                     END IF;
                     IF V_ALIQICMSDEST IS NULL THEN
                        BEGIN
                           SELECT NVL(CONSULTA_QUADRO_ALIQUOTAS(V_SGESTADODEST, V_SGESTADODEST), 0)
                             INTO V_ALIQICMSDEST
                             FROM DUAL;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_ALIQICMSDEST := 0;
                        END;
                     END IF;
                     IF V_VRALIQITEM <= V_ALIQICMSDEST THEN
                        /* TER ATENCAO TAMBEM NA REJEICAO 694 (REJEICAO: NAO INFORMADO O GRUPO DE ICMS PARA A UF DE DESTINO) */
						/*Rejeicao 694: Esta regra de validacao nao se aplica nas operacoes isentas (CST = 40 - Isenta ou CSOSN = 103 - Isento), imunes ou nao tributadas
						(CST = 41 - Nao tributada, ou CSOSN = 300 - Imune, ou CSOSN = 400 - Nao tributada pelo Simples Nacional)*/
                        IF ((V_CDSITUCRT <> '1') AND (V_CDSITUTRIBITNFE IN ('00', '20', /*'40', '41',*/ '60'))) OR /* FOI COLOCADO PARA EVITAR A REJEICAO 508 (REJEICAO: CST INCOMPATIVEL NA OPERACAO COM NAO CONTRIBUINTE) */
                           ((V_CDSITUCRT = '1') AND (SUBSTR(C_ITEMPRODUTO.CDFISCOPERSN, 2, 3) IN ('102', /*'103', '300', '400',*/ '500'))) /* FOI COLOCADO PARA EVITAR A REJEICAO 600 (REJEICAO: CSOSN INCOMPATIVEL NA OPERACAO COM NAO CONTRIBUINTE) */
                        THEN
                           IF V_ALIQFECPDEST = 0 THEN
                              /* CALCULANDO O VALOR DO FUNDO ESTADUAL DE COMBATE A POBREZA */
                              BEGIN
                                 SELECT CDIMPOSTO
                                   INTO V_CDIMPOSTOFECP
                                   FROM IMPOSTO
                                  WHERE CDIMPOSTONFE = '01';
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_CDIMPOSTOFECP := NULL;
                              END;
                              IF V_CDIMPOSTOFECP IS NOT NULL THEN
                                 DELETE
                                   FROM ALIQTEMP
                                  WHERE NRALIQTEMP = V_ALIQTEMP;
                                 --VERIFICANDO SE EXISTE A INCIDENCIA DE FECP PARA O PRODUTO


                                 IF V_IDUTMUNIORIG = 'D' THEN
                                    /* CONSIDERA O MUNICIPIO DE DESTINO */
                                    CONSULTA_ALIQUOTA(V_CDIMPOSTOFECP,
                                                      V_IDENTRSAIDOP,
                                                      V_CDEMPRESA,
                                                      C_ITEMPRODUTO.CDARVPROD,
                                                      V_CDINSCESTA,
                                                      V_CDPAISDEST,
                                                      V_SGESTADODEST,
                                                      V_CDPAISDEST,
                                                      V_SGESTADODEST,
                                                      V_CDMUNICIPIODEST,
                                                      (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                                                      V_DTINIVALID,
                                                      P_CDFILIAL,
                                                      P_NRLANCTONF,
                                                      V_CDGRUPOFISC,
                                                      V_CDTIPOOPER,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      C_ITEMPRODUTO.IDORIGEMPROD);
                                    ELSE
                                    /* CONSIDERA O MUNICIPIO DE ORIGEM */
                                    CONSULTA_ALIQUOTA(V_CDIMPOSTOFECP,
                                                      V_IDENTRSAIDOP,
                                                      V_CDEMPRESA,
                                                      C_ITEMPRODUTO.CDARVPROD,
                                                      V_CDINSCESTA,
                                                      V_CDPAISDEST,
                                                      V_SGESTADODEST,
                                                      V_CDPAISDEST,
                                                      V_SGESTADODEST,
                                                      V_CDMUNICIPIOEMIT,
                                                      (C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM),
                                                      V_DTINIVALID,
                                                      P_CDFILIAL,
                                                      P_NRLANCTONF,
                                                      V_CDGRUPOFISC,
                                                      V_CDTIPOOPER,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      NULL,
                                                      C_ITEMPRODUTO.IDORIGEMPROD);
                                 END IF;
                                 BEGIN
                                    SELECT NVL(MAX(VRALIQUTMP), 0)
                                      INTO V_ALIQFECPDEST
                                      FROM ALIQTEMP
                                     WHERE NRALIQTEMP = V_ALIQTEMP;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_ALIQFECPDEST := 0;
                                 END;
                              ELSE
                                 V_ALIQFECPDEST := 0;
                              END IF;
                           END IF;

			               IF V_VRPERREDDEST > 0 THEN
			                  V_VRBASECALCREME := ROUND(V_VRBASECALCIT, 2);
                              V_VRIMPOSTOORIG := V_VRIMPOSTOIT;
                              V_VRBASECALCDEST := ROUND(V_VRBASECALCIT - (V_VRBASECALCIT * (V_VRPERREDDEST / 100)), 2);
                              V_VRIMPOSTODEST := ROUND(V_VRBASECALCDEST * (V_ALIQICMSDEST / 100), 2);
							  IF V_VRIMPOSTOORIG > V_VRIMPOSTODEST THEN 
                                 V_DIFPARTILHAICMS := 0;
							  ELSE
							     V_DIFPARTILHAICMS := ROUND(V_VRIMPOSTODEST - V_VRIMPOSTOORIG, 2);
							  END IF;
                              V_IMPOQFECPDEST := ROUND(V_VRBASECALCDEST * (V_ALIQFECPDEST / 100), 2);
                              V_VRIMPOPARTDEST := ROUND(V_DIFPARTILHAICMS * (V_VRPERCPARTILHA / 100), 2);
                              V_VRIMPOPARTREME :=  ROUND((V_DIFPARTILHAICMS - V_VRIMPOPARTDEST), 2);
                           ELSIF V_VRALIQITEM = V_ALIQICMSDEST THEN
                              V_VRBASECALCREME := ROUND(V_VRBASECALCIT, 2);
                              V_VRIMPOSTOORIG := V_VRIMPOSTOIT;
                              V_VRBASECALCDEST := ROUND(V_VRBASECALCIT, 2);
                              V_VRIMPOSTODEST := V_VRIMPOSTOIT;
                              V_DIFPARTILHAICMS := ROUND(V_VRIMPOSTODEST - V_VRIMPOSTOORIG, 2);
                              V_IMPOQFECPDEST := ROUND(V_VRBASECALCDEST * (V_ALIQFECPDEST / 100), 2);
                              V_VRIMPOPARTDEST := ROUND(V_DIFPARTILHAICMS * (V_VRPERCPARTILHA / 100), 2);
                              V_VRIMPOPARTREME :=  ROUND((V_DIFPARTILHAICMS - V_VRIMPOPARTDEST), 2);
                           ELSE
                              IF (V_CDPAISDEST = '0055') AND (UPPER(V_SGESTADODEST) = 'MG') AND (V_IDCALCDIFALDENT = 'S') THEN
                                 -- EM MG O CALCULO E REALIZADO DE UMA FORMA DIFERENTE DE ACORDO COM A 
                                 -- ORIENTACAO TRIBUTARIA DOLT/SUTRI N 002/2016
                                 IF V_VRPERREDDEST > 0 THEN
                                    V_VRBASECALCREME := ROUND(V_VRBASECALCIT / (1 - ((V_ALIQICMSDEST + V_ALIQFECPDEST) / 100)), 2);
                                    V_VRIMPOSTOORIG := V_VRBASECALCREME * (V_VRALIQITEM / 100);
                                    V_VRBASECALCDEST := ROUND(C_ITEMPRODUTO.VRBRUTITEM - (C_ITEMPRODUTO.VRBRUTITEM * (V_VRPERREDDEST / 100)), 2);
                                    V_VRIMPOSTODEST := V_VRBASECALCDEST * ((V_ALIQICMSDEST + V_ALIQFECPDEST) / 100);
                                    V_DIFPARTILHAICMS := ROUND(V_VRIMPOSTODEST - V_VRIMPOSTOORIG, 2);
                                    V_IMPOQFECPDEST := ROUND(V_VRBASECALCDEST * (V_ALIQFECPDEST / 100), 2);
                                    V_VRIMPOPARTDEST := ROUND((V_DIFPARTILHAICMS - V_IMPOQFECPDEST) * (V_VRPERCPARTILHA / 100), 2);
                                    V_VRIMPOPARTREME :=  ROUND((V_DIFPARTILHAICMS - V_IMPOQFECPDEST - V_VRIMPOPARTDEST), 2);
                                 ELSE
                                    V_VRBASECALCREME := ROUND(V_VRBASECALCIT / (1 - ((V_ALIQICMSDEST + V_ALIQFECPDEST) / 100)), 2);
                                    V_VRIMPOSTOORIG := V_VRBASECALCREME * (V_VRALIQITEM / 100);
                                    V_VRBASECALCDEST := ROUND(C_ITEMPRODUTO.VRBRUTITEM, 2);
                                    V_VRIMPOSTODEST := V_VRBASECALCDEST * ((V_ALIQICMSDEST + V_ALIQFECPDEST) / 100);
                                    V_DIFPARTILHAICMS := ROUND(V_VRIMPOSTODEST - V_VRIMPOSTOORIG, 2);
                                    V_IMPOQFECPDEST := ROUND(V_VRBASECALCDEST * (V_ALIQFECPDEST / 100), 2);
                                    V_VRIMPOPARTDEST := ROUND((V_DIFPARTILHAICMS - V_IMPOQFECPDEST) * (V_VRPERCPARTILHA / 100), 2);
                                    V_VRIMPOPARTREME :=  ROUND((V_DIFPARTILHAICMS - V_IMPOQFECPDEST - V_VRIMPOPARTDEST), 2);
                                 END IF;
                              ELSE
                                 V_VRBASECALCREME := ROUND(V_VRBASECALCIT, 2);
                                 V_VRIMPOSTOORIG := V_VRIMPOSTOIT;
                                 V_VRBASECALCDEST := ROUND(V_VRBASECALCREME, 2);
                                 V_VRIMPOSTODEST := V_VRBASECALCDEST * (V_ALIQICMSDEST / 100);
                                 V_DIFPARTILHAICMS := ROUND(V_VRIMPOSTODEST - V_VRIMPOSTOORIG, 2);
                                 V_IMPOQFECPDEST := ROUND(V_VRBASECALCDEST * (V_ALIQFECPDEST / 100), 2);
                                 V_VRIMPOPARTDEST := ROUND(V_DIFPARTILHAICMS * (V_VRPERCPARTILHA / 100), 2);
                                 V_VRIMPOPARTREME :=  ROUND((V_DIFPARTILHAICMS - V_VRIMPOPARTDEST), 2);
                              END IF;
                           END IF;
                           UPDATE ITEMPROIMPOS
                              SET VRBASECALCDEST = CASE V_CDFISCALIT WHEN '1' THEN V_VRBASECALCDEST ELSE 0 END,
                                  VRALIQINTEDEST = V_ALIQICMSDEST,
                                  VRPERCPARTILHA = V_VRPERCPARTILHA,
                                  VRIMPOPARTDEST = CASE V_CDFISCALIT WHEN '1' THEN V_VRIMPOPARTDEST ELSE 0 END,
                                  VRIMPOPARTREME = CASE V_CDFISCALIT WHEN '1' THEN V_VRIMPOPARTREME ELSE 0 END,
                                  VRALIQINTEREST = V_VRALIQITEM,
                                  VRALIQFCP = V_ALIQFECPDEST,
                                  VRIMPOFCP = CASE V_CDFISCALIT WHEN '1' THEN V_IMPOQFECPDEST ELSE 0 END,
                                  VRBASECALCREME = CASE V_CDFISCALIT WHEN '1' THEN V_VRBASECALCREME ELSE 0 END
                            WHERE CDFILIAL = P_CDFILIAL
                              AND NRLANCTONF = P_NRLANCTONF
                              AND NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                              AND CDIMPOSTO = V_CDIMPOSTO
                              AND NRITPROIMPOS = '1';
                        END IF;
					/*Esse else foi colocado por causa dos clientes que podem possuir regime especial onde a aliquota interestadual sera maior que a interna.
					  Nesse caso o Difal nao gera valores, sendo necessario apenas informar as aliquotas e o percentual de partilha nas tags.*/	
                     ELSE
                        UPDATE ITEMPROIMPOS
                           SET VRBASECALCDEST = 0,
                               VRALIQINTEDEST = V_ALIQICMSDEST,
                               VRPERCPARTILHA = V_VRPERCPARTILHA,
                               VRIMPOPARTDEST = 0,
                               VRIMPOPARTREME = 0,
                               VRALIQINTEREST = V_VRALIQITEM,
                               VRALIQFCP = 0,
                               VRIMPOFCP = 0,
                               VRBASECALCREME = 0
                         WHERE CDFILIAL = P_CDFILIAL
                           AND NRLANCTONF = P_NRLANCTONF
                           AND NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                           AND CDIMPOSTO = V_CDIMPOSTO
                           AND NRITPROIMPOS = '1';   				 
					 END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
         --OBTENDO O MAIOR REGISTRO DA TABELA DE DADOS ADICIONAIS
         SELECT MAX(NRDADOADIC)
           INTO V_NRDADOADIC
           FROM DADOSADIC
          WHERE CDFILIAL = P_CDFILIAL
            AND NRLANCTONF = P_NRLANCTONF;
         IF V_NRDADOADIC IS NULL THEN
            V_NRDADOADIC := '001';
         ELSE
            V_NRDADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRDADOADIC) + 1)), 3, 0);
         END IF;
         FOR C_VRIMPOPARTDEST IN (SELECT VRALIQINTEDEST,
                                         VRALIQFCP,
                                         SUM(VRIMPOPARTDEST) AS VRIMPOPARTDEST,
                                         SUM(VRIMPOPARTREME) AS VRIMPOPARTREME,
                                         SUM(VRIMPOFCP) AS VRIMPOFCP
                                    FROM ITEMPROIMPOS IT, IMPOSTO I
                                   WHERE IT.CDIMPOSTO = I.CDIMPOSTO
                                     AND I.CDIMPOSTONFE = '00'
                                     AND CDFILIAL = P_CDFILIAL
                                     AND NRLANCTONF = P_NRLANCTONF
                                   GROUP BY VRALIQINTEDEST, 
                                         VRALIQFCP
                                  HAVING SUM(VRIMPOPARTDEST) > 0
                                   ORDER BY VRALIQINTEDEST)
         LOOP
            SELECT DECODE(SUBSTR(LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTDEST, 2), '9999999999999.99')), 1, 1), '.', '0'||LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTDEST, 2), '9999999999999.99')), LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTDEST, 2), '9999999999999.99'))),
                   DECODE(SUBSTR(LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQINTEDEST, 2), '999.99')), 1, 1), '.', '0'||LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQINTEDEST, 2), '999.99')), LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQINTEDEST, 2), '999.99'))),
                   DECODE(SUBSTR(LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTREME, 2), '9999999999999.99')), 1, 1), '.', '0'||LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTREME, 2), '9999999999999.99')), LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOPARTREME, 2), '9999999999999.99'))),
                   DECODE(SUBSTR(LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOFCP, 2), '9999999999999.99')), 1, 1), '.', '0'||LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOFCP, 2), '9999999999999.99')), LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRIMPOFCP, 2), '9999999999999.99'))),
                   DECODE(SUBSTR(LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQFCP, 2), '999.99')), 1, 1), '.', '0'||LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQFCP, 2), '999.99')), LTRIM(TO_CHAR(ROUND(C_VRIMPOPARTDEST.VRALIQFCP, 2), '999.99')))
              INTO V_VRIMPOPARTDESTINO,
                   V_VRALIQPARTDESTINO,
                   V_VRIMPOPARTORIGEM,
                   V_VRIMPOFCPDESTINO,
                   V_VRALIQFCPDESTINO
              FROM DUAL;

            V_MSGDADOSADIC := 'Valores totais do ICMS Interestadual: DIFAL da UF destino R$' || V_VRIMPOPARTDESTINO || ' (Aliquota interna do destinatario ' || V_VRALIQPARTDESTINO || '%)';
            IF C_VRIMPOPARTDEST.VRIMPOFCP > 0 THEN
               V_MSGDADOSADIC := V_MSGDADOSADIC || ' + ' || V_VRALIQFCPDESTINO || '% de FECP totalizando R$' || V_VRIMPOFCPDESTINO;             
            END IF;
            V_MSGDADOSADIC := V_MSGDADOSADIC || '; DIFAL da UF Origem R$' || V_VRIMPOPARTORIGEM ;
            V_MSGDADOSADIC := V_MSGDADOSADIC || '. Atendendo ao disposto na Emenda Constitucional n 87 de 2015';             

            INSERT INTO DADOSADIC
               (CDFILIAL, 
                NRLANCTONF, 
                NRDADOADIC, 
                CDMENSAGEM, 
                DSDADOADIC)
            VALUES
               (P_CDFILIAL, 
                P_NRLANCTONF, 
                V_NRDADOADIC, 
                '', 
                V_MSGDADOSADIC);
            V_NRDADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRDADOADIC) + 1)), 3, 0);
         END LOOP;
      END IF;
   END IF;
   DELETE
     FROM ALIQTEMP
    WHERE NRALIQTEMP = V_ALIQTEMP;
END;
/