-- ======================================================================================
--   TABLE: DADOSFISCREGRA
-- ======================================================================================
ALTER TABLE DADOSFISCREGRA ADD CDBENEFFISCAL VARCHAR2(10) 
/ 
-- ======================================================================================
--   TABLE: DADOSFISCNCM
-- ======================================================================================
ALTER TABLE DADOSFISCNCM ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: DADOSFISCPROD
-- ======================================================================================
ALTER TABLE DADOSFISCPROD ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: CODAJUSTEEFDICMS
-- ======================================================================================
ALTER TABLE CODAJUSTEEFDICMS DROP CONSTRAINT CKC_IDTPAJUSTE_CODAJUSTEEFDICM
/
ALTER TABLE CODAJUSTEEFDICMS ADD CONSTRAINT CKC_IDTPAJUSTE_CODAJUSTEEFDICM CHECK (IDTPAJUSTE IN ('A', 'B', 'D'))
/
-- ======================================================================================
--   TABLE: ALIQTEMP
-- ======================================================================================
ALTER TABLE ALIQTEMP ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: ALIQUOTA
-- ======================================================================================
ALTER TABLE ALIQUOTA ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: ITEMPROIMPOS
-- ======================================================================================
ALTER TABLE ITEMPROIMPOS ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: ITEMPROIMPOSORIG
-- ======================================================================================
ALTER TABLE ITEMPROIMPOSORIG ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
--   TABLE: TRABITPROIMPOS
-- ======================================================================================
ALTER TABLE TRABITPROIMPOS ADD CDBENEFFISCAL VARCHAR2(10)
/
-- ======================================================================================
-- Table: DADOSFISCREGRA
-- ======================================================================================
ALTER TABLE DADOSFISCREGRA ADD IDIMPODESONERA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE DADOSFISCREGRA ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
-- ======================================================================================
-- Table: DADOSFISCNCM
-- ======================================================================================
ALTER TABLE DADOSFISCNCM ADD IDIMPODESONERA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE DADOSFISCNCM ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
-- ======================================================================================
-- Table: DADOSFISCPROD
-- ======================================================================================
ALTER TABLE DADOSFISCPROD ADD IDIMPODESONERA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE DADOSFISCPROD ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
-- ======================================================================================
-- Table: ALIQTEMP 
-- ======================================================================================
ALTER TABLE ALIQTEMP ADD IDIMPODESONERA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE ALIQTEMP ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
-- ======================================================================================
--   TABLE: ALIQUOTA
-- ======================================================================================
ALTER TABLE ALIQUOTA ADD IDIMPODESONERA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE ALIQUOTA ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
-- ======================================================================================
--   TABLE: ITEMPROIMPOS
-- ======================================================================================
ALTER TABLE ITEMPROIMPOS ADD IDDESONERAREGRA VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE ITEMPROIMPOS ADD IDCONSDESONVRNF VARCHAR2(1) DEFAULT 'N' NOT NULL
/
ALTER TABLE ITEMPROIMPOS ADD VRIMPOSTODESON FLOAT
/
-- ============================================================
-- TABLE: TRABITPROIMPOS
-- ============================================================
ALTER TABLE TRABITPROIMPOS ADD VRIMPOSTODESON FLOAT
/
/*
 Tecnisa - Tecnologia em Informática
 Nome: CONSULTA_REGRA_FISCAL
  Descrição:
  Função para detectar a regra fiscal a ser considerada e, posteriormente, preencher as tabelas temporárias de alíquota,
  incidência, cfop e cst conforme a regra encontrada.
 Criação:
 23/05/2012 - Marcelo Alexsandro Souza Silva
*/
DROP FUNCTION CONSULTA_REGRA_FISCAL
/
DROP TYPE REGRAFISCAL_TABLE
/
DROP TYPE REGRAFISCAL_TYPE
/
CREATE TYPE REGRAFISCAL_TYPE AS
OBJECT (CDREGRAFISC      VARCHAR2(10),
        NMREGRAFISC      VARCHAR2(50),
        NRSEQDADOSFISC   VARCHAR2(10),
        CDCLASFISC       VARCHAR2(10),
        CDPRODUTO        VARCHAR2(10),
        DSMENSREGRAFISC  VARCHAR2(150),
        CDIMPOSTO        VARCHAR2(2),
        CDFISCAL         VARCHAR2(1),
        CDSITUTRIB       VARCHAR2(2),
        VRALIQUOTA       FLOAT(126),
        IDMODBCNFE       VARCHAR2(1),
        IDMODBCSTNFE     VARCHAR2(1),
        IDMOTIDESSTNFE   VARCHAR2(2),
        CDTPCRPICOSTNFE  VARCHAR2(3),
        CDNATUBCPCSTNFE  VARCHAR2(2),
        VRINIFAIXA       FLOAT(126),
        VRFIMFAIXA       FLOAT(126),
        VRPARDEDUZ       FLOAT(126),
        VR1PERREDBC      FLOAT(126),
        VRPERREDBC       FLOAT(126),
        VRPBCSUBTRIB     FLOAT(126),
        IDTRATIMPST      VARCHAR2(1),
        IDPMCBASECA      VARCHAR2(1),
        IDCSTINTEREST    VARCHAR2(1),
        IDCSTINTERNA     VARCHAR2(1),
        CDFISCOPER       VARCHAR2(10),
        IDCFOPINTEREST   VARCHAR2(1),
        IDDIFEALIQ       VARCHAR2(1),
        IDDIFALIQCUSPR   VARCHAR2(1),
        IDTIPODESTFISC   VARCHAR2(1),
        CDDETALHEFISC    VARCHAR2(5),
        IDTIPOREGISTRO   VARCHAR2(4),
        IDMENSAGEM       VARCHAR2(1),
        CDENQLEGALIPI    VARCHAR2(3),
        CDCEST           VARCHAR2(9),
        VRADICALIQFECP   FLOAT(126),
        CDBENEFFISCAL    VARCHAR2(10),
        IDCONSMVAPMC     VARCHAR2(1),
        IDCONSCOMPBCPMC  VARCHAR2(1),
        IDCONSDIFALIQ    VARCHAR2(1),
        IDIMPODESONERA   VARCHAR2(1),
        IDCONSDESONVRNF  VARCHAR2(1));
/
CREATE TYPE REGRAFISCAL_TABLE AS
TABLE OF REGRAFISCAL_TYPE
/
CREATE OR REPLACE FUNCTION CONSULTA_REGRA_FISCAL
(P_CDIMPOSTO   IN IMPOSTO.CDIMPOSTO%TYPE,
 P_EMPRESA     IN INCIDENCIA.CDEMPRESA%TYPE,
 P_CDGRUPOFISC IN INCIDENCIA.CDGRUPOFISC%TYPE,
 P_ENTRSAIDIN  IN INCIDENCIA.IDENTRSAIDIN%TYPE,
 P_TIPOOPER    IN INCIDENCIA.CDTIPOOPER%TYPE,
 P_INSCESTA    IN INCIDENCIA.CDINSCESTA%TYPE,
 P_CDARVPROD   IN PRODUTO.CDARVPROD%TYPE,
 P_DTENTRSAID  IN NOTAFISCAL.DTENTRSAID%TYPE,
 P_PAISORIG    IN PAIS.CDPAIS%TYPE,
 P_ESTAORIG    IN ESTADO.SGESTADO%TYPE,
 P_MUNIORIG    IN MUNICIPIO.CDMUNICIPIO%TYPE,
 P_PAISDEST    IN PAIS.CDPAIS%TYPE,
 P_ESTADEST    IN ESTADO.SGESTADO%TYPE,
 P_MUNIDEST    IN MUNICIPIO.CDMUNICIPIO%TYPE,
 P_BASECALC    IN ALIQUOTA.VRFIMFAIXA%TYPE,
 P_CFOP        IN INCIDENCIA.IDENTRSAIDIN%TYPE,
 P_IDORIGEMPROD IN VARCHAR2 DEFAULT 'N') RETURN REGRAFISCAL_TABLE PIPELINED
IS
V_CDREGRAFISC         REGRAFISCAL.CDREGRAFISC%TYPE;
V_NMREGRAFISC         REGRAFISCAL.NMREGRAFISC%TYPE;
V_DSMENSREGRAFISC     REGRAFISCAL.DSMENSREGRAFISC%TYPE;
V_CDFISCOPER          VARCHAR2(10);
V_IDCFOPINTEREST      VARCHAR2(1);
V_IDDIFEALIQ          VARCHAR2(1);
V_IDDIFALIQCUSPR      VARCHAR2(1);
V_UTFAIXVLR           IMPOSTO.IDUTFAIXVLR%TYPE;
V_UTMUNIORIG          IMPOSTO.IDUTMUNIORIG%TYPE;
V_UTUFORIG            IMPOSTO.IDUTUFORIG%TYPE;
V_UTUFDEST            IMPOSTO.IDUTUFDEST%TYPE;
V_CDFISCAL            VARCHAR2(1);
V_CDSITUTRIB          VARCHAR2(2);
V_VRALIQUOTA          FLOAT(126);
V_IDMODBCNFE          VARCHAR2(1);
V_IDMODBCSTNFE        VARCHAR2(1);
V_IDMOTIDESSTNFE      VARCHAR2(2);
V_CDTPCRPICOSTNFE     VARCHAR2(3);
V_CDNATUBCPCSTNFE     VARCHAR2(2);
V_VRINIFAIXA          FLOAT(126);
V_VRFIMFAIXA          FLOAT(126);
V_VRPARDEDUZ          FLOAT(126);
V_VR1PERREDBC         FLOAT(126);
V_VRPERREDBC          FLOAT(126);
V_VRPBCSUBTRIB        FLOAT(126);
V_IDTRATIMPST         VARCHAR2(1);
V_IDPMCBASECA         VARCHAR2(1);
V_IDCSTINTEREST       VARCHAR2(1);
V_IDCSTINTERNA        VARCHAR2(1);
V_IDTIPODESTFISC      VARCHAR2(1);
V_CDDETALHEFISC       VARCHAR2(5);
V_STATUSESTADUAL      VARCHAR2(1);
V_STATUSINTERNACIONAL VARCHAR2(1);
V_IDTIPOREGISTRO      VARCHAR2(4);
V_NRSEQDADOSFISC      VARCHAR2(10);
V_IDMENSAGEM          VARCHAR2(01);
V_CDCLASFISC          VARCHAR2(10);
V_CDPRODUTO           VARCHAR2(10);
V_VRQTDEMB            FLOAT(126);
V_SGUNIDEMB           VARCHAR2(5);
V_UTILRANGE           VARCHAR2(1);
V_IDORIGEMPROD        VARCHAR2(1);
V_CDIMPOSTONFE        VARCHAR2(2);
V_CDENQLEGALIPI       VARCHAR2(3);
V_CDCEST              VARCHAR2(9);
V_IDUTORIGPROD        VARCHAR2(1);
V_VRADICALIQFECP      FLOAT(126);
V_CDBENEFFISCAL       VARCHAR2(10);
V_IDCONSMVAPMC        VARCHAR2(01);
V_IDCONSCOMPBCPMC     VARCHAR2(01);
V_IDCONSDIFALIQ       VARCHAR2(1);
V_IDIMPODESONERA      VARCHAR2(1);
V_IDCONSDESONVRNF     VARCHAR2(1);
OUT_RECORD REGRAFISCAL_TYPE := REGRAFISCAL_TYPE (NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL, NULL, NULL,
                                                 NULL, NULL);
BEGIN
   FOR C_REGRAFISCAL IN
      (SELECT V.CDIMPOSTO, MIN(V.NRORDPRIORIDADE||'_'||R.CDREGRAFISC) ORDEM
         FROM REGRAFISCAL R,
          (
           SELECT MAX(TO_CHAR(REGAUX.DTVALREGRAFISC, 'YYYYMMDD')||'_'||REGAUX.CDREGRAFISC) NUMERO, NRORDPRIORIDADE, IMPREGRAFISCAL.CDIMPOSTO
             FROM VINCULOFISREGRA, IMPREGRAFISCAL, REGRAFISCAL REGAUX
            WHERE VINCULOFISREGRA.CDEMPRESA      = P_EMPRESA
              AND VINCULOFISREGRA.CDREGRAFISC    = REGAUX.CDREGRAFISC
              AND REGAUX.IDATIVREGRAFISC = 'S'
              AND ((REGAUX.DTVALREGRAFISC <= TRUNC(P_DTENTRSAID)) OR (REGAUX.DTVALREGRAFISC IS NULL) OR (P_DTENTRSAID IS NULL))
              AND (VINCULOFISREGRA.IDENTRSAIDOP  = P_ENTRSAIDIN   OR IDENTRSAIDOP IS NULL)
              AND (VINCULOFISREGRA.CDTIPOOPER    = P_TIPOOPER     OR CDTIPOOPER IS NULL)
              AND (VINCULOFISREGRA.CDINSCESTA    = P_INSCESTA     OR CDINSCESTA IS NULL)
              AND (IMPREGRAFISCAL.CDIMPOSTO      = P_CDIMPOSTO    OR P_CDIMPOSTO IS NULL)
              AND (IMPREGRAFISCAL.CDREGRAFISC = REGAUX.CDREGRAFISC)
              AND (IMPREGRAFISCAL.IDIMPOBRIGREGRA = 'S')
              AND ((VINCULOFISREGRA.DTVALVINCFISC >= TRUNC(P_DTENTRSAID)) OR (VINCULOFISREGRA.DTVALVINCFISC IS NULL) OR (P_DTENTRSAID IS NULL))
              AND ((P_CDGRUPOFISC IS NULL     AND NOT EXISTS (SELECT 1 FROM GRUPOFISCREGRA  WHERE GRUPOFISCREGRA.CDREGRAFISC = REGAUX.CDREGRAFISC)) OR
                   (P_CDGRUPOFISC IS NOT NULL AND     EXISTS (SELECT 1 FROM GRUPOFISCREGRA WHERE GRUPOFISCREGRA.CDREGRAFISC = REGAUX.CDREGRAFISC AND GRUPOFISCREGRA.CDGRUPOFISC = P_CDGRUPOFISC)))
           GROUP BY NRORDPRIORIDADE, IMPREGRAFISCAL.CDIMPOSTO) V
       WHERE R.CDREGRAFISC = SUBSTR(V.NUMERO, (INSTR(V.NUMERO, '_')) + 1, 10)
       GROUP BY V.CDIMPOSTO
       ORDER BY V.CDIMPOSTO
       )
   LOOP
      BEGIN
         SELECT IDUTFAIXVLR, IDUTMUNIORIG, IDUTUFORIG, IDUTUFDEST, CDIMPOSTONFE
           INTO V_UTFAIXVLR, V_UTMUNIORIG, V_UTUFORIG, V_UTUFDEST, V_CDIMPOSTONFE
           FROM IMPOSTO
          WHERE IMPOSTO.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_UTFAIXVLR    := 'N';
            V_UTMUNIORIG   := 'N';
            V_UTUFORIG     := 'N';
            V_UTUFDEST     := 'N';
            V_CDIMPOSTONFE := NULL;
         END;
      END;
      V_CDFISCOPER     := NULL;
      V_IDCFOPINTEREST := NULL;
      V_IDDIFEALIQ     := NULL;
      V_IDDIFALIQCUSPR := NULL;
      V_IDTIPOREGISTRO := NULL;
      V_IDMENSAGEM     := NULL;
      V_CDCLASFISC     := NULL;
      V_CDPRODUTO      := NULL;
      V_IDORIGEMPROD   := NULL;
      IF (V_CDIMPOSTONFE = '00') THEN
         BEGIN
            SELECT NVL(IDUTORIGPROD, 'N')
              INTO V_IDUTORIGPROD
              FROM PARAMGERAL
             WHERE CDPARGERAL = '0001';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDUTORIGPROD := 'N';
         END;
         IF V_IDUTORIGPROD = 'S' THEN
            V_IDORIGEMPROD := P_IDORIGEMPROD;
         ELSE
            V_IDORIGEMPROD := 'N';
         END IF;
      ELSE
         V_IDORIGEMPROD := 'N';
      END IF;
      V_CDREGRAFISC := SUBSTR(C_REGRAFISCAL.ORDEM, (INSTR(C_REGRAFISCAL.ORDEM, '_')) + 1, 10);
      BEGIN
         IF (P_PAISORIG||P_ESTAORIG) <> (P_PAISDEST||P_ESTADEST) THEN
            SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('PROD')), MAX(CFOPREGRAFISCAL.CDPRODUTO)
              INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO, V_CDPRODUTO
              FROM CFOPREGRAFISCAL, PRODUTO PRODUTOREGRA
             WHERE CFOPREGRAFISCAL.CDREGRAFISC = V_CDREGRAFISC
               AND PRODUTOREGRA.CDPRODUTO = CFOPREGRAFISCAL.CDPRODUTO
               AND ((IDCFOPINTEREST = 'I') OR (IDCFOPINTEREST = 'T'))
               AND PRODUTOREGRA.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                               FROM CFOPREGRAFISCAL A, PRODUTO B
                                              WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                AND A.CDPRODUTO = B.CDPRODUTO
                                                AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1);
            BEGIN
               SELECT DECODE(COUNT(MSGCFOPREGFISC.CDREGRAFISC), 0, 'N', 'S')
                 INTO V_IDMENSAGEM
                 FROM MSGCFOPREGFISC
                WHERE CDREGRAFISC = V_CDREGRAFISC
                  AND IDCFOPINTEREST = V_IDCFOPINTEREST
                  AND CDPRODUTO = V_CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_IDMENSAGEM      := 'N';
               END;
            END;
            IF V_CDFISCOPER IS NULL THEN
               SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('NCM')), MAX(CDCLASFISC)
                 INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO, V_CDCLASFISC
                 FROM CFOPNCMREGRAFIS
                WHERE CFOPNCMREGRAFIS.CDREGRAFISC = V_CDREGRAFISC
                  AND ((IDCFOPINTEREST = 'I') OR (IDCFOPINTEREST = 'T'))
                  AND CFOPNCMREGRAFIS.CDCLASFISC = (SELECT MAX(A.CDCLASFISC)
                                                      FROM CFOPNCMREGRAFIS A, PRODUTO B
                                                     WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                       AND B.CDARVPROD = P_CDARVPROD
                                                       AND INSTR(B.CDCLASFISC, A.CDCLASFISC)=1);
               BEGIN
                  SELECT DECODE(COUNT(MSGCFOPNCM.CDREGRAFISC), 0, 'N', 'S')
                    INTO V_IDMENSAGEM
                    FROM MSGCFOPNCM
                   WHERE CDREGRAFISC = V_CDREGRAFISC
                     AND CDCLASFISC = V_CDCLASFISC
                     AND IDCFOPINTEREST = V_IDCFOPINTEREST;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_IDMENSAGEM      := 'N';
                  END;
               END;
               IF V_CDFISCOPER IS NULL THEN
                  SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('PAD'))
                    INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO
                    FROM CFOPADRAOREGFIS
                   WHERE CFOPADRAOREGFIS.CDREGRAFISC = V_CDREGRAFISC
                     AND ((IDCFOPINTEREST = 'I') OR (IDCFOPINTEREST = 'T'));
                  BEGIN
                     SELECT DECODE(COUNT(MSGCFOPADRAO.CDREGRAFISC), 0, 'N', 'S')
                       INTO V_IDMENSAGEM
                       FROM MSGCFOPADRAO
                      WHERE CDREGRAFISC = V_CDREGRAFISC
                        AND IDCFOPINTEREST = V_IDCFOPINTEREST;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN BEGIN
                        V_IDMENSAGEM      := 'N';
                     END;
                  END;
               END IF;
            END IF;
         ELSE
            SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('PROD')), MAX(CFOPREGRAFISCAL.CDPRODUTO)
              INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO, V_CDPRODUTO
              FROM CFOPREGRAFISCAL, PRODUTO PRODUTOREGRA
             WHERE CFOPREGRAFISCAL.CDREGRAFISC = V_CDREGRAFISC
               AND PRODUTOREGRA.CDPRODUTO = CFOPREGRAFISCAL.CDPRODUTO
               AND ((IDCFOPINTEREST = 'E') OR (IDCFOPINTEREST = 'T'))
               AND PRODUTOREGRA.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                               FROM CFOPREGRAFISCAL A, PRODUTO B
                                              WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                AND A.CDPRODUTO = B.CDPRODUTO
                                                AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1);
            BEGIN
               SELECT DECODE(COUNT(MSGCFOPREGFISC.CDREGRAFISC), 0, 'N', 'S')
                 INTO V_IDMENSAGEM
                 FROM MSGCFOPREGFISC
                WHERE CDREGRAFISC = V_CDREGRAFISC
                  AND IDCFOPINTEREST = V_IDCFOPINTEREST
                  AND CDPRODUTO = V_CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_IDMENSAGEM      := 'N';
               END;
            END;
            IF V_CDFISCOPER IS NULL THEN
               SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('NCM')), MAX(CDCLASFISC)
                 INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO, V_CDCLASFISC
                 FROM CFOPNCMREGRAFIS
                WHERE CFOPNCMREGRAFIS.CDREGRAFISC = V_CDREGRAFISC
                  AND ((IDCFOPINTEREST = 'E') OR (IDCFOPINTEREST = 'T'))
                  AND CFOPNCMREGRAFIS.CDCLASFISC = (SELECT MAX(A.CDCLASFISC)
                                                      FROM CFOPNCMREGRAFIS A, PRODUTO B
                                                     WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                       AND B.CDARVPROD = P_CDARVPROD
                                                       AND INSTR(B.CDCLASFISC, A.CDCLASFISC)=1);
               BEGIN
                  SELECT DECODE(COUNT(MSGCFOPNCM.CDREGRAFISC), 0, 'N', 'S')
                    INTO V_IDMENSAGEM
                    FROM MSGCFOPNCM
                   WHERE CDREGRAFISC = V_CDREGRAFISC
                     AND CDCLASFISC = V_CDCLASFISC
                     AND IDCFOPINTEREST = V_IDCFOPINTEREST;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_IDMENSAGEM      := 'N';
                  END;
               END;
               IF V_CDFISCOPER IS NULL THEN
                  SELECT MAX(CDFISCOPER), MAX(IDCFOPINTEREST), MAX(IDDIFEALIQ), MAX(IDDIFALIQCUSPR), TO_CHAR(MAX('PAD'))
                    INTO V_CDFISCOPER, V_IDCFOPINTEREST, V_IDDIFEALIQ, V_IDDIFALIQCUSPR, V_IDTIPOREGISTRO
                    FROM CFOPADRAOREGFIS
                   WHERE CFOPADRAOREGFIS.CDREGRAFISC = V_CDREGRAFISC
                     AND ((IDCFOPINTEREST = 'E') OR (IDCFOPINTEREST = 'T'));
                  BEGIN
                     SELECT DECODE(COUNT(MSGCFOPADRAO.CDREGRAFISC), 0, 'N', 'S')
                       INTO V_IDMENSAGEM
                       FROM MSGCFOPADRAO
                      WHERE CDREGRAFISC = V_CDREGRAFISC
                        AND IDCFOPINTEREST = V_IDCFOPINTEREST;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN BEGIN
                        V_IDMENSAGEM      := 'N';
                     END;
                  END;
               END IF;
            END IF;
         END IF;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_CDFISCOPER     := NULL;
            V_IDCFOPINTEREST := NULL;
            V_IDDIFEALIQ     := NULL;
            V_IDDIFALIQCUSPR := NULL;
            V_IDTIPOREGISTRO := NULL;
            V_IDMENSAGEM     := NULL;
            V_CDCLASFISC     := NULL;
            V_CDPRODUTO      := NULL;
         END;
      END;
      V_CDFISCAL        := NULL;
      V_CDSITUTRIB      := NULL;
      V_VRALIQUOTA      := NULL;
      V_IDMODBCNFE      := NULL;
      V_IDMODBCSTNFE    := NULL;
      V_IDMOTIDESSTNFE  := NULL;
      V_CDTPCRPICOSTNFE := NULL;
      V_CDNATUBCPCSTNFE := NULL;
      V_VRINIFAIXA      := NULL;
      V_VRFIMFAIXA      := NULL;
      V_VRPARDEDUZ      := NULL;
      V_VR1PERREDBC     := NULL;
      V_VRPERREDBC      := NULL;
      V_VRPBCSUBTRIB    := NULL;
      V_IDTRATIMPST     := NULL;
      V_IDPMCBASECA     := NULL;
      V_IDCSTINTEREST   := NULL;
      V_IDCSTINTERNA    := NULL;
      V_IDTIPODESTFISC  := NULL;
      V_CDDETALHEFISC   := NULL;
      V_CDENQLEGALIPI   := NULL;
      V_CDCEST          := NULL;
      V_VRADICALIQFECP  := NULL;
      V_CDBENEFFISCAL   := NULL;
      V_IDCONSMVAPMC    := NULL;
      V_IDCONSCOMPBCPMC := NULL;
      V_IDCONSDIFALIQ   := NULL;
      V_IDIMPODESONERA  := NULL;
      V_IDCONSDESONVRNF := NULL;
      IF P_CFOP = 'N' THEN
         IF (P_PAISORIG||P_ESTAORIG) <> (P_PAISDEST||P_ESTADEST) THEN
            V_STATUSESTADUAL := 'I';
         ELSE
            V_STATUSESTADUAL := 'E';
         END IF;
         IF (P_PAISORIG) <> (P_PAISDEST) THEN
            V_STATUSINTERNACIONAL := 'I';
         ELSE
            V_STATUSINTERNACIONAL := 'N';
         END IF;
         BEGIN
            SELECT
               CDFISCAL,
               CDSITUTRIB,
               VRALIQUOTA,
               IDMODBCNFE,
               IDMODBCSTNFE,
               IDMOTIDESSTNFE,
               CDTPCRPICOSTNFE,
               CDNATUBCPCSTNFE,
               VRINIFAIXA,
               VRFIMFAIXA,
               VRPARDEDUZ,
               VR1PERREDBC,
               VRPERREDBC,
               VRPBCSUBTRIB,
               IDTRATIMPST,
               IDPMCBASECA,
               IDCSTINTEREST,
               IDCSTINTERNA,
               IDTIPODESTFISC,
               CDDETALHEFISC,
               TO_CHAR('PROD'),
               NRSEQDADOSFISC,
               '',
               DADOSFISCPROD.CDPRODUTO,
               CDFISCOPER,
               IDDIFEALIQ,
               IDDIFALIQCUSPR,
               CDENQLEGALIPI,
               DADOSFISCPROD.CDCEST,
               DADOSFISCPROD.VRADICALIQFECP,
               DADOSFISCPROD.CDBENEFFISCAL,
               DADOSFISCPROD.IDCONSMVAPMC,
               DADOSFISCPROD.IDCONSCOMPBCPMC,
               DADOSFISCPROD.IDCONSDIFALIQ,
               DADOSFISCPROD.IDIMPODESONERA,
               DADOSFISCPROD.IDCONSDESONVRNF
            INTO
               V_CDFISCAL,
               V_CDSITUTRIB,
               V_VRALIQUOTA,
               V_IDMODBCNFE,
               V_IDMODBCSTNFE,
               V_IDMOTIDESSTNFE,
               V_CDTPCRPICOSTNFE,
               V_CDNATUBCPCSTNFE,
               V_VRINIFAIXA,
               V_VRFIMFAIXA,
               V_VRPARDEDUZ,
               V_VR1PERREDBC,
               V_VRPERREDBC,
               V_VRPBCSUBTRIB,
               V_IDTRATIMPST,
               V_IDPMCBASECA,
               V_IDCSTINTEREST,
               V_IDCSTINTERNA,
               V_IDTIPODESTFISC,
               V_CDDETALHEFISC,
               V_IDTIPOREGISTRO,
               V_NRSEQDADOSFISC,
               V_CDCLASFISC,
               V_CDPRODUTO,
               V_CDFISCOPER,
               V_IDDIFEALIQ,
               V_IDDIFALIQCUSPR,
               V_CDENQLEGALIPI,
               V_CDCEST,
               V_VRADICALIQFECP,
               V_CDBENEFFISCAL,
               V_IDCONSMVAPMC,
               V_IDCONSCOMPBCPMC,
               V_IDCONSDIFALIQ,
               V_IDIMPODESONERA,
               V_IDCONSDESONVRNF
              FROM DADOSFISCPROD, PRODUTO PRODUTOREGRA
             WHERE DADOSFISCPROD.CDREGRAFISC = V_CDREGRAFISC
               AND DADOSFISCPROD.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
               AND PRODUTOREGRA.CDPRODUTO = DADOSFISCPROD.CDPRODUTO
               AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
               AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
               AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
               AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
               AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                    ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                    (V_UTMUNIORIG = 'N'))
               AND ((VRINIFAIXA  <= P_BASECALC) AND (VRFIMFAIXA  >= P_BASECALC) OR  V_UTFAIXVLR = 'N')
               AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N'))
               AND PRODUTOREGRA.CDARVPROD = (SELECT MAX(B.CDARVPROD)
                                               FROM DADOSFISCPROD A, PRODUTO B
                                              WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                AND A.CDPRODUTO = B.CDPRODUTO
                                                AND A.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                                                AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1
                                                AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                                                AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                                                AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                                                AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                                                AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                                                     ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                                                     (V_UTMUNIORIG = 'N'))
                                                AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N')));
         EXCEPTION
            WHEN TOO_MANY_ROWS THEN BEGIN
               RAISE_APPLICATION_ERROR(-20000, 'Operação Bloqueada! Existe cadastro duplicado na regra fiscal ' || V_CDREGRAFISC || ' (imposto ' || C_REGRAFISCAL.CDIMPOSTO || ', produto ' || P_CDARVPROD || ', página "Por Produto").', TRUE);
            END;
            WHEN NO_DATA_FOUND THEN BEGIN
               V_CDFISCAL        := NULL;
               V_CDSITUTRIB      := NULL;
               V_VRALIQUOTA      := NULL;
               V_IDMODBCNFE      := NULL;
               V_IDMODBCSTNFE    := NULL;
               V_IDMOTIDESSTNFE  := NULL;
               V_CDTPCRPICOSTNFE := NULL;
               V_CDNATUBCPCSTNFE := NULL;
               V_VRINIFAIXA      := NULL;
               V_VRFIMFAIXA      := NULL;
               V_VRPARDEDUZ      := NULL;
               V_VR1PERREDBC     := NULL;
               V_VRPERREDBC      := NULL;
               V_VRPBCSUBTRIB    := NULL;
               V_IDTRATIMPST     := NULL;
               V_IDPMCBASECA     := NULL;
               V_IDCSTINTEREST   := NULL;
               V_IDCSTINTERNA    := NULL;
               V_IDTIPODESTFISC  := NULL;
               V_CDDETALHEFISC   := NULL;
               V_IDTIPOREGISTRO  := NULL;
               V_NRSEQDADOSFISC  := NULL;
               V_CDCLASFISC      := NULL;
               V_CDPRODUTO       := NULL;
               V_CDENQLEGALIPI   := NULL;
               V_CDCEST          := NULL;
               V_VRADICALIQFECP  := NULL;
               V_CDBENEFFISCAL   := NULL;
               V_IDCONSMVAPMC    := NULL; 
               V_IDCONSCOMPBCPMC := NULL;
               V_IDCONSDIFALIQ   := NULL;
               V_IDIMPODESONERA  := NULL;
               V_IDCONSDESONVRNF := NULL;
            END;
         END;
         BEGIN
            SELECT DECODE(COUNT(MSGFISCPROD.CDREGRAFISC), 0, 'N', 'S')
              INTO V_IDMENSAGEM
              FROM MSGFISCPROD
             WHERE CDREGRAFISC = V_CDREGRAFISC
               AND CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
               AND NRSEQDADOSFISC = V_NRSEQDADOSFISC
               AND CDPRODUTO = V_CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
               V_IDMENSAGEM      := 'N';
            END;
         END;
         IF V_CDFISCAL IS NULL THEN
            SELECT NVL(MAX(VRQTDEMB), NULL) VRQTDEMB,
                   NVL(MAX(SGUNIDEMB), NULL) SGUNIDEMB
              INTO V_VRQTDEMB, V_SGUNIDEMB
              FROM PRODUTO
             WHERE CDARVPROD = P_CDARVPROD;
            BEGIN
               SELECT
                  CDFISCAL,
                  CDSITUTRIB,
                  VRALIQUOTA,
                  IDMODBCNFE,
                  IDMODBCSTNFE,
                  IDMOTIDESSTNFE,
                  CDTPCRPICOSTNFE,
                  CDNATUBCPCSTNFE,
                  VRINIFAIXA,
                  VRFIMFAIXA,
                  VRPARDEDUZ,
                  VR1PERREDBC,
                  VRPERREDBC,
                  VRPBCSUBTRIB,
                  IDTRATIMPST,
                  IDPMCBASECA,
                  IDCSTINTEREST,
                  IDCSTINTERNA,
                  IDTIPODESTFISC,
                  CDDETALHEFISC,
                  TO_CHAR('NCM'),
                  NRSEQDADOSFISC,
                  CDCLASFISC,
                  '',
                  CDFISCOPER,
                  IDDIFEALIQ,
                  IDDIFALIQCUSPR,
                  CDENQLEGALIPI,
                  CDCEST,
                  VRADICALIQFECP,
                  CDBENEFFISCAL,
                  IDCONSMVAPMC,
                  IDCONSCOMPBCPMC,
                  IDCONSDIFALIQ,
                  IDIMPODESONERA,
                  IDCONSDESONVRNF
               INTO
                  V_CDFISCAL,
                  V_CDSITUTRIB,
                  V_VRALIQUOTA,
                  V_IDMODBCNFE,
                  V_IDMODBCSTNFE,
                  V_IDMOTIDESSTNFE,
                  V_CDTPCRPICOSTNFE,
                  V_CDNATUBCPCSTNFE,
                  V_VRINIFAIXA,
                  V_VRFIMFAIXA,
                  V_VRPARDEDUZ,
                  V_VR1PERREDBC,
                  V_VRPERREDBC,
                  V_VRPBCSUBTRIB,
                  V_IDTRATIMPST,
                  V_IDPMCBASECA,
                  V_IDCSTINTEREST,
                  V_IDCSTINTERNA,
                  V_IDTIPODESTFISC,
                  V_CDDETALHEFISC,
                  V_IDTIPOREGISTRO,
                  V_NRSEQDADOSFISC,
                  V_CDCLASFISC,
                  V_CDPRODUTO,
                  V_CDFISCOPER,
                  V_IDDIFEALIQ,
                  V_IDDIFALIQCUSPR,
                  V_CDENQLEGALIPI,
                  V_CDCEST,
                  V_VRADICALIQFECP,
                  V_CDBENEFFISCAL,
                  V_IDCONSMVAPMC,
                  V_IDCONSCOMPBCPMC,
                  V_IDCONSDIFALIQ,
                  V_IDIMPODESONERA,
                  V_IDCONSDESONVRNF
                 FROM DADOSFISCNCM
                WHERE DADOSFISCNCM.CDREGRAFISC = V_CDREGRAFISC
                  AND DADOSFISCNCM.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                  AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                  AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                  AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                  AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                  AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                       ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                       (V_UTMUNIORIG = 'N'))
                  AND ((VRINIFAIXA  <= P_BASECALC) AND (VRFIMFAIXA  >= P_BASECALC) OR  V_UTFAIXVLR = 'N')
                  AND ((VRRANGINI   <= V_VRQTDEMB) AND (VRRANGFIM   >= V_VRQTDEMB) AND  SGUNIDEMB = V_SGUNIDEMB)
                  AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N'))
                  AND DADOSFISCNCM.CDCLASFISC = (SELECT MAX(A.CDCLASFISC)
                                                   FROM DADOSFISCNCM A, PRODUTO B
                                                  WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                    AND B.CDARVPROD = P_CDARVPROD
                                                    AND A.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                                                    AND INSTR(B.CDCLASFISC, A.CDCLASFISC)=1
                                                    AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                                                    AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                                                    AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                                                    AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                                                    AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                                                         ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                                                         (V_UTMUNIORIG = 'N'))
                                                    AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N')));
            EXCEPTION
               WHEN TOO_MANY_ROWS THEN BEGIN
                  RAISE_APPLICATION_ERROR(-20000, 'Operação Bloqueada! Existe cadastro duplicado na regra fiscal ' || V_CDREGRAFISC || ' (imposto ' || C_REGRAFISCAL.CDIMPOSTO || ', produto ' || P_CDARVPROD || ', página "Por NCM").', TRUE);
               END;
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_CDFISCAL        := NULL;
                  V_CDSITUTRIB      := NULL;
                  V_VRALIQUOTA      := NULL;
                  V_IDMODBCNFE      := NULL;
                  V_IDMODBCSTNFE    := NULL;
                  V_IDMOTIDESSTNFE  := NULL;
                  V_CDTPCRPICOSTNFE := NULL;
                  V_CDNATUBCPCSTNFE := NULL;
                  V_VRINIFAIXA      := NULL;
                  V_VRFIMFAIXA      := NULL;
                  V_VRPARDEDUZ      := NULL;
                  V_VR1PERREDBC     := NULL;
                  V_VRPERREDBC      := NULL;
                  V_VRPBCSUBTRIB    := NULL;
                  V_IDTRATIMPST     := NULL;
                  V_IDPMCBASECA     := NULL;
                  V_IDCSTINTEREST   := NULL;
                  V_IDCSTINTERNA    := NULL;
                  V_IDTIPODESTFISC  := NULL;
                  V_CDDETALHEFISC   := NULL;
                  V_IDTIPOREGISTRO  := NULL;
                  V_NRSEQDADOSFISC  := NULL;
                  V_CDCLASFISC      := NULL;
                  V_CDPRODUTO       := NULL;
                  V_CDFISCOPER      := NULL;
                  V_IDDIFEALIQ      := NULL;
                  V_IDDIFALIQCUSPR  := NULL;
                  V_CDENQLEGALIPI   := NULL;
                  V_CDCEST          := NULL;
                  V_VRADICALIQFECP  := NULL;
                  V_CDBENEFFISCAL   := NULL;
                  V_IDCONSMVAPMC    := NULL;
                  V_IDCONSCOMPBCPMC := NULL;
                  V_IDCONSDIFALIQ   := NULL;
                  V_IDIMPODESONERA  := NULL;
                  V_IDCONSDESONVRNF := NULL;
               END;
            END;
            BEGIN
               SELECT DECODE(COUNT(MSGFISCNCM.CDREGRAFISC), 0, 'N', 'S')
                 INTO V_IDMENSAGEM
                 FROM MSGFISCNCM
                WHERE CDREGRAFISC = V_CDREGRAFISC
                  AND CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                  AND CDCLASFISC = V_CDCLASFISC
                  AND NRSEQDADOSFISC = V_NRSEQDADOSFISC;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN BEGIN
                  V_IDMENSAGEM      := 'N';
               END;
            END;
            IF V_CDFISCAL IS NULL THEN
               BEGIN
                  SELECT
                     CDFISCAL,
                     CDSITUTRIB,
                     VRALIQUOTA,
                     IDMODBCNFE,
                     IDMODBCSTNFE,
                     IDMOTIDESSTNFE,
                     CDTPCRPICOSTNFE,
                     CDNATUBCPCSTNFE,
                     VRINIFAIXA,
                     VRFIMFAIXA,
                     VRPARDEDUZ,
                     VR1PERREDBC,
                     VRPERREDBC,
                     VRPBCSUBTRIB,
                     IDTRATIMPST,
                     IDPMCBASECA,
                     IDCSTINTEREST,
                     IDCSTINTERNA,
                     IDTIPODESTFISC,
                     CDDETALHEFISC,
                     TO_CHAR('NCM'),
                     NRSEQDADOSFISC,
                     CDCLASFISC,
                     '',
                     CDFISCOPER,
                     IDDIFEALIQ,
                     IDDIFALIQCUSPR,
                     CDENQLEGALIPI,
                     CDCEST,
                     VRADICALIQFECP,
                     CDBENEFFISCAL,
                     IDCONSMVAPMC,
                     IDCONSCOMPBCPMC,
                     IDCONSDIFALIQ,
                     IDIMPODESONERA,
                     IDCONSDESONVRNF
                  INTO
                     V_CDFISCAL,
                     V_CDSITUTRIB,
                     V_VRALIQUOTA,
                     V_IDMODBCNFE,
                     V_IDMODBCSTNFE,
                     V_IDMOTIDESSTNFE,
                     V_CDTPCRPICOSTNFE,
                     V_CDNATUBCPCSTNFE,
                     V_VRINIFAIXA,
                     V_VRFIMFAIXA,
                     V_VRPARDEDUZ,
                     V_VR1PERREDBC,
                     V_VRPERREDBC,
                     V_VRPBCSUBTRIB,
                     V_IDTRATIMPST,
                     V_IDPMCBASECA,
                     V_IDCSTINTEREST,
                     V_IDCSTINTERNA,
                     V_IDTIPODESTFISC,
                     V_CDDETALHEFISC,
                     V_IDTIPOREGISTRO,
                     V_NRSEQDADOSFISC,
                     V_CDCLASFISC,
                     V_CDPRODUTO,
                     V_CDFISCOPER,
                     V_IDDIFEALIQ,
                     V_IDDIFALIQCUSPR,
                     V_CDENQLEGALIPI,
                     V_CDCEST,
                     V_VRADICALIQFECP,
                     V_CDBENEFFISCAL,
                     V_IDCONSMVAPMC,
                     V_IDCONSCOMPBCPMC,
                     V_IDCONSDIFALIQ,
                     V_IDIMPODESONERA,
                     V_IDCONSDESONVRNF
                    FROM DADOSFISCNCM
                   WHERE DADOSFISCNCM.CDREGRAFISC = V_CDREGRAFISC
                     AND DADOSFISCNCM.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                     AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                     AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                     AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                     AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                     AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                          ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                          (V_UTMUNIORIG = 'N'))
                     AND ((VRINIFAIXA  <= P_BASECALC) AND (VRFIMFAIXA  >= P_BASECALC) OR  V_UTFAIXVLR = 'N')
                     AND ((VRRANGINI IS NULL) AND (VRRANGFIM IS NULL))
                     AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N'))
                     AND DADOSFISCNCM.CDCLASFISC = (SELECT MAX(A.CDCLASFISC)
                                                      FROM DADOSFISCNCM A, PRODUTO B
                                                     WHERE A.CDREGRAFISC = V_CDREGRAFISC
                                                       AND B.CDARVPROD = P_CDARVPROD
                                                       AND A.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                                                       AND INSTR(B.CDCLASFISC, A.CDCLASFISC)=1
                                                       AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                                                       AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                                                       AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                                                       AND (((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST)) OR  V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                                                       AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                                                            ((CDMUNIDEST = P_MUNIDEST  AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                                                            (V_UTMUNIORIG = 'N'))
                                                       AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N')));
               EXCEPTION
                  WHEN TOO_MANY_ROWS THEN BEGIN
                     RAISE_APPLICATION_ERROR(-20000, 'Operação Bloqueada! Existe cadastro duplicado na regra fiscal ' || V_CDREGRAFISC || ' (imposto ' || C_REGRAFISCAL.CDIMPOSTO || ', produto ' || P_CDARVPROD || ', página "Por NCM").', TRUE);
                  END;
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_CDFISCAL        := NULL;
                     V_CDSITUTRIB      := NULL;
                     V_VRALIQUOTA      := NULL;
                     V_IDMODBCNFE      := NULL;
                     V_IDMODBCSTNFE    := NULL;
                     V_IDMOTIDESSTNFE  := NULL;
                     V_CDTPCRPICOSTNFE := NULL;
                     V_CDNATUBCPCSTNFE := NULL;
                     V_VRINIFAIXA      := NULL;
                     V_VRFIMFAIXA      := NULL;
                     V_VRPARDEDUZ      := NULL;
                     V_VR1PERREDBC     := NULL;
                     V_VRPERREDBC      := NULL;
                     V_VRPBCSUBTRIB    := NULL;
                     V_IDTRATIMPST     := NULL;
                     V_IDPMCBASECA     := NULL;
                     V_IDCSTINTEREST   := NULL;
                     V_IDCSTINTERNA    := NULL;
                     V_IDTIPODESTFISC  := NULL;
                     V_CDDETALHEFISC   := NULL;
                     V_IDTIPOREGISTRO  := NULL;
                     V_NRSEQDADOSFISC  := NULL;
                     V_CDCLASFISC      := NULL;
                     V_CDPRODUTO       := NULL;
                     V_CDFISCOPER      := NULL;
                     V_IDDIFEALIQ      := NULL;
                     V_IDDIFALIQCUSPR  := NULL;
                     V_CDENQLEGALIPI   := NULL;
                     V_CDCEST          := NULL;
                     V_VRADICALIQFECP  := NULL;
                     V_CDBENEFFISCAL   := NULL;
                     V_IDCONSMVAPMC    := NULL;
                     V_IDCONSCOMPBCPMC := NULL;
                     V_IDCONSDIFALIQ   := NULL;
                     V_IDIMPODESONERA  := NULL;
                     V_IDCONSDESONVRNF := NULL;
                  END;
               END;
               BEGIN
                  SELECT DECODE(COUNT(MSGFISCNCM.CDREGRAFISC), 0, 'N', 'S')
                    INTO V_IDMENSAGEM
                    FROM MSGFISCNCM
                   WHERE CDREGRAFISC = V_CDREGRAFISC
                     AND CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                     AND CDCLASFISC = V_CDCLASFISC
                     AND NRSEQDADOSFISC = V_NRSEQDADOSFISC;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_IDMENSAGEM      := 'N';
                  END;
               END;
            END IF;
            IF V_CDFISCAL IS NULL THEN
               SELECT NVL(MAX(VRQTDEMB), NULL) VRQTDEMB,
                      NVL(MAX(SGUNIDEMB), NULL) SGUNIDEMB
                 INTO V_VRQTDEMB, V_SGUNIDEMB
                 FROM PRODUTO
                WHERE CDARVPROD = P_CDARVPROD;
               SELECT NVL(MAX(IDUTRANGEMB), NULL) IDUTRANGEMB
                 INTO V_UTILRANGE
                 FROM IMPOSTO
                WHERE CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO;
               BEGIN
                  SELECT
                     CDFISCAL,
                     CDSITUTRIB,
                     VRALIQUOTA,
                     IDMODBCNFE,
                     IDMODBCSTNFE,
                     IDMOTIDESSTNFE,
                     CDTPCRPICOSTNFE,
                     CDNATUBCPCSTNFE,
                     VRINIFAIXA,
                     VRFIMFAIXA,
                     VRPARDEDUZ,
                     VR1PERREDBC,
                     VRPERREDBC,
                     VRPBCSUBTRIB,
                     IDTRATIMPST,
                     IDPMCBASECA,
                     IDCSTINTEREST,
                     IDCSTINTERNA,
                     IDTIPODESTFISC,
                     CDDETALHEFISC,
                     TO_CHAR('PAD'),
                     NRSEQDADOSFISC,
                     '',
                     '',
                     CDFISCOPER,
                     IDDIFEALIQ,
                     IDDIFALIQCUSPR,
                     CDENQLEGALIPI,
                     CDCEST,
                     VRADICALIQFECP,
                     CDBENEFFISCAL,
                     IDCONSMVAPMC,
                     IDCONSCOMPBCPMC,
                     IDCONSDIFALIQ,
                     IDIMPODESONERA,
                     IDCONSDESONVRNF
                  INTO
                     V_CDFISCAL,
                     V_CDSITUTRIB,
                     V_VRALIQUOTA,
                     V_IDMODBCNFE,
                     V_IDMODBCSTNFE,
                     V_IDMOTIDESSTNFE,
                     V_CDTPCRPICOSTNFE,
                     V_CDNATUBCPCSTNFE,
                     V_VRINIFAIXA,
                     V_VRFIMFAIXA,
                     V_VRPARDEDUZ,
                     V_VR1PERREDBC,
                     V_VRPERREDBC,
                     V_VRPBCSUBTRIB,
                     V_IDTRATIMPST,
                     V_IDPMCBASECA,
                     V_IDCSTINTEREST,
                     V_IDCSTINTERNA,
                     V_IDTIPODESTFISC,
                     V_CDDETALHEFISC,
                     V_IDTIPOREGISTRO,
                     V_NRSEQDADOSFISC,
                     V_CDCLASFISC,
                     V_CDPRODUTO,
                     V_CDFISCOPER,
                     V_IDDIFEALIQ,
                     V_IDDIFALIQCUSPR,
                     V_CDENQLEGALIPI,
                     V_CDCEST,
                     V_VRADICALIQFECP,
                     V_CDBENEFFISCAL,
                     V_IDCONSMVAPMC,
                     V_IDCONSCOMPBCPMC,
                     V_IDCONSDIFALIQ,
                     V_IDIMPODESONERA,
                     V_IDCONSDESONVRNF
                    FROM DADOSFISCREGRA
                  WHERE DADOSFISCREGRA.CDREGRAFISC = V_CDREGRAFISC
                     AND DADOSFISCREGRA.CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                     AND (IDCSTINTEREST = V_STATUSESTADUAL OR IDCSTINTEREST = 'T')
                     AND (IDCSTINTERNA  = V_STATUSINTERNACIONAL OR IDCSTINTERNA = 'T')
                     AND (((CDPAISORIG = P_PAISORIG) AND (SGESTAORIG = P_ESTAORIG)) OR  V_UTUFORIG = 'N' OR IDTIPOORIGFISC = 'T')
                     AND (((CDPAISDEST = P_PAISDEST)  AND (SGESTADEST = P_ESTADEST)) OR V_UTUFDEST = 'N' OR IDTIPODESTFISC = 'T')
                     AND (((CDMUNIORIG = P_MUNIORIG  AND V_UTMUNIORIG = 'O') OR (IDTIPOORIGFISC = 'T') OR ((CDMUNIORIG IS NULL) AND  (V_UTMUNIORIG = 'D'))) AND
                          ((CDMUNIDEST = P_MUNIDEST AND V_UTMUNIORIG = 'D') OR (IDTIPODESTFISC = 'T') OR ((CDMUNIDEST IS NULL) AND  (V_UTMUNIORIG = 'O'))) OR
                          (V_UTMUNIORIG = 'N'))
                     AND ((VRINIFAIXA  <= P_BASECALC) AND (VRFIMFAIXA  >= P_BASECALC) OR  V_UTFAIXVLR = 'N')
                     AND (((V_VRQTDEMB IS NULL) AND (V_UTILRANGE = 'S')) OR (V_UTILRANGE <> 'S'))
                     AND (NVL(IDORIGEMPRODIMP, 'N') = NVL(V_IDORIGEMPROD, 'N'));
               EXCEPTION
                  WHEN TOO_MANY_ROWS THEN BEGIN
                     RAISE_APPLICATION_ERROR(-20000, 'Operação Bloqueada! Existe cadastro duplicado na regra fiscal ' || V_CDREGRAFISC || ' (imposto ' || C_REGRAFISCAL.CDIMPOSTO || ', página "Padrão").', TRUE);
                  END;
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_CDFISCAL        := NULL;
                     V_CDSITUTRIB      := NULL;
                     V_VRALIQUOTA      := NULL;
                     V_IDMODBCNFE      := NULL;
                     V_IDMODBCSTNFE    := NULL;
                     V_IDMOTIDESSTNFE  := NULL;
                     V_CDTPCRPICOSTNFE := NULL;
                     V_CDNATUBCPCSTNFE := NULL;
                     V_VRINIFAIXA      := NULL;
                     V_VRFIMFAIXA      := NULL;
                     V_VRPARDEDUZ      := NULL;
                     V_VR1PERREDBC     := NULL;
                     V_VRPERREDBC      := NULL;
                     V_VRPBCSUBTRIB    := NULL;
                     V_IDTRATIMPST     := NULL;
                     V_IDPMCBASECA     := NULL;
                     V_IDCSTINTEREST   := NULL;
                     V_IDCSTINTERNA    := NULL;
                     V_IDTIPODESTFISC  := NULL;
                     V_CDDETALHEFISC   := NULL;
                     V_IDTIPOREGISTRO  := NULL;
                     V_NRSEQDADOSFISC  := NULL;
                     V_CDCLASFISC      := NULL;
                     V_CDPRODUTO       := NULL;
                     V_CDENQLEGALIPI   := NULL;
                     V_CDCEST          := NULL;
                     V_VRADICALIQFECP  := NULL;
                     V_CDBENEFFISCAL   := NULL;
                     V_IDCONSMVAPMC    := NULL;
                     V_IDCONSCOMPBCPMC := NULL;
                     V_IDCONSDIFALIQ   := NULL;
                     V_IDIMPODESONERA  := NULL;
                     V_IDCONSDESONVRNF := NULL;
                  END;
               END;
               BEGIN
                  SELECT DECODE(COUNT(MSGFISCREGRA.CDREGRAFISC), 0, 'N', 'S')
                    INTO V_IDMENSAGEM
                    FROM MSGFISCREGRA
                   WHERE CDREGRAFISC = V_CDREGRAFISC
                     AND CDIMPOSTO = C_REGRAFISCAL.CDIMPOSTO
                     AND NRSEQDADOSFISC = V_NRSEQDADOSFISC;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_IDMENSAGEM      := 'N';
                  END;
               END;
            END IF;
         END IF;
      END IF;
      BEGIN
         SELECT NMREGRAFISC, DSMENSREGRAFISC
           INTO V_NMREGRAFISC, V_DSMENSREGRAFISC
           FROM REGRAFISCAL
          WHERE CDREGRAFISC = V_CDREGRAFISC;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_NMREGRAFISC     := NULL;
            V_DSMENSREGRAFISC := NULL;
         END;
      END;
      IF V_CDREGRAFISC IS NOT NULL THEN
         IF V_CDFISCAL        IS NOT NULL OR
            V_CDSITUTRIB      IS NOT NULL OR
            V_VRALIQUOTA      IS NOT NULL OR
            V_IDMODBCNFE      IS NOT NULL OR
            V_IDMODBCSTNFE    IS NOT NULL OR
            V_IDMOTIDESSTNFE  IS NOT NULL OR
            V_CDTPCRPICOSTNFE IS NOT NULL OR
            V_CDNATUBCPCSTNFE IS NOT NULL OR
            V_VRINIFAIXA      IS NOT NULL OR
            V_VRFIMFAIXA      IS NOT NULL OR
            V_VRPARDEDUZ      IS NOT NULL OR
            V_VR1PERREDBC     IS NOT NULL OR
            V_VRPERREDBC      IS NOT NULL OR
            V_VRPBCSUBTRIB    IS NOT NULL OR
            V_IDTRATIMPST     IS NOT NULL OR
            V_IDPMCBASECA     IS NOT NULL OR
            V_IDCSTINTEREST   IS NOT NULL OR
            V_IDCSTINTERNA    IS NOT NULL OR
            V_CDFISCOPER      IS NOT NULL OR
            V_IDCFOPINTEREST  IS NOT NULL OR
            V_IDDIFEALIQ      IS NOT NULL OR
            V_IDDIFALIQCUSPR  IS NOT NULL OR
            V_IDTIPODESTFISC  IS NOT NULL OR
            V_CDDETALHEFISC   IS NOT NULL OR
            V_IDTIPOREGISTRO  IS NOT NULL OR
            V_NRSEQDADOSFISC  IS NOT NULL OR
            V_IDMENSAGEM      IS NOT NULL OR
            V_CDCLASFISC      IS NOT NULL OR
            V_CDPRODUTO       IS NOT NULL OR
            V_CDENQLEGALIPI   IS NOT NULL OR
            V_CDCEST          IS NOT NULL OR
            V_VRADICALIQFECP  IS NOT NULL OR
            V_CDBENEFFISCAL   IS NOT NULL OR
            V_IDCONSMVAPMC    IS NOT NULL OR
            V_IDCONSCOMPBCPMC IS NOT NULL OR
            V_IDCONSDIFALIQ   IS NOT NULL OR
            V_IDIMPODESONERA  IS NOT NULL OR
            V_IDCONSDESONVRNF IS NOT NULL THEN
            OUT_RECORD.CDREGRAFISC        := V_CDREGRAFISC;
            OUT_RECORD.NMREGRAFISC        := V_NMREGRAFISC;
            OUT_RECORD.DSMENSREGRAFISC    := V_DSMENSREGRAFISC;
            OUT_RECORD.CDIMPOSTO          := C_REGRAFISCAL.CDIMPOSTO;
            OUT_RECORD.CDFISCAL           := V_CDFISCAL;
            OUT_RECORD.CDSITUTRIB         := V_CDSITUTRIB;
            OUT_RECORD.VRALIQUOTA         := V_VRALIQUOTA;
            OUT_RECORD.IDMODBCNFE         := V_IDMODBCNFE;
            OUT_RECORD.IDMODBCSTNFE       := V_IDMODBCSTNFE;
            OUT_RECORD.IDMOTIDESSTNFE     := V_IDMOTIDESSTNFE;
            OUT_RECORD.CDTPCRPICOSTNFE    := V_CDTPCRPICOSTNFE;
            OUT_RECORD.CDNATUBCPCSTNFE    := V_CDNATUBCPCSTNFE;
            OUT_RECORD.VRINIFAIXA         := V_VRINIFAIXA;
            OUT_RECORD.VRFIMFAIXA         := V_VRFIMFAIXA;
            OUT_RECORD.VRPARDEDUZ         := V_VRPARDEDUZ;
            OUT_RECORD.VR1PERREDBC        := V_VR1PERREDBC;
            OUT_RECORD.VRPERREDBC         := V_VRPERREDBC;
            OUT_RECORD.VRPBCSUBTRIB       := V_VRPBCSUBTRIB;
            OUT_RECORD.IDTRATIMPST        := V_IDTRATIMPST;
            OUT_RECORD.IDPMCBASECA        := V_IDPMCBASECA;
            OUT_RECORD.IDCSTINTEREST      := V_IDCSTINTEREST;
            OUT_RECORD.IDCSTINTERNA       := V_IDCSTINTERNA;
            OUT_RECORD.CDFISCOPER         := V_CDFISCOPER;
            OUT_RECORD.IDCFOPINTEREST     := V_IDCFOPINTEREST;
            OUT_RECORD.IDDIFEALIQ         := V_IDDIFEALIQ;
            OUT_RECORD.IDDIFALIQCUSPR     := V_IDDIFALIQCUSPR;
            OUT_RECORD.IDTIPODESTFISC     := V_IDTIPODESTFISC;
            OUT_RECORD.CDDETALHEFISC      := V_CDDETALHEFISC;
            OUT_RECORD.IDTIPOREGISTRO     := V_IDTIPOREGISTRO;
            OUT_RECORD.NRSEQDADOSFISC     := V_NRSEQDADOSFISC;
            OUT_RECORD.IDMENSAGEM         := V_IDMENSAGEM;
            OUT_RECORD.CDCLASFISC         := V_CDCLASFISC;
            OUT_RECORD.CDPRODUTO          := V_CDPRODUTO;
            OUT_RECORD.CDENQLEGALIPI      := V_CDENQLEGALIPI;
            OUT_RECORD.CDCEST             := V_CDCEST;
            OUT_RECORD.VRADICALIQFECP     := V_VRADICALIQFECP;
            OUT_RECORD.CDBENEFFISCAL      := V_CDBENEFFISCAL;
            OUT_RECORD.IDCONSMVAPMC       := V_IDCONSMVAPMC;
            OUT_RECORD.IDCONSCOMPBCPMC    := V_IDCONSCOMPBCPMC;
            OUT_RECORD.IDCONSDIFALIQ      := V_IDCONSDIFALIQ;
            OUT_RECORD.IDIMPODESONERA     := V_IDIMPODESONERA;
            OUT_RECORD.IDCONSDESONVRNF    := V_IDCONSDESONVRNF;
            PIPE ROW (OUT_RECORD);
         END IF;
      END IF;
   END LOOP;
END;
/
/*
@C:\WEB_619\Sql\End_Conv\Oracle\5001_FISSTPO_Consulta_Aliquota.SQL
Descrição:
Procedure para consulta dos impostos dos produtos do lançamento
*/
CREATE OR REPLACE PROCEDURE CONSULTA_ALIQUOTA(
    P_IMPOSTO     IN ALIQUOTA.CDIMPOSTO%TYPE,
    P_ENTRSAIDAL  IN ALIQUOTA.IDENTRSAIDAL%TYPE,
    P_EMPRESA     IN ALIQUOTA.CDEMPRESA%TYPE,
    P_PRODUTO     IN PRODUTO.CDARVPROD%TYPE,
    P_INSCESTA    IN ALIQUOTA.CDINSCESTA%TYPE,
    P_PAISORIG    IN PAIS.CDPAIS%TYPE,
    P_ESTAORIG    IN ESTADO.SGESTADO%TYPE,
    P_PAISDEST    IN PAIS.CDPAIS%TYPE,
    P_ESTADEST    IN ESTADO.SGESTADO%TYPE,
    P_MUNIORIG    IN MUNICIPIO.CDMUNICIPIO%TYPE,
    P_BASECALC    IN ALIQUOTA.VRFIMFAIXA%TYPE,
    P_INIVALID    IN ALIQUOTA.DTINIVALID%TYPE,
    P_FILIAL      IN VARCHAR2,
    P_LANCTONF    IN VARCHAR2,
    P_CDGRUPOFISC IN ALIQUOTA.CDGRUPOFISC%TYPE,
    P_CDTIPOOPER  IN TIPOOPERAC.CDTIPOOPER%TYPE DEFAULT NULL,
    P_IDSISTEMA   IN VARCHAR2 DEFAULT NULL,
    P_LANCPRODUTO IN VARCHAR2 DEFAULT NULL,  --Exclusivo Unificação
    P_VRPRODUTO   IN NUMBER   DEFAULT NULL,  --Exclusivo Unificação
    P_CDFILIRECE  IN VARCHAR2 DEFAULT NULL,  --Exclusivo Unificação
    P_CDFORNECED  IN VARCHAR2 DEFAULT NULL,  --Exclusivo Unificação
    P_CDCLIENTE   IN VARCHAR2 DEFAULT NULL,  --Exclusivo Unificação
    P_IDORIGEMPROD IN VARCHAR2 DEFAULT 'N')
IS
    V_SEQUENCIA   VARCHAR2(02); /*Varíavel para gerar o sequencial da alíquota*/
    V_CDARVPROD   VARCHAR2(20); /*Código de árvore do produto(Alíquota por nível ou todos)*/
    V_UTUFORIG       CHAR(1);   /*Utiliza UF de origem*/
    V_UTUFDEST       CHAR(1);   /*Utiliza UF de destino*/
    V_UTMUNIORIG     CHAR(1);   /*Utiliza municipio (origem ou destino)*/
    V_UTFAIXVLR      CHAR(1);   /*Utiliza faixa de valores*/
    V_IDUTALIQTPOPER CHAR(1);   /*Utiliza alíquota por tipo de operação*/
    V_IDPRODNOTA  VARCHAR2(01); /*Visualização do imposto: C-No corpo da nota, P-No produto*/
    V_VRITEMPROD  FLOAT;       /*Valor líquido do item*/
    V_CONTADOR    NUMBER;      /*Varíavel para o total de alíquotas encontradas*/
    w_N           Char(1):= 'N';
    w_S           Char(1):= 'S';
    w_P           Char(1):= 'P';
    w_O           Char(1):= 'O';
    w_D           Char(1):= 'D';
    V_CDGRUPOFISC VARCHAR2(03); /*Código do grupo fiscal*/
    V_CDTIPOOPER  VARCHAR2(02); /*Código do tipo de operação*/
    V_EXISTE      INTEGER;
    V_COUNTMENS     INTEGER;
    V_DSMENSALIQU VARCHAR2(120);
    V_COUNT        INTEGER;
    V_MUNIORIG    VARCHAR2(04);
    V_MUNIDEST    VARCHAR2(04);
    V_ALIQSIMPLES   INTEGER;
    V_VRALIQSIMPLES NUMBER;
BEGIN
   /*Parametros do Imposto */
   Begin
      SELECT NVL(MAX(IDUTUFORIG), w_N), NVL(MAX(IDUTUFDEST), w_N), NVL(MAX(IDUTMUNIORIG), w_N),
             NVL(MAX(IDUTFAIXVLR), w_N), MAX(IDPRODNOTA), NVL(MAX(IDUTALIQTPOPER), w_N)
      INTO V_UTUFORIG, V_UTUFDEST, V_UTMUNIORIG, V_UTFAIXVLR, V_IDPRODNOTA,
           V_IDUTALIQTPOPER
      FROM IMPOSTO
      WHERE (CDIMPOSTO = P_IMPOSTO);
   Exception
      When No_Data_Found Then
         V_UTUFORIG   := w_N;  --Utiliza UF de origem
         V_UTUFDEST   := w_N;  --Utiliza UF de destino
         V_UTMUNIORIG := w_N;  --Utiliza municipio (Origem ou destino)
         V_UTFAIXVLR  := w_N;  --Utiliza faixa de valores
         V_IDPRODNOTA := Null; --Visualização do imposto (C-Corpo da nota; P-Produto)
         V_IDUTALIQTPOPER := Null; --Utiliza aliquota por tipo de operação
   End;
   IF V_UTMUNIORIG = W_O THEN
      V_MUNIORIG := P_MUNIORIG;
      V_MUNIDEST := NULL;
   END IF;
   IF V_UTMUNIORIG = W_D THEN
      V_MUNIORIG := NULL;
      V_MUNIDEST := P_MUNIORIG;
   END IF;
   IF V_UTMUNIORIG = W_N THEN
      V_MUNIORIG := NULL;
      V_MUNIDEST := NULL;
   END IF;
   IF (P_LANCTONF <> '0000000000') THEN /*Se a consulta_alíquota for chamada a partir de um lançamento*/
      IF (V_UTFAIXVLR = w_S) AND (V_IDPRODNOTA = w_P) AND (P_ENTRSAIDAL = w_S) THEN
         IF P_IDSISTEMA = 'PED' THEN
            SELECT SUM((VRPREUNITPED * QTITEMPED) - ((VRPREUNITPED * QTITEMPED) * (VRDESITPED/100)))
              INTO V_VRITEMPROD
              FROM ITEMPEDIDO
             WHERE CDFILIAL = SUBSTR(P_FILIAL,1,4) AND
                   NRPEDIDO = SUBSTR(P_FILIAL,5,10);
         ELSE
            SELECT SUM(VRTOTAITEM - VRDESCITEM)
            INTO V_VRITEMPROD
            FROM ITEMPRODUTO
            WHERE CDFILIAL   = P_FILIAL AND
                  NRLANCTONF = P_LANCTONF;
         END IF;
      ELSE
         IF(P_LANCPRODUTO = 'S') THEN
            V_VRITEMPROD := P_VRPRODUTO;
         ELSE
            V_VRITEMPROD := P_BASECALC;
         END IF;
      END IF;
   ELSE /*Se a Consulta_alíquota não for chamada a partir de um lançamento*/
      IF(P_LANCPRODUTO = 'S') THEN
         V_VRITEMPROD := P_VRPRODUTO;
      ELSE
         V_VRITEMPROD := P_BASECALC;
      END IF;
   END IF;
   V_SEQUENCIA := '01';
   V_CDGRUPOFISC := NULL;
   /* Verificação das aliquotas referente as filiais parametrizadas na tela Parâmetros de Grupo Fiscal (Imposto/Inscrição Estadual) */
      /*Por Fornecedor*/
   V_CDGRUPOFISC := NULL;
   BEGIN
      SELECT MAX(G.CDGRUPOFISC)
        INTO V_CDGRUPOFISC
        FROM GRFISIMPIEFORN G, (SELECT CDFORNECED
                                  FROM NOTAFISCAL
                                 WHERE CDFILIAL = P_FILIAL
                                   AND NRLANCTONF = P_LANCTONF
                                   AND P_CDFORNECED IS NULL
                                 UNION ALL
                                SELECT CDFORNECED
                                  FROM FORNECEDOR
                                 WHERE CDFORNECED = P_CDFORNECED) F
       WHERE G.CDIMPOSTO = P_IMPOSTO
         AND G.CDFORNECED = F.CDFORNECED
         AND G.CDEMPRESA = P_EMPRESA
         AND G.CDINSCESTA = P_INSCESTA;
   EXCEPTION
      WHEN No_Data_Found THEN
         V_CDGRUPOFISC := NULL;
   END;
   IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
      FOR C_REGRA IN (SELECT *
                     FROM TABLE(CONSULTA_REGRA_FISCAL(P_IMPOSTO, P_EMPRESA, V_CDGRUPOFISC, P_ENTRSAIDAL, P_CDTIPOOPER, P_INSCESTA, P_PRODUTO, P_INIVALID,
                                                      P_PAISORIG, P_ESTAORIG, V_MUNIORIG, P_PAISDEST, P_ESTADEST, V_MUNIDEST, P_BASECALC, 'N', P_IDORIGEMPROD))
                       WHERE VRALIQUOTA IS NOT NULL) LOOP
          SELECT COUNT(*)
            INTO V_EXISTE
            FROM ALIQTEMP
           WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
          IF V_EXISTE > 0 THEN
             DELETE FROM ALIQTEMP
             WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
          END IF;
          V_ALIQSIMPLES := 0;
          BEGIN
             SELECT VRALIQUOTA, COUNT(*)
               INTO V_VRALIQSIMPLES, V_ALIQSIMPLES
               FROM ALIQSIMPNAC
              WHERE CDFORNECED  = P_CDFORNECED
                AND CDREGRAFISC = C_REGRA.CDREGRAFISC
                AND CDIMPOSTO   = P_IMPOSTO
              GROUP BY VRALIQUOTA;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_VRALIQSIMPLES := NULL; V_ALIQSIMPLES := 0;
          END;
          IF (V_ALIQSIMPLES > 0) THEN
             INSERT INTO ALIQTEMP
                (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                 IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                 CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                 IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
             VALUES
                (P_FILIAL||P_LANCTONF, V_SEQUENCIA, 0, 0, V_VRALIQSIMPLES, NULL,
                 C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, 0, C_REGRA.CDREGRAFISC,
                 P_CDTIPOOPER, C_REGRA.CDFISCOPER, 'N', 'N', C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                 C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
          ELSE
             INSERT INTO ALIQTEMP
                (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                 IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                 CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                 IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
             VALUES
                (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_REGRA.VRPERREDBC, C_REGRA.VRPARDEDUZ, C_REGRA.VRALIQUOTA, NULL,
                 C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, C_REGRA.VR1PERREDBC, C_REGRA.CDREGRAFISC,
                 P_CDTIPOOPER, C_REGRA.CDFISCOPER, C_REGRA.IDDIFEALIQ, C_REGRA.IDDIFALIQCUSPR, C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                 C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
          END IF;
          V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
      END LOOP;
   ELSE
       /*Por Cliente*/  
      BEGIN
        SELECT MAX(G.CDGRUPOFISC)
          INTO V_CDGRUPOFISC
          FROM GRFISIMPIECLIE G, (SELECT CDCLIENTE
                                    FROM NOTAFISCAL
                                   WHERE CDFILIAL = P_FILIAL
                                     AND NRLANCTONF = P_LANCTONF
                                     AND P_CDCLIENTE IS NULL
                                   UNION ALL
                                  SELECT CDCLIENTE
                                    FROM CLIENTE
                                   WHERE CDCLIENTE = P_CDCLIENTE) F
         WHERE G.CDIMPOSTO = P_IMPOSTO
           AND G.CDCLIENTE = F.CDCLIENTE
           AND G.CDEMPRESA = P_EMPRESA
           AND G.CDINSCESTA = P_INSCESTA;
      EXCEPTION
        WHEN No_Data_Found THEN
           V_CDGRUPOFISC := NULL;
      END;
      IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
         FOR C_REGRA IN (SELECT *
                        FROM TABLE(CONSULTA_REGRA_FISCAL(P_IMPOSTO, P_EMPRESA, V_CDGRUPOFISC, P_ENTRSAIDAL, P_CDTIPOOPER, P_INSCESTA, P_PRODUTO, P_INIVALID,
                                                         P_PAISORIG, P_ESTAORIG, V_MUNIORIG, P_PAISDEST, P_ESTADEST, V_MUNIDEST, P_BASECALC, 'N', P_IDORIGEMPROD))
                          WHERE VRALIQUOTA IS NOT NULL) LOOP
             SELECT COUNT(*)
               INTO V_EXISTE
               FROM ALIQTEMP
              WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
             IF V_EXISTE > 0 THEN
                DELETE FROM ALIQTEMP
                WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
             END IF;
             V_ALIQSIMPLES := 0;
             BEGIN
                SELECT VRALIQUOTA, COUNT(*)
                  INTO V_VRALIQSIMPLES, V_ALIQSIMPLES
                  FROM ALIQSIMPNAC
                 WHERE CDFORNECED  = P_CDFORNECED
                   AND CDREGRAFISC = C_REGRA.CDREGRAFISC
                   AND CDIMPOSTO   = P_IMPOSTO
                 GROUP BY VRALIQUOTA;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_VRALIQSIMPLES := NULL; V_ALIQSIMPLES := 0;
             END;
             IF (V_ALIQSIMPLES > 0) THEN
                INSERT INTO ALIQTEMP
                   (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                    IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                    CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                    IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                VALUES
                   (P_FILIAL||P_LANCTONF, V_SEQUENCIA, 0, 0, V_VRALIQSIMPLES, NULL,
                    C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, 0, C_REGRA.CDREGRAFISC,
                    P_CDTIPOOPER, C_REGRA.CDFISCOPER, 'N', 'N', C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                    C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
             ELSE
                INSERT INTO ALIQTEMP
                   (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                    IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                    CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                    IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                VALUES
                   (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_REGRA.VRPERREDBC, C_REGRA.VRPARDEDUZ, C_REGRA.VRALIQUOTA, NULL,
                    C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, C_REGRA.VR1PERREDBC, C_REGRA.CDREGRAFISC,
                    P_CDTIPOOPER, C_REGRA.CDFISCOPER, C_REGRA.IDDIFEALIQ, C_REGRA.IDDIFALIQCUSPR, C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                    C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
             END IF;
             V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
         END LOOP;
      ELSE
         BEGIN
            SELECT MAX(G.CDGRUPOFISC)
              INTO V_CDGRUPOFISC
              FROM GRUPOFISCIMPFIL G, (SELECT DECODE(P_ENTRSAIDAL, 'E', CDFILIRECE, CDFILIEMIT) AS CDFILIAL
                                         FROM NOTAFISCAL
                                        WHERE CDFILIAL = P_FILIAL
                                          AND NRLANCTONF = P_LANCTONF
                                          AND P_IDSISTEMA IS NULL
                                          AND P_CDFILIRECE IS NULL
                                       UNION ALL
                                       SELECT CDFILIAL
                                         FROM PEDIDO
                                        WHERE CDFILIAL = SUBSTR(P_FILIAL,1,4)
                                          AND NRPEDIDO = SUBSTR(P_FILIAL,5,10)
                                          AND P_IDSISTEMA = 'PED'
                                       UNION ALL
                                       SELECT CDFILIAL
                                         FROM FILIAL
                                        WHERE CDFILIAL = P_CDFILIRECE) F
             WHERE G.CDIMPOSTO = P_IMPOSTO
               AND G.CDFILIAL = F.CDFILIAL;
         EXCEPTION
            WHEN No_Data_Found THEN
               V_CDGRUPOFISC := NULL;
         END;
         IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Filial*/
            FOR C_REGRA IN (SELECT *
                           FROM TABLE(CONSULTA_REGRA_FISCAL(P_IMPOSTO, P_EMPRESA, V_CDGRUPOFISC, P_ENTRSAIDAL, P_CDTIPOOPER, P_INSCESTA, P_PRODUTO, P_INIVALID,
                                                            P_PAISORIG, P_ESTAORIG, V_MUNIORIG, P_PAISDEST, P_ESTADEST, V_MUNIDEST, P_BASECALC, 'N', P_IDORIGEMPROD))
                             WHERE VRALIQUOTA IS NOT NULL) LOOP
                SELECT COUNT(*)
                  INTO V_EXISTE
                  FROM ALIQTEMP
                 WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
                IF V_EXISTE > 0 THEN
                   DELETE FROM ALIQTEMP
                   WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF;
                END IF;
                V_ALIQSIMPLES := 0;
                BEGIN
                   SELECT VRALIQUOTA, COUNT(*)
                     INTO V_VRALIQSIMPLES, V_ALIQSIMPLES
                     FROM ALIQSIMPNAC
                    WHERE CDFORNECED  = P_CDFORNECED
                      AND CDREGRAFISC = C_REGRA.CDREGRAFISC
                      AND CDIMPOSTO   = P_IMPOSTO
                    GROUP BY VRALIQUOTA;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_VRALIQSIMPLES := NULL; V_ALIQSIMPLES := 0;
                END;
                IF (V_ALIQSIMPLES > 0) THEN
                   INSERT INTO ALIQTEMP
                      (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                       IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                       CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                       IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                   VALUES
                      (P_FILIAL||P_LANCTONF, V_SEQUENCIA, 0, 0, V_VRALIQSIMPLES, NULL,
                       C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, 0, C_REGRA.CDREGRAFISC,
                       P_CDTIPOOPER, C_REGRA.CDFISCOPER, 'N', 'N', C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                       C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
                ELSE
                   INSERT INTO ALIQTEMP
                      (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                       IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                       CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                       IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                   VALUES
                      (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_REGRA.VRPERREDBC, C_REGRA.VRPARDEDUZ, C_REGRA.VRALIQUOTA, NULL,
                       C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, C_REGRA.VR1PERREDBC, C_REGRA.CDREGRAFISC,
                       P_CDTIPOOPER, C_REGRA.CDFISCOPER, C_REGRA.IDDIFEALIQ, C_REGRA.IDDIFALIQCUSPR, C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                       C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
                END IF;
                V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
            END LOOP;
         ELSE
            FOR C_REGRA IN (SELECT *
                              FROM TABLE(CONSULTA_REGRA_FISCAL(P_IMPOSTO, P_EMPRESA, P_CDGRUPOFISC, P_ENTRSAIDAL, P_CDTIPOOPER, P_INSCESTA, P_PRODUTO, P_INIVALID,
                                                               P_PAISORIG, P_ESTAORIG, V_MUNIORIG, P_PAISDEST, P_ESTADEST, V_MUNIDEST, P_BASECALC, 'N', P_IDORIGEMPROD))
                             WHERE VRALIQUOTA IS NOT NULL) LOOP
                SELECT COUNT(*)
                  INTO V_EXISTE
                  FROM ALIQTEMP
                 WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF
                   AND CDREGRATMP IS NULL;
                IF V_EXISTE > 0 THEN
                   DELETE FROM ALIQTEMP
                   WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF
                     AND CDREGRATMP IS NULL;
                END IF;
                V_ALIQSIMPLES := 0;
                BEGIN
                   SELECT VRALIQUOTA, COUNT(*)
                     INTO V_VRALIQSIMPLES, V_ALIQSIMPLES
                     FROM ALIQSIMPNAC
                    WHERE CDFORNECED  = P_CDFORNECED
                      AND CDREGRAFISC = C_REGRA.CDREGRAFISC
                      AND CDIMPOSTO   = P_IMPOSTO
                    GROUP BY VRALIQUOTA;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_VRALIQSIMPLES := NULL; V_ALIQSIMPLES := 0;
                END;
                IF (V_ALIQSIMPLES > 0) THEN
                   INSERT INTO ALIQTEMP
                      (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                       IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                       CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                       IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                   VALUES
                      (P_FILIAL||P_LANCTONF, V_SEQUENCIA, 0, 0, V_VRALIQSIMPLES, NULL,
                       C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, 0, C_REGRA.CDREGRAFISC,
                       P_CDTIPOOPER, C_REGRA.CDFISCOPER, 'N', 'N', C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                       C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
                ELSE
                   INSERT INTO ALIQTEMP
                      (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP, VRALIQUTMP, DSMENSALITMP,
                       IDTRIMPSTTMP, VRPBCSTTMP, IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, CDREGRATMP,
                       CDTIPOOPERTMP, CDFISCOPER, IDDIFEALIQ, IDDIFALIQCUSPR, VRADICALIQFECP, CDBENEFFISCAL,
                       IDCONSMVAPMC, IDCONSCOMPBCPMC, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                   VALUES
                      (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_REGRA.VRPERREDBC, C_REGRA.VRPARDEDUZ, C_REGRA.VRALIQUOTA, NULL,
                       C_REGRA.IDTRATIMPST, C_REGRA.VRPBCSUBTRIB, C_REGRA.IDPMCBASECA,NULL, C_REGRA.VR1PERREDBC, C_REGRA.CDREGRAFISC,
                       P_CDTIPOOPER, C_REGRA.CDFISCOPER, C_REGRA.IDDIFEALIQ, C_REGRA.IDDIFALIQCUSPR, C_REGRA.VRADICALIQFECP, C_REGRA.CDBENEFFISCAL,
                       C_REGRA.IDCONSMVAPMC, C_REGRA.IDCONSCOMPBCPMC, C_REGRA.IDCONSDIFALIQ, C_REGRA.IDIMPODESONERA, C_REGRA.IDCONSDESONVRNF);
                END IF;
                V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
            END LOOP;
         END IF;
      END IF;
   END IF;
   V_EXISTE := 0;
   SELECT COUNT(*)
     INTO V_EXISTE
     FROM ALIQTEMP
    WHERE NRALIQTEMP  = P_FILIAL||P_LANCTONF
      AND CDREGRATMP IS NOT NULL;
   IF NOT(V_EXISTE > 0) THEN
      IF P_CDGRUPOFISC IS NOT NULL THEN /*Se há grupo fiscal*/
         IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
            SELECT MAX(CDTIPOOPER), COUNT(*)
              INTO V_CDTIPOOPER, V_CONTADOR
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC  = P_CDGRUPOFISC)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG  = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
               INTO V_CDARVPROD
               FROM ALIQUOTA A, PRODUTO P
               WHERE (CDIMPOSTO    = P_IMPOSTO)
                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                 AND (CDEMPRESA    = P_EMPRESA)
                 AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                 AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                 AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                 AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                 AND ((CDMUNIORIG  = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                 AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                 AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                 AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                  AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            END IF;
         ELSE /*Se imposto da nota*/
            SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
            INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
            FROM ALIQUOTA A
            WHERE (CDIMPOSTO    = P_IMPOSTO)
              AND (IDENTRSAIDAL = P_ENTRSAIDAL)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDINSCESTA   = RTRIM(P_INSCESTA))
              AND (CDGRUPOFISC  = P_CDGRUPOFISC)
              AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
              AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
              AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
              AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
              AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
              AND (A.CDPRODUTO IS NULL);
         END IF;
         IF V_CONTADOR > 0 THEN /*Se encontrou alíquota para o grupo fiscal*/
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto de maior nível*/
                  FOR C_ALIQUOTA IN (
                      SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST,
                             VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL,
                             IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                        FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                       WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                         AND (A.CDIMPOSTO = P_IMPOSTO)
                         AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                         AND (A.CDEMPRESA = P_EMPRESA)
                         AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                         AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                         AND (A.CDPRODUTO = P.CDPRODUTO(+))
                         AND (P.CDARVPROD = V_CDARVPROD)
                         AND ((A.CDPAISORIG = P_PAISORIG)
                         AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                         AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                         AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                         AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                         AND (CDTIPOOPER = V_CDTIPOOPER)
                         AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                               FROM ALIQUOTA A, PRODUTO P
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                                 AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                 AND (P.CDARVPROD = V_CDARVPROD)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD) AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (CDTIPOOPER = V_CDTIPOOPER)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                      SELECT COUNT(*)
                        INTO V_COUNTMENS
                        FROM MENSAGEM
                       WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                         AND IDSITUACAOMENS = 'I';
                      IF V_COUNTMENS > 0 THEN
                         V_DSMENSALIQU := NULL;
                      ELSE
                         V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                      END IF;
                      INSERT INTO ALIQTEMP
                         (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                          VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                          IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                          VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                      VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, C_ALIQUOTA.IDPMCBASECAL,
                         C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                      V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                     SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                            CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                       FROM ALIQUOTA A, MENSALIQU
                      WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                        AND (A.CDIMPOSTO = P_IMPOSTO)
                        AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                        AND (A.CDEMPRESA = P_EMPRESA)
                        AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                        AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                        AND (A.CDPRODUTO IS NULL)
                        AND ((A.CDPAISORIG = P_PAISORIG)
                        AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                        AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                        AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                        AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                        AND (CDTIPOOPER = V_CDTIPOOPER)
                        AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                FROM ALIQUOTA
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                                 AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                 AND (CDPRODUTO IS NULL)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST)
                                                 AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD)
                                                 AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (CDTIPOOPER = V_CDTIPOOPER)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto de maior nível*/
                  FOR C_ALIQUOTA IN (
                      SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                             VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                        FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                       WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                         AND (A.CDIMPOSTO = P_IMPOSTO)
                         AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                         AND (A.CDEMPRESA = P_EMPRESA)
                         AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                         AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                         AND (A.CDPRODUTO = P.CDPRODUTO(+))
                         AND (P.CDARVPROD = V_CDARVPROD)
                         AND ((A.CDPAISORIG = P_PAISORIG)
                         AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                         AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                         AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                         AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                         AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                         AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                               FROM ALIQUOTA A, PRODUTO P
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                                 AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                 AND (P.CDARVPROD = V_CDARVPROD)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD) AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                      SELECT COUNT(*)
                        INTO V_COUNTMENS
                        FROM MENSAGEM
                       WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                         AND IDSITUACAOMENS = 'I';
                      IF V_COUNTMENS > 0 THEN
                         V_DSMENSALIQU := NULL;
                      ELSE
                         V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                      END IF;
                      INSERT INTO ALIQTEMP
                         (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                          VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                          IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                          VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                      VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                      V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                     SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                            VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                       FROM ALIQUOTA A, MENSALIQU
                      WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                        AND (A.CDIMPOSTO = P_IMPOSTO)
                        AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                        AND (A.CDEMPRESA = P_EMPRESA)
                        AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                        AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                        AND (A.CDPRODUTO IS NULL)
                        AND ((A.CDPAISORIG = P_PAISORIG)
                        AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                        AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                        AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                        AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                        AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                        AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                FROM ALIQUOTA
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                                 AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                 AND (CDPRODUTO IS NULL)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST)
                                                 AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD)
                                                 AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            END IF;
         END IF;
      ELSE /*Se não há grupo fiscal*/
         SELECT MAX(A.CDTIPOOPER)
         INTO V_CDTIPOOPER
         FROM ALIQUOTA A, PRODUTO P
         WHERE (CDIMPOSTO    = P_IMPOSTO)
           AND (IDENTRSAIDAL = P_ENTRSAIDAL)
           AND (CDEMPRESA    = P_EMPRESA)
           AND (CDINSCESTA   = RTRIM(P_INSCESTA))
           AND (CDGRUPOFISC IS NULL)
           AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
           AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
           AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
           AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
           AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
           AND (A.CDPRODUTO = P.CDPRODUTO(+))
           AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
         IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
            SELECT MAX(P.CDARVPROD)
              INTO V_CDARVPROD
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC IS NULL)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
         ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
            SELECT MAX(P.CDARVPROD)
              INTO V_CDARVPROD
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC IS NULL)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
         END IF;
         IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               FOR C_ALIQUOTA IN (
                   SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                          CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                     FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                    WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                      AND (A.CDIMPOSTO = P_IMPOSTO)
                      AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                      AND (A.CDEMPRESA = P_EMPRESA)
                      AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                      AND (A.CDGRUPOFISC IS NULL)
                      AND (A.CDPRODUTO = P.CDPRODUTO(+))
                      AND (P.CDARVPROD = V_CDARVPROD)
                      AND ((A.CDPAISORIG = P_PAISORIG)
                      AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                      AND ((A.CDPAISDEST = P_PAISDEST)
                      AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                      AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                      AND ((A.VRINIFAIXA < V_VRITEMPROD)
                      AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                      AND (CDTIPOOPER = V_CDTIPOOPER)
                      AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (CDGRUPOFISC IS NULL)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                    (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                     VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                     IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                     VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                    (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                     C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                     C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                     C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               FOR C_ALIQUOTA IN (
                   SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                          CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                     FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                    WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                      AND (A.CDIMPOSTO = P_IMPOSTO)
                      AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                      AND (A.CDEMPRESA = P_EMPRESA)
                      AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                      AND (A.CDGRUPOFISC IS NULL)
                      AND (A.CDPRODUTO = P.CDPRODUTO(+))
                      AND (P.CDARVPROD = V_CDARVPROD)
                      AND ((A.CDPAISORIG = P_PAISORIG)
                      AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                      AND ((A.CDPAISDEST = P_PAISDEST)
                      AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                      AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                      AND ((A.VRINIFAIXA < V_VRITEMPROD)
                      AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                      AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                      AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (CDGRUPOFISC IS NULL)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                    (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                     VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                     IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                     CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                    (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                     C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                     C_ALIQUOTA.IDPMCBASECAL,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                     C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para todos*/
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se há alíquota por tipo de operação*/
               FOR C_ALIQUOTA IN (
                  SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                         CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                  FROM ALIQUOTA A, MENSALIQU
                  WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                    AND (A.CDIMPOSTO = P_IMPOSTO)
                    AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                    AND (A.CDEMPRESA = P_EMPRESA)
                    AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                    AND (A.CDGRUPOFISC IS NULL)
                    AND (A.CDPRODUTO IS NULL)
                    AND ((A.CDPAISORIG = P_PAISORIG)
                    AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                    AND ((A.CDPAISDEST = P_PAISDEST)
                    AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                    AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                    AND ((A.VRINIFAIXA < V_VRITEMPROD)
                    AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                    AND (CDTIPOOPER = V_CDTIPOOPER)
                    AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                          FROM ALIQUOTA
                                          WHERE (CDIMPOSTO = P_IMPOSTO)
                                            AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                            AND (CDEMPRESA = P_EMPRESA)
                                            AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                            AND (CDGRUPOFISC IS NULL)
                                            AND (CDPRODUTO IS NULL)
                                            AND ((CDPAISORIG = P_PAISORIG)
                                            AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                            AND ((CDPAISDEST = P_PAISDEST)
                                            AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                            AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                            AND ((VRINIFAIXA < V_VRITEMPROD)
                                            AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                            AND (CDTIPOOPER = V_CDTIPOOPER)
                                            AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               FOR C_ALIQUOTA IN (
                  SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                         CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                  FROM ALIQUOTA A, MENSALIQU
                  WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                    AND (A.CDIMPOSTO = P_IMPOSTO)
                    AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                    AND (A.CDEMPRESA = P_EMPRESA)
                    AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                    AND (A.CDGRUPOFISC IS NULL)
                    AND (A.CDPRODUTO IS NULL)
                    AND ((A.CDPAISORIG = P_PAISORIG)
                    AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                    AND ((A.CDPAISDEST = P_PAISDEST)
                    AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                    AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                    AND ((A.VRINIFAIXA < V_VRITEMPROD)
                    AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                    AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                    AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                          FROM ALIQUOTA
                                          WHERE (CDIMPOSTO = P_IMPOSTO)
                                            AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                            AND (CDEMPRESA = P_EMPRESA)
                                            AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                            AND (CDGRUPOFISC IS NULL)
                                            AND (CDPRODUTO IS NULL)
                                            AND ((CDPAISORIG = P_PAISORIG)
                                            AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                            AND ((CDPAISDEST = P_PAISDEST)
                                            AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                            AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                            AND ((VRINIFAIXA < V_VRITEMPROD)
                                            AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                            AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                            AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         END IF;
      END IF;
      /* Verificação das aliquotas referente as filiais parametrizadas na tela Parâmetros de Grupo Fiscal (Imposto/Filial) */
      V_CDGRUPOFISC := NULL;
      BEGIN
         SELECT MAX(G.CDGRUPOFISC)
           INTO V_CDGRUPOFISC
           FROM GRUPOFISCIMPFIL G, (SELECT DECODE(P_ENTRSAIDAL, 'E', CDFILIRECE, CDFILIEMIT) AS CDFILIAL
                                      FROM NOTAFISCAL
                                     WHERE CDFILIAL = P_FILIAL
                                       AND NRLANCTONF = P_LANCTONF
                                       AND P_IDSISTEMA IS NULL
                                       AND P_CDFILIRECE IS NULL
                                    UNION ALL
                                    SELECT CDFILIAL
                                      FROM PEDIDO
                                     WHERE CDFILIAL = SUBSTR(P_FILIAL,1,4)
                                       AND NRPEDIDO = SUBSTR(P_FILIAL,5,10)
                                       AND P_IDSISTEMA = 'PED'
                                     UNION ALL
                                    SELECT CDFILIAL
                                      FROM FILIAL
                                     WHERE CDFILIAL = P_CDFILIRECE) F
          WHERE G.CDIMPOSTO = P_IMPOSTO
            AND G.CDFILIAL = F.CDFILIAL;
      EXCEPTION
         WHEN No_Data_Found THEN
            V_CDGRUPOFISC := NULL;
      END;
      IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Filial*/
         IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
            SELECT MAX(CDTIPOOPER), COUNT(*)
              INTO V_CDTIPOOPER, V_CONTADOR
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC  = V_CDGRUPOFISC)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
               INTO V_CDARVPROD
               FROM ALIQUOTA A, PRODUTO P
               WHERE (CDIMPOSTO    = P_IMPOSTO)
                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                 AND (CDEMPRESA    = P_EMPRESA)
                 AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                 AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                 AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                 AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                 AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                 AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            END IF;
         ELSE /*Se imposto da nota*/
            SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
            INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
            FROM ALIQUOTA A
            WHERE (CDIMPOSTO    = P_IMPOSTO)
              AND (IDENTRSAIDAL = P_ENTRSAIDAL)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDINSCESTA   = RTRIM(P_INSCESTA))
              AND (CDGRUPOFISC  = V_CDGRUPOFISC)
              AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
              AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
              AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
              AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
              AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
              AND (A.CDPRODUTO IS NULL);
         END IF;
         IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                       IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                       VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         END IF;
      END IF;
   ----------------------
   /* Verificação das aliquotas referente as filiais parametrizadas na tela Parâmetros de Grupo Fiscal (Imposto/Inscrição Estadual) */
      /*Por Fornecedor*/
      V_CDGRUPOFISC := NULL;
      BEGIN
         SELECT MAX(G.CDGRUPOFISC)
           INTO V_CDGRUPOFISC
           FROM GRFISIMPIEFORN G, (SELECT CDFORNECED
                                     FROM NOTAFISCAL
                                    WHERE CDFILIAL = P_FILIAL
                                      AND NRLANCTONF = P_LANCTONF
                                      AND P_CDFORNECED IS NULL
                                    UNION ALL
                                   SELECT CDFORNECED
                                     FROM FORNECEDOR
                                    WHERE CDFORNECED = P_CDFORNECED) F
          WHERE G.CDIMPOSTO = P_IMPOSTO
            AND G.CDFORNECED = F.CDFORNECED
            AND G.CDEMPRESA = P_EMPRESA
            AND G.CDINSCESTA = P_INSCESTA;
      EXCEPTION
         WHEN No_Data_Found THEN
            V_CDGRUPOFISC := NULL;
      END;
      IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
         IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
            SELECT MAX(CDTIPOOPER), COUNT(*)
              INTO V_CDTIPOOPER, V_CONTADOR
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC  = V_CDGRUPOFISC)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
               INTO V_CDARVPROD
               FROM ALIQUOTA A, PRODUTO P
               WHERE (CDIMPOSTO    = P_IMPOSTO)
                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                 AND (CDEMPRESA    = P_EMPRESA)
                 AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                 AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                 AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                 AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                 AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                 AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            END IF;
         ELSE /*Se imposto da nota*/
            SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
            INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
            FROM ALIQUOTA A
            WHERE (CDIMPOSTO    = P_IMPOSTO)
              AND (IDENTRSAIDAL = P_ENTRSAIDAL)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDINSCESTA   = RTRIM(P_INSCESTA))
              AND (CDGRUPOFISC  = V_CDGRUPOFISC)
              AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
              AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
              AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
              AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
              AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
              AND (A.CDPRODUTO IS NULL);
         END IF;
         IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL,C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         END IF;
      END IF;
      /*Por Cliente*/
      V_CDGRUPOFISC := NULL;
      BEGIN
         SELECT MAX(G.CDGRUPOFISC)
           INTO V_CDGRUPOFISC
           FROM GRFISIMPIECLIE G, (SELECT CDCLIENTE
                                     FROM NOTAFISCAL
                                    WHERE CDFILIAL = P_FILIAL
                                      AND NRLANCTONF = P_LANCTONF
                                      AND P_CDCLIENTE IS NULL
                                    UNION ALL
                                   SELECT CDCLIENTE
                                     FROM CLIENTE
                                    WHERE CDCLIENTE = P_CDCLIENTE) F
          WHERE G.CDIMPOSTO = P_IMPOSTO
            AND G.CDCLIENTE = F.CDCLIENTE
            AND G.CDEMPRESA = P_EMPRESA
            AND G.CDINSCESTA = P_INSCESTA;
      EXCEPTION
         WHEN No_Data_Found THEN
            V_CDGRUPOFISC := NULL;
      END;
      IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
         IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
            SELECT MAX(CDTIPOOPER), COUNT(*)
              INTO V_CDTIPOOPER, V_CONTADOR
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   = RTRIM(P_INSCESTA))
               AND (CDGRUPOFISC  = V_CDGRUPOFISC)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
               INTO V_CDARVPROD
               FROM ALIQUOTA A, PRODUTO P
               WHERE (CDIMPOSTO    = P_IMPOSTO)
                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                 AND (CDEMPRESA    = P_EMPRESA)
                 AND (CDINSCESTA   = RTRIM(P_INSCESTA))
                 AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                 AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                 AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                 AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                 AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            END IF;
         ELSE /*Se imposto da nota*/
            SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
            INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
            FROM ALIQUOTA A
            WHERE (CDIMPOSTO    = P_IMPOSTO)
              AND (IDENTRSAIDAL = P_ENTRSAIDAL)
              AND (CDEMPRESA    = P_EMPRESA)
              AND (CDINSCESTA   = RTRIM(P_INSCESTA))
              AND (CDGRUPOFISC  = V_CDGRUPOFISC)
              AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
              AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
              AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
              AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
              AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
              AND (A.CDPRODUTO IS NULL);
         END IF;
         IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM,
                           VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (CDTIPOOPER = V_CDTIPOOPER)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (CDTIPOOPER = V_CDTIPOOPER)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, CDTIPOOPERTMP, VR1PREDBCTMP, CDINSCESTAATMP,
                      VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA,
                      C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO = P.CDPRODUTO(+))
                       AND (P.CDARVPROD = V_CDARVPROD)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA A, PRODUTO P
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                               AND (P.CDARVPROD = V_CDARVPROD)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
               FOR C_ALIQUOTA IN (
                    SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                           CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                      FROM ALIQUOTA A, MENSALIQU M
                     WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                       AND (A.CDIMPOSTO = P_IMPOSTO)
                       AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                       AND (A.CDEMPRESA = P_EMPRESA)
                       AND (A.CDINSCESTA = RTRIM(P_INSCESTA))
                       AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                       AND (A.CDPRODUTO IS NULL)
                       AND ((A.CDPAISORIG = P_PAISORIG)
                       AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                       AND ((A.CDPAISDEST = P_PAISDEST)
                       AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                       AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                       AND ((A.VRINIFAIXA < V_VRITEMPROD)
                       AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                       AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                       AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                              FROM ALIQUOTA
                                             WHERE (CDIMPOSTO = P_IMPOSTO)
                                               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                               AND (CDEMPRESA = P_EMPRESA)
                                               AND (CDINSCESTA = RTRIM(P_INSCESTA))
                                               AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                               AND (CDPRODUTO IS NULL)
                                               AND ((CDPAISORIG = P_PAISORIG)
                                               AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                               AND ((CDPAISDEST = P_PAISDEST)
                                               AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                               AND ((VRINIFAIXA < V_VRITEMPROD)
                                               AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                               AND (DTINIVALID <= P_INIVALID)))) LOOP
                  SELECT COUNT(*)
                    INTO V_EXISTE
                    FROM ALIQTEMP
                   WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  IF V_EXISTE > 0 THEN
                     DELETE FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                  END IF;
                  SELECT COUNT(*)
                    INTO V_COUNTMENS
                    FROM MENSAGEM
                   WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                     AND IDSITUACAOMENS = 'I';
                  IF V_COUNTMENS > 0 THEN
                     V_DSMENSALIQU := NULL;
                  ELSE
                     V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                  END IF;
                  INSERT INTO ALIQTEMP
                     (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                      VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                      IDPMCBSCALTMP, VR1PREDBCTMP, CDINSCESTAATMP, VRADICALIQFECP,
                      CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                  VALUES
                     (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                      C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                      C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.VR1PERREDBC, P_INSCESTA, C_ALIQUOTA.VRADICALIQFECP, 
                      C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                  V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
               END LOOP;
            END IF;
         END IF;
      END IF;
      /*------------------------IMPOSTOS FEDERAIS--------------------------------------*/
      SELECT COUNT(*)
        INTO V_COUNT
        FROM ALIQTEMP
       WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
      IF V_COUNT = 0 THEN
         IF P_CDGRUPOFISC IS NOT NULL THEN /*Se há grupo fiscal*/
            IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
               SELECT MAX(CDTIPOOPER), COUNT(*)
                 INTO V_CDTIPOOPER, V_CONTADOR
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               END IF;
            ELSE /*Se imposto da nota*/
               SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
                 INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
                 FROM ALIQUOTA A
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = P_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO IS NULL);
            END IF;
            IF V_CONTADOR > 0 THEN /*Se encontrou alíquota para o grupo fiscal*/
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto de maior nível*/
                     FOR C_ALIQUOTA IN (
                        SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST,
                               VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL,
                               IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                          FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                         WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                           AND (A.CDIMPOSTO = P_IMPOSTO)
                           AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                           AND (A.CDEMPRESA = P_EMPRESA)
                           AND (A.CDINSCESTA IS NULL)
                           AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                           AND (A.CDPRODUTO = P.CDPRODUTO(+))
                           AND (P.CDARVPROD = V_CDARVPROD)
                           AND ((A.CDPAISORIG = P_PAISORIG)
                           AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                           AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                           AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                           AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                           AND (CDTIPOOPER = V_CDTIPOOPER)
                           AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                   FROM ALIQUOTA A, PRODUTO P
                                                  WHERE (CDIMPOSTO = P_IMPOSTO)
                                                    AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                    AND (CDEMPRESA = P_EMPRESA)
                                                    AND (CDINSCESTA IS NULL)
                                                    AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                    AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                    AND (P.CDARVPROD = V_CDARVPROD)
                                                    AND ((CDPAISORIG = P_PAISORIG)
                                                    AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                    AND ((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                    AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                    AND ((VRINIFAIXA < V_VRITEMPROD) AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                    AND (CDTIPOOPER = V_CDTIPOOPER)
                                                    AND (DTINIVALID <= P_INIVALID)))) LOOP
                        SELECT COUNT(*)
                          INTO V_COUNTMENS
                          FROM MENSAGEM
                         WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                           AND IDSITUACAOMENS = 'I';
                        IF V_COUNTMENS > 0 THEN
                           V_DSMENSALIQU := NULL;
                        ELSE
                           V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                        END IF;
                        INSERT INTO ALIQTEMP
                           (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                            VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                            IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                            VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                        VALUES
                           (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                            C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                            C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                            C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                        V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                     END LOOP;
                  ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                     FOR C_ALIQUOTA IN (
                        SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                               CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                          FROM ALIQUOTA A, MENSALIQU
                         WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                           AND (A.CDIMPOSTO = P_IMPOSTO)
                           AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                           AND (A.CDEMPRESA = P_EMPRESA)
                           AND (A.CDINSCESTA IS NULL)
                           AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                           AND (A.CDPRODUTO IS NULL)
                           AND ((A.CDPAISORIG = P_PAISORIG)
                           AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                           AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                           AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                           AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                           AND (CDTIPOOPER = V_CDTIPOOPER)
                           AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                   FROM ALIQUOTA
                                                  WHERE (CDIMPOSTO = P_IMPOSTO)
                                                    AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                    AND (CDEMPRESA = P_EMPRESA)
                                                    AND (CDINSCESTA IS NULL)
                                                    AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                    AND (CDPRODUTO IS NULL)
                                                    AND ((CDPAISORIG = P_PAISORIG)
                                                    AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                    AND ((CDPAISDEST = P_PAISDEST)
                                                    AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                    AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                    AND ((VRINIFAIXA < V_VRITEMPROD)
                                                    AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                    AND (CDTIPOOPER = V_CDTIPOOPER)
                                                    AND (DTINIVALID <= P_INIVALID)))) LOOP
                        SELECT COUNT(*)
                          INTO V_COUNTMENS
                          FROM MENSAGEM
                         WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                           AND IDSITUACAOMENS = 'I';
                        IF V_COUNTMENS > 0 THEN
                           V_DSMENSALIQU := NULL;
                        ELSE
                           V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                        END IF;
                        INSERT INTO ALIQTEMP
                           (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                            VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                            IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                            VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                        VALUES
                           (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                            C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                            C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                            C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                        V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                     END LOOP;
                  END IF;
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto de maior nível*/
                     FOR C_ALIQUOTA IN (
                         SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                                VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                           FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                          WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                            AND (A.CDIMPOSTO = P_IMPOSTO)
                            AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                            AND (A.CDEMPRESA = P_EMPRESA)
                            AND (A.CDINSCESTA IS NULL)
                            AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                            AND (A.CDPRODUTO = P.CDPRODUTO(+))
                            AND (P.CDARVPROD = V_CDARVPROD)
                            AND ((A.CDPAISORIG = P_PAISORIG)
                            AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                            AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                            AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                            AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                            AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                            AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                    FROM ALIQUOTA A, PRODUTO P
                                                   WHERE (CDIMPOSTO = P_IMPOSTO)
                                                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                     AND (CDEMPRESA = P_EMPRESA)
                                                     AND (CDINSCESTA IS NULL)
                                                     AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                     AND (P.CDARVPROD = V_CDARVPROD)
                                                     AND ((CDPAISORIG = P_PAISORIG)
                                                     AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                     AND ((CDPAISDEST = P_PAISDEST) AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                     AND ((VRINIFAIXA < V_VRITEMPROD) AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                     AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                     AND (DTINIVALID <= P_INIVALID)))) LOOP
                        SELECT COUNT(*)
                          INTO V_COUNTMENS
                          FROM MENSAGEM
                         WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                           AND IDSITUACAOMENS = 'I';
                        IF V_COUNTMENS > 0 THEN
                           V_DSMENSALIQU := NULL;
                        ELSE
                           V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                        END IF;
                        INSERT INTO ALIQTEMP
                           (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                            VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                            IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                            CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                        VALUES
                           (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                            C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                            C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                            C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                        V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                     END LOOP;
                  ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                     FOR C_ALIQUOTA IN (
                        SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                               VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                          FROM ALIQUOTA A, MENSALIQU
                         WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                           AND (A.CDIMPOSTO = P_IMPOSTO)
                           AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                           AND (A.CDEMPRESA = P_EMPRESA)
                           AND (A.CDINSCESTA IS NULL)
                           AND (A.CDGRUPOFISC = P_CDGRUPOFISC)
                           AND (A.CDPRODUTO IS NULL)
                           AND ((A.CDPAISORIG = P_PAISORIG)
                           AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                           AND ((A.CDPAISDEST = P_PAISDEST) AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                           AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                           AND ((A.VRINIFAIXA < V_VRITEMPROD) AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                           AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                           AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                   FROM ALIQUOTA
                                                  WHERE (CDIMPOSTO = P_IMPOSTO)
                                                    AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                    AND (CDEMPRESA = P_EMPRESA)
                                                    AND (CDINSCESTA IS NULL)
                                                    AND (CDGRUPOFISC = P_CDGRUPOFISC)
                                                    AND (CDPRODUTO IS NULL)
                                                    AND ((CDPAISORIG = P_PAISORIG)
                                                    AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                    AND ((CDPAISDEST = P_PAISDEST)
                                                    AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                    AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                    AND ((VRINIFAIXA < V_VRITEMPROD)
                                                    AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                    AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                    AND (DTINIVALID <= P_INIVALID)))) LOOP
                        SELECT COUNT(*)
                          INTO V_COUNTMENS
                          FROM MENSAGEM
                         WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                           AND IDSITUACAOMENS = 'I';
                        IF V_COUNTMENS > 0 THEN
                           V_DSMENSALIQU := NULL;
                        ELSE
                           V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                        END IF;
                        INSERT INTO ALIQTEMP
                           (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                            VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                            IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                            CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                        VALUES
                           (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                            C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                            C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                            C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                        V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                     END LOOP;
                  END IF;
               END IF;
            END IF;
         ELSE /*Se não há grupo fiscal*/
            SELECT MAX(A.CDTIPOOPER)
              INTO V_CDTIPOOPER
              FROM ALIQUOTA A, PRODUTO P
             WHERE (CDIMPOSTO    = P_IMPOSTO)
               AND (IDENTRSAIDAL = P_ENTRSAIDAL)
               AND (CDEMPRESA    = P_EMPRESA)
               AND (CDINSCESTA   IS NULL)
               AND (CDGRUPOFISC IS NULL)
               AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
               AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
               AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
               AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
               AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
               AND (A.CDPRODUTO = P.CDPRODUTO(+))
               AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC IS NULL)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               SELECT MAX(P.CDARVPROD)
                 INTO V_CDARVPROD
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC IS NULL)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
            END IF;
            IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  FOR C_ALIQUOTA IN (
                     SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                            CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                       FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                      WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                        AND (A.CDIMPOSTO = P_IMPOSTO)
                        AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                        AND (A.CDEMPRESA = P_EMPRESA)
                        AND (A.CDINSCESTA IS NULL)
                        AND (A.CDGRUPOFISC IS NULL)
                        AND (A.CDPRODUTO = P.CDPRODUTO(+))
                        AND (P.CDARVPROD = V_CDARVPROD)
                        AND ((A.CDPAISORIG = P_PAISORIG)
                        AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                        AND ((A.CDPAISDEST = P_PAISDEST)
                        AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                        AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                        AND ((A.VRINIFAIXA < V_VRITEMPROD)
                        AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                        AND (CDTIPOOPER = V_CDTIPOOPER)
                        AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                FROM ALIQUOTA A, PRODUTO P
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA IS NULL)
                                                 AND (CDGRUPOFISC IS NULL)
                                                 AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                 AND (P.CDARVPROD = V_CDARVPROD)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST)
                                                 AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD)
                                                 AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (CDTIPOOPER = V_CDTIPOOPER)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                       (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                        VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                        IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                        VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                       (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                        C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                        C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                        C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  FOR C_ALIQUOTA IN (
                      SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                             CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                        FROM ALIQUOTA A, MENSALIQU, PRODUTO P
                       WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                         AND (A.CDIMPOSTO = P_IMPOSTO)
                         AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                         AND (A.CDEMPRESA = P_EMPRESA)
                         AND (A.CDINSCESTA IS NULL)
                         AND (A.CDGRUPOFISC IS NULL)
                         AND (A.CDPRODUTO = P.CDPRODUTO(+))
                         AND (P.CDARVPROD = V_CDARVPROD)
                         AND ((A.CDPAISORIG = P_PAISORIG)
                         AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                         AND ((A.CDPAISDEST = P_PAISDEST)
                         AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                         AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                         AND ((A.VRINIFAIXA < V_VRITEMPROD)
                         AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                         AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                         AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (CDGRUPOFISC IS NULL)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                       (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                        VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                        IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                        CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                       (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                        C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                        C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                        C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para todos*/
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se há alíquota por tipo de operação*/
                  FOR C_ALIQUOTA IN (
                     SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                            CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                       FROM ALIQUOTA A, MENSALIQU
                      WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                        AND (A.CDIMPOSTO = P_IMPOSTO)
                        AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                        AND (A.CDEMPRESA = P_EMPRESA)
                        AND (A.CDINSCESTA IS NULL)
                        AND (A.CDGRUPOFISC IS NULL)
                        AND (A.CDPRODUTO IS NULL)
                        AND ((A.CDPAISORIG = P_PAISORIG)
                        AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                        AND ((A.CDPAISDEST = P_PAISDEST)
                        AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                        AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                        AND ((A.VRINIFAIXA < V_VRITEMPROD)
                        AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                        AND (CDTIPOOPER = V_CDTIPOOPER)
                        AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                FROM ALIQUOTA
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA IS NULL)
                                                 AND (CDGRUPOFISC IS NULL)
                                                 AND (CDPRODUTO IS NULL)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST)
                                                 AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD)
                                                 AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (CDTIPOOPER = V_CDTIPOOPER)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  FOR C_ALIQUOTA IN (
                     SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                            CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                       FROM ALIQUOTA A, MENSALIQU
                      WHERE (A.NRALIQUOTA = MENSALIQU.NRALIQUOTA(+))
                        AND (A.CDIMPOSTO = P_IMPOSTO)
                        AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                        AND (A.CDEMPRESA = P_EMPRESA)
                        AND (A.CDINSCESTA IS NULL)
                        AND (A.CDGRUPOFISC IS NULL)
                        AND (A.CDPRODUTO IS NULL)
                        AND ((A.CDPAISORIG = P_PAISORIG)
                        AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                        AND ((A.CDPAISDEST = P_PAISDEST)
                        AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                        AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                        AND ((A.VRINIFAIXA < V_VRITEMPROD)
                        AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                        AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                        AND (A.DTINIVALID = ( SELECT MAX(DTINIVALID)
                                                FROM ALIQUOTA
                                               WHERE (CDIMPOSTO = P_IMPOSTO)
                                                 AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                 AND (CDEMPRESA = P_EMPRESA)
                                                 AND (CDINSCESTA IS NULL)
                                                 AND (CDGRUPOFISC IS NULL)
                                                 AND (CDPRODUTO IS NULL)
                                                 AND ((CDPAISORIG = P_PAISORIG)
                                                 AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                 AND ((CDPAISDEST = P_PAISDEST)
                                                 AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                 AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                 AND ((VRINIFAIXA < V_VRITEMPROD)
                                                 AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                 AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                 AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            END IF;
         END IF;
         /* Verificação das aliquotas referente as filiais parametrizadas na tela Parâmetros de Grupo Fiscal (Imposto/Filial) */
         V_CDGRUPOFISC := NULL;
         BEGIN
            SELECT MAX(G.CDGRUPOFISC)
              INTO V_CDGRUPOFISC
              FROM GRUPOFISCIMPFIL G, (SELECT DECODE(P_ENTRSAIDAL, 'E', CDFILIRECE, CDFILIEMIT) AS CDFILIAL
                                         FROM NOTAFISCAL
                                        WHERE CDFILIAL = P_FILIAL
                                          AND NRLANCTONF = P_LANCTONF
                                          AND P_IDSISTEMA IS NULL
                                          AND P_CDFILIRECE IS NULL
                                       UNION ALL
                                       SELECT CDFILIAL
                                         FROM PEDIDO
                                        WHERE CDFILIAL = SUBSTR(P_FILIAL,1,4)
                                          AND NRPEDIDO = SUBSTR(P_FILIAL,5,10)
                                          AND P_IDSISTEMA = 'PED'
                                        UNION ALL
                                       SELECT CDFILIAL
                                         FROM FILIAL
                                        WHERE CDFILIAL = P_CDFILIRECE) F
             WHERE G.CDIMPOSTO = P_IMPOSTO
               AND G.CDFILIAL = F.CDFILIAL;
         EXCEPTION
            WHEN No_Data_Found THEN
               V_CDGRUPOFISC := NULL;
         END;
         IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Filial*/
            IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
               SELECT MAX(CDTIPOOPER), COUNT(*)
                 INTO V_CDTIPOOPER, V_CONTADOR
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                      AND (CDEMPRESA    = P_EMPRESA)
                      AND (CDINSCESTA   IS NULL)
                      AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                      AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                      AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                      AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                      AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                      AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                      AND (A.CDPRODUTO = P.CDPRODUTO(+))
                      AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               END IF;
            ELSE /*Se imposto da nota*/
               SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
                 INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
                 FROM ALIQUOTA A
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO IS NULL);
            END IF;
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB,
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            END IF;
         END IF;
         ----------------------
         /* Verificação das aliquotas referente as filiais parametrizadas na tela Parâmetros de Grupo Fiscal (Imposto/Inscrição Estadual) */
         /*Por Fornecedor*/
         V_CDGRUPOFISC := NULL;
         BEGIN
            SELECT MAX(G.CDGRUPOFISC)
              INTO V_CDGRUPOFISC
              FROM GRFISIMPIEFORN G, (SELECT CDFORNECED
                                        FROM NOTAFISCAL
                                       WHERE CDFILIAL = P_FILIAL
                                         AND NRLANCTONF = P_LANCTONF
                                         AND P_CDFORNECED IS NULL
                                       UNION ALL
                                      SELECT CDFORNECED
                                        FROM FORNECEDOR
                                       WHERE CDFORNECED = P_CDFORNECED) F
             WHERE G.CDIMPOSTO = P_IMPOSTO
               AND G.CDFORNECED = F.CDFORNECED
               AND G.CDEMPRESA = P_EMPRESA
               AND G.CDINSCESTA = P_INSCESTA;
         EXCEPTION
             WHEN No_Data_Found THEN
                V_CDGRUPOFISC := NULL;
          END;
         IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
            IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
               SELECT MAX(CDTIPOOPER), COUNT(*)
                 INTO V_CDTIPOOPER, V_CONTADOR
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               END IF;
            ELSE /*Se imposto da nota*/
               SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
                 INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
                 FROM ALIQUOTA A
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO IS NULL);
            END IF;
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                    SELECT COUNT(*)
                      INTO V_EXISTE
                      FROM ALIQTEMP
                     WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                    IF V_EXISTE > 0 THEN
                       DELETE FROM ALIQTEMP
                       WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                    END IF;
                    SELECT COUNT(*)
                      INTO V_COUNTMENS
                      FROM MENSAGEM
                     WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                       AND IDSITUACAOMENS = 'I';
                    IF V_COUNTMENS > 0 THEN
                       V_DSMENSALIQU := NULL;
                    ELSE
                       V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                    END IF;
                    INSERT INTO ALIQTEMP
                       (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                        VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                        IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                        VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                    VALUES
                       (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                        C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                        C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                        C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                    V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            END IF;
         END IF;
         /*Por Cliente*/
         V_CDGRUPOFISC := NULL;
         BEGIN
            SELECT MAX(G.CDGRUPOFISC)
              INTO V_CDGRUPOFISC
              FROM GRFISIMPIECLIE G, (SELECT CDCLIENTE
                                        FROM NOTAFISCAL
                                       WHERE CDFILIAL = P_FILIAL
                                         AND NRLANCTONF = P_LANCTONF
                                         AND P_CDCLIENTE IS NULL
                                       UNION ALL
                                      SELECT CDCLIENTE
                                        FROM CLIENTE
                                       WHERE CDCLIENTE = P_CDCLIENTE) F
             WHERE G.CDIMPOSTO = P_IMPOSTO
               AND G.CDCLIENTE = F.CDCLIENTE
               AND G.CDEMPRESA = P_EMPRESA
               AND G.CDINSCESTA = P_INSCESTA;
         EXCEPTION
            WHEN No_Data_Found THEN
               V_CDGRUPOFISC := NULL;
         END;
         IF NOT (V_CDGRUPOFISC IS NULL) THEN /*Se há grupo fiscal na tela Parâmetros de Grupo Fiscal na aba Imposto/Inscrição Estadual*/
            IF V_IDPRODNOTA = w_P THEN /*Se imposto do item*/
               SELECT MAX(CDTIPOOPER), COUNT(*)
                 INTO V_CDTIPOOPER, V_CONTADOR
                 FROM ALIQUOTA A, PRODUTO P
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                  AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA  IS NULL)
                     AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (CDTIPOOPER = V_CDTIPOOPER OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
                  SELECT MAX(P.CDARVPROD)
                    INTO V_CDARVPROD
                    FROM ALIQUOTA A, PRODUTO P
                   WHERE (CDIMPOSTO    = P_IMPOSTO)
                     AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                     AND (CDEMPRESA    = P_EMPRESA)
                     AND (CDINSCESTA   IS NULL)
                     AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                     AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                     AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                     AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                     AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                     AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                     AND (A.CDPRODUTO = P.CDPRODUTO(+))
                     AND (INSTR(NVL(P_PRODUTO,'_'),NVL(RTRIM(P.CDARVPROD),NVL(P_PRODUTO,'_'))) = 1);
               END IF;
            ELSE /*Se imposto da nota*/
               SELECT MAX(A.CDPRODUTO), COUNT(*), MAX(CDTIPOOPER)
                 INTO V_CDARVPROD, V_CONTADOR, V_CDTIPOOPER
                 FROM ALIQUOTA A
                WHERE (CDIMPOSTO    = P_IMPOSTO)
                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                  AND (CDEMPRESA    = P_EMPRESA)
                  AND (CDINSCESTA   IS NULL)
                  AND (CDGRUPOFISC  = V_CDGRUPOFISC)
                  AND ((CDPAISORIG  = P_PAISORIG) AND (SGESTAORIG  = P_ESTAORIG) OR V_UTUFORIG = w_N)
                  AND ((CDPAISDEST  = P_PAISDEST) AND (SGESTADEST  = P_ESTADEST) OR V_UTUFDEST = w_N)
                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                  AND ((VRINIFAIXA  < V_VRITEMPROD) AND (VRFIMFAIXA  >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                  AND (A.CDPRODUTO IS NULL);
            END IF;
            IF NOT (V_CDTIPOOPER IS NULL) THEN /*Se possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, CDTIPOOPER, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL, A.CDTIPOOPER, CDMENSAGEM,
                              VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (CDTIPOOPER = V_CDTIPOOPER)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (CDTIPOOPER = V_CDTIPOOPER)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDTIPOOPERTMP, CDINSCESTAATMP, VR1PREDBCTMP,
                         VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, C_ALIQUOTA.CDTIPOOPER, NULL, C_ALIQUOTA.VR1PERREDBC, 
                         C_ALIQUOTA.VRADICALIQFECP, C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            ELSIF (V_CDTIPOOPER IS NULL) THEN /*Se não possui alíquota por tipo de operação*/
               IF NOT (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o maior nivel*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M, PRODUTO P
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO = P.CDPRODUTO(+))
                          AND (P.CDARVPROD = V_CDARVPROD)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA A, PRODUTO P
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (A.CDPRODUTO = P.CDPRODUTO(+))
                                                  AND (P.CDARVPROD = V_CDARVPROD)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               ELSIF (V_CDARVPROD IS NULL) THEN /*Se há alíquota para o produto todos*/
                  FOR C_ALIQUOTA IN (
                       SELECT A.NRALIQUOTA, VRPERREDBC, VR1PERREDBC, VRPARDEDUZ, VRALIQUOTA, DSMENSALIQU, IDTRATIMPST, VRPBCSUBTRIB, IDPMCBASECAL,
                              CDMENSAGEM, VRADICALIQFECP, CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF
                         FROM ALIQUOTA A, MENSALIQU M
                        WHERE (A.NRALIQUOTA = M.NRALIQUOTA(+))
                          AND (A.CDIMPOSTO = P_IMPOSTO)
                          AND (A.IDENTRSAIDAL = P_ENTRSAIDAL)
                          AND (A.CDEMPRESA = P_EMPRESA)
                          AND (A.CDINSCESTA IS NULL)
                          AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                          AND (A.CDPRODUTO IS NULL)
                          AND ((A.CDPAISORIG = P_PAISORIG)
                          AND (A.SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                          AND ((A.CDPAISDEST = P_PAISDEST)
                          AND (A.SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                          AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                          AND ((A.VRINIFAIXA < V_VRITEMPROD)
                          AND (A.VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                          AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                          AND (A.DTINIVALID = (SELECT MAX(DTINIVALID)
                                                 FROM ALIQUOTA
                                                WHERE (CDIMPOSTO = P_IMPOSTO)
                                                  AND (IDENTRSAIDAL = P_ENTRSAIDAL)
                                                  AND (CDEMPRESA = P_EMPRESA)
                                                  AND (CDINSCESTA IS NULL)
                                                  AND (A.CDGRUPOFISC = V_CDGRUPOFISC)
                                                  AND (CDPRODUTO IS NULL)
                                                  AND ((CDPAISORIG = P_PAISORIG)
                                                  AND (SGESTAORIG = P_ESTAORIG) OR V_UTUFORIG = w_N)
                                                  AND ((CDPAISDEST = P_PAISDEST)
                                                  AND (SGESTADEST = P_ESTADEST) OR V_UTUFDEST = w_N)
                                                  AND ((CDMUNIORIG   = P_MUNIORIG and V_UTMUNIORIG = w_O) OR (CDMUNIDEST   = P_MUNIORIG and V_UTMUNIORIG = w_D) OR (V_UTMUNIORIG = w_N))
                                                  AND ((VRINIFAIXA < V_VRITEMPROD)
                                                  AND (VRFIMFAIXA >= V_VRITEMPROD) OR V_UTFAIXVLR = w_N)
                                                  AND (INSTR(NVL(P_CDTIPOOPER,'_'), NVL(RTRIM(CDTIPOOPER), NVL(P_CDTIPOOPER,'_'))) = 1  OR V_IDUTALIQTPOPER = w_N)
                                                  AND (DTINIVALID <= P_INIVALID)))) LOOP
                     SELECT COUNT(*)
                       INTO V_EXISTE
                       FROM ALIQTEMP
                      WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     IF V_EXISTE > 0 THEN
                        DELETE FROM ALIQTEMP
                        WHERE NRALIQTEMP = P_FILIAL||P_LANCTONF;
                     END IF;
                     SELECT COUNT(*)
                       INTO V_COUNTMENS
                       FROM MENSAGEM
                      WHERE CDMENSAGEM = C_ALIQUOTA.CDMENSAGEM
                        AND IDSITUACAOMENS = 'I';
                     IF V_COUNTMENS > 0 THEN
                        V_DSMENSALIQU := NULL;
                     ELSE
                        V_DSMENSALIQU := C_ALIQUOTA.DSMENSALIQU;
                     END IF;
                     INSERT INTO ALIQTEMP
                        (NRALIQTEMP, NRSEQUALIQ, VRPREDBCTMP, VRPARDEDTMP,
                         VRALIQUTMP, DSMENSALITMP, IDTRIMPSTTMP, VRPBCSTTMP,
                         IDPMCBSCALTMP, CDINSCESTAATMP, VR1PREDBCTMP, VRADICALIQFECP,
                         CDBENEFFISCAL, IDCONSDIFALIQ, IDIMPODESONERA, IDCONSDESONVRNF)
                     VALUES
                        (P_FILIAL||P_LANCTONF, V_SEQUENCIA, C_ALIQUOTA.VRPERREDBC, C_ALIQUOTA.VRPARDEDUZ,
                         C_ALIQUOTA.VRALIQUOTA, V_DSMENSALIQU, C_ALIQUOTA.IDTRATIMPST, C_ALIQUOTA.VRPBCSUBTRIB, 
                         C_ALIQUOTA.IDPMCBASECAL, NULL, C_ALIQUOTA.VR1PERREDBC, C_ALIQUOTA.VRADICALIQFECP, 
                         C_ALIQUOTA.CDBENEFFISCAL, C_ALIQUOTA.IDCONSDIFALIQ, C_ALIQUOTA.IDIMPODESONERA, C_ALIQUOTA.IDCONSDESONVRNF);
                     V_SEQUENCIA := LPAD(RTRIM(V_SEQUENCIA + '01'),2,0);
                  END LOOP;
               END IF;
            END IF;
         END IF;
      END IF;
   END IF;
END;
/
CREATE OR REPLACE PROCEDURE CONSULTA_DESONERACAO(
   P_CDFILIAL IN VARCHAR2,
   P_NRLANCTONF IN VARCHAR2,
   P_CDPAISDEST IN VARCHAR2,
   P_SGESTADODEST IN VARCHAR2,
   P_VRDESONERA OUT FLOAT)
IS
   V_VRDESONERA FLOAT;
   V_CDDESTINO VARCHAR2(50);
   V_IDORIGDESTNF VARCHAR2(1);
   V_VRIMPOSTODESON FLOAT;
   V_CDPAISEMIT VARCHAR2(04);
   V_SGESTADOEMIT VARCHAR2(02);
   V_VRPERREDBCIT FLOAT;
   V_VRALIQNORMAL FLOAT;
BEGIN
   V_VRDESONERA := 0;
   BEGIN
      SELECT NVL(N.CDCLIENTE, NVL(N.CDFORNECED, DECODE(N.IDENTRSAIDOP, 'S', N.CDFILIRECE, N.CDFILIEMIT))) AS CDDESTINO, 
             N.IDORIGDESTNF,
             I.CDPAIS,
             I.SGESTADO          
        INTO V_CDDESTINO, 
             V_IDORIGDESTNF,
             V_CDPAISEMIT,
             V_SGESTADOEMIT
        FROM NOTAFISCAL N JOIN INSCRESTAD I ON (N.CDEMPRESA = I.CDEMPRESA)
                                           AND (N.CDINSCESTA = I.CDINSCESTA)
       WHERE N.CDFILIAL = P_CDFILIAL
         AND N.NRLANCTONF = P_NRLANCTONF;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_CDDESTINO := NULL;
         V_IDORIGDESTNF := NULL;
         V_CDPAISEMIT := NULL;
         V_SGESTADOEMIT := NULL;
      END;
   END;
   FOR C_ITEMPROIMPOS IN (SELECT IP.CDFILIAL, 
                                 IP.NRLANCTONF, 
                                 IP.NRSEQITPROD, 
                                 IP.CDIMPOSTO,
                                 NVL(IP.IDCONSDESONVRNF, 'N') AS IDCONSDESONVRNF,
                                 IP.VRIMPOSTOIT,
                                 IP.CDSITUTRIBITNFE,
                                 (IT.VRTOTAITEM - IT.VRDESCITEM) AS VRTOTAITEM,
                                 (IP.VRALIQITEM / 100) AS VRALIQITEM,
                                 (IP.VRPERREDBCIT / 100) AS VRPERREDBCIT
                            FROM ITEMPRODUTO IT LEFT JOIN ITEMPROIMPOS IP ON (IT.CDFILIAL = IP.CDFILIAL)
                                                                         AND (IT.NRLANCTONF = IP.NRLANCTONF)
                           WHERE IT.CDFILIAL = P_CDFILIAL
                             AND IT.NRLANCTONF = P_NRLANCTONF
                             AND IP.IDDESONERAREGRA = 'S'
                             AND IP.NRITPROIMPOS = '1')
   LOOP
      V_VRIMPOSTODESON := C_ITEMPROIMPOS.VRIMPOSTOIT;
      IF (V_CDPAISEMIT = '0055') AND (V_SGESTADOEMIT = 'RJ') THEN
         IF C_ITEMPROIMPOS.CDSITUTRIBITNFE IN ('20', '70') THEN
            IF (NVL(C_ITEMPROIMPOS.VRPERREDBCIT, 0) = 0) THEN
               BEGIN
                  SELECT (NVL(CONSULTA_QUADRO_ALIQUOTAS(V_SGESTADOEMIT, P_SGESTADODEST), 0) / 100)
                    INTO V_VRALIQNORMAL
                    FROM DUAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_VRALIQNORMAL := 0;
                  END;
               END;
               V_VRPERREDBCIT := 1 - (C_ITEMPROIMPOS.VRALIQITEM / V_VRALIQNORMAL);
            ELSE
               V_VRPERREDBCIT := 1 - C_ITEMPROIMPOS.VRPERREDBCIT;
            END IF;
            -- VALOR DO ICMS DESONERADO = PREÇO NA NOTA FISCAL * (1 - (ALÍQUOTA * (1 - PERCENTUAL DE REDUÇÃO DA BC))) / (1 - ALÍQUOTA) - PREÇO NA NOTA FISCAL
            V_VRIMPOSTODESON := ROUND(C_ITEMPROIMPOS.VRTOTAITEM * (1 - (C_ITEMPROIMPOS.VRALIQITEM * (1 - V_VRPERREDBCIT))) / (1 - C_ITEMPROIMPOS.VRALIQITEM) - C_ITEMPROIMPOS.VRTOTAITEM, 2);
         END IF;
         IF C_ITEMPROIMPOS.CDSITUTRIBITNFE IN ('30', '40') THEN
            -- VALOR DO ICMS DESONERADO = (PREÇO NA NOTA FISCAL / (1 - ALÍQUOTA)) * ALÍQUOTA
            V_VRIMPOSTODESON := ROUND((C_ITEMPROIMPOS.VRTOTAITEM / (1 - C_ITEMPROIMPOS.VRALIQITEM)) * C_ITEMPROIMPOS.VRALIQITEM, 2);
         END IF;
      END IF;
      IF C_ITEMPROIMPOS.IDCONSDESONVRNF = 'S' THEN
         V_VRDESONERA := V_VRDESONERA + V_VRIMPOSTODESON; --C_ITEMPROIMPOS.VRIMPOSTOIT;
      END IF;
      UPDATE ITEMPROIMPOS
         SET IDIMPDESONERAIT = CASE C_ITEMPROIMPOS.IDCONSDESONVRNF WHEN 'S' THEN 'S' ELSE 'N' END,
             VRIMPOSTODESON = V_VRIMPOSTODESON
       WHERE CDFILIAL = C_ITEMPROIMPOS.CDFILIAL
         AND NRLANCTONF = C_ITEMPROIMPOS.NRLANCTONF
         AND NRSEQITPROD = C_ITEMPROIMPOS.NRSEQITPROD
         AND CDIMPOSTO = C_ITEMPROIMPOS.CDIMPOSTO
         AND NRITPROIMPOS = '1';
      UPDATE TRABITPROIMPOS
         SET IDIMPDESOTRABIT = CASE C_ITEMPROIMPOS.IDCONSDESONVRNF WHEN 'S' THEN 'S' ELSE 'N' END
       WHERE CDFILIMPOIT = C_ITEMPROIMPOS.CDFILIAL
         AND NRLANCIMPOIT = C_ITEMPROIMPOS.NRLANCTONF
         AND NRSEQIMPOIT = C_ITEMPROIMPOS.NRSEQITPROD
         AND CDIMPOSTOIT = C_ITEMPROIMPOS.CDIMPOSTO;
      UPDATE IMPOSTONF
         SET IDIMPDESONERANF = CASE C_ITEMPROIMPOS.IDCONSDESONVRNF WHEN 'S' THEN 'S' ELSE 'N' END
       WHERE CDFILIAL = C_ITEMPROIMPOS.CDFILIAL
         AND NRLANCTONF = C_ITEMPROIMPOS.NRLANCTONF
         AND CDIMPOSTO = C_ITEMPROIMPOS.CDIMPOSTO;
      UPDATE ITEMPRODUTO
         SET VRCONTITEM = CASE C_ITEMPROIMPOS.IDCONSDESONVRNF WHEN 'S' THEN VRCONTITEM - V_VRIMPOSTODESON ELSE VRCONTITEM END
       WHERE CDFILIAL = C_ITEMPROIMPOS.CDFILIAL
         AND NRLANCTONF = C_ITEMPROIMPOS.NRLANCTONF
         AND NRSEQITPROD = C_ITEMPROIMPOS.NRSEQITPROD;
   END LOOP;
   FOR C_IMPOSTO IN (SELECT IT.CDFILIAL, 
                            IT.NRLANCTONF, 
                            IT.NRSEQITPROD, 
                            IT.CDPRODUTO,
                            IP.CDIMPOSTO, 
                            IP.CDFISCALIT, 
                            IP.IDIMPDESONERAIT, 
                            IP.VRIMPOSTOIT
                       FROM ITEMPRODUTO IT, ITEMPROIMPOS IP, IMPOSTO IM, PRODUTO PR
                      WHERE IP.CDFILIAL = IT.CDFILIAL
                        AND IP.NRLANCTONF = IT.NRLANCTONF
                        AND IP.NRSEQITPROD = IT.NRSEQITPROD
                        AND IM.CDIMPOSTO = IP.CDIMPOSTO
                        AND PR.CDPRODUTO = IT.CDPRODUTO
                        AND IT.CDFILIAL = P_CDFILIAL
                        AND IT.NRLANCTONF = P_NRLANCTONF
                        AND IM.IDDESONERAIMPO = 'S'
                        AND IP.NRITPROIMPOS = '1'
                        AND IP.IDDESONERAREGRA = 'N'
                        AND EXISTS (SELECT PC.CDPRODUTO, PC.CDCLIENTE AS DESTINO
                                      FROM PRODESONERAIMCLI PC, PRODUTO PRO
                                     WHERE PRO.CDPRODUTO = PC.CDPRODUTO
                                       AND PC.CDCLIENTE = V_CDDESTINO
                                       AND V_IDORIGDESTNF = 'C'
                                       AND INSTR(PR.CDARVPROD, NVL(RTRIM(PRO.CDARVPROD), PR.CDARVPROD)) = 1
                                     UNION ALL
                                    SELECT PF.CDPRODUTO, PF.CDFORNECED AS DESTINO
                                      FROM PRODESONERAIMFOR PF, PRODUTO PRO
                                     WHERE PRO.CDPRODUTO = PF.CDPRODUTO
                                       AND PF.CDFORNECED = V_CDDESTINO
                                       AND V_IDORIGDESTNF = 'F'
                                       AND INSTR(PR.CDARVPROD, NVL(RTRIM(PRO.CDARVPROD), PR.CDARVPROD)) = 1
                                     UNION ALL
                                    SELECT PL.CDPRODUTO, PL.CDFILIAL AS DESTINO
                                      FROM PRODESONERAIMFIL PL, PRODUTO PRO
                                     WHERE PRO.CDPRODUTO = PL.CDPRODUTO
                                       AND PL.CDFILIAL = V_CDDESTINO
                                       AND V_IDORIGDESTNF = 'L'
                                       AND INSTR(PR.CDARVPROD, NVL(RTRIM(PRO.CDARVPROD), PR.CDARVPROD)) = 1)) LOOP
      V_VRDESONERA := V_VRDESONERA + C_IMPOSTO.VRIMPOSTOIT;
      UPDATE ITEMPROIMPOS
         SET IDIMPDESONERAIT = 'S',
             VRIMPOSTODESON = C_IMPOSTO.VRIMPOSTOIT
       WHERE CDFILIAL = C_IMPOSTO.CDFILIAL
         AND NRLANCTONF = C_IMPOSTO.NRLANCTONF
         AND NRSEQITPROD = C_IMPOSTO.NRSEQITPROD
         AND CDIMPOSTO = C_IMPOSTO.CDIMPOSTO
         AND NRITPROIMPOS = '1';
      UPDATE TRABITPROIMPOS
         SET IDIMPDESOTRABIT = 'S'
       WHERE CDFILIMPOIT = C_IMPOSTO.CDFILIAL
         AND NRLANCIMPOIT = C_IMPOSTO.NRLANCTONF
         AND NRSEQIMPOIT = C_IMPOSTO.NRSEQITPROD
         AND CDIMPOSTOIT = C_IMPOSTO.CDIMPOSTO;
      UPDATE IMPOSTONF
         SET IDIMPDESONERANF = 'S'
       WHERE CDFILIAL = C_IMPOSTO.CDFILIAL
         AND NRLANCTONF = C_IMPOSTO.NRLANCTONF
         AND CDIMPOSTO = C_IMPOSTO.CDIMPOSTO;
      UPDATE ITEMPRODUTO
         SET VRCONTITEM = VRCONTITEM - C_IMPOSTO.VRIMPOSTOIT
       WHERE CDFILIAL = C_IMPOSTO.CDFILIAL
         AND NRLANCTONF = C_IMPOSTO.NRLANCTONF
         AND NRSEQITPROD = C_IMPOSTO.NRSEQITPROD;
   END LOOP;
   P_VRDESONERA := V_VRDESONERA;
END;
/
/*
 @C:\Web_619\Sql\End_Conv\Oracle\5102_DFSSTPO_Imposto_Saida.SQL
 Descrição:
 Procedure para geração dos impostos e valor final das notas de saída e dos valores contabéis
 Parâmetros
 P_EMPRESA     - Código da empresa
 P_PRODUTO     - Código de árvore do prduto(CDARVPROD)
 P_INSCESTA    - Inscrição estadual do lançamento
 P_TIPOOPER    - Tipo de operação do lançamento
 P_CLIENTE     - Código do destinatário da nota (CDCLIENTE, CDFORNECED ou CDFILIAL)
 P_FILIAL      - Código da filial do lançamento (CDFILIAL)
 P_LANCTONF    - Número do lançamento (NRLANCTONF)
 P_INIVALID    - Data de saída do lançamento
 P_VRNOTAFISC  - Valor final da nota
 P_LANCESTQ    - Número do lançamento de estoque
 P_CDOPERADOR  - Operador gravado na LANCTOESTOQ
 raise_application_error(-20501,  , True);
*/
CREATE OR REPLACE PROCEDURE IMPOSTO_SAIDA(
   P_EMPRESA    IN ALIQUOTA.CDEMPRESA%TYPE,
   P_INSCESTA   IN ALIQUOTA.CDINSCESTA%TYPE,
   P_TIPOOPER   IN INCIDENCIA.CDTIPOOPER%TYPE,
   P_CLIENTE    IN CLIENTE.CDCLIENTE%TYPE,
   P_FILIAL     IN NOTAFISCAL.CDFILIAL%TYPE,
   P_LANCTONF   IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_INIVALID   IN ALIQUOTA.DTINIVALID%TYPE,
   P_VRNOTAFISC OUT NUMBER,
   P_LANCESTQ   IN LANCTOESTOQ.NRLANCESTQ%TYPE DEFAULT NULL,
   P_CDOPERADOR IN LANCTOESTOQ.CDOPERADOR%TYPE DEFAULT NULL)
IS
   V_TESTE          VARCHAR2(50);
   V_IDTRATIMPO     VARCHAR2(01);
   V_PAISORIG       VARCHAR2(04); -- Pais de origem (utiliza UF de Origem)
   V_ESTAORIG       VARCHAR2(02); -- Estado de origem (utiliza UF de Origem)
   V_MUNIORIG       VARCHAR2(04); -- Municipio de origem (utiliza municipio)
   V_PAISDEST       VARCHAR2(04);
   V_ESTADEST       VARCHAR2(02);
   V_MUNIDEST       VARCHAR2(04);
   V_IDUTMUNIORIG   VARCHAR2(04);
   V_PAISCFOP       VARCHAR2(04);
   V_ESTACFOP       VARCHAR2(02);
   V_CDPAISST       VARCHAR2(04);
   V_SGESTADOST     VARCHAR2(02);
   V_CDMUNICIPIOST  VARCHAR2(04);
   V_CDINSCESTAST   VARCHAR2(16);
   V_ALIQTEMP       VARCHAR2(14);
   V_NRALIQTEMP     VARCHAR2(14);
   V_DADOADIC       VARCHAR2(03);
   V_INCITEMP       VARCHAR2(14);
   V_CST1DIGT       VARCHAR2(1);
   V_CSTTEMP        VARCHAR2(14);
   V_FISCALIT       VARCHAR2(20);
   V_CFOPTEMP       VARCHAR2(14);
   V_FISOPEITEM     VARCHAR2(11);
   V_SUFXCFOPPR     VARCHAR2(03);
   V_SITUTRIBPR     VARCHAR2(03);
   V_NRINSJURNF     VARCHAR2(20);
   V_SERIE          VARCHAR2(05);
   V_TIPOMOVI       VARCHAR2(01);
   V_CDFISCOPER     VARCHAR2(11);
   V_CDFILIEMIT     VARCHAR2(04);
   V_CDFILIRECE     VARCHAR2(04);
   V_ORIGDESTOP     VARCHAR2(01);
   V_CDFISOPENTF    VARCHAR2(11);
   V_IDENDCFOP      VARCHAR2(01);
   V_IDENDEMIS      VARCHAR2(01);
   V_CDEMPRESA      VARCHAR2(02);
   V_CDINSCESTA     VARCHAR2(16);
   V_CDINTEGRACAO   VARCHAR2(16);
   V_IDORIGDESTNF   VARCHAR2(01);
   V_NRLANBOLREC    VARCHAR2(10);
   V_IDDOCFINANC    VARCHAR2(01);
   V_IDERROAVISO    VARCHAR2(01);
   V_IDDOCREPLIC    VARCHAR2(14);
   V_IDDOCESTOQ     VARCHAR2(14);
   V_IDSISTEMA      VARCHAR2(03);
   V_IDRETPROEXP    VARCHAR2(01);
   V_IDATUEST       VARCHAR2(01);
   V_NMTIPOOPER     VARCHAR2(30);
   V_NMFILIRECE     VARCHAR2(60);
   V_DESCLANC       VARCHAR2(60);
   V_CDFISCTEMP     VARCHAR2(01);
   V_CDDETALHEPRODTEMP VARCHAR2(05);
   V_TRATIMPST      VARCHAR2(01);
   V_IDTRIMPSTII    VARCHAR2(01);
   V_CDIMPOSTRIB    VARCHAR2(250);
   V_CDIMPOSICMS    VARCHAR2(250);
   V_IDCTRLESTQ     VARCHAR2(01);
   V_CDFILIAPFATU   VARCHAR2(04);
   V_NRAPFATUTNF    VARCHAR2(10);
   V_IDITEMISSAO    VARCHAR2(01);
   V_CDIMPOBCALC    VARCHAR2(02);
   V_IDIMPOSTONF    VARCHAR2(01);
   V_IDVRIMPSTRIB   VARCHAR2(01);
   V_IDDEVOLIST     VARCHAR2(01);
   V_IDUTILALMOX    VARCHAR2(01);
   V_IDUTILLCESTQ   VARCHAR2(01);
   V_IDUTILLOTE     VARCHAR2(01);
   V_IDPMCBASECAL   VARCHAR2(01);
   V_IDTPCOMPPROD   VARCHAR2(01);
   V_NRINSJURCLIE   VARCHAR2(20);
   V_UTIBB          VARCHAR2(01);
   V_CDSITTRIBTMP    CODSITUTRIBNFE.CDSITUTRIBNFE%TYPE;
   V_IDMODBCNFE      CODSITUTRIBNFE.IDMODBCNFE%TYPE;
   V_IDMOTIDESSTNFE  CODSITUTRIBNFE.IDMOTIDESSTNFE%TYPE;
   V_IDMODBCSTNFE    CODSITUTRIBNFE.IDMODBCSTNFE%TYPE;
   V_CDTPCRPICOSTNFE CODSITUTRIBNFE.CDTPCRPICOSTNFE%TYPE;
   V_CDNATUBCPCSTNFE CODSITUTRIBNFE.CDNATUBCPCSTNFE%TYPE;
   V_CDSITUTRIBNFE     CODSITUTRIBNFE.CDSITUTRIBNFE%TYPE;
   V_IDMODBCNFEIT      CODSITUTRIBNFE.IDMODBCNFE%TYPE;
   V_IDMODBCSTNFEIT    CODSITUTRIBNFE.IDMODBCSTNFE%TYPE;
   V_CDTPCRPICOSTNFEIT CODSITUTRIBNFE.CDTPCRPICOSTNFE%TYPE;
   V_CDNATUBCPCSTNFEIT CODSITUTRIBNFE.CDNATUBCPCSTNFE%TYPE;
   V_IDINTEREST   VARCHAR2(01);
   V_IDCONSPARFIS VARCHAR2(01);
   V_CDFISCOPERSN ITEMPRODUTO.CDFISCOPERSN%TYPE;
   V_IDINTERNA VARCHAR2(01);
   V_PARDEDTMP    NUMBER;
   V_PREDBCTMP    NUMBER;
   V_ALIQUTMP     NUMBER;
   V_COUNT        NUMBER;
   V_ERROAVISO    NUMBER;
   V_LIQUIITEM    NUMBER;
   V_TOTALNOTA    NUMBER;
   V_LIQUIDO      NUMBER;
   V_SOMAENCA     NUMBER;
   V_MENOENCA     NUMBER;
   V_SOMAIMPO     NUMBER;
   V_MENOIMPO     NUMBER;
   V_TOTAPRODENCA NUMBER;
   V_TOTAPRENIMPO NUMBER;
   V_TOTAIMPBCALC NUMBER;
   V_TOTAIMPBCDES NUMBER;
   V_TAXABASECALC NUMBER;
   V_TAXABCSUBSTR NUMBER;
   V_TAXAALIQUOTA NUMBER;
   V_PRODUENCARGO NUMBER;
   V_SEQUIMPOSTNF NUMBER;
   V_SOMAITEM     NUMBER;
   V_DESCITEM     NUMBER;
   V_BASECALCIT   NUMBER;
   V_BASECALCTO   NUMBER;
   V_BASECALCIRRF NUMBER;
   V_PBCSUBTRIB   NUMBER;
   V_IMPOSTOIT    NUMBER;
   V_VRIMPOSTO    NUMBER;
   V_FATOCONV     NUMBER;
   V_TOTABRUT     NUMBER;
   V_SOMAIMPONF   NUMBER;
   V_DESCIMPONF   NUMBER;
   V_QTDELANCTO   NUMBER;
   V_VRUNITLANCTO NUMBER;
   V_VRTOTALANCTO NUMBER;
   V_TOTACONTAB   NUMBER;
   V_VRBRUTO      NUMBER;
   V_VRCONTAB     NUMBER;
   V_IMPOCONTAB   NUMBER;
   V_TOTIMPOCONT  NUMBER;
   V_TOTIMPOBRUT  NUMBER;
   V_CONTIMPO     NUMBER;
   V_IMPOSRETI    NUMBER;
   V_CONTABCALC   NUMBER;
   V_PERDBCALC    NUMBER;
   V_FAIXATOLER   NUMBER;
   V_NRDECITOTANF NUMBER;
   V_IMPOSINFUSU  NUMBER;
   V_VRCONTAREC   NUMBER;
   V_VRDIFERENCA  NUMBER;
   V_EXISTE_ROT   NUMBER;
   V_NRSEQITPROD  NUMBER;
   V_VRFATOCONV   NUMBER;
   V_VRLIQUORIG   NUMBER;
   V_VRPESOBRUTO  NUMBER;
   V_VRIMPOSTOST  NUMBER;
   V_VRREDUCAO    NUMBER;
   V_VALOR        NUMBER;
   V_VRTOTAITEM   NUMBER;
   V_SOMATOTAITEM NUMBER;
   V_PERCENTITEM  NUMBER;
   V_SOMAQITEMPROD  NUMBER;
   V_SOMAVRBRUTITEM NUMBER;
   V_SOMAVRCONTITEM NUMBER;
   V_CDGRUPOFISC  VARCHAR2(03);
   V_CDGRPFISCSV  VARCHAR2(03);
   V_UTGRUPFISCS  VARCHAR2(01);
   V_CDORIGDESTNF VARCHAR2(21);
   V_IDOPERDEVONF VARCHAR2(01);
   V_CHAVE        VARCHAR2(21);
   V_IMPOSTO      VARCHAR2(02);
   V_IDRECALCULO  VARCHAR2(01);
   V_CDFILIMOVI   VARCHAR2(04);
   V_CDTIPOOPER   VARCHAR2(02);
   V_CDENCDESCBONDEV VARCHAR2(02);
   V_CDAJUCTPAG   VARCHAR2(04);
   V_VRPEDESCFORN FLOAT;
   V_VRENCARBONI  FLOAT;
   V_IDCONDESBONFORN VARCHAR2(01);
   V_DTINIVRPDESC DATE;
   V_IMPOSDESONERA NUMBER;
   V_DIFERENCA     FLOAT;
   V_VRFRETEITEM   FLOAT;
   V_VRSEGURITEM   FLOAT;
   V_VRENCARGODESC FLOAT;
   V_SUMVRDESCITEM FLOAT;
   V_VROUTRASDESPITEM FLOAT;
   V_VRDESPADUANEIRA  FLOAT;
   V_DSCDFISOPEIT VARCHAR2(450);
   V_DTVINGENTE   DATE;
   V_DTINIREFEFAT DATE;
   V_ICMS         VARCHAR2(01);
   V_IMPOICMS     VARCHAR2(02);
   V_CDSITUCRT         VARCHAR2(01);
   V_CDSIMPLESNACIONAL VARCHAR2(5);
   V_RBT12             FLOAT; --RECEITA BRUTA TOTAL DOS ÚLTIMOS 12 MESES
   V_RBA               FLOAT; --RECEITA BRUTA ACUMULADA
   V_VRSUBLIMITESN     FLOAT;
   V_VRALIQSIMPLES     FLOAT;
   V_APROVICMS         FLOAT;
   V_ALIQAPROVICMS     FLOAT;
   V_SIMPLES           VARCHAR2(01);
   V_CDFAIXA           VARCHAR2(5);
   V_ESTORNOCANC       VARCHAR2(01);
   /*Alíquota do imposto que possui diferencial de alíquota*/
   V_DIFALIQ           FLOAT;
   V_CDFISCOPERREGRA     VARCHAR2(10);
   V_DSCDFISOPEITREGRA   VARCHAR2(50);
   V_IDDIFEALIQREGRA     VARCHAR2(10);
   V_IDDIFALIQCUSPRREGRA VARCHAR2(10);
   V_CFOPINFUSU          VARCHAR2(01);
   V_CFOP1DIGT           VARCHAR2(01);
   w_A            CHAR(1):= 'A';
   w_C            CHAR(1):= 'C';
   w_D            CHAR(1):= 'D';
   w_N            CHAR(1):= 'N';
   w_S            CHAR(1):= 'S';
   w_R            CHAR(1):= 'R';
   w_P            CHAR(1):= 'P';
   w_I            CHAR(1):= 'I';
   w_L            CHAR(1):= 'L';
   w_V            CHAR(1):= 'V';
   w_O            CHAR(1):= 'O';
   w_F            CHAR(1):= 'F';
   w_U            CHAR(1):= 'U';
   w_0            CHAR(1):= '0';
   w_1            CHAR(1):= '1';
   w_2            CHAR(1):= '2';
   w_3            CHAR(1):= '3';
   w_4            CHAR(1):= '4';
   w_5            CHAR(1):= '5';
   w_8            CHAR(1):= '8';
   w_9            CHAR(1):= '9';
   w_01           CHAR(2):= '01';
   w_03           CHAR(2):= '03';
   w_09           CHAR(2):= '09';
   w_11           CHAR(2):= '11';
   w_12           CHAR(2):= '12';
   w_90           CHAR(2):= '90';
   w_000          CHAR(3):= '000';
   w_001          CHAR(3):= '001';
   w_101          CHAR(3):= '101';
   w_00000        CHAR(5):= '00000';
   w_VMN          CHAR(3):= 'VMN';
   w_EXP          CHAR(3):= 'EXP';
   w_VND          CHAR(3):= 'VND';
   w_Av04         CHAR(4):= 'AV04';
   w_Av05         CHAR(4):= 'AV05';
   w_Av06         CHAR(4):= 'AV06';
   w_Av09         CHAR(4):= 'AV09';
   w_Av10         CHAR(4):= 'AV10';
   w_Er03         CHAR(4):= 'ER03';
   w_Er04         CHAR(4):= 'ER04';
   w_Er06         CHAR(4):= 'ER06';
   V_IDIMPOBCALTPOP  VARCHAR2(01);
   V_IDIMBCALTPOPDE  VARCHAR2(01);
   V_QTITEMPROD      FLOAT;
   V_CDIMPOSTO       VARCHAR2(02);
   V_IDUTCTRLLOTE    VARCHAR2(01);
   V_MEDIA           NUMBER;
   V_BCICMSSTRETIDO  FLOAT;
   V_VRICMSSTRETIDO  FLOAT;
   V_NRLOTEESTQ      VARCHAR2(20);
   V_EXISTDSDADOSADIC  INTEGER;
   V_BCICMSRET       FLOAT;
   V_ICMSRET         FLOAT;
   V_IDCALCPESONF    VARCHAR2(01);
   V_IDUTDESCICMS    VARCHAR2(01);
   V_CDREGRAITALIQ    VARCHAR2(10);
   V_CARGA            FLOAT;
   V_CDIMPOSRECALC    VARCHAR2(200);
   V_CDCFOPINFUSU     VARCHAR2(11);
   V_DSCFOPINFUSU     VARCHAR2(50);
   V_IDUTVLRQTDEIMPO  VARCHAR2(01);
   V_VRFATOCONVES     FLOAT;
   V_DTENTRSAID       DATE;
   V_CDIMPOSTOI       VARCHAR2(02);
   V_CDPRODUTO        VARCHAR2(10);
   V_VRIMPOSTOVISUIT  FLOAT;
   V_IDALTERADO_ENCA  VARCHAR2(01);
   V_CDGRUPOFISCAUX   VARCHAR2(03);
   V_CDIMPOSIPI        VARCHAR2(02);
   V_IDGERIPIDESPA     VARCHAR2(01);
   V_IDGERICMSTDESPA   VARCHAR2(01);
   V_VRTOTALIPI        FLOAT;
   V_CDENCARGOOD       VARCHAR2(02);
   V_VRTOTALICMSST     FLOAT;
   V_CDENCARGOICMST    VARCHAR2(02);
   V_IDPEINFICMSTDEME  VARCHAR2(01);
   V_VRENCAICMSSTIT    FLOAT;
   V_VRICMSST          FLOAT;
   V_VRBASECALC        FLOAT;
   V_SOMAVRNOTAFISC    FLOAT;
   V_IDUTCTRLFISSAID   VARCHAR2(01);
   V_IDUTCTRLFISFIL    VARCHAR2(01);
   V_IDUTCTRLFIS       VARCHAR2(01);
   V_IDPERVISIMPSCRE   VARCHAR2(01);
   V_VRIMPOSST         FLOAT;
   V_VRADICFECPST      FLOAT;
   V_VRADICFECPSTAUX   FLOAT;
   V_DIFEVRBRUTO       FLOAT;
   V_VRPERDIFERE       FLOAT;
   V_PERDIFERE         FLOAT;
   V_IMPOSTOOPERA      FLOAT;
   V_IMPOSTODIFER      FLOAT;
   V_IDCONTCONFORIG    VARCHAR2(01);
   V_IDDESCIMPRECCONT  VARCHAR2(01);
   V_IDIMPORECUP       VARCHAR2(01);
   V_CDCCTBLATIV       VARCHAR2(20);
   V_IDATUESTTPOP      TIPOOPERAC.IDATUESTTPOP%TYPE;
   V_IDREMESSAINDU     TIPOOPERAC.IDREMESSAINDU%TYPE;
   V_CDALMOXINFO       AGENTETERCECLI.CDALMOXINFOCLI%TYPE;
   V_CDLOCALINFO       AGENTETERCECLI.CDLOCALINFOCLI%TYPE;
   V_CDFILIALENTR      CTRLMOVIESTQ.CDFILIALENTR%TYPE;
   V_NRLANESTENTR      NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_NRCTRLMOVEST      NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_BOLANESTENTR      BOOLEAN := TRUE;
   V_DSENDEDEVOEMBA    VARCHAR2(255);
   V_CDENQLEGALIPI     VARCHAR2(03);
   V_CDCEST            VARCHAR2(09);
   /* variáveis para geração de entrada no estoque (filial agente de terceiração */
   V_CDFILIAGENT       VARCHAR2(04);
   V_BOLANESTENTRAG    BOOLEAN := TRUE;
   V_NRLANESTENTRAG    NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_CDALMOXARIFEAG    ALMOXARIFADO.CDALMOXARIFE%TYPE;
   V_CDLOCALESTOQAG    LOCALESTOQUE.CDLOCALESTOQ%TYPE;
   V_IDUTILLOTEAG      VARCHAR2(01);
   V_NRLOTEESTQAG      VARCHAR2(20);
   V_NRSUBLOTEAG       VARCHAR2(04);
   V_NRLANCTONFAG      VARCHAR2(20);
   V_IDTPIJURNF        VARCHAR2(01);
   V_CDEMPRESAAG       VARCHAR2(02);
   V_CDINSCESTAAG      VARCHAR2(16);
   V_CDINSCMUNIAG      VARCHAR2(16);
   V_CDFILIORIG        VARCHAR2(04);
   V_TPOPERRETORNO     VARCHAR2(02);
   V_IDUTORIGPROD       VARCHAR2(01);
   V_VRPRODUTOBC       FLOAT;
   V_VRALIQUTMPDEST    VARCHAR2(14);
   V_CDIMPOSTOICMS     VARCHAR2(02);
   V_VRIMPOSTOICMS     FLOAT;
   V_VRBASECALCICMS    FLOAT;
   V_IDIMPSTCARGTRIB   VARCHAR2(01);
   V_VRIMPOSTOOPERAIT  FLOAT;
   V_VRPERDIFEREIT     FLOAT;
   V_VRIMPOSTODIFERIT  FLOAT;
   V_CDPAISFCT      VARCHAR2(04);
   V_SGESTADOFCT    VARCHAR2(02);
   V_CDMUNICIPIOFCT VARCHAR2(04);
   V_QTDREGFCT      FLOAT;
   V_IDPRESENCIAL      VARCHAR2(01);
   V_IDUTILPVRIMPBC    VARCHAR2(01);
   V_VRADICALIQFECP    FLOAT(126);
   V_VRADICFECP        FLOAT(126);
   V_IDCONSFINAL       VARCHAR2(01);
   V_STRVRADICALIQFECP VARCHAR2(15);
   V_STRVRADICFECP     VARCHAR2(15);
   V_NRINSESTDESNF     VARCHAR2(20);
   V_IDCONTRIBICMS     VARCHAR2(01);
   V_IDCONTRIBICMSAUX  VARCHAR2(01);
   V_ALIQICMSDEST      FLOAT;
   V_ALIQFECPDEST      FLOAT;
   V_CDIMPOSTOFECP     VARCHAR2(02);
   V_IDDIFECLI         VARCHAR2(01);
   V_CDFILIALPED       VARCHAR2(04);
   V_NRPEDIDO          VARCHAR2(10);
   V_DADOSADICENDPED   VARCHAR2(400);
   V_IDPRODPERIG       VARCHAR2(01);
   V_MSGPRODPERIG      VARCHAR2(500);
   V_GRAVAMSGPRODPERIG INTEGER;
   V_IDCALCDIFALDENT   VARCHAR2(01);
   V_NRREGISTROANP     VARCHAR2(10);
   V_DSREGISTROANP     VARCHAR2(255);
   V_IDUTILVENC        VARCHAR2(01);
   V_IDNOTADEVO        VARCHAR2(01);
   V_IDNFAJUSTE        VARCHAR2(01);
   V_IDVERLEIAUTENFE   VARCHAR2(04);
   V_MAJORAOUREDUZ     VARCHAR2(01);
   /* Variáveis para geração dos encargos de acordo com os impostos relacionados na nota fiscal de origem(importação de XML) */
   V_VRENCARGOIMPXML NUMBER;
   V_VRIMPENCXMLORIG NUMBER;
   V_UPDENCIMPXML    VARCHAR2(01);
   V_NRSEQITORIG     VARCHAR2(04);
   V_NRACESSONFORIG  VARCHAR2(44);
   V_IDNFORIGVIAXML  VARCHAR2(01);
   V_VRIMPORETNF     FLOAT;
   V_VRIMPORELAC     FLOAT;
   V_IDOPTANTESNCLIE VARCHAR2(01);
   V_CDCNAECLIE      VARCHAR2(07);
   V_VRMVA           FLOAT;
   V_IDENDEMISTPOPFIL VARCHAR2(01);
   V_CDBENEFFISCAL    VARCHAR2(10);
   V_IDUTILNFSE      VARCHAR2(01);
   /* Variáveis prestação de serviço */
   V_CDPAISSERV      VARCHAR2(04);
   V_SGESTADOSERV    VARCHAR2(02);
   V_CDMUNICIPIOSERV VARCHAR2(04);
   V_QTDREGSERV      NUMBER;
   V_IDENDCFOPCLIPRES VARCHAR2(01);
   V_IDCONSMVAPMC VARCHAR2(01);
   V_IDCONSCOMPBCPMC VARCHAR2(01);
   V_IDCONSDIFALIQ VARCHAR2(01);
   V_VRADICFECPNFTOT FLOAT;
   V_IDIMPODESONERA  VARCHAR2(01);
   V_IDCONSDESONVRNF VARCHAR2(01);
   V_CDPAISEMIT      VARCHAR2(04);
   V_SGESTADOEMIT    VARCHAR2(02);
BEGIN
--VARIÁVEIS COM A CHAVE PARA AS TABELAS TEMPORÁRIAS
   V_ALIQTEMP := P_FILIAL||P_LANCTONF;/* ALIQUOTA */
   V_INCITEMP := P_FILIAL||P_LANCTONF;/* INCIDENCIA */
   V_CSTTEMP  := P_FILIAL||P_LANCTONF;/* CST */
   V_CFOPTEMP := P_FILIAL||P_LANCTONF;/* CFOP */
   V_TOTALNOTA  := 0; /*VALOR TOTAL DA NOTA*/
   V_FAIXATOLER := 0.02; /* FAIXA DE TOLERANCIA DE VALORES (CONSISTE VRNOTAFISC X VRPRODUTOS E VENCIMENTOS X VALOR TOTAL DA NOTA)*/
   V_VRADICALIQFECP := NULL;
   V_VRADICFECP := NULL;
   V_CDBENEFFISCAL := NULL;
   Begin
      SELECT N.NRINSJURNF,
             N.CDSERIE,
             N.CDFILIEMIT,
             N.CDFILIRECE,
             NVL(P.IDUTILALMOX, w_N),
             NVL(P.IDUTILLCESTQ, w_N),
             NVL(P.IDUTILLOTE, w_N),
             N.CDINTEGRACAO,
             N.IDORIGDESTNF,
             N.IDDOCFINANC,
             N.IDDOCREPLIC,
             N.IDSISTEMA,
             NVL(P.IDCTRLESTQ, w_S),
             N.DTINIREFEFAT,
             N.CDINSCESTA,
             N.CDEMPRESA,
             N.IDTPIJURNF,
             NVL(N.IDPRESENCIAL, w_9),
             NVL(I.IDVERLEIAUTENFE, '3.10'),
             NVL(CDSITUCRT, '3'),
             NVL(VRSUBLIMITESN, 0),
             I.CDPAIS,
             I.SGESTADO
        INTO V_NRINSJURNF,
             V_SERIE,
             V_CDFILIEMIT,
             V_CDFILIRECE,
             V_IDUTILALMOX,
             V_IDUTILLCESTQ,
             V_IDUTILLOTE,
             V_CDINTEGRACAO,
             V_IDORIGDESTNF,
             V_IDDOCFINANC,
             V_IDDOCREPLIC,
             V_IDSISTEMA,
             V_IDCTRLESTQ,
             V_DTINIREFEFAT,
             V_CDINSCESTA,
             V_CDEMPRESA,
             V_IDTPIJURNF,
             V_IDPRESENCIAL,
             V_IDVERLEIAUTENFE,
             V_CDSITUCRT,
             V_VRSUBLIMITESN,
             V_CDPAISEMIT,
             V_SGESTADOEMIT
        FROM NOTAFISCAL N, PARAMFILIAL P, INSCRESTAD I, PARAMEMPRESA PE
       WHERE N.CDFILIAL = P_FILIAL   
         AND N.NRLANCTONF = P_LANCTONF 
         AND N.CDFILIEMIT = P.CDFILIAL(+)
         AND N.CDEMPRESA = I.CDEMPRESA
         AND N.CDINSCESTA = I.CDINSCESTA
         AND N.CDEMPRESA = PE.CDEMPRESA(+);
   Exception
      When No_Data_Found Then
         V_NRINSJURNF := Null;
         V_SERIE := Null;
         V_CDFILIEMIT := Null;
         V_CDFILIRECE := Null;
         V_IDUTILALMOX := w_N;
         V_IDUTILLCESTQ := w_N;
         V_IDUTILLOTE := w_N;
         V_CDINTEGRACAO := Null;
         V_IDORIGDESTNF:= Null;
         V_IDDOCFINANC := Null;
         V_IDDOCREPLIC := Null;
         V_IDSISTEMA := Null;
         V_IDCTRLESTQ := w_S;
         V_DTINIREFEFAT := Null;
         V_CDINSCESTA := Null;
         V_CDEMPRESA := Null;
         V_IDTPIJURNF := NULL;
         V_IDPRESENCIAL := w_9;
         V_IDVERLEIAUTENFE := '3.10';
         V_CDSITUCRT := '3';
         V_VRSUBLIMITESN := 0;
         V_CDPAISEMIT := Null;
         V_SGESTADOEMIT := Null;
   End;
   /* LANCAMENTO DE ESTOQUE DO DOCUMENTO GERADO ATRAVES DE REPLICACAO */
   Begin
      SELECT CDFILIAL||NRLANCESTQ
      INTO   V_IDDOCESTOQ
      FROM LANCTOESTOQ
      WHERE CDFILIAL   = SUBSTR(V_IDDOCREPLIC, 1, 4) AND
            NRLANCTONF = SUBSTR(V_IDDOCREPLIC, 5, 10);
   Exception
      When No_Data_Found Then
         V_IDDOCESTOQ := Null;
   End;
   IF V_IDDOCESTOQ IS NULL THEN
      /* LANCAMENTO DE ESTOQUE DO DOCUMENTO GERADO ATRAVES DE INTEGRACAO (EX: IMPORTACAO DE NFS)*/
      Begin
         SELECT CDFILIAL||NRLANCESTQ
         INTO   V_IDDOCESTOQ
         FROM LANCTOESTOQ
         WHERE CDFILIAL   = SUBSTR(V_CDINTEGRACAO, 1, 4) AND
               NRLANCTONF = SUBSTR(V_CDINTEGRACAO, 5, 10);
      Exception
         When No_Data_Found Then
            V_IDDOCESTOQ := Null;
      End;
   END IF;
   /*NUMERO MAXIMO DE CASAS DECIMAIS*/
   SELECT NVL(NRDECITOTANF,2), 
          NVL(IDUTORIGPROD, 'N')
     INTO V_NRDECITOTANF, 
          V_IDUTORIGPROD
     FROM PARAMGERAL;
--MAIOR REGISTRO DA TABELA DE DADOS ADICIONAIS
   SELECT MAX(NRDADOADIC)
     INTO   V_DADOADIC
     FROM DADOSADIC
    WHERE (CDFILIAL   = P_FILIAL) AND
          (NRLANCTONF = P_LANCTONF);
   IF (V_DADOADIC IS NULL) THEN
      V_DADOADIC := W_001;
   ELSE
      V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
      /*GERA O PROXIMO SEQUENCIAL A SER INSERIDO*/
   END IF;
   FOR C_MENSINSC IN (SELECT M.CDMENSAGEM, I.DSMENSINSCRESTA
                        FROM MENSINSCRESTAD I LEFT JOIN MENSAGEM M ON (M.CDMENSAGEM = I.CDMENSAGEM)
                       WHERE (I.CDEMPRESA = P_EMPRESA)
                         AND (I.CDINSCESTA = P_INSCESTA)
                         AND (I.IDENTRSAIDMENS <> 'E')
                         AND (((I.CDMENSAGEM IS NOT NULL) AND (M.IDSITUACAOMENS  = 'A')) OR (I.CDMENSAGEM IS NULL))
                         AND NOT EXISTS (SELECT DSDADOADIC
                                           FROM DADOSADIC
                                          WHERE (CDFILIAL = P_FILIAL)
                                            AND (NRLANCTONF = P_LANCTONF)
                                            AND (DSDADOADIC LIKE I.DSMENSINSCRESTA || '%'))
                       ORDER BY I.NRMENSINSCRESTA) LOOP
      /*PREENCHE AS MENSAGENS ATRELADAS A INSCRICAO ESTADUAL*/
      INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, CDMENSAGEM, DSDADOADIC)
                     VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, C_MENSINSC.CDMENSAGEM, C_MENSINSC.DSMENSINSCRESTA);
      V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
   END LOOP;
   IF V_IDORIGDESTNF = 'C' THEN
      FOR C_MENSCLIENTE IN (SELECT M.CDMENSAGEM, C.DSMENSCLIENTE
                              FROM MENSCLIENTE C LEFT JOIN MENSAGEM M ON (M.CDMENSAGEM = C.CDMENSAGEM)
                             WHERE C.CDCLIENTE = P_CLIENTE
                               AND C.IDENTRSAIDMENS <> 'E'
                               AND (((C.CDMENSAGEM IS NOT NULL) AND (M.IDSITUACAOMENS  = 'A')) OR (C.CDMENSAGEM IS NULL))
                               AND NOT EXISTS (SELECT DSDADOADIC
                                                 FROM DADOSADIC
                                                WHERE (CDFILIAL = P_FILIAL)
                                                  AND (NRLANCTONF = P_LANCTONF)
                                                  AND (DSDADOADIC LIKE C.DSMENSCLIENTE || '%'))
                             ORDER BY C.NRMENSCLIENTE) 
      LOOP
         INSERT INTO DADOSADIC
            (CDFILIAL, 
             NRLANCTONF, 
             NRDADOADIC, 
             CDMENSAGEM, 
             DSDADOADIC)
         VALUES
            (P_FILIAL, 
             P_LANCTONF, 
             V_DADOADIC, 
             C_MENSCLIENTE.CDMENSAGEM, 
             C_MENSCLIENTE.DSMENSCLIENTE);
         V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
      END LOOP;
   END IF;
   BEGIN
      SELECT TRANSLATE(SUBSTR('Devolver as embalagens vazias no seguinte endereço: ' || 
             PRE.DSPOSTORECEMB ||
             ', ' || PRE.DSENDERECEMB || 
             CASE NVL(PRE.DSCOMPENDERECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE ', ' || PRE.DSCOMPENDERECEMB END ||
             ', ' || B.NMBAIRRO ||
             ', CEP:' || PRE.NRCEPRECEMB ||
             ', ' || M.NMMUNICIPIO ||
             ', ' || E.SGESTADO ||
             ', ' || P.NMPAIS ||
             CASE NVL(PRE.NRTELERECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE '. Telefone: ' || PRE.NRTELERECEMB END ||
             CASE NVL(PRE.NRFAXRECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE '. FAX: ' || PRE.NRFAXRECEMB END, 1, 255), 'áâãäæèïéìëíîçåñòóôöõàøúüûùýÁÂÃÄÆÈÏÉÌËÍÎÅÑÒÓÔÖÕÀØÚÜÛÙÝÇ', 'aaaaaeieieiicanoooooaouuuuyAAAAAEIEIEIIANOOOOOAOUUUUYC') AS DSENDEDEVOEMBA
        INTO V_DSENDEDEVOEMBA
        FROM NOTAFISCAL N JOIN ITEMPRODUTO I ON (N.CDFILIAL = I.CDFILIAL) AND
                                                (N.NRLANCTONF = I.NRLANCTONF)
                          JOIN PRODUTO PR ON (I.CDPRODUTO = PR.CDPRODUTO)
                          JOIN (SELECT P.CDPOSTORECEMB, PR.CDARVPROD
                                  FROM PRODPOSTORECEMB P JOIN PRODUTO PR ON (P.CDPRODUTO = PR.CDPRODUTO)) PPRE ON (INSTR(PR.CDARVPROD, NVL(RTRIM(PPRE.CDARVPROD), PR.CDARVPROD)) = 1)
                          JOIN CLIEPOSTORECEMB C ON (N.CDCLIENTE = C.CDCLIENTE) AND
                                                    (PPRE.CDPOSTORECEMB = C.CDPOSTORECEMB)
                          JOIN POSTORECEMB PRE ON (C.CDPOSTORECEMB = PRE.CDPOSTORECEMB)
                          JOIN PAIS P ON (PRE.CDPAIS = P.CDPAIS)
                          JOIN ESTADO E ON (PRE.CDPAIS = E.CDPAIS) AND
                                           (PRE.SGESTADO = E.SGESTADO)
                          JOIN MUNICIPIO M ON (PRE.CDPAIS = M.CDPAIS) AND
                                              (PRE.SGESTADO = M.SGESTADO) AND
                                              (PRE.CDMUNICIPIO = M.CDMUNICIPIO)
                          JOIN BAIRRO B ON (PRE.CDPAIS = B.CDPAIS) AND
                                           (PRE.SGESTADO = B.SGESTADO) AND
                                           (PRE.CDMUNICIPIO = B.CDMUNICIPIO) AND
                                           (PRE.CDBAIRRO = B.CDBAIRRO)
       WHERE N.CDFILIAL = P_FILIAL
         AND N.NRLANCTONF = P_LANCTONF
         AND NOT EXISTS (SELECT DSDADOADIC
                           FROM DADOSADIC
                          WHERE (CDFILIAL = P_FILIAL)
                            AND (NRLANCTONF = P_LANCTONF)
                            AND (DSDADOADIC LIKE TRANSLATE(SUBSTR('Devolver as embalagens vazias no seguinte endereço: ' || 
                                                 PRE.DSPOSTORECEMB ||
                                                 ', ' || PRE.DSENDERECEMB || 
                                                 CASE NVL(PRE.DSCOMPENDERECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE ', ' || PRE.DSCOMPENDERECEMB END ||
                                                 ', ' || B.NMBAIRRO ||
                                                 ', CEP:' || PRE.NRCEPRECEMB ||
                                                 ', ' || M.NMMUNICIPIO ||
                                                 ', ' || E.SGESTADO ||
                                                 ', ' || P.NMPAIS ||
                                                 CASE NVL(PRE.NRTELERECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE '. Telefone: ' || PRE.NRTELERECEMB END ||
                                                 CASE NVL(PRE.NRFAXRECEMB, '!X!X!') WHEN '!X!X!' THEN '' ELSE '. FAX: ' || PRE.NRFAXRECEMB END, 1, 255), 'áâãäæèïéìëíîçåñòóôöõàøúüûùýÁÂÃÄÆÈÏÉÌËÍÎÅÑÒÓÔÖÕÀØÚÜÛÙÝÇ', 'aaaaaeieieiicanoooooaouuuuyAAAAAEIEIEIIANOOOOOAOUUUUYC') || '%'));
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_DSENDEDEVOEMBA := NULL;
      WHEN TOO_MANY_ROWS THEN
         RAISE_APPLICATION_ERROR(-20501, 'Operação bloqueada. Existem mais de um posto de recolhimento de embalagens cadastradas no sistema.', TRUE);
   END;
   IF (V_DSENDEDEVOEMBA IS NOT NULL) THEN
      INSERT INTO DADOSADIC
         (CDFILIAL, 
          NRLANCTONF, 
          NRDADOADIC, 
          CDMENSAGEM, 
          DSDADOADIC)
      VALUES
         (P_FILIAL, 
          P_LANCTONF, 
          V_DADOADIC, 
          '',
          V_DSENDEDEVOEMBA);
      V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
   END IF;
   --VARIÁVEIS PARA CONSULTA DE ALÍQUOTA, INCIDÊNCIA, CFOP
   Begin
      SELECT NVL(IDENDCFOPFIL,w_I), CDEMPRESA,   CDINSCESTA
      INTO   V_IDENDCFOP,           V_CDEMPRESA, V_CDINSCESTA
      FROM FILIAL
      WHERE (CDFILIAL = V_CDFILIEMIT);
   Exception
      When No_Data_Found Then
         V_IDENDCFOP:= w_I; V_CDEMPRESA:= Null; V_CDINSCESTA:= Null;
   End;
   BEGIN
      SELECT NVL(IDENDEMISTPOPFIL, w_P)
        INTO V_IDENDEMISTPOPFIL
        FROM TIPOOPERACFIL
       WHERE IDENTRSAIDOP = w_S
         AND CDTIPOOPER = P_TIPOOPER
         AND CDFILIAL = V_CDFILIEMIT;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDENDEMISTPOPFIL := w_P;
   END;
   IF V_IDENDEMISTPOPFIL <> w_P THEN
      IF V_IDENDEMISTPOPFIL = w_I THEN
         BEGIN
            SELECT CDPAIS, 
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_PAISORIG,
                   V_ESTAORIG,
                   V_MUNIORIG
              FROM INSCRESTAD
             WHERE CDEMPRESA  = P_EMPRESA 
               AND CDINSCESTA = P_INSCESTA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISORIG := NULL; 
               V_ESTAORIG := NULL; 
               V_MUNIORIG := NULL;
         END;
      ELSE
         BEGIN
            SELECT CDPAIS,
                   SGESTADO,
                   CDMUNICIPIO
              INTO V_PAISORIG,
                   V_ESTAORIG,
                   V_MUNIORIG
              FROM ENDEFILI
             WHERE CDFILIAL     = V_CDFILIEMIT
               AND IDTPENDEFILI = V_IDENDEMISTPOPFIL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PAISORIG := NULL;
               V_ESTAORIG := NULL;
               V_MUNIORIG := NULL;
         END;
      END IF;
   ELSE   
      IF V_IDENDCFOP = w_I THEN
         Begin
            SELECT CDPAIS    , SGESTADO  , CDMUNICIPIO
            INTO   V_PAISORIG, V_ESTAORIG, V_MUNIORIG
            FROM INSCRESTAD
            WHERE CDEMPRESA  = P_EMPRESA AND
                  CDINSCESTA = P_INSCESTA;
         Exception
            When No_Data_Found Then
               V_PAISORIG := Null; V_ESTAORIG := Null; V_MUNIORIG := Null;
         End;
      ELSE
         Begin
            SELECT CDPAIS    , SGESTADO  , CDMUNICIPIO
            INTO   V_PAISORIG, V_ESTAORIG, V_MUNIORIG
            FROM ENDEFILI
            WHERE (CDFILIAL     = V_CDFILIEMIT) AND
                  (IDTPENDEFILI = V_IDENDCFOP);
         Exception
            When No_Data_Found Then
               V_PAISORIG := Null; V_ESTAORIG := Null; V_MUNIORIG := Null;
         End;
      END IF;
   END IF;
   /*DESTINATÁRIO-REMETENTE DA NOTA*/
   IF V_IDORIGDESTNF IS NULL THEN
      Begin
         SELECT IDORIGDESTOP
         INTO   V_ORIGDESTOP
         FROM TIPOOPERAC
         WHERE IDENTRSAIDOP = w_S AND
               CDTIPOOPER   = P_TIPOOPER;
      Exception
         When No_Data_Found Then
            V_ORIGDESTOP := Null;
      End;
   ELSE
      V_ORIGDESTOP := V_IDORIGDESTNF;
   END IF;
   V_CDORIGDESTNF := P_CLIENTE;
   V_IDCONSFINAL := w_N;
   IF V_ORIGDESTOP = w_L THEN /*DESTINATARIO -> FILIAL */
      Begin
         SELECT NVL(IDENDCFOPFIL,w_I), NVL(IDENDEMISFIL,w_I), CDEMPRESA  , CDINSCESTA
         INTO   V_IDENDCFOP          , V_IDENDEMIS          , V_CDEMPRESA, V_CDINSCESTA
         FROM FILIAL
         WHERE (CDFILIAL = V_CDFILIRECE);
      Exception
         When No_Data_Found Then
            V_IDENDCFOP := w_I; V_IDENDEMIS := w_I; V_CDEMPRESA := Null; V_CDINSCESTA := Null;
      End;
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
        INTO V_CDPAISST, V_SGESTADOST, V_CDMUNICIPIOST
        FROM ENDEFILI
       WHERE CDFILIAL = V_CDFILIRECE
         AND IDTPENDEFILI = 'P';
      SELECT MAX(CDINSCESTAST)
        INTO V_CDINSCESTAST
        FROM INSCRESTADST
       WHERE CDEMPRESA = P_EMPRESA
         AND CDINSCESTA = P_INSCESTA
         AND CDPAIS = V_CDPAISST
         AND SGESTADO = V_SGESTADOST;
      IF V_IDENDCFOP = w_I THEN
         Begin
            SELECT CDPAIS    , SGESTADO
            INTO   V_PAISCFOP, V_ESTACFOP
            FROM INSCRESTAD
            WHERE CDEMPRESA  = V_CDEMPRESA AND
                  CDINSCESTA = V_CDINSCESTA;
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null;
         End;
      ELSE
         Begin
            SELECT CDPAIS    , SGESTADO
            INTO   V_PAISCFOP, V_ESTACFOP
            FROM ENDEFILI
            WHERE (CDFILIAL     = V_CDFILIRECE) AND
                  (IDTPENDEFILI = V_IDENDCFOP);
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null;
         End;
      END IF;
      IF V_IDENDEMIS = w_I THEN
         Begin
            SELECT CDPAIS    , SGESTADO  , CDMUNICIPIO
            INTO   V_PAISDEST, V_ESTADEST, V_MUNIDEST
            FROM INSCRESTAD
            WHERE CDEMPRESA  = V_CDEMPRESA AND
                  CDINSCESTA = V_CDINSCESTA;
         Exception
            When No_Data_Found Then
               V_PAISDEST := Null; V_ESTADEST := Null; V_MUNIDEST := Null;
         End;
      ELSE
         Begin
            SELECT CDPAIS    , SGESTADO  , CDMUNICIPIO
            INTO   V_PAISDEST, V_ESTADEST, V_MUNIDEST
            FROM ENDEFILI
            WHERE CDFILIAL     = V_CDFILIRECE AND
                  IDTPENDEFILI = V_IDENDEMIS;
         Exception
            When No_Data_Found Then
               V_PAISDEST := Null; V_ESTADEST := Null; V_MUNIDEST := Null;
         End;
      END IF;
      V_CDORIGDESTNF := V_CDFILIRECE;
   ELSIF V_ORIGDESTOP = w_F THEN /*DESTINATARIO -> FORNECEDOR */
      BEGIN
         SELECT NVL(IDENDCFOPFOR,w_P), 
                NVL(IDENDEMISFOR,w_P),
                NVL(IDCONSFINAL,w_N),
                NRINSESTFORN,
                NVL(IDCONTRIBICMS,w_N)
           INTO V_IDENDCFOP,
                V_IDENDEMIS,
                V_IDCONSFINAL,
                V_NRINSESTDESNF,
                V_IDCONTRIBICMS
           FROM FORNECEDOR
          WHERE (CDFORNECED = P_CLIENTE);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDCFOP := w_P; 
            V_IDENDEMIS := w_P;
            V_IDCONSFINAL := w_N;
            V_NRINSESTDESNF := NULL;
            V_IDCONTRIBICMS := w_N;
      END;
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
        INTO V_CDPAISST, V_SGESTADOST, V_CDMUNICIPIOST
        FROM ENDEFORN
       WHERE CDFORNECED = P_CLIENTE
         AND IDTPENDEFORN = 'P';
      SELECT MAX(CDINSCESTAST)
        INTO V_CDINSCESTAST
        FROM INSCRESTADST
       WHERE CDEMPRESA = P_EMPRESA
         AND CDINSCESTA = P_INSCESTA
         AND CDPAIS = V_CDPAISST
         AND SGESTADO = V_SGESTADOST;
      IF V_IDENDCFOP = w_I THEN
         Begin
            SELECT CDPAIS    , SGESTADO
            INTO   V_PAISCFOP, V_ESTACFOP
            FROM INSCRESTAD
            WHERE CDEMPRESA  = P_EMPRESA AND
                  CDINSCESTA = P_INSCESTA;
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null;
         End;
      ELSE
         Begin
            SELECT CDPAIS    , SGESTADO
            INTO   V_PAISCFOP, V_ESTACFOP
            FROM ENDEFORN
            WHERE (CDFORNECED   = P_CLIENTE) AND
                  (IDTPENDEFORN = V_IDENDCFOP);
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null;
         End;
      END IF;
      Begin
         SELECT CDPAIS,     SGESTADO,   CDMUNICIPIO
         INTO   V_PAISDEST, V_ESTADEST, V_MUNIDEST
         FROM ENDEFORN
         WHERE (CDFORNECED   = P_CLIENTE) AND
               (IDTPENDEFORN = V_IDENDEMIS);
      Exception
         When No_Data_Found Then
            V_PAISDEST := Null; V_ESTADEST := Null; V_MUNIDEST := Null;
      End;
   ELSE /*DESTINATARIO -> CLIENTE(DEFAULT) */
      BEGIN
         SELECT NVL(IDENDCFOPCLI,w_P),
                NVL(IDENDEMISCLI,w_P),
                NVL(IDUTDESCICMS, w_N),
                NVL(IDCONSFINAL,w_N),
                NRINSESTCLIE,
                NVL(IDCONTRIBICMS,w_N),
                CDCNAECLIE,
                NVL(IDOPTANTESNCLIE,w_N),
                NVL(IDENDCFOPCLIPRES, 'I')
           INTO V_IDENDCFOP,
                V_IDENDEMIS,
                V_IDUTDESCICMS,
                V_IDCONSFINAL,
                V_NRINSESTDESNF,
                V_IDCONTRIBICMS,
                V_CDCNAECLIE,
                V_IDOPTANTESNCLIE,
                V_IDENDCFOPCLIPRES
           FROM CLIENTE
          WHERE (CDCLIENTE = P_CLIENTE);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDENDCFOP := w_P;
            V_IDENDEMIS := w_P;
            V_IDUTDESCICMS := w_N;
            V_IDCONSFINAL := w_N;
            V_NRINSESTDESNF := NULL;
            V_IDCONTRIBICMS := w_N;
            V_CDCNAECLIE := NULL;
            V_IDOPTANTESNCLIE := w_N;
            V_IDENDCFOPCLIPRES := 'I';
      END;
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
        INTO V_CDPAISST, V_SGESTADOST, V_CDMUNICIPIOST
        FROM ENDECLIE
       WHERE CDCLIENTE = P_CLIENTE
         AND IDTPENDECLIE = 'P';
      SELECT MAX(CDINSCESTAST)
        INTO V_CDINSCESTAST
        FROM INSCRESTADST
       WHERE CDEMPRESA = P_EMPRESA
         AND CDINSCESTA = P_INSCESTA
         AND CDPAIS = V_CDPAISST
         AND SGESTADO = V_SGESTADOST;
      IF V_IDENDCFOP = w_I THEN
         Begin
            SELECT CDPAIS    , SGESTADO, CDMUNICIPIO
            INTO   V_PAISCFOP, V_ESTACFOP, V_MUNIDEST
            FROM INSCRESTAD
            WHERE CDEMPRESA  = P_EMPRESA AND
                  CDINSCESTA = P_INSCESTA;
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null; V_MUNIDEST := Null;
         End;
         V_PAISDEST := V_PAISCFOP;
         V_ESTADEST := V_ESTACFOP;
      ELSE
         Begin
            SELECT CDPAIS    , SGESTADO
            INTO   V_PAISCFOP, V_ESTACFOP
            FROM ENDECLIE
            WHERE (CDCLIENTE    = P_CLIENTE) AND
                  (IDTPENDECLIE = V_IDENDCFOP);
         Exception
            When No_Data_Found Then
               V_PAISCFOP := Null; V_ESTACFOP := Null;
         End;
         Begin
            SELECT CDPAIS    , SGESTADO  , CDMUNICIPIO
            INTO   V_PAISDEST, V_ESTADEST, V_MUNIDEST
            FROM ENDECLIE
            WHERE (CDCLIENTE    = P_CLIENTE) AND
                  (IDTPENDECLIE = V_IDENDEMIS);
         Exception
            When No_Data_Found Then
               V_PAISDEST := Null; V_ESTADEST := Null; V_MUNIDEST := Null;
         End;
      END IF;
   END IF;
   IF (V_NRINSESTDESNF IS NULL) OR (V_NRINSESTDESNF = '') THEN
      V_IDCONTRIBICMSAUX := 'N';
   ELSE
      V_IDCONTRIBICMSAUX := V_IDCONTRIBICMS;
   END IF;
   IF (V_CDINSCESTAST IS NOT NULL) OR (V_CDINSCESTAST = '')  THEN
      UPDATE NOTAFISCAL
         SET CDINSCESTAST = V_CDINSCESTAST
       WHERE CDFILIAL = P_FILIAL
         AND NRLANCTONF = P_LANCTONF;
      FOR C_MENSINSCESTAST IN (SELECT M.CDMENSAGEM, I.DSMENSINSCESTAST
                                 FROM MENSINSCESTAST I LEFT JOIN MENSAGEM M ON (M.CDMENSAGEM = I.CDMENSAGEM)
                                WHERE I.CDEMPRESA = P_EMPRESA
                                  AND I.CDINSCESTA = P_INSCESTA
                                  AND I.CDINSCESTAST = V_CDINSCESTAST
                                  AND I.IDENTRSAIDMENSST <> 'E'
                                  AND (((I.CDMENSAGEM IS NOT NULL) AND (M.IDSITUACAOMENS  = 'A')) OR (I.CDMENSAGEM IS NULL))
                                  AND NOT EXISTS (SELECT DSDADOADIC
                                                    FROM DADOSADIC
                                                   WHERE (CDFILIAL = P_FILIAL)
                                                     AND (NRLANCTONF = P_LANCTONF)
                                                     AND (DSDADOADIC LIKE I.DSMENSINSCESTAST || '%'))
                                ORDER BY NRMENSINSCESTAST) LOOP
         /*PREENCHE AS MENSAGENS ATRELADAS A INSCRICAO ESTADUAL DO SUBSTITUTO TRIBUTÁRIO*/
         INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, CDMENSAGEM, DSDADOADIC)
                        VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, C_MENSINSCESTAST.CDMENSAGEM, C_MENSINSCESTAST.DSMENSINSCESTAST);
         V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
      END LOOP;
   END IF;
    -- PREENCHER CLASSIFICACAO FISCAL NCM NA TABELA ITEMPRODUTO
    FOR C_ITEMPRODUTO IN (SELECT I.CDFILIAL, I.NRLANCTONF, I.NRSEQITPROD, P.CDCLASFISC
                            FROM ITEMPRODUTO I, PRODUTO P
                           WHERE I.CDFILIAL   = P_FILIAL
                             AND I.NRLANCTONF = P_LANCTONF
                             AND I.CDPRODUTO = P.CDPRODUTO)
    LOOP
      UPDATE ITEMPRODUTO
         SET CDPRODNCMTRANS = C_ITEMPRODUTO.CDCLASFISC
       WHERE CDFILIAL    = C_ITEMPRODUTO.CDFILIAL
         AND NRLANCTONF  = C_ITEMPRODUTO.NRLANCTONF
         AND NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD;
   END LOOP;
   /*
   ROTINA PARA VERIFICAR AS NOTAS DO SISTEMA FACILITIES. NESTAS NOTAS O SISTEMA
   NÃO VERIFICARÁ O PAIS, O ESTADO E NEM O MUNICÍPIO DO DESTINATÁRIO DA NOTA FISCAL
   E SIM DO LOCAL DE ATENDIMENTO DAQUELA PRESTAÇÃO DE SERVIÇO
   */
   V_QTDREGFCT := 0;
   BEGIN
      SELECT CDPAIS,
             SGESTADO,
             CDMUNICIPIO,
             COUNT(*)
        INTO V_CDPAISFCT,
             V_SGESTADOFCT,
             V_CDMUNICIPIOFCT,
             V_QTDREGFCT
        FROM FCT_DADOSNF
       WHERE CDFILIAL = P_FILIAL
         AND NRLANCTONF = P_LANCTONF
       GROUP BY CDPAIS, 
             SGESTADO, 
             CDMUNICIPIO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDPAISFCT := NULL;
         V_SGESTADOFCT := NULL;
         V_CDMUNICIPIOFCT := NULL;
         V_QTDREGFCT := 0;
   END;
   IF (V_QTDREGFCT > 0) THEN
      V_PAISDEST := V_CDPAISFCT;
      V_ESTADEST := V_SGESTADOFCT;
      V_MUNIDEST := V_CDMUNICIPIOFCT;
   END IF;
   /*
   QUANDO A OPERAÇÃO DA NOTA FISCAL FOR PRESENCIAL O SISTEMA USARÁ COMO ENDEREÇO
   DE DESTINO O MESMO ENDEREÇO DA ORIGEM. ESTÁ CONDIÇÃO FOI NECESSÁRIA PARA ATENDER
   A NOTA TÉCNICA 2015/003
   */
   IF V_IDPRESENCIAL = W_1 THEN
      V_PAISDEST := V_PAISORIG;
      V_ESTADEST := V_ESTAORIG;
      V_MUNIDEST := V_MUNIORIG;
      -- Verificar identificador de endereço CFOP conforme operação presencial
      IF (NVL(V_IDORIGDESTNF, 'C') = 'C') THEN
         IF V_IDENDCFOPCLIPRES = w_I THEN
            Begin
               SELECT CDPAIS, SGESTADO
                 INTO V_PAISCFOP, V_ESTACFOP
                 FROM INSCRESTAD
                WHERE CDEMPRESA  = P_EMPRESA
                  AND CDINSCESTA = P_INSCESTA;
            Exception
               When No_Data_Found Then
                  V_PAISCFOP := Null; V_ESTACFOP := Null;
            End;
         ELSE
            Begin
               SELECT CDPAIS, SGESTADO
                 INTO V_PAISCFOP, V_ESTACFOP
                 FROM ENDECLIE
                WHERE CDCLIENTE    = P_CLIENTE
                  AND IDTPENDECLIE = V_IDENDCFOPCLIPRES;
            Exception
               When No_Data_Found Then
                  V_PAISCFOP := Null; V_ESTACFOP := Null;
            End;
         END IF;
      END IF;   
   END IF;
   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;
   IF ((V_IDSISTEMA = 'VND') OR (V_IDSISTEMA = 'PDV')) AND (NVL(V_IDORIGDESTNF, 'C') <> 'L') THEN
      UPDATE ITEMPRODUTO
      SET VRTOTAITEM = TRUNC(VRTOTAITEM,2)
      WHERE CDFILIAL   = P_FILIAL AND
            NRLANCTONF = P_LANCTONF;
   ELSE
      UPDATE ITEMPRODUTO
      SET VRTOTAITEM = ROUND(VRTOTAITEM,5)  
      WHERE CDFILIAL   = P_FILIAL AND
            NRLANCTONF = P_LANCTONF;
   END IF;
   SELECT SUM(VRLIQUIDO)
     INTO V_LIQUIDO
     FROM (SELECT DECODE(QTITEMPROD, 0, (VRTOTAITEM - VRDESCITEM), (ROUND(QTITEMPROD,4) * ROUND(VRUNITITEM,10)) - ROUND(VRDESCITEM, 2)) AS VRLIQUIDO
             FROM ITEMPRODUTO
            WHERE CDFILIAL   = P_FILIAL
              AND NRLANCTONF = P_LANCTONF);
   /*PREENCHE O GRUPO FISCAL*/
   IF V_IDORIGDESTNF = w_U THEN /*LICENCA DE USO*/
      CONSULTA_GRUPOFISCAL(w_C           , V_CDORIGDESTNF, V_CDFILIEMIT, w_S, P_TIPOOPER, V_CDGRUPOFISC);
   ELSE /*DEMAIS DESTINATARIOS*/
      CONSULTA_GRUPOFISCAL(V_IDORIGDESTNF, V_CDORIGDESTNF, V_CDFILIEMIT, w_S, P_TIPOOPER, V_CDGRUPOFISC);
   END IF;
   /*VERIFICA SE A NOTA UTILIZA DOCUMENTO DE ORIGEM E SE O TIPO DE OPERAÇÃO É DE ESTORNO DE CANCELAMENTO*/
   BEGIN
      SELECT IDOPERDEVONF, 
             IDCONSPARFIS, 
             IDNFESTCANC,
             IDCALCDIFALDENT,
             IDUTILVENC,
             IDNOTADEVO,
             IDNFAJUSTE,
             IDUTILNFSE,
             NVL(IDCONTCONFORIG, 'S')
        INTO V_IDOPERDEVONF, 
             V_IDCONSPARFIS, 
             V_ESTORNOCANC,
             V_IDCALCDIFALDENT,
             V_IDUTILVENC,
             V_IDNOTADEVO,
             V_IDNFAJUSTE,
             V_IDUTILNFSE,
             V_IDCONTCONFORIG
        FROM TIPOOPERAC
       WHERE IDENTRSAIDOP = w_S
         AND CDTIPOOPER = P_TIPOOPER;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_IDOPERDEVONF := w_N;
         V_IDCONSPARFIS := w_S;
         V_ESTORNOCANC := w_N;
         V_IDCALCDIFALDENT := w_N;
         V_IDUTILVENC := w_N;
         V_IDNOTADEVO := w_N;
         V_IDNFAJUSTE := w_N;
         V_IDUTILNFSE := w_N;
         V_IDCONTCONFORIG := w_S;
      END;
   END;
   IF (V_IDUTILNFSE = 'S') THEN
      V_QTDREGSERV := 0;
      BEGIN
         SELECT CDPAISPRESSERV,
                SGESTADOPRESSERV,
                CDMUNICIPRESSERV,
                COUNT(*)
           INTO V_CDPAISSERV,
                V_SGESTADOSERV,
                V_CDMUNICIPIOSERV,
                V_QTDREGSERV
           FROM DADOSERVPRES
          WHERE CDFILIAL   = P_FILIAL
            AND NRLANCTONF = P_LANCTONF
          GROUP BY CDPAISPRESSERV,
                   SGESTADOPRESSERV,
                   CDMUNICIPRESSERV;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDPAISSERV      := NULL;
            V_SGESTADOSERV    := NULL;
            V_CDMUNICIPIOSERV := NULL;
            V_QTDREGSERV      := 0;
      END;
       IF (V_QTDREGSERV > 0) THEN
         V_PAISDEST := V_CDPAISSERV;
         V_ESTADEST := V_SGESTADOSERV;
         V_MUNIDEST := V_CDMUNICIPIOSERV;
      END IF;
   END IF;
   IF V_IDOPERDEVONF <> w_S THEN  /*SE NAO UTILIZA DOCUMENTO DE ORIGEM*/
      IF ((V_IDSISTEMA = 'VND') OR (V_IDSISTEMA = 'PDV')) AND (NVL(V_IDORIGDESTNF, 'C') <> 'L') THEN
         UPDATE ITEMPRODUTO
         SET VRBRUTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2),
             VRCONTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2)
         WHERE CDFILIAL   = P_FILIAL   AND
               NRLANCTONF = P_LANCTONF;
      ELSE
         UPDATE ITEMPRODUTO
         SET VRBRUTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5),
             VRCONTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5)
         WHERE CDFILIAL   = P_FILIAL   AND
               NRLANCTONF = P_LANCTONF;
      END IF;
      V_IDOPERDEVONF := w_N;
   ELSE
      IF ((V_IDSISTEMA = 'VND') OR (V_IDSISTEMA = 'PDV')) AND (NVL(V_IDORIGDESTNF, 'C') <> 'L') THEN
         UPDATE ITEMPRODUTO
         SET VRBRUTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2),
             VRCONTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2)
         WHERE CDFILIAL   = P_FILIAL   AND
               NRLANCTONF = P_LANCTONF;
      ELSE
         UPDATE ITEMPRODUTO
         SET VRBRUTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5),
             VRCONTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5)
         WHERE CDFILIAL   = P_FILIAL   AND
               NRLANCTONF = P_LANCTONF;
      END IF;
      SELECT COUNT(*)
      INTO   V_COUNT
      FROM ITEMNOTAFISC
      WHERE CDFILIAL   = P_FILIAL AND
            NRLANCTONF = P_LANCTONF;
      V_IDDEVOLIST := w_N; /*SE O DOCUMENTO DE ORIGEM E DE LISTA OU NAO*/
      IF (V_COUNT > 1) THEN
         V_IDDEVOLIST := w_S;
      END IF;
      IF (V_COUNT = 0) THEN
         V_IDOPERDEVONF := w_N;
         IF ((V_IDSISTEMA = 'VND') OR (V_IDSISTEMA = 'PDV')) AND (NVL(V_IDORIGDESTNF, 'C') <> 'L') THEN
            UPDATE ITEMPRODUTO
            SET VRBRUTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2),
                VRCONTITEM   = TRUNC((VRTOTAITEM - VRDESCITEM),2)
            WHERE CDFILIAL   = P_FILIAL   AND
                  NRLANCTONF = P_LANCTONF;
         ELSE
            UPDATE ITEMPRODUTO
            SET VRBRUTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5),
                VRCONTITEM   = ROUND((VRTOTAITEM - VRDESCITEM),5)
            WHERE CDFILIAL   = P_FILIAL   AND
                  NRLANCTONF = P_LANCTONF;
         END IF;
      ELSE
         V_IDOPERDEVONF := w_S;
         IF (P_TIPOOPER = '03') OR (P_TIPOOPER = '05') OR (P_TIPOOPER = '11') THEN
            V_IDOPERDEVONF := w_N;
         END IF;
      END IF;
   END IF;
   DELETE 
     FROM DETESPCOMBNFE
    WHERE CDFILIAL = P_FILIAL
      AND NRLANCTONF = P_LANCTONF;
   /* GRAVA INFORMAÇÕES ADICIONAIS DO PRODUTO */
   V_IDPRODPERIG := 'N';
   FOR C_ITEMPRODINF IN (SELECT I.NRSEQITPROD, P.IDPRODPERIG, P.DSINFADICPROD, I.CDPRODUTO
                           FROM ITEMPRODUTO I, PRODUTO P
                          WHERE I.CDFILIAL = P_FILIAL
                            AND I.NRLANCTONF = P_LANCTONF
                            AND I.CDPRODUTO = P.CDPRODUTO)
   LOOP
      UPDATE ITEMPRODUTO
         SET DSINFADICPROD = C_ITEMPRODINF.DSINFADICPROD
       WHERE CDFILIAL = P_FILIAL
         AND NRLANCTONF = P_LANCTONF
         AND NRSEQITPROD = C_ITEMPRODINF.NRSEQITPROD;
      BEGIN
         SELECT NRREGISTROANP,
                DSREGISTROANP
           INTO V_NRREGISTROANP,
                V_DSREGISTROANP
           FROM INFADICPROD
          WHERE CDPRODUTO = C_ITEMPRODINF.CDPRODUTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_NRREGISTROANP := NULL;
            V_DSREGISTROANP := NULL;
      END;
      IF V_NRREGISTROANP IS NOT NULL THEN
         INSERT INTO DETESPCOMBNFE
            (CDFILIAL, NRLANCTONF, NRSEQITPROD, CDPAIS, 
             SGESTADO, CDPRODANP, DSPRODANP)
         VALUES
            (P_FILIAL, P_LANCTONF, C_ITEMPRODINF.NRSEQITPROD, V_PAISORIG, 
             V_ESTAORIG, SUBSTR(V_NRREGISTROANP, 1, 9), SUBSTR(V_DSREGISTROANP, 1, 255));
      END IF;
      IF C_ITEMPRODINF.IDPRODPERIG = 'S' THEN
         V_IDPRODPERIG := 'S';
      END IF;
   END LOOP;
   /* GRAVA MENSAGEM REFERENTE A PRODUTO PERIGOSO */
   IF V_IDPRODPERIG = 'S' THEN
      V_MSGPRODPERIG := 'Declaro que os produtos perigosos estão adequadamente ' ||
                        'classificados, embalados, identificados, e estivados ' ||
                        'para suportar os riscos das operações de transporte e ' ||
                        'que atendem às exigências da regulamentação.';
      BEGIN
         SELECT COUNT(DSDADOADIC)
           INTO V_GRAVAMSGPRODPERIG
           FROM DADOSADIC
          WHERE (CDFILIAL = P_FILIAL)
            AND (NRLANCTONF = P_LANCTONF)
            AND (DSDADOADIC LIKE SUBSTR(V_MSGPRODPERIG, 1, LENGTH(V_MSGPRODPERIG) - 19) || '%');
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_GRAVAMSGPRODPERIG := 0;
      END;
      IF (V_GRAVAMSGPRODPERIG = 0) THEN
         INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, CDMENSAGEM, DSDADOADIC)
                        VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, NULL, V_MSGPRODPERIG);
         V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
      END IF;
   End If;
   DELETE FROM DADOSADIC
    WHERE CDFILIAL = P_FILIAL
      AND NRLANCTONF = P_LANCTONF
      AND DSDADOADIC LIKE 'ICMS retido anteriormente por substituição tributária: BC %';
   DELETE FROM DADOSADIC
     WHERE CDFILIAL = P_FILIAL
       AND NRLANCTONF = P_LANCTONF
       AND DSDADOADIC LIKE 'Permite o aproveitamento do credito do ICMS no valor de R$ %';
-- ATUALIZAÇÃO DAS TABELAS DE NOTAFISCAL, ITEMPRODUTO E DADOS ADICIONAIS
   IF NOT(P_TIPOOPER IN ('03','07','09','10','12')) AND (V_IDOPERDEVONF <> w_S) THEN
   /*AS NOTAS QUE NAO UTILIZAM DOCUMENTO DE ORIGEM*/
      FOR C_ITEMPRODUTO IN (SELECT VRTOTAITEM, VRDESCITEM, IT.CDPRODUTO, NRSEQITPROD,
                                   CDCSTINFUSU, CDCFOPINFUSU, CDSUFXINFUSU, P.CDARVPROD,
                                   IT.QTITEMPROD, IT.IDORIGEMPROD, IT.VRUNITITEM
                            FROM ITEMPRODUTO IT, PRODUTO P
                            WHERE IT.CDFILIAL   = P_FILIAL   AND
                                  IT.NRLANCTONF = P_LANCTONF AND
                                  IT.CDPRODUTO  = P.CDPRODUTO) LOOP
         V_LIQUIITEM := C_ITEMPRODUTO.VRTOTAITEM - C_ITEMPRODUTO.VRDESCITEM;
         /*VERIFICA O CST POR ITEM*/
         CONSULTA_CST(w_S, P_EMPRESA, C_ITEMPRODUTO.CDARVPROD, P_INSCESTA, P_TIPOOPER, P_FILIAL, P_LANCTONF, V_CDGRUPOFISC, V_IDINTEREST, V_IDINTERNA, NULL, C_ITEMPRODUTO.IDORIGEMPROD);
         FOR C_CSTTEMP IN (SELECT DSMENSCSTTMP
                           FROM CSTTEMP
                           WHERE (NRCSTTEMP = V_CSTTEMP)    AND
                                 (DSMENSCSTTMP IS NOT NULL) AND
                                 (NOT EXISTS(SELECT DSDADOADIC
                                             FROM DADOSADIC
                                             WHERE (CDFILIAL   = P_FILIAL)   AND
                                                   (NRLANCTONF = P_LANCTONF) AND
                                                   (DSDADOADIC LIKE CSTTEMP.DSMENSCSTTMP || '%')))) LOOP
            IF NOT (C_CSTTEMP.DSMENSCSTTMP IS NULL) THEN
               /*PREENCHE AS MENSAGENS ATRELADAS AO CST*/
               INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
               VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, C_CSTTEMP.DSMENSCSTTMP);
               V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
            END IF;
         END LOOP;
         IF V_PAISORIG = V_PAISCFOP THEN
            IF V_ESTAORIG = V_ESTACFOP THEN
               V_CFOP1DIGT := '5';
            ELSE
               V_CFOP1DIGT := '6';
            END IF;
         ELSE
            V_CFOP1DIGT := '7';
         END IF;
         /*VERIFICA CFOP POR ITEM*/
         CONSULTA_CFOP(w_S, P_EMPRESA, C_ITEMPRODUTO.CDARVPROD, P_INSCESTA, P_TIPOOPER, V_PAISORIG,
                        V_ESTAORIG, V_PAISCFOP, V_ESTACFOP, P_FILIAL, P_LANCTONF, V_CDGRUPOFISC, P_INIVALID, C_ITEMPRODUTO.IDORIGEMPROD );
         FOR C_CFOPTEMP IN (SELECT DSMENSCFOTMP
                            FROM CFOPTEMP
                            WHERE (NRCFOPTEMP = V_CFOPTEMP)  AND
                                  (DSMENSCFOTMP IS NOT NULL) AND
                                  (NOT EXISTS(SELECT DSDADOADIC
                                              FROM DADOSADIC
                                              WHERE (CDFILIAL   = P_FILIAL)   AND
                                                    (NRLANCTONF = P_LANCTONF) AND
                                                    (DSDADOADIC LIKE CFOPTEMP.DSMENSCFOTMP || '%')))) LOOP
            IF NOT (C_CFOPTEMP.DSMENSCFOTMP IS NULL) THEN
               /*PREENCHE AS MENSAGENS ATRELADAS AO CFOP*/
               INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                              VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, C_CFOPTEMP.DSMENSCFOTMP);
               V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
            END IF;
         END LOOP;
         V_CFOPINFUSU := 'N';         
         IF C_ITEMPRODUTO.CDCFOPINFUSU IS NULL THEN /*SE NAO HOUVER CFOP INFORMADO PELO USUARIO PARA O PRODUTO*/
            /*SE A DESCRIÇÃO DO CFOP NAO TIVER SIDO INFORMADA PELO USUARIO O SISTEMA ASSUME A DESCRICAO DO CFOP DOS ITENS*/
            UPDATE NOTAFISCAL
               SET DSCDFISOPENF = (SELECT MAX(DSCFOPTMP) FROM CFOPTEMP
                                  WHERE NRCFOPTEMP = V_CFOPTEMP)
            WHERE CDFILIAL   = P_FILIAL   AND
                  NRLANCTONF = P_LANCTONF;
            SELECT MAX(CDFISOPETMP), MAX(CDSUFCFOPTMP), SUBSTR(MAX(DSCFOPTMP),1,50)
            INTO   V_FISOPEITEM    , V_SUFXCFOPPR, V_DSCDFISOPEIT
            FROM CFOPTEMP
            WHERE NRCFOPTEMP = V_CFOPTEMP;
            SELECT MAX(CDSITTRIBTMP)
            INTO   V_SITUTRIBPR
            FROM CSTTEMP
            WHERE NRCSTTEMP = V_CSTTEMP;
         ELSE /*SE HOUVER CFOP INFORMADO PELO USUARIO PARA O PRODUTO*/
            V_CFOPINFUSU := 'S';
            V_FISOPEITEM := C_ITEMPRODUTO.CDCFOPINFUSU;
            V_SUFXCFOPPR := C_ITEMPRODUTO.CDSUFXINFUSU;
            V_SITUTRIBPR := C_ITEMPRODUTO.CDCSTINFUSU;
         END IF;
         IF V_IDDOCREPLIC IS NOT NULL THEN /*SE A NF FOI REPLICADA*/
            IF LENGTH(V_SITUTRIBPR) = 3 THEN
               V_SITUTRIBPR := SUBSTR(V_SITUTRIBPR,1,1) || w_90;
            ELSE
               V_SITUTRIBPR := w_90;
            END IF;
         END IF;
         /*VERIFICA CSOSN POR IMPOSTO*/
         CONSULTA_CSOSN('S', P_EMPRESA, C_ITEMPRODUTO.CDARVPROD, P_INSCESTA, P_TIPOOPER, P_FILIAL, P_LANCTONF, V_CDGRUPOFISC, V_IDINTEREST, V_CDFISCOPERSN);
         UPDATE ITEMPRODUTO
         SET CDFISOPEITEM  = V_FISOPEITEM,
             CDSUFXCFOPPR  = V_SUFXCFOPPR,
             CDSITUTRIBPR  = V_SITUTRIBPR,
             DSCDFISOPEIT  = V_DSCDFISOPEIT,
             CDFISCOPERSN  = V_CDFISCOPERSN
         WHERE CDFILIAL    = P_FILIAL AND
               NRLANCTONF  = P_LANCTONF AND
               NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD;
         DELETE CFOPTEMP
         WHERE NRCFOPTEMP = V_CFOPTEMP;
         DELETE CSTTEMP
         WHERE NRCSTTEMP = V_CSTTEMP;
   -- ATUALIZAÇÃO DA TABELA DE IMPOSTOS POR ITEM.
         DELETE ITEMPROIMPOS
         WHERE (CDFILIAL    = P_FILIAL)   AND
               (NRLANCTONF  = P_LANCTONF) AND
               (NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD);
         DELETE ITEMPROIMPOSORIG
         WHERE (CDFILIAL    = P_FILIAL)   AND
               (NRLANCTONF  = P_LANCTONF) AND
               (NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD);
         SELECT COUNT(*)
         INTO   V_IMPOSINFUSU
         FROM IMPOSINFUSU
         WHERE (CDFILIAL    = P_FILIAL)   AND
               (NRLANCTONF  = P_LANCTONF) AND
               (NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD);
         IF V_IMPOSINFUSU = 0 THEN
-- Verifica se há grupo fiscal por servico
            SELECT MAX(CDGRUPOFISC)
            INTO V_CDGRPFISCSV
            FROM SERVCLIE SC, SERVICO S
            WHERE SC.CDFILIAL   = V_CDFILIEMIT AND
                  SC.CDCLIENTE  = P_CLIENTE    AND
                  SC.CDFILIAL   = S.CDFILIAL   AND
                  SC.CDSERVFILI = S.CDSERVFILI AND
                  S.CDPRODUTO   = C_ITEMPRODUTO.CDPRODUTO;
            IF V_CDGRPFISCSV IS NULL THEN
               -- Verifica se há grupo fiscal por cliente da filial
               SELECT MAX(CDGRUPOFISC)
               INTO V_CDGRPFISCSV
               FROM CLIENFILIAL
               WHERE CDFILIAL   = V_CDFILIEMIT AND
                     CDCLIENTE  = P_CLIENTE;
            END IF;
            CONSULTA_INCIDENCIA(w_S, P_EMPRESA, C_ITEMPRODUTO.CDARVPROD, P_INSCESTA, P_TIPOOPER, P_FILIAL, P_LANCTONF, V_CDGRUPOFISC, V_CDGRPFISCSV,
                                V_IDINTEREST, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, C_ITEMPRODUTO.IDORIGEMPROD);
            FOR C_INCITEMP IN (SELECT DSMENSINCTMP
                               FROM INCITEMP
                               WHERE (NRINCITEMP = V_INCITEMP)  AND
                                     (DSMENSINCTMP IS NOT NULL) AND
                                     (NOT EXISTS(SELECT DSDADOADIC
                                                 FROM DADOSADIC
                                                 WHERE (CDFILIAL   = P_FILIAL)   AND
                                                       (NRLANCTONF = P_LANCTONF) AND
                                                       (DSDADOADIC LIKE INCITEMP.DSMENSINCTMP || '%')))) LOOP
               IF NOT(C_INCITEMP.DSMENSINCTMP IS NULL) THEN
               /*PREENCHE AS MENSAGENS ATRELADAS A INCIDENCIA*/
                  INSERT INTO DADOSADIC(CDFILIAL, NRLANCTONF, NRDADOADIC, DSDADOADIC)
                                 VALUES(P_FILIAL, P_LANCTONF, V_DADOADIC, C_INCITEMP.DSMENSINCTMP);
                  V_DADOADIC := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_DADOADIC) + 1)),3,0);
               END IF;
            END LOOP;
            FOR C_INCIDENCIA IN (SELECT DISTINCT (CDIMPOTEMP) AS CDIMPOTEMP, CDFISCTEMP, IDTRATIMPTMP, IDUTMUNIORIG,
                                        IDCONSISTENT, IDIMPORECUP, IDUTVLRQTDEIMPO, CDDETALHEPROD,
                                        CDREGRATMP, IP.CDIMPOSTONFE, IT.CDENQLEGALIPI, IT.CDCEST,
                                        IT.VRADICALIQFECP, IP.CDIMPOBASERET, IP.IDDESCRFONTE , IP.IDDESONERAIMPO
                                 FROM INCITEMP IT, IMPOSTO IP
                                 WHERE (IT.NRINCITEMP = V_INCITEMP)    AND
                                       (IP.CDIMPOSTO  = IT.CDIMPOTEMP) AND
                                       (IP.IDPRODNOTA = w_P)
                                 ORDER BY CDIMPOTEMP) LOOP
               -- Se o imposto é retido (valor NF) e se utiliza o valor de outro imposto como base de cálculo
               IF ((C_INCIDENCIA.IDTRATIMPTMP = 'R') AND (C_INCIDENCIA.CDIMPOBASERET IS NOT NULL)) THEN
                  V_VRIMPORELAC := 0;
