SET DEFINE OFF;

-- SITIPOSAPONTAMENTO
CREATE TABLE SITIPOSAPONTAMENTO
  (
    tipoApontamento  CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SITIPOSAPONTAMENTO ADD CONSTRAINT SITIPOSAPONTAMENTO_PK1 PRIMARY KEY (tipoApontamento);
CREATE INDEX SITIPOSAPONTAMENTO_K2 ON SITIPOSAPONTAMENTO (descricao);
CREATE INDEX SITIPOSAPONTAMENTO_K3 ON SITIPOSAPONTAMENTO (ordenacao, tipoApontamento);

INSERT INTO SITIPOSAPONTAMENTO (tipoApontamento, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SITIPOSAPONTAMENTO (tipoApontamento, ordenacao, descricao, ativo, observacoes) values ('N', 1, 'Não Aponta', 1, ' ');
INSERT INTO SITIPOSAPONTAMENTO (tipoApontamento, ordenacao, descricao, ativo, observacoes) values ('T', 2, 'Término', 1, ' ');
INSERT INTO SITIPOSAPONTAMENTO (tipoApontamento, ordenacao, descricao, ativo, observacoes) values ('I', 3, 'Início e Término', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SITIPOSAPONTAMENTO', 'Tipos Apontamento', 1, 613, 'SI', 'tipoApontamento', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposApontamento', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (964, 'Tipos Apontamento', 1, 9090009540, 90, 'SIS', 0, 964, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposApontamento', ' ', 0, 0, NULL, ' ');

COMMIT;

INSERT INTO SICONTROLESESTOQUE (controleEstoque, descricao, ativo, observacoes) values (6,'06 Ficha Técnica',1,' ');

COMMIT;

-- CAGRADEPRODUTOXFICHAATIV
CREATE TABLE CAGRADEPRODUTOXFICHAATIV
  (
    gradeProdutoXFichaAtividade NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                   NUMERIC (11,0) DEFAULT 0 NOT NULL,
    atividadeServico            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ativo                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoApontamento             CHAR (1) DEFAULT ' ' NOT NULL,
    quantidade                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                 VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE CAGRADEPRODUTOXFICHAATIV ADD CONSTRAINT CAGRADEPRODUTOXFICHAATIV_PK1 PRIMARY KEY (gradeProdutoXFichaAtividade);
CREATE UNIQUE INDEX CAGRADEPRODUTOXFICHAATIV_K2 ON CAGRADEPRODUTOXFICHAATIV (gradeProduto, ordenacao);
CREATE INDEX CAGRADEPRODUTOXFICHAATIV_K3 ON CAGRADEPRODUTOXFICHAATIV (atividadeServico);
ALTER TABLE CAGRADEPRODUTOXFICHAATIV ADD CONSTRAINT CAGRADEPRODUTOXFICHAATIV_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXFICHAATIV ADD CONSTRAINT CAGRADEPRODUTOXFICHAATIV_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE CAGRADEPRODUTOXFICHAATIV ADD CONSTRAINT CAGRADEPRODUTOXFICHAATIV_FK3 FOREIGN KEY (tipoApontamento) REFERENCES SITIPOSAPONTAMENTO (tipoApontamento);

INSERT INTO CAGRADEPRODUTOXFICHAATIV (gradeProdutoXFichaAtividade, gradeProduto, ordenacao, atividadeServico, ativo, tipoApontamento, quantidade, observacoes) VALUES (0, 0, 0, 0, 1, ' ',  0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('CAGRADEPRODUTOXFICHAATIV', 'Grade Produto X Ficha Atividade', 1, 30830, 'CA', 'gradeProdutoXFichaAtividade', 'N', 14, ' ', 1, ' ', 0, 200005, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', ' ', 1, 1, ' '); 

COMMIT;

-- CAGRADEPRODUTOXFICHAPROD
CREATE TABLE CAGRADEPRODUTOXFICHAPROD
  (
    id                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProdutoXFichaAtividade NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                   NUMERIC (11,0) DEFAULT 0 NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ativo                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    quantidade                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                 VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE CAGRADEPRODUTOXFICHAPROD ADD CONSTRAINT CAGRADEPRODUTOXFICHAPROD_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX CAGRADEPRODUTOXFICHAPROD_K2 ON CAGRADEPRODUTOXFICHAPROD (gradeProdutoXFichaAtividade, ordenacao);
CREATE INDEX CAGRADEPRODUTOXFICHAPROD_K3 ON CAGRADEPRODUTOXFICHAPROD (gradeProdutoXFichaAtividade);
CREATE INDEX CAGRADEPRODUTOXFICHAPROD_K4 ON CAGRADEPRODUTOXFICHAPROD (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXFICHAPROD ADD CONSTRAINT CAGRADEPRODUTOXFICHAPROD_FK1 FOREIGN KEY (gradeProdutoXFichaAtividade) REFERENCES CAGRADEPRODUTOXFICHAATIV (gradeProdutoXFichaAtividade);
ALTER TABLE CAGRADEPRODUTOXFICHAPROD ADD CONSTRAINT CAGRADEPRODUTOXFICHAPROD_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

INSERT INTO CAGRADEPRODUTOXFICHAPROD (id, gradeProdutoXFichaAtividade, ordenacao, gradeProduto, ativo, quantidade, observacoes) VALUES (0, 0, 0, 0, 1, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('CAGRADEPRODUTOXFICHAPROD', 'Grade Produto X Ficha Produto', 1, 30831, 'CA', 'id', 'N', 14, ' ', 1, ' ', 0, 200005, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2024001005, '2024.1.5', TO_DATE ('21/10/2024', 'DD/MM/YYYY'), 1, 1, sysdate, ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('21/10/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 1' WHERE idVersaoSistema = 2024001005;

COMMIT;

-- FIM BETA 1 - 21/10/2024

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorTarifaCartao        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  /* Retornos */
  r_valorLiquidoSemFreteSeguro   OUT NUMBER,
  r_valorCaptacao                OUT NUMBER,
  r_valorTarifaCartao            OUT NUMBER,
  r_valorImpostos                OUT NUMBER,
  r_precoCusto                   OUT NUMBER,
  r_valorCusto                   OUT NUMBER,
  r_valorMargem                  OUT NUMBER,
  r_percentualMargem             OUT NUMBER)
IS
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             VARCHAR(10);
  v_prod_subcategoriaProduto     NUMBER;
  v_prod_marca                   NUMBER;
  v_prod_caracteristicaA         NUMBER;
  v_prod_caracteristicaB         NUMBER;
  v_prod_caracteristicaC         NUMBER;
  v_prod_caracteristicaD         NUMBER;
  v_prod_caracteristicaE         NUMBER;
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_controleEstoque         NUMBER;
  v_subCatProd_categoriaProduto  NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(256);    
BEGIN
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    prod.controleEstoque,
    subCatProd.categoriaProduto
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_subcategoriaProduto,
    v_prod_marca,
    v_prod_caracteristicaA,
    v_prod_caracteristicaB,
    v_prod_caracteristicaC,
    v_prod_caracteristicaD,
    v_prod_caracteristicaE,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_controleEstoque,
    v_subCatProd_categoriaProduto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  r_valorLiquidoSemFreteSeguro :=
    p_item_valorLiquidoItem
    - p_item_valorFreteItem
    - p_item_valorSeguroItem
    - p_item_valorFreteGeral
    - p_item_valorSeguroGeral
    - p_item_valorAdicFreteMarTotal
    - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO (
    p_cab_prazoMedioPonderado,
    p_regMarg_taxaCapitacaoCustoFi,
    r_valorLiquidoSemFreteSeguro);
  IF p_regMarg_reduzirTarifaCartao = 1
    AND p_cab_valorLiquidoItem <> 0
  THEN
    r_valorTarifaCartao :=
      CASE
        WHEN p_cab_valorLiquidoItem = 0
        THEN 0
        ELSE ROUND ((p_cab_valorTarifaCartao * p_item_valorLiquidoItem / p_cab_valorLiquidoItem), 2)
      END;
  ELSE
    r_valorTarifaCartao := 0;
  END IF;
  r_valorImpostos := 0;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos := FUNC_ADD_BUSCA_IMPOSTOS_MARGEM (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        p_cab_estabelecimento,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_modeloDocumento),
      p_cab_estabelecimento,
      p_munEndEst_uf,
      p_munEndPess_uf,
      p_item_quantidade,
      p_item_valorRetIRRF,
      p_item_valorRetCSLL,
      p_item_valorII,
      p_item_valorIOF,
      p_item_valorIPI,
      p_item_valorIPIDevolucao,
      p_item_valorPIS,
      p_item_valorPISST,
      p_item_valorCOFINS,
      p_item_valorCOFINSST,
      p_item_valorCreditoSimplesNac,
      p_item_valorICMSOperacao,
      p_item_valorICMSDiferido,
      p_item_valorICMS,
      p_item_valorICMSDesoneracao,
      p_item_valorICMSST,
      p_item_valorICMSUFDestinatario,
      p_item_valorICMSUFRemetente,
      p_item_valorFCP,
      p_item_valorFCPST,
      p_item_valorFCPSTAnteriormente,
      p_item_valorFCPUFDestinatario,
      r_valorLiquidoSemFreteSeguro,
      v_gradProd_produto,
      v_prod_subcategoriaProduto,
      v_prod_marca,
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_idNcm,
      v_prod_listaServicos,
      v_subCatProd_categoriaProduto);
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada, -- p_config_64_casasDecSaidas
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0, -- p_perfilUsuarioLogado
    0, -- p_usuarioLogado
    'E', -- p_cab_entradaSaida
    0, -- p_cab_devolucaoAnulacaoRetorno
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900', 'DD/MM/YYYY'), -- p_cab_dataPrecoInicial
    p_cab_dataEmissao, -- p_cab_dataPrecoFinal
    0, -- p_cab_pessoa
    ' ', -- p_cab_projeto
    0, -- p_modDoc_capituloNaturezaFisc
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf, -- p_endPessEst_uf
    p_munEndEst_uf, -- p_endPess_uf
    0, -- p_item_vendedor
    p_item_idFormulaTinta,
    p_item_personalizacao,
    0, -- p_item_localEstoque,
    0, -- p_item_pessoaParticipante,
    p_item_quantidade,
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    '0', -- v_locEst_indicadorPropPosseIt,
    0, -- p_manterPreco
    0, -- p_precoSugestaoAPrazoOriginal
    0, -- p_precoSugestaoAVistaOriginal
    ' ', -- p_tipoPreco
    ' ', -- p_tabelaPreco
    /* Retornos */
    v_auxVarchar, -- r_tipoPreco
    v_auxVarchar, -- r_tabelaPreco
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  r_valorCusto := ROUND ((p_item_quantidade * r_precoCusto),2);
  r_valorMargem :=
    r_valorLiquidoSemFreteSeguro
    - r_valorCaptacao
    - r_valorImpostos
    - r_valorTarifaCartao
    - r_valorCusto;
  r_percentualMargem :=
    CASE
      WHEN r_valorLiquidoSemFreteSeguro = 0
      THEN 0
      ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8)
    END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemDocFiscal = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_idDocumentoFiscal);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'D'
    AND idCabecalho = p_idDocumentoFiscal;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MODOCFISCALXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemDocFiscal = p_idItemDocFiscal
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'D'
      AND temp.idCabecalho = p_idDocumentoFiscal;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_idDocumentoFiscal;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MODOCFISCALXITENS a
    WHERE p_idItemDocFiscal = 0
    AND idDocumentoFiscal = p_idDocumentoFiscal
    OR p_idItemDocFiscal <> 0
    AND idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'D'                            orcamentoPredocumentoDocumento,
      p_idDocumentoFiscal            idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemOrcamento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_orcamento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'O'
    AND idCabecalho = p_orcamento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOORCAMENTOXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'O'
      AND temp.idCabecalho = p_orcamento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_orcamento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOORCAMENTOXITENS a
    WHERE p_idItemOrcamento = 0
    AND orcamento = p_orcamento
    OR p_idItemOrcamento <> 0
    AND idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_orcamento                    idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemPreDocumento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_preDocumento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'P'
    AND idCabecalho = p_preDocumento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOPREDOCUMXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemPreDocumento = p_idItemPreDocumento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'P'
      AND temp.idCabecalho = p_preDocumento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOPREDOCUMXITENS a
    WHERE p_idItemPreDocumento = 0
    AND preDocumento = p_preDocumento
    OR p_idItemPreDocumento <> 0
    AND idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'P'                            orcamentoPredocumentoDocumento,
      p_preDocumento                 idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

DROP PROCEDURE ADD_ORCAMENTO_INFO_CRIA;

create or replace PROCEDURE ADD_ORCAMENTO_INFO_GRAVA (
  p_estabelecimentoAtivo       IN NUMBER,
  p_id                         IN NUMBER,
  p_orcamento                  IN NUMBER,
  p_geradoPeloSistema          IN NUMBER,
  p_imprimir                   IN NUMBER,
  p_destaque                   IN NUMBER,
  p_informacaoComplementar     IN NUMBER,
  p_descInformacaoComplementar IN VARCHAR2,
  /* Retornos */
  r_id                         OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF (r_id = 0) THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXINFOCOMPLENT', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXINFOCOMPLENT a 
  USING (SELECT r_id id FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento = p_orcamento,
    a.geradoPeloSistema = p_geradoPeloSistema,
    a.imprimir = p_imprimir,
    a.destaque = p_destaque,
    a.informacaoComplementar = p_informacaoComplementar,
    a.descInformacaoComplementar = p_descInformacaoComplementar
  WHEN NOT MATCHED THEN INSERT (
    id,
    orcamento,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar)
  VALUES (
    r_id,
    p_orcamento,
    COALESCE ((
      SELECT MAX (sequencia)
      FROM MOORCAMENTOXINFOCOMPLENT
      WHERE orcamento = p_orcamento), 0) + 1,
    p_geradoPeloSistema,
    p_imprimir,
    p_destaque,
    p_informacaoComplementar,
    CASE WHEN RTRIM(p_descInformacaoComplementar) = '' THEN ' ' ELSE RTRIM(p_descInformacaoComplementar) END);
END ADD_ORCAMENTO_INFO_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_ETAPA_TROCA (
  p_usuarioLogado              IN NUMBER,
  p_estabelecimentoAtivo       IN NUMBER,
  p_person_190_modeloFrete     IN CHAR,
  p_config_378_calcularVolumes IN NUMBER,
  p_orcamento                  IN NUMBER,
  p_usuario                    IN NUMBER,
  p_novaEtapaOrcamento         IN NUMBER,
  p_justificativaCancelamento  IN VARCHAR,
  p_cancelandoOrcamento        IN NUMBER,
  p_colaboradorRespRecebimento IN NUMBER)
IS
  v_cab_etapaOrcamento      NUMBER;
  v_etOrc_situacaoOrcamento NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  SELECT situacaoOrcamento
  INTO v_etOrc_situacaoOrcamento
  FROM PAETAPASORCAMENTO
  WHERE etapaOrcamento = p_novaEtapaOrcamento;
  SELECT etapaOrcamento
  INTO v_cab_etapaOrcamento
  FROM MOORCAMENTOS
  WHERE orcamento = p_orcamento;
  IF v_cab_etapaOrcamento <> p_novaEtapaOrcamento THEN
    IF p_cancelandoOrcamento = 1
      OR v_etOrc_situacaoOrcamento = 90
    THEN
      IF NOT (p_justificativaCancelamento IS NULL)
        AND p_justificativaCancelamento <> ' '
      THEN
        ADD_ORCAMENTO_INFO_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_orcamento,
          0,
          0,
          0,
          0,
          p_justificativaCancelamento,
          /* Retornos */
          v_auxNumber);
      END IF;
      FOR a IN (
        SELECT idItemOrcamento
        FROM MOORCAMENTOXITENS
        WHERE orcamento = p_orcamento
        AND cancelado = 0)
      LOOP
        ADD_ORCAMENTO_ITEM_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_378_calcularVolumes,
          0,
          a.idItemOrcamento,
          'C',
          1,
          /* Retornos */
          v_auxVarchar,
          v_auxNumber);
      END LOOP;
      FOR a IN (
        SELECT idPagamentoOrcamento
        FROM MOORCAMENTOXPAGAMENTOS
        WHERE orcamento = p_orcamento)
      LOOP
        ADD_ORCAMENTO_PAG_EXCLUI_CORR (a.idPagamentoOrcamento);
        UPDATE MOORCAMENTOXPAGAMENTOS b
        SET b.saldoEfetivar = 0
        WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento;
      END LOOP;
    ELSIF v_etOrc_situacaoOrcamento <= 30 THEN
      FOR a IN (
        SELECT b.entrega
        FROM MOORCAMENTOXITENS a
        JOIN MOENTREGAS b
        ON b.idItemOrcamento = a.idItemOrcamento
        WHERE a.orcamento = p_orcamento
        AND a.cancelado = 0
        AND b.situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_CAB_ETAPA_TROCA');
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = p_novaEtapaOrcamento
    WHERE orcamento = p_orcamento;
    v_cab_etapaOrcamento := p_novaEtapaOrcamento;    
    ADD_ORCAMENTO_CAB_ETAPA_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_orcamento,
      p_usuario,
      p_novaEtapaOrcamento,
      ' ');
  END IF;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (
    p_orcamento,
    p_estabelecimentoAtivo);
  IF NOT (v_etOrc_situacaoOrcamento IN(11,90))
    AND p_cancelandoOrcamento = 0
  THEN
    FOR a IN (
      SELECT itemTransf.documentoTransferencia
      FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      JOIN MOORCAMENTOXITENS itemDoc
      ON itemDoc.idItemOrcamento = transfXDoc.idItemOrcamento
      WHERE itemDoc.orcamento = p_orcamento
      AND itemTransf.documentoTransferencia > 0
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND (cabTransf.colaboradorResponsavelRetirada = 0
        OR cabTransf.colaboradorResponsavelRecebim = 0)
      GROUP BY itemTransf.documentoTransferencia)
    LOOP
      ADD_DOCTRANSF_CAB_ENCERRA_REC (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferencia,
        p_colaboradorRespRecebimento);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_CAB_ETAPA_TROCA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_quantidade,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_movimentaEstoqueFiscal  NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_idEnderecoEstoque            NUMBER;
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
        AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_DOC_FISC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado,
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idEnderecoEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      ADD_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 14, p_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND ( v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 0)
        THEN
          r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        1, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_item_movimentaEstoqueFiscal,
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_item_somarICMSST,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        p_item_valorIPIDevolucao,
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    ELSE
    ADD_DOC_ATUALIZA_RESERVAS (
      p_estabelecimentoAtivo,
      v_cab_devolucaoAnulacaoRetorno,
      0, -- p_idItemPreDocumento
      r_item_idItemDocFiscal);
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        0,
        v_auxNumber);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'D',
      r_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MODOCFISCALXITENS
    SET observacoes = v_observacoes
    WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

-- Alguns clientes estavam sem este registro, então alterado para inserir novamente.
INSERT INTO SIREGIMESTRIBUTARIO (regimeTributario, descricao, ativo, observacoes) values ('4', '4 Simples Nacional - MEI', 1, ' ');

COMMIT;

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO (
  p_gradeProdutoDe   IN NUMBER,
  p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto);
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque);
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque);
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie);
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAATIV a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXFICHAATIV b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.ordenacao = a.ordenacao);
  UPDATE CAGRADEPRODUTOXFICHAATIV
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAPROD
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MODISTRIBUICAODFEXGRADE b
    WHERE b.distribuicaoDFe = a.distribuicaoDFe
    AND b.sequencia = a.sequencia
    AND b.gradeProduto = p_gradeProdutoPara);
  UPDATE MODISTRIBUICAODFEXGRADE a SET
    a.quantidade = a.quantidade + COALESCE ((
      SELECT SUM (b.quantidade)
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe), 0)
    WHERE a.gradeProduto = p_gradeProdutoPara
    AND EXISTS (
      SELECT 1
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe);
  DELETE MODISTRIBUICAODFEXGRADE
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie);
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante);
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1);
END ADD_TROCA_GRADEPRODUTO;

/

UPDATE SICONFIGURACOES SET observacoes = 'O sistema verificará todos os lotes com disponibilidade maior que zero no estabelecimento e local de estoque e irá sugerir o lote de menor validade.' WHERE configuracao = 422;

COMMIT;

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_personalizacao               IN NUMBER,
    p_quantidade                   IN NUMBER,
    p_valorProdutoServico          IN NUMBER,
    p_valorFreteTotal              IN NUMBER,
    p_valorSeguroTotal             IN NUMBER,
    p_valorDescontoTotal           IN NUMBER,
    p_valorOutrasDespesasTotal     IN NUMBER,
    p_valorAdicFreteMarinMerTotal  IN NUMBER,
    p_valorDespesasAduaneirasTotal IN NUMBER,
    p_cfop                         IN NUMBER,
    p_calcularISSQN                IN NUMBER,
    p_indicadorISSQN               IN CHAR,
    p_aliquotaISSQN                IN NUMBER,
    p_baseISSQN                    IN NUMBER,
    p_valorISSQN                   IN NUMBER,
    p_calcularRetencaoIRRF         IN NUMBER,
    p_retencaoIRRF                 IN NUMBER,
    p_baseRetIRRF                  IN NUMBER,
    p_valorRetIRRF                 IN NUMBER,
    p_calcularRetencaoINSS         IN NUMBER,
    p_retencaoINSS                 IN NUMBER,
    p_baseRetINSS                  IN NUMBER,
    p_valorRetINSS                 IN NUMBER,
    p_calcularRetencaoPIS          IN NUMBER,
    p_retencaoPIS                  IN NUMBER,
    p_baseRetPIS                   IN NUMBER,
    p_valorRetPIS                  IN NUMBER,
    p_calcularRetencaoCOFINS       IN NUMBER,
    p_retencaoCOFINS               IN NUMBER,
    p_baseRetCOFINS                IN NUMBER,
    p_valorRetCOFINS               IN NUMBER,
    p_calcularRetencaoCSLL         IN NUMBER,
    p_retencaoCSLL                 IN NUMBER,
    p_baseRetCSLL                  IN NUMBER,
    p_valorRetCSLL                 IN NUMBER,
    p_calcularRetencaoOutros       IN NUMBER,
    p_retencaoOutros               IN NUMBER,
    p_baseRetOutros                IN NUMBER,
    p_valorRetOutros               IN NUMBER,
    p_calcularII                   IN NUMBER,
    p_aliquotaII                   IN NUMBER,
    p_baseII                       IN NUMBER,
    p_valorII                      IN NUMBER,
    p_calcularIOF                  IN NUMBER,
    p_aliquotaIOF                  IN NUMBER,
    p_baseIOF                      IN NUMBER,
    p_valorIOF                     IN NUMBER,
    p_calcularIPI                  IN NUMBER,
    p_aliquotaIPI                  IN NUMBER,
    p_valorAliquotaIPI             IN NUMBER,
    p_baseIPI                      IN NUMBER,
    p_valorIPI                     IN NUMBER,
    p_valorIPIDevolucao            IN NUMBER,
    p_calcularPIS                  IN NUMBER,
    p_aliquotaPIS                  IN NUMBER,
    p_valorAliquotaPIS             IN NUMBER,
    p_basePIS                      IN NUMBER,
    p_valorPIS                     IN NUMBER,
    p_calcularPISST                IN NUMBER,
    p_aliquotaPISST                IN NUMBER,
    p_valorAliquotaPISST           IN NUMBER,
    p_basePISST                    IN NUMBER,
    p_valorPISST                   IN NUMBER,
    p_calcularCOFINS               IN NUMBER,
    p_aliquotaCOFINS               IN NUMBER,
    p_valorAliquotaCOFINS          IN NUMBER,
    p_baseCOFINS                   IN NUMBER,
    p_valorCOFINS                  IN NUMBER,
    p_calcularCOFINSST             IN NUMBER,
    p_aliquotaCOFINSST             IN NUMBER,
    p_valorAliquotaCOFINSST        IN NUMBER,
    p_baseCOFINSST                 IN NUMBER,
    p_valorCOFINSST                IN NUMBER,
    p_calcularSimplesNacional      IN NUMBER,
    p_stSimplesNacional            IN CHAR,
    p_creditoSimplesNacional       IN NUMBER,
    p_baseCreditoSimplesNacional   IN NUMBER,
    p_valorCreditoSimplesNacional  IN NUMBER,
    p_calcularICMS                 IN NUMBER,
    p_stICMS                       IN CHAR,
    p_modalidadeBaseCalcICMS       IN CHAR,
    p_reducaoBaseICMS              IN NUMBER,
    p_aliquotaICMS                 IN NUMBER,
    p_diferimentoICMS              IN NUMBER,
    p_baseICMS                     IN NUMBER,
    p_valorICMSOperacao            IN NUMBER,
    p_valorICMSDiferido            IN NUMBER,
    p_valorICMS                    IN NUMBER,
    p_valorICMSDesoneracao         IN NUMBER,
    p_calcularICMSST               IN NUMBER,
    p_modalidadeBaseCalcICMSST     IN CHAR,
    p_margemValorAdicionadoST      IN NUMBER,
    p_reducaoBaseST                IN NUMBER,
    p_aliquotaICMSST               IN NUMBER,
    p_baseICMSST                   IN NUMBER,
    p_valorICMSST                  IN NUMBER,
    p_calcularICMSSTAnterEfetivo   IN NUMBER,
    p_baseICMSSTAnteriormente      IN NUMBER,
    p_valorICMSSTAnteriormente     IN NUMBER,
    p_valorICMSProprioSubstituto   IN NUMBER,
    p_reducaoBaseICMSEfetivo       IN NUMBER,
    p_aliquotaICMSEfetivo          IN NUMBER,
    p_baseICMSEfetivo              IN NUMBER,
    p_valorICMSEfetivo             IN NUMBER,
    p_calcularICMSEscrituracao     IN NUMBER,
    p_stICMSEscrituracao           IN CHAR,
    p_reducaoBaseICMSEscrituracao  IN NUMBER,
    p_aliquotaICMSEscrituracao     IN NUMBER,
    p_diferimentoICMSEscrituracao  IN NUMBER,
    p_baseICMSEscrituracao         IN NUMBER,
    p_valorICMSEscrituracao        IN NUMBER,
    p_valorICMSDesonEscrituracao   IN NUMBER,
    p_calcularICMSSTEscrituracao   IN NUMBER,
    p_margemValorAdicSTEscriturac  IN NUMBER,
    p_reducaoBaseSTEscrituracao    IN NUMBER,
    p_aliquotaICMSSTEscrituracao   IN NUMBER,
    p_baseICMSSTEscrituracao       IN NUMBER,
    p_valorICMSSTEscrituracao      IN NUMBER,
    p_calcularDIFAL                IN NUMBER,
    p_aliquotaICMSUFDestinatario   IN NUMBER,
    p_aliquotaICMSInterestadual    IN NUMBER,
    p_partilhaICMSInterestadual    IN NUMBER,
    p_baseICMSUFDestinatario       IN NUMBER,
    p_valorICMSUFDestinatario      IN NUMBER,
    p_baseICMSUFRemetente          IN NUMBER,
    p_valorICMSUFRemetente         IN NUMBER,
    p_calcularFCP                  IN NUMBER,
    p_aliquotaFCP                  IN NUMBER,
    p_baseFCP                      IN NUMBER,
    p_valorFCP                     IN NUMBER,
    p_aliquotaFCPST                IN NUMBER,
    p_baseFCPST                    IN NUMBER,
    p_valorFCPST                   IN NUMBER,
    p_aliquotaFCPSTAnteriormente   IN NUMBER,
    p_baseFCPSTAnteriormente       IN NUMBER,
    p_valorFCPSTAnteriormente      IN NUMBER,
    p_aliquotaFCPUFDestinatario    IN NUMBER,
    p_baseFCPUFDestinatario        IN NUMBER,
    p_valorFCPUFDestinatario       IN NUMBER,
    p_calcularImpostosEstimados    IN NUMBER,
    p_aliquotaEstImpFederais       IN NUMBER,
    p_aliquotaEstImpEstaduais      IN NUMBER,
    p_aliquotaEstImpMunicipais     IN NUMBER,
    p_baseEstimadaImpostos         IN NUMBER,
    p_valorEstimadoImpFederais     IN NUMBER,
    p_valorEstimadoImpEstaduais    IN NUMBER,
    p_valorEstimadoImpMunicipais   IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    p_prod_precoPautaTabelado      IN NUMBER,
    /* Retornos */
    r_baseISSQN                    OUT NUMBER,
    r_valorISSQN                   OUT NUMBER,
    r_baseRetIRRF                  OUT NUMBER,
    r_valorRetIRRF                 OUT NUMBER,
    r_baseRetINSS                  OUT NUMBER,
    r_valorRetINSS                 OUT NUMBER,
    r_baseRetPIS                   OUT NUMBER,
    r_valorRetPIS                  OUT NUMBER,
    r_baseRetCOFINS                OUT NUMBER,
    r_valorRetCOFINS               OUT NUMBER,
    r_baseRetCSLL                  OUT NUMBER,
    r_valorRetCSLL                 OUT NUMBER,
    r_baseRetOutros                OUT NUMBER,
    r_valorRetOutros               OUT NUMBER,
    r_baseII                       OUT NUMBER,
    r_valorII                      OUT NUMBER,
    r_baseIOF                      OUT NUMBER,
    r_valorIOF                     OUT NUMBER,
    r_baseIPI                      OUT NUMBER,
    r_valorIPI                     OUT NUMBER,
    r_basePIS                      OUT NUMBER,
    r_valorPIS                     OUT NUMBER,
    r_basePISST                    OUT NUMBER,
    r_valorPISST                   OUT NUMBER,
    r_baseCOFINS                   OUT NUMBER,
    r_valorCOFINS                  OUT NUMBER,
    r_baseCOFINSST                 OUT NUMBER,
    r_valorCOFINSST                OUT NUMBER,
    r_baseCreditoSimplesNacional   OUT NUMBER,
    r_valorCreditoSimplesNacional  OUT NUMBER,
    r_baseICMS                     OUT NUMBER,
    r_valorICMSOperacao            OUT NUMBER,
    r_valorICMSDiferido            OUT NUMBER,
    r_valorICMS                    OUT NUMBER,
    r_valorICMSDesoneracao         OUT NUMBER,
    r_baseICMSST                   OUT NUMBER,
    r_valorICMSST                  OUT NUMBER,
    r_baseICMSSTAnteriormente      OUT NUMBER,
    r_valorICMSSTAnteriormente     OUT NUMBER,
    r_valorICMSProprioSubstituto   OUT NUMBER,
    r_baseICMSEfetivo              OUT NUMBER,
    r_valorICMSEfetivo             OUT NUMBER,
    r_baseICMSEscrituracao         OUT NUMBER,
    r_valorICMSEscrituracao        OUT NUMBER,
    r_valorICMSDesonEscrituracao   OUT NUMBER,
    r_baseICMSSTEscrituracao       OUT NUMBER,
    r_valorICMSSTEscrituracao      OUT NUMBER,
    r_baseICMSUFDestinatario       OUT NUMBER,
    r_valorICMSUFDestinatario      OUT NUMBER,
    r_baseICMSUFRemetente          OUT NUMBER,
    r_valorICMSUFRemetente         OUT NUMBER,
    r_baseFCP                      OUT NUMBER,
    r_valorFCP                     OUT NUMBER,
    r_baseFCPST                    OUT NUMBER,
    r_valorFCPST                   OUT NUMBER,
    r_baseFCPSTAnteriormente       OUT NUMBER,
    r_valorFCPSTAnteriormente      OUT NUMBER,
    r_baseFCPUFDestinatario        OUT NUMBER,
    r_valorFCPUFDestinatario       OUT NUMBER,
    r_baseEstimadaImpostos         OUT NUMBER,
    r_valorEstimadoImpFederais     OUT NUMBER,
    r_valorEstimadoImpEstaduais    OUT NUMBER,
    r_valorEstimadoImpMunicipais    OUT NUMBER)
IS
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
BEGIN
  /* Inicia retornos com paramentros */
  r_baseISSQN                   := p_baseISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseRetIRRF                 := p_baseRetIRRF;
  r_valorRetIRRF                := p_valorRetIRRF;
  r_baseRetINSS                 := p_baseRetINSS;
  r_valorRetINSS                := p_valorRetINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseRetOutros               := p_baseRetOutros;
  r_valorRetOutros              := p_valorRetOutros;
  r_baseII                      := p_baseII;
  r_valorII                     := p_valorII;
  r_baseIOF                     := p_baseIOF;
  r_valorIOF                    := p_valorIOF;
  r_baseIPI                     := p_baseIPI;
  r_valorIPI                    := p_valorIPI;
  r_basePIS                     := p_basePIS;
  r_valorPIS                    := p_valorPIS;
  r_basePISST                   := p_basePISST;
  r_valorPISST                  := p_valorPISST;
  r_baseCOFINS                  := p_baseCOFINS;
  r_valorCOFINS                 := p_valorCOFINS;
  r_baseCOFINSST                := p_baseCOFINSST;
  r_valorCOFINSST               := p_valorCOFINSST;
  r_baseCreditoSimplesNacional  := p_baseCreditoSimplesNacional;
  r_valorCreditoSimplesNacional := p_valorCreditoSimplesNacional;
  r_baseICMS                    := p_baseICMS;
  r_valorICMSOperacao           := p_valorICMSOperacao;
  r_valorICMSDiferido           := p_valorICMSDiferido;
  r_valorICMS                   := p_valorICMS;
  r_valorICMSDesoneracao        := p_valorICMSDesoneracao;
  r_baseICMSST                  := p_baseICMSST;
  r_valorICMSST                 := p_valorICMSST;
  r_baseICMSSTAnteriormente     := p_baseICMSSTAnteriormente;
  r_valorICMSSTAnteriormente    := p_valorICMSSTAnteriormente;
  r_valorICMSProprioSubstituto  := p_valorICMSProprioSubstituto;
  r_baseICMSEfetivo             := p_baseICMSEfetivo;
  r_valorICMSEfetivo            := p_valorICMSEfetivo;
  r_baseICMSEscrituracao        := p_baseICMSEscrituracao;
  r_valorICMSEscrituracao       := p_valorICMSEscrituracao;
  r_valorICMSDesonEscrituracao  := p_valorICMSDesonEscrituracao;
  r_baseICMSSTEscrituracao      := p_baseICMSSTEscrituracao;
  r_valorICMSSTEscrituracao     := p_valorICMSSTEscrituracao;
  r_baseICMSUFDestinatario      := p_baseICMSUFDestinatario;
  r_valorICMSUFDestinatario     := p_valorICMSUFDestinatario;
  r_baseICMSUFRemetente         := p_baseICMSUFRemetente;
  r_valorICMSUFRemetente        := p_valorICMSUFRemetente;
  r_baseFCP                     := p_baseFCP;
  r_valorFCP                    := p_valorFCP;
  r_baseFCPST                   := p_baseFCPST;
  r_valorFCPST                  := p_valorFCPST;
  r_baseFCPSTAnteriormente      := p_baseFCPSTAnteriormente;
  r_valorFCPSTAnteriormente     := p_valorFCPSTAnteriormente;
  r_baseFCPUFDestinatario       := p_baseFCPUFDestinatario;
  r_valorFCPUFDestinatario      := p_valorFCPUFDestinatario;
  r_baseEstimadaImpostos        := p_baseEstimadaImpostos;
  r_valorEstimadoImpFederais    := p_valorEstimadoImpFederais;
  r_valorEstimadoImpEstaduais   := p_valorEstimadoImpEstaduais;
  r_valorEstimadoImpMunicipais  := p_valorEstimadoImpMunicipais;
  /* ISSQN */
  IF p_calcularISSQN = 1 THEN
    IF p_indicadorISSQN = '1' THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100), 2);
    ELSE
      r_baseISSQN := 0;
      r_valorISSQN := 0;
    END IF;
  END IF;
  /* IRRF */
  IF p_calcularRetencaoIRRF = 1 THEN
    IF p_retencaoIRRF > 0 THEN
      r_baseRetIRRF := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetIRRF := ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100), 2);
    ELSE
      r_baseRetIRRF := 0;
      r_valorRetIRRF := 0;
    END IF;
  END IF;
  /* INSS */
  IF p_calcularRetencaoINSS = 1 THEN
    IF p_retencaoINSS > 0 THEN
      r_baseRetINSS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetINSS := ROUND ((r_baseRetINSS * p_retencaoINSS / 100), 2);
    ELSE
      r_baseRetINSS := 0;
      r_valorRetINSS := 0;
    END IF;
  END IF;
  /* Retenção PIS */
  IF p_calcularRetencaoPIS = 1 THEN
    IF p_retencaoPIS > 0 THEN
      r_baseRetPIS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetPIS := ROUND ((r_baseRetPIS * p_retencaoPIS / 100), 2);
    ELSE
      r_baseRetPIS := 0;
      r_valorRetPIS := 0;
    END IF;
  END IF;
  /* Retenção COFINS */
  IF p_calcularRetencaoCOFINS = 1 THEN
    IF p_retencaoCOFINS > 0 THEN
      r_baseRetCOFINS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCOFINS := ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100), 2);
    ELSE
      r_baseRetCOFINS := 0;
      r_valorRetCOFINS := 0;
    END IF;
  END IF;
  /* Retenção CSLL */
  IF p_calcularRetencaoCSLL = 1 THEN
    IF p_retencaoCSLL > 0 THEN
      r_baseRetCSLL := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCSLL := ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100), 2);
    ELSE
      r_baseRetCSLL := 0;
      r_valorRetCSLL := 0;
    END IF;
  END IF;
  /* Retenção Outros */
  IF p_calcularRetencaoOutros = 1 THEN
    IF p_retencaoOutros > 0 THEN
      r_baseRetOutros := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetOutros := ROUND ((r_baseRetOutros * p_retencaoOutros / 100), 2);
    ELSE
      r_baseRetOutros := 0;
      r_valorRetOutros := 0;
    END IF;
  END IF;
  /* II */
  IF p_calcularII = 1 THEN
    IF p_aliquotaII > 0 THEN
      r_baseII :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorII := ROUND ((r_baseII * p_aliquotaII / 100), 2);
    ELSE
      r_baseII := 0;
      r_valorII := 0;
    END IF;
  END IF;
  /* IOF */
  IF p_calcularIOF = 1 THEN
    IF p_aliquotaIOF > 0 THEN
      r_baseIOF := 
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorIOF := ROUND ((r_baseIOF * p_aliquotaIOF / 100), 2);
    ELSE
      r_baseIOF := 0;
      r_valorIOF := 0;
    END IF;
  END IF;
  /* IPI */
  IF p_calcularIPI = 1 THEN
    IF p_aliquotaIPI > 0 THEN
      r_baseIPI :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF;
      r_valorIPI := ROUND ((r_baseIPI * p_aliquotaIPI / 100), 2);
    ELSE
      r_baseIPI := 0;
      r_valorIPI := 0;
    END IF;
    IF p_valorAliquotaIPI > 0 THEN
      r_valorIPI := ROUND ((r_valorIPI + (p_quantidade * p_valorAliquotaIPI)), 2);
    END IF;
  END IF;
  /* Simples Nacional */
  IF p_calcularSimplesNacional = 1 THEN
    IF p_stSimplesNacional IN('101','102','201','202','900')
      AND p_creditoSimplesNacional > 0
    THEN
      r_baseCreditoSimplesNacional :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      r_valorCreditoSimplesNacional := ROUND ((r_baseCreditoSimplesNacional * p_creditoSimplesNacional / 100), 2);
    ELSE
      r_baseCreditoSimplesNacional := 0;
      r_valorCreditoSimplesNacional := 0;
    END IF;
  END IF;
  /* ICMS */
  IF p_calcularICMS = 1 THEN
      r_baseICMS := 0;
      r_valorICMSOperacao := 0;
      r_valorICMSDiferido := 0;
      r_valorICMS := 0;
      r_valorICMSDesoneracao := 0;
    IF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('40','41','50') THEN
      r_valorICMSDesoneracao := ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
              THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END
      ) * p_aliquotaICMS / 100), 2);
    ELSIF p_aliquotaICMS > 0
      AND ((p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS IN ('00','10','20','51','70','90')
        OR p_stSimplesNacional = '900')
    THEN
      r_baseICMS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      IF p_prod_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMS = '1' OR p_modalidadeBaseCalcICMS = '2' AND r_baseICMS > p_quantidade * p_prod_precoPautaTabelado) THEN
        r_baseICMS := ROUND ((p_quantidade * p_prod_precoPautaTabelado), 2);
      END IF;
      r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
      IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('20','70','90') OR p_stSimplesNacional = '900') AND p_reducaoBaseICMS > 0 THEN
        r_valorICMSDesoneracao := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
        r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_valorICMSDesoneracao := r_valorICMSDesoneracao - r_valorICMS;
      ELSE
        IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' AND p_reducaoBaseICMS > 0 AND p_reducaoBaseICMS <> p_diferimentoICMS THEN
          r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
          r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        END IF;
        r_valorICMSDesoneracao := 0;
      END IF;
      IF (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '51'
      THEN
        r_valorICMSOperacao := r_valorICMS;
        r_valorICMSDiferido := ROUND ((r_valorICMSOperacao * p_diferimentoICMS / 100), 2);
        r_valorICMS := r_valorICMSOperacao - r_valorICMSDiferido;
        IF r_valorICMS <= 0 THEN
          IF p_cfop IN (5124, 6124) THEN
            r_baseICMS := 0;
          END IF;
          r_valorICMS := 0;
        END IF;
      ELSE
        r_valorICMSOperacao := 0;
        r_valorICMSDiferido := 0;
      END IF;
    END IF;
  END IF;
  /* ICMS ST */
  IF p_calcularICMSST = 1 THEN
    IF (p_stSimplesNacional IS NULL
      OR p_stSimplesNacional = '   ')
    AND (p_stICMS IN ('10','30','70')
      OR p_stICMS = '90'
      AND p_aliquotaICMSST > 0)
    OR p_stSimplesNacional IN ('201','202')
    OR p_stSimplesNacional = '900'
    AND p_aliquotaICMSST > 0
    THEN
      r_baseICMSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      IF p_prod_precoPautaTabelado > 0
        AND (p_modalidadeBaseCalcICMSST = '5'
          OR p_modalidadeBaseCalcICMSST = '0'
          AND r_baseICMSST > p_quantidade * p_prod_precoPautaTabelado)
        AND ((p_stSimplesNacional IS NULL
            OR p_stSimplesNacional = '   ')
          AND p_stICMS IN ('10','30','70','90')
          OR p_stSimplesNacional IN ('201','202','900'))
      THEN
        r_baseICMSST := ROUND ((p_quantidade * p_prod_precoPautaTabelado), 2);
      END IF;
      IF p_modalidadeBaseCalcICMSST = '4'
        OR (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '60'
        OR p_stSimplesNacional = '500'
      THEN
        r_baseICMSST := ROUND ((r_baseICMSST * (1 + p_margemValorAdicionadoST / 100)), 2);
      END IF;
      r_baseICMSST := ROUND ((r_baseICMSST * (1 - p_reducaoBaseST / 100)), 2);
      r_valorICMSST := ROUND (((r_baseICMSST * p_aliquotaICMSST / 100) - r_valorICMS), 2);
      IF r_valorICMSST <= 0 THEN
        r_baseICMSST := 0;
        r_valorICMSST := 0;
      END IF;
    ELSE
      r_baseICMSST := 0;
      r_valorICMSST := 0;
    END IF;
  END IF;
  /* Busca dados apenas quando precisa. */
  v_baseICMSSTAnteriormente := 0;
  v_valorICMSSTAnteriormente := 0;
  v_valorICMSProprioSubstituto := 0;
  v_baseFCPSTAnteriormente := 0;
  v_valorFCPSTAnteriormente := 0;
  IF (p_calcularICMSSTAnterEfetivo = 1
      OR p_calcularFCP = 1) 
    AND ((p_stSimplesNacional IS NULL
        OR p_stSimplesNacional = '   ')
      AND p_stICMS='60'
      OR p_stSimplesNacional='500') 
    AND p_cab_indicadorConsumidorFinal = '0' 
    AND (p_cab_entradaSaida = 'S'
      OR p_cfop IN (1201,1202,1203,1204,1208,1209,1410,1411,1503,1504,1505,1506,1553,1660,1661,1662,1918,1919)
      OR p_cfop IN (2201,2202,2203,2204,2208,2209,2410,2411,2503,2504,2505,2506,2553,2660,2661,2662,2918,2919)
      OR p_cfop IN (3201,3202,3211,3503,3553))
  THEN
    ADD_BUSCA_ICMS_ST_ANTERIOR (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataEntradaSaida,
      p_personalizacao,
      p_quantidade,
      p_calcularICMSSTAnterEfetivo,
      p_calcularFCP,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_prod_controleEstoque,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente);
  END IF;
  /* ICMS ST Retido Anteriormente / Efetivo */
  IF p_calcularICMSSTAnterEfetivo = 1 THEN
    r_baseICMSSTAnteriormente := v_baseICMSSTAnteriormente;
    r_valorICMSSTAnteriormente := v_valorICMSSTAnteriormente;
    r_valorICMSProprioSubstituto := v_valorICMSProprioSubstituto;
    IF ((p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND p_stICMS = '60'
        OR p_stSimplesNacional = '500')
      AND p_aliquotaICMSEfetivo <> 0
    THEN
      r_baseICMSEfetivo :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      r_baseICMSEfetivo := ROUND ((r_baseICMSEfetivo * (1 - p_reducaoBaseICMSEfetivo / 100)), 2);
      r_valorICMSEfetivo := ROUND ((r_baseICMSEfetivo * p_aliquotaICMSEfetivo / 100), 2);
    ELSE
      r_baseICMSEfetivo := 0;
      r_valorICMSEfetivo := 0;
    END IF;
  END IF;
  /* ICMS Escrituracao */
  IF p_calcularICMSEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    THEN
      IF p_cab_nfFornecedor = 1
        AND p_stICMSEscrituracao = '51'
        AND p_diferimentoICMSEscrituracao <> 0
        AND p_diferimentoICMSEscrituracao <> p_reducaoBaseICMSEscrituracao
      THEN
        r_baseICMSEscrituracao := ROUND ((r_baseICMS * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
      ELSE
        r_baseICMSEscrituracao := r_baseICMS;
      END IF;
      r_valorICMSEscrituracao := r_valorICMS;
      r_valorICMSDesonEscrituracao := r_valorICMS;
    ELSE
      r_baseICMSEscrituracao := 0;
      r_valorICMSEscrituracao := 0;
      r_valorICMSDesonEscrituracao := 0;
      IF p_aliquotaICMSEscrituracao > 0
        AND p_stICMSEscrituracao IN ('40','41','50')
      THEN
        r_valorICMSDesonEscrituracao := ROUND (((
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END) * p_aliquotaICMSEscrituracao / 100), 2);
      ELSIF p_aliquotaICMSEscrituracao > 0
        AND p_stICMSEscrituracao IN ('00','10','20','51','70','90')
      THEN
        r_baseICMSEscrituracao :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        IF p_stICMSEscrituracao IN ('20','70','90')
          AND p_reducaoBaseICMSEscrituracao > 0
        THEN
          r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
        ELSIF p_stICMSEscrituracao = '51'
          AND p_reducaoBaseICMSEscrituracao > 0
          AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMSEscrituracao
        THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
            r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
            r_valorICMSDesonEscrituracao := 0;
        ELSE
          r_valorICMSDesonEscrituracao := 0;
        END IF;
        IF p_stICMSEscrituracao = '51' THEN
          r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMSEscrituracao / 100), 2);
          IF p_cab_nfFornecedor = 1 THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMSEscrituracao / 100)), 2);
          END IF;
          IF r_valorICMSEscrituracao < 0 THEN
            r_valorICMSEscrituracao := 0;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
  /* ICMS ST Escrituracao */
  IF p_calcularICMSSTEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
      AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
      AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
      AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
    THEN
      r_baseICMSSTEscrituracao := r_baseICMSST;
      r_valorICMSSTEscrituracao := r_valorICMSST;
    ELSIF p_stICMSEscrituracao IN ('10','30','70')
      OR p_stICMSEscrituracao = '90'
      AND p_aliquotaICMSSTEscrituracao > 0
    THEN
      r_baseICMSSTEscrituracao := ROUND ((ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END
      ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
      r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
      IF r_valorICMSSTEscrituracao <= 0 THEN
        r_baseICMSSTEscrituracao := 0;
        r_valorICMSSTEscrituracao := 0;
      END IF;
    ELSE
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  END IF;
  /* DIFAL */
  IF p_calcularDIFAL = 1 THEN
    IF p_cab_localDestinoOperacao = '2'
      AND (p_cab_entradaSaida = 'E'
        OR p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9')
      AND NOT(p_stICMS IN('40','41'))
      AND (p_stSimplesNacional IS NOT NULL
        OR NOT(p_stSimplesNacional IN('103','300','400')))
      AND NOT(p_cfop IN(6552,6922,6929))
      AND p_aliquotaICMSInterestadual <> 0
      AND p_partilhaICMSInterestadual <> 0
    THEN
      IF (p_stSimplesNacional IS NULL
          OR p_stSimplesNacional = '   ')
        AND r_baseICMS = 0
        OR p_stSimplesNacional IS NOT NULL
        AND p_stSimplesNacional <> '   '
        AND r_baseCreditoSimplesNacional = 0
      THEN
        r_baseICMSUFDestinatario :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE
            WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
              AND p_prod_tipoProduto IN ('07','08')
              OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END
              AND (p_cab_indicadorConsumidorFinal = '0'
                OR p_pess_indicadorInscricaoEstad = '9')
            THEN r_valorIPI + p_valorIPIDevolucao
            ELSE 0
          END;
      ELSE
        r_baseICMSUFDestinatario := CASE WHEN (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') THEN r_baseICMS ELSE r_baseCreditoSimplesNacional END;
      END IF;
      r_baseICMSUFRemetente := r_baseICMSUFDestinatario;
      IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
        r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
        r_valorICMSUFRemetente    := ROUND ((r_baseICMSUFRemetente    * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
      ELSE
        r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
        r_valorICMSUFRemetente    := ROUND ((r_baseICMSUFRemetente    * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
      END IF;
    ELSE
      r_baseICMSUFDestinatario := 0;
      r_valorICMSUFDestinatario := 0;
      r_baseICMSUFRemetente := 0;
      r_valorICMSUFRemetente := 0;
    END IF;
  END IF;
  /* Fundo de Combate a Pobreza */
  IF p_calcularFCP = 1 THEN
    IF r_baseCreditoSimplesNacional <> 0
      AND p_aliquotaFCP <> 0
    THEN
      r_baseFCP := r_baseCreditoSimplesNacional;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSIF (p_stSimplesNacional IS NULL
        OR p_stSimplesNacional = '   ')
      AND p_stICMS IN ('00','20','51','90')
      AND r_baseICMS <> 0
      AND p_aliquotaFCP <> 0
    THEN
      r_baseFCP := r_baseICMS;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSE
      r_baseFCP := 0;
      r_valorFCP := 0;
    END IF;
    /* Fundo de Combate a Pobreza ST */
    IF r_baseICMSST <> 0 AND p_aliquotaFCPST <> 0 THEN
      r_baseFCPST := r_baseICMSST;
      r_valorFCPST := ROUND ((r_baseFCPST * p_aliquotaFCPST / 100), 2);
    ELSE
      r_baseFCPST := 0;
      r_valorFCPST := 0;
    END IF;
    /* Fundo de Combate a Pobreza ICMS ST Retido Anteriormente */
    r_baseFCPSTAnteriormente := v_baseFCPSTAnteriormente;
    r_valorFCPSTAnteriormente := v_valorFCPSTAnteriormente;
    /* Fundo de Combate a Pobreza DIFAL */
    IF p_cab_localDestinoOperacao = '2'
      AND (p_cab_entradaSaida = 'E'
        OR p_cab_indicadorConsumidorFinal = '1'
        OR p_pess_indicadorInscricaoEstad = '9')
      AND r_baseICMSUFDestinatario <> 0
      AND p_aliquotaFCPUFDestinatario <> 0
    THEN
      r_baseFCPUFDestinatario := r_baseICMSUFDestinatario;
      r_valorFCPUFDestinatario := ROUND ((r_baseFCPUFDestinatario * p_aliquotaFCPUFDestinatario / 100), 2);
    ELSE
      r_baseFCPUFDestinatario := 0;
      r_valorFCPUFDestinatario := 0;
    END IF;
  END IF;
  /* PIS */
  IF p_calcularPIS = 1 THEN
    IF p_aliquotaPIS > 0 THEN
      r_basePIS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPIS := ROUND ((r_basePIS * p_aliquotaPIS / 100), 2);
    ELSE
      r_basePIS := 0;
      r_valorPIS := 0;
    END IF;
    IF p_valorAliquotaPIS > 0 THEN
      r_valorPIS := ROUND ((r_valorPIS + (p_quantidade * p_valorAliquotaPIS)), 2);
    END IF;
  END IF;
  /* PIS ST */
  IF p_calcularPISST = 1 THEN
    IF p_aliquotaPISST > 0 THEN
      r_basePISST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPISST := ROUND ((r_basePISST * p_aliquotaPISST / 100), 2);
    ELSE
      r_basePISST := 0;
      r_valorPISST := 0;
    END IF;
    IF p_valorAliquotaPISST > 0 THEN
      r_valorPISST := ROUND ((r_valorPISST + (p_quantidade * p_valorAliquotaPISST)), 2);
    END IF;
  END IF;
  /* COFINS */
  IF p_calcularCOFINS = 1 THEN
    IF p_aliquotaCOFINS > 0 THEN
      r_baseCOFINS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINS := ROUND ((r_baseCOFINS * p_aliquotaCOFINS / 100), 2);
    ELSE
      r_baseCOFINS := 0;
      r_valorCOFINS := 0;
    END IF;
    IF p_valorAliquotaCOFINS > 0 THEN
      r_valorCOFINS := ROUND ((r_valorCOFINS + (p_quantidade * p_valorAliquotaCOFINS)), 2);
    END IF;
  END IF;
  /* COFINS ST */
  IF p_calcularCOFINSST = 1 THEN
    IF p_aliquotaCOFINSST > 0 THEN
      r_baseCOFINSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINSST := ROUND ((r_baseCOFINSST * p_aliquotaCOFINSST / 100), 2);
    ELSE
      r_baseCOFINSST := 0;
      r_valorCOFINSST := 0;
    END IF;
    IF p_valorAliquotaCOFINSST > 0 THEN
      r_valorCOFINSST := ROUND ((r_valorCOFINSST + (p_quantidade * p_valorAliquotaCOFINSST)), 2);
    END IF;
  END IF;
  /* Impostos Estimados */
  IF p_calcularImpostosEstimados = 1 THEN
    IF p_aliquotaEstImpFederais > 0 OR p_aliquotaEstImpEstaduais > 0 OR p_aliquotaEstImpMunicipais > 0 THEN
      r_baseEstimadaImpostos :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal;
      r_valorEstimadoImpFederais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpFederais / 100), 2);
      r_valorEstimadoImpEstaduais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpEstaduais / 100), 2);
      r_valorEstimadoImpMunicipais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpMunicipais / 100), 2);
    ELSE
      r_baseEstimadaImpostos := 0;
      r_valorEstimadoImpFederais := 0;
      r_valorEstimadoImpEstaduais := 0;
      r_valorEstimadoImpMunicipais := 0;
    END IF;
  END IF;
END ADD_CALCULA_IMPOSTOS_ITEM;

/

UPDATE SICONFIGURACOES SET tipoCampo = 'A', mascara = '256', exibirCampo = 'P' WHERE configuracao= 397;

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (170, 'N', 'Não', 397, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (171, 'S', 'Sim', 397, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (172, 'C', 'Código e Descrição', 397, 1, 3, ' ');

COMMIT;

DROP TABLE PAIMPRESSORAXDOCUMENTO_2401;

CREATE TABLE PAIMPRESSORAXDOCUMENTO_2401 AS SELECT * FROM PAIMPRESSORAXDOCUMENTO;

DROP TABLE PAIMPRESSORAXDOCUMENTO;

-- PAIMPRESSORAXDOCUMENTO
CREATE TABLE PAIMPRESSORAXDOCUMENTO
  (
    id                             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumentoImpresso          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    tecnologiaImpressao            NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    perfilUsuario                  NUMERIC (6,0) DEFAULT 0 NOT NULL,
    usuario                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dispositivo                    CHAR (1) DEFAULT ' ' NOT NULL,
    enderecoMAC                    VARCHAR (12) DEFAULT ' ' NOT NULL,
    etapaOrcamento                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    selectWhere                    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    imprimirFinalizacao            CHAR (1) DEFAULT ' ' NOT NULL,
    numeroViasFinalizacao          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    visualizarAntesImprimirFinaliz NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirBotao                  CHAR (1) DEFAULT ' ' NOT NULL,
    numeroViasBotao                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    visualizarAntesImprimirBotao   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    arquivoModelo                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    extensaoReport                 VARCHAR (10) DEFAULT ' ' NOT NULL,
    formaImpressao                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idImpressora                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    abrirGaveta                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_PK1 PRIMARY KEY (id);
CREATE INDEX PAIMPRESSORAXDOCUMENTO_K2 ON PAIMPRESSORAXDOCUMENTO (tipoDocumentoImpresso ASC, descricao ASC, etapaOrcamento DESC, enderecoMAC DESC, dispositivo DESC, usuario DESC, perfilUsuario DESC, estabelecimento DESC,id ASC);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK1 FOREIGN KEY (tipoDocumentoImpresso) REFERENCES SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK2 FOREIGN KEY (tecnologiaImpressao) REFERENCES SITECNOLOGIASIMPRESSAO (tecnologiaImpressao);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK3 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK4 FOREIGN KEY (perfilUsuario) REFERENCES PAPERFISUSUARIO (perfilUsuario);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK5 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK6 FOREIGN KEY (dispositivo) REFERENCES SIDISPOSITIVOS (dispositivo);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK7 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK8 FOREIGN KEY (imprimirFinalizacao) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK9 FOREIGN KEY (numeroViasFinalizacao) REFERENCES SINUMEROVIAS (numeroVias);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK10 FOREIGN KEY (imprimirBotao) REFERENCES SISIMNAO (simNao);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK11 FOREIGN KEY (numeroViasBotao) REFERENCES SINUMEROVIAS (numeroVias);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK12 FOREIGN KEY (extensaoReport) REFERENCES SIEXTENSOESREPORT (extensaoReport);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK13 FOREIGN KEY (formaImpressao) REFERENCES SIFORMASIMPRESSAO (formaImpressao);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK14 FOREIGN KEY (idImpressora) REFERENCES PAIMPRESSORAS (idImpressora);

INSERT INTO PAIMPRESSORAXDOCUMENTO (id, tipoDocumentoImpresso, tecnologiaImpressao, descricao, ativo, estabelecimento, perfilUsuario, usuario, dispositivo, enderecoMAC, etapaOrcamento, selectWhere, imprimirFinalizacao, numeroViasFinalizacao, visualizarAntesImprimirFinaliz, imprimirBotao, numeroViasBotao, visualizarAntesImprimirBotao, arquivoModelo, extensaoReport, formaImpressao, idImpressora, abrirGaveta, observacoes) VALUES (0, 0, 0, 'SELECIONE', 1, 0, 0, 0, ' ', ' ', 0, ' ', ' ', 0, 0, ' ', 0, 0, ' ', ' ', 0, 0, 0, ' ');
INSERT INTO PAIMPRESSORAXDOCUMENTO (id, tipoDocumentoImpresso, tecnologiaImpressao, descricao, ativo, estabelecimento, perfilUsuario, usuario, dispositivo, enderecoMAC, etapaOrcamento, selectWhere, imprimirFinalizacao, numeroViasFinalizacao, visualizarAntesImprimirFinaliz, imprimirBotao, numeroViasBotao, visualizarAntesImprimirBotao, arquivoModelo, extensaoReport, formaImpressao, idImpressora, abrirGaveta, observacoes) SELECT id, tipoDocumentoImpresso, tecnologiaImpressao, descricao, ativo, estabelecimento, perfilUsuario, usuario, dispositivo, enderecoMAC, etapaOrcamento, selectWhere, imprimirFinalizacao, numeroViasFinalizacao, visualizarAntesImprimirFinaliz, imprimirBotao, numeroViasBotao, visualizarAntesImprimirBotao, arquivoModelo, extensaoReport, formaImpressao, idImpressora, CASE WHEN comandoAbrirGaveta > 0 THEN 1 ELSE 0 END, observacoes FROM PAIMPRESSORAXDOCUMENTO_2401 WHERE id > 0;

COMMIT;

DROP TABLE SICOMANDOSABRIRGAVETA;

DELETE SITABELASSISTEMA  WHERE tabelaSistema = 'SICOMANDOSABRIRGAVETA';

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 936;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 936;
DELETE PAMENUXATALHOS WHERE menu = 936;
DELETE PAMENUXFAVORITOS WHERE menu = 936;
DELETE PAMENUXPERMISSOES WHERE menu = 936;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 936;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 936;
DELETE MOMARCADORES WHERE menu = 936;
DELETE MONOTIFICACOES WHERE menu = 936;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 936;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 936;
DELETE SIMENUS WHERE menu = 936;

DROP TABLE TEMPIMPRESSOES;

-- TEMPIMPRESSOES;
CREATE GLOBAL TEMPORARY TABLE TEMPIMPRESSOES
  (
    sessaoClient            VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    selecionar              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    selecionado             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoDocumentoImpresso   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    tecnologiaImpressao     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeroVias              NUMERIC (3,0) DEFAULT 0 NOT NULL,
    visualizarAntesImprimir NUMERIC (1,0) DEFAULT 0 NOT NULL,
    arquivoModelo           VARCHAR (256) DEFAULT ' ' NOT NULL,
    extensaoReport          VARCHAR (10) NOT NULL,
    arquivoGerado           CLOB,
    arquivoGeradoB          CLOB,
    formaImpressao          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idImpressora            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    abrirGaveta             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoImpressora          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    impressoraClient        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    caminhoImpressora       VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPRESSOES ADD CONSTRAINT TEMPIMPRESSOES_PK1 PRIMARY KEY (sessaoClient, contadorSessao, ordenacao);

create or replace PROCEDURE ADD_CRM_ATUALIZA_CFE_HISTORICO (
  p_idCRM IN NUMBER)
IS
  v_historicoExiste NUMBER;
BEGIN
  v_historicoExiste := 0;
  FOR a IN (
    SELECT
      a.tipoAcaoCRM,
      a.situacaoCRM,
      ( SELECT MIN (c.dataInicio)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataInicio IS NOT NULL) dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          ORDER BY
            CASE WHEN a.situacaoCRM = 'C' THEN 0 ELSE b.ordenacao END,
            a.dataInicio DESC,
            a.dataTermino DESC,
            a.id DESC) ordenacao,
        a.tipoAcaoCRM,
        a.situacaoCRM,
        a.dataTermino,
        a.dataProximoContato,
        a.horaProximoContatoFinal,
        a.observacoes
      FROM MOCRMXHISTORICO a
      JOIN SISITUACOESCRM b
      ON b.situacaoCRM = a.situacaoCRM
      WHERE a.idCRM = p_idCRM) a
    WHERE a.ordenacao = 1)
  LOOP
    UPDATE MOCRMS b SET
      b.tipoAcaoCRM             = a.tipoAcaoCRM,
      b.situacaoCRM             = a.situacaoCRM,
      b.dataInicio              = a.dataInicio,
      b.dataTermino             = a.dataTermino,
      b.dataProximoContato      = a.dataProximoContato,
      b.horaProximoContatoFinal = a.horaProximoContatoFinal,
      b.observacoes             = a.observacoes
    WHERE b.idCRM = p_idCRM;
    v_historicoExiste := 1;
  END LOOP;
  IF v_historicoExiste = 0 THEN
    DELETE MOCRMXORCAMENTOS
    WHERE idCRM = p_idCRM;
    DELETE MOCRMS
    WHERE idCRM = p_idCRM;
  END IF;
END ADD_CRM_ATUALIZA_CFE_HISTORICO;

/

CREATE TABLE PASERVICOSMUNICIPIOS_2401 AS SELECT * FROM PASERVICOSMUNICIPIOS;

ALTER TABLE PAOPERFISCALXMUNICIPIOS DROP CONSTRAINT PAOPERFISCALXMUNICIPIOS_FK6;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK25;
ALTER TABLE MOPREDOCUMXITENS DROP CONSTRAINT MOPREDOCUMXITENS_FK20;
ALTER TABLE MODOCFISCALXITENS DROP CONSTRAINT MODOCFISCALXITENS_FK20;

DROP TABLE PASERVICOSMUNICIPIOS;

-- PASERVICOSMUNICIPIOS
CREATE TABLE PASERVICOSMUNICIPIOS
  (
    idServicoMunicipio     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    municipioOrigem        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    municipioDestino       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    codigoServicoMunicipio VARCHAR (30) DEFAULT ' ' NOT NULL,
    descricao              VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PASERVICOSMUNICIPIOS ADD CONSTRAINT PASERVICOSMUNICIPIOS_PK1 PRIMARY KEY (idServicoMunicipio);
CREATE UNIQUE INDEX PASERVICOSMUNICIPIOS_K2 ON PASERVICOSMUNICIPIOS (municipioOrigem, municipioDestino, codigoServicoMunicipio);
ALTER TABLE PASERVICOSMUNICIPIOS ADD CONSTRAINT PASERVICOSMUNICIPIOS_FK1 FOREIGN KEY (municipioOrigem) REFERENCES SIMUNICIPIOS (municipio);
ALTER TABLE PASERVICOSMUNICIPIOS ADD CONSTRAINT PASERVICOSMUNICIPIOS_FK2 FOREIGN KEY (municipioDestino) REFERENCES SIMUNICIPIOS (municipio);

INSERT INTO PASERVICOSMUNICIPIOS (idServicoMunicipio, municipioOrigem, municipioDestino, codigoServicoMunicipio, descricao, ativo, observacoes) VALUES (0, 0, 0, ' ', 'SELECIONE', 1, ' ');
INSERT INTO PASERVICOSMUNICIPIOS (idServicoMunicipio, municipioOrigem, municipioDestino, codigoServicoMunicipio, descricao, ativo, observacoes) SELECT idServicoMunicipio, municipio, 0, codigoServicoMunicipio, descricao, ativo, observacoes FROM PASERVICOSMUNICIPIOS_2401 WHERE idServicoMunicipio > 0;

COMMIT;

ALTER TABLE PAOPERFISCALXMUNICIPIOS ADD CONSTRAINT PAOPERFISCALXMUNICIPIOS_FK6 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK25 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK20 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK20 FOREIGN KEY (idServicoMunicipio) REFERENCES PASERVICOSMUNICIPIOS (idServicoMunicipio);

create or replace PROCEDURE ADD_ITEM_OPERACAO_FISCAL_BUSCA (
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_finalidadeNota           IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_vendaConsumidor          IN NUMBER,
  p_cab_enderecoEntregaPessoa    IN NUMBER,
  p_cab_municipioFatoGerador     IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_modDoc_movimentaEstoque      IN NUMBER,
  p_modDoc_geraFinanceiro        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_endPess_enderecoPessoa       IN NUMBER,
  p_munEndPess_uf                IN CHAR,
  p_munEndEntr_uf                IN CHAR,
  p_item_operacaoFiscal          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_prod_tipoProduto             IN CHAR,
  p_prod_origemMercadoria        IN CHAR,
  p_prod_idNcm                   IN NUMBER,
  p_prod_listaServicos           IN NUMBER,
  p_movimentaEstoque             IN NUMBER,
  p_movimentaEstoqueFiscal       IN NUMBER,
  p_geraFinanceiro               IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_atualizarISSQN               IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR,
  p_atualizarRetencaoIRRF        IN NUMBER,
  p_item_retencaoIRRF            IN NUMBER,
  p_atualizarRetencaoINSS        IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_atualizarRetencaoPIS         IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_atualizarRetencaoCOFINS      IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_atualizarRetencaoCSLL        IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_atualizarRetencaoOutros      IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_atualizarII                  IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_atualizarIOF                 IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_atualizarIPI                 IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_atualizarPIS                 IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_atualizarPISST               IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_atualizarCOFINS              IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_atualizarCOFINSST            IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_atualizarSimplesNacional     IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_atualizarICMS                IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalidadeBaseCalcICMS  IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_atualizarICMSST              IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicST       IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_atualizarICMSSTAnteriorEfet  IN NUMBER,
  p_item_aliquotaSTSuportConsF   IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_atualizarICMSEscrituracao    IN NUMBER,
  p_item_stICMSEscrit            IN CHAR,
  p_item_reducaoBaseICMSEscrit   IN NUMBER,
  p_item_aliquotaICMSEscrit      IN NUMBER,
  p_atualizarICMSSTEscrituracao  IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscrit     IN NUMBER,
  p_item_aliquotaICMSSTEscrit    IN NUMBER,
  p_item_diferimentoICMSEscrit   IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_atualizarDIFAL               IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_atualizarFCP                 IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_atualizarImpostosEstimados   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  /* Retornos */
  r_encontrouRegistro            OUT NUMBER,
  r_movimentaEstoque             OUT NUMBER,
  r_movimentaEstoqueFiscal       OUT NUMBER,
  r_geraFinanceiro               OUT NUMBER,
  r_item_cfop                    OUT NUMBER,
  r_item_indicadorISSQN          OUT CHAR,
  r_item_aliquotaISSQN           OUT NUMBER,
  r_item_retidoISSQN             OUT NUMBER,
  r_item_tributadoForaMunicipio  OUT NUMBER,
  r_item_incentivoFiscal         OUT NUMBER,
  r_item_listaServicos           OUT NUMBER,
  r_item_cnae                    OUT NUMBER,
  r_item_idServicoMunicipio      OUT NUMBER,
  r_item_numeroProcessoAdministr OUT VARCHAR,
  r_item_retencaoIRRF            OUT NUMBER,
  r_item_retencaoINSS            OUT NUMBER,
  r_item_retencaoPIS             OUT NUMBER,
  r_item_retencaoCOFINS          OUT NUMBER,
  r_item_retencaoCSLL            OUT NUMBER,
  r_item_retencaoOutros          OUT NUMBER,
  r_item_aliquotaII              OUT NUMBER,
  r_item_aliquotaIOF             OUT NUMBER,
  r_item_codigoEnquadramentoIPI  OUT NUMBER,
  r_item_stIPI                   OUT CHAR,
  r_item_aliquotaIPI             OUT NUMBER,
  r_item_valorAliquotaIPI        OUT NUMBER,
  r_item_stPIS                   OUT CHAR,
  r_item_aliquotaPIS             OUT NUMBER,
  r_item_valorAliquotaPIS        OUT NUMBER,
  r_item_aliquotaPISST           OUT NUMBER,
  r_item_valorAliquotaPISST      OUT NUMBER,
  r_item_stCOFINS                OUT CHAR,
  r_item_aliquotaCOFINS          OUT NUMBER,
  r_item_valorAliquotaCOFINS     OUT NUMBER,
  r_item_aliquotaCOFINSST        OUT NUMBER,
  r_item_valorAliquotaCOFINSST   OUT NUMBER,
  r_item_stSimplesNacional       OUT CHAR,
  r_item_creditoSimplesNacional  OUT NUMBER,
  r_item_stICMS                  OUT CHAR,
  r_item_modalidadeBaseCalcICMS  OUT CHAR,
  r_item_reducaoBaseICMS         OUT NUMBER,
  r_item_aliquotaICMS            OUT NUMBER,
  r_item_diferimentoICMS         OUT NUMBER,
  r_item_motivoDesoneracaoICMS   OUT CHAR,
  r_item_idBeneficio             OUT NUMBER,
  r_item_modalBaseCalcICMSST     OUT CHAR,
  r_item_margemValorAdicST       OUT NUMBER,
  r_item_reducaoBaseST           OUT NUMBER,
  r_item_aliquotaICMSST          OUT NUMBER,
  r_item_aliquotaSTSuportConsF   OUT NUMBER,
  r_item_reducaoBaseICMSEfetivo  OUT NUMBER,
  r_item_aliquotaICMSEfetivo     OUT NUMBER,
  r_item_stICMSEscrit            OUT CHAR,
  r_item_reducaoBaseICMSEscrit   OUT NUMBER,
  r_item_aliquotaICMSEscrit      OUT NUMBER,
  r_item_margemValorAdicSTEscrit OUT NUMBER,
  r_item_reducaoBaseSTEscrit     OUT NUMBER,
  r_item_aliquotaICMSSTEscrit    OUT NUMBER,
  r_item_diferimentoICMSEscrit   OUT NUMBER,
  r_item_somarICMSST             OUT NUMBER,
  r_item_aliquotaICMSUFDestinat  OUT NUMBER,
  r_item_aliquotaICMSInterestad  OUT NUMBER,
  r_item_partilhaICMSInterestad  OUT NUMBER,
  r_item_aliquotaFCP             OUT NUMBER,
  r_item_aliquotaFCPST           OUT NUMBER,
  r_item_aliquotaFCPSTAnteriorm  OUT NUMBER,
  r_item_aliquotaFCPUFDestinat   OUT NUMBER,
  r_item_aliquotaEstImpFederais  OUT NUMBER,
  r_item_aliquotaEstImpEstaduais OUT NUMBER,
  r_item_aliquotaEstImpMunicipai OUT NUMBER)    
IS    
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(60);  
  v_encontouDesoneracao          NUMBER;
  v_est_municipio                NUMBER;
      
BEGIN
  r_movimentaEstoque             := p_movimentaEstoque;
  r_movimentaEstoqueFiscal       := p_movimentaEstoqueFiscal;
  r_geraFinanceiro               := p_geraFinanceiro;
  r_item_cfop                    := p_item_cfop;
  r_item_indicadorISSQN          := p_item_indicadorISSQN;
  r_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  r_item_retidoISSQN             := p_item_retidoISSQN;
  r_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  r_item_incentivoFiscal         := p_item_incentivoFiscal;
  r_item_listaServicos           := p_item_listaServicos;
  r_item_cnae                    := p_item_cnae;
  r_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  r_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  r_item_retencaoIRRF            := p_item_retencaoIRRF;
  r_item_retencaoINSS            := p_item_retencaoINSS;
  r_item_retencaoPIS             := p_item_retencaoPIS;
  r_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  r_item_retencaoCSLL            := p_item_retencaoCSLL;
  r_item_retencaoOutros          := p_item_retencaoOutros;
  r_item_aliquotaII              := p_item_aliquotaII;
  r_item_aliquotaIOF             := p_item_aliquotaIOF;
  r_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  r_item_stIPI                   := p_item_stIPI;
  r_item_aliquotaIPI             := p_item_aliquotaIPI;
  r_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  r_item_stPIS                   := p_item_stPIS;
  r_item_aliquotaPIS             := p_item_aliquotaPIS;
  r_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  r_item_aliquotaPISST           := p_item_aliquotaPISST;
  r_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  r_item_stCOFINS                := p_item_stCOFINS;
  r_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  r_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  r_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  r_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  r_item_stSimplesNacional       := p_item_stSimplesNacional;
  r_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  r_item_stICMS                  := p_item_stICMS;
  r_item_modalidadeBaseCalcICMS  := p_item_modalidadeBaseCalcICMS;
  r_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  r_item_aliquotaICMS            := p_item_aliquotaICMS;
  r_item_diferimentoICMS         := p_item_diferimentoICMS;
  r_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  r_item_idBeneficio             := p_item_idBeneficio;
  r_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  r_item_margemValorAdicST       := p_item_margemValorAdicST;
  r_item_reducaoBaseST           := p_item_reducaoBaseST;
  r_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  r_item_aliquotaSTSuportConsF   := p_item_aliquotaSTSuportConsF;
  r_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  r_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  r_item_stICMSEscrit            := p_item_stICMSEscrit;
  r_item_reducaoBaseICMSEscrit   := p_item_reducaoBaseICMSEscrit;
  r_item_aliquotaICMSEscrit      := p_item_aliquotaICMSEscrit;
  r_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  r_item_reducaoBaseSTEscrit     := p_item_reducaoBaseSTEscrit;
  r_item_aliquotaICMSSTEscrit    := p_item_aliquotaICMSSTEscrit;
  r_item_diferimentoICMSEscrit   := p_item_diferimentoICMSEscrit;
  r_item_somarICMSST             := p_item_somarICMSST;
  r_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  r_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  r_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  r_item_aliquotaFCP             := p_item_aliquotaFCP;
  r_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  r_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  r_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  r_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  r_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  r_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  r_encontrouRegistro := 0;
  SELECT COALESCE (MAX (endPess.municipio), 0)
  INTO v_est_municipio
  FROM PAESTABELECIMENTOS est
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.pessoa = est.pessoaEstabelecimento
  WHERE est.estabelecimento = p_cab_estabelecimento
  AND endPess.principal = 1
  AND endPess.ativo = 1;
  FOR opFisc IN (
    SELECT
      opFisc.cfop,
      cfop.geraFinanceiro,
      COALESCE (opXMun.indicadorISSQN, '2') indicadorISSQN,
      COALESCE ((CASE WHEN opXMun.tributadoForaMunicipio = 1 THEN COALESCE (opXMunFato.aliquotaISSQN, opXMun.aliquotaISSQN) ELSE opXMun.aliquotaISSQN END), 0) aliquotaISSQN,
      COALESCE (opXMun.retidoISSQN, 0) retidoISSQN,
      COALESCE (opXMun.tributadoForaMunicipio, 0) tributadoForaMunicipio,
      COALESCE (opXMun.incentivoFiscal, 0) incentivoFiscal,
      COALESCE (opXMun.listaServicos, 0) listaServicos,
      COALESCE (opXMun.cnae, 0) cnae,
      CASE
        WHEN COALESCE (opXMun.idServicoMunicipio, 0) = 0
        THEN COALESCE ((
          SELECT MAX (servMunFato.idServicoMunicipio)
          FROM PASERVICOSMUNICIPIOS servMunFato
          WHERE servMunFato.municipioOrigem = v_est_municipio
          AND servMunFato.municipioDestino = p_cab_municipioFatoGerador
          AND servMunFato.ativo = 1), COALESCE ((
          SELECT MAX (servMunOrig.idServicoMunicipio)
          FROM PASERVICOSMUNICIPIOS servMunOrig
          WHERE servMunOrig.municipioOrigem = v_est_municipio
          AND servMunOrig.municipioDestino = 0
          AND servMunOrig.ativo = 1), 0))
        ELSE COALESCE (opXMun.idServicoMunicipio, 0)
      END idServicoMunicipio,
      COALESCE (opXMun.numeroProcessoAdministrativo, ' ') numeroProcessoAdministrativo,
      opFisc.retencaoIRRF,
      opFisc.retencaoINSS,
      opFisc.retencaoPIS,
      opFisc.retencaoCOFINS,
      opFisc.retencaoCSLL,
      opFisc.retencaoOutros,
      opFisc.aliquotaII,
      opFisc.aliquotaIOF,
      opFisc.codigoEnquadramentoIPI,
      opFisc.stIPI,
      opFisc.aliquotaIPI,
      opFisc.valorAliquotaIPI,
      opFisc.stPIS,
      opFisc.aliquotaPIS,
      opFisc.valorAliquotaPIS,
      opFisc.aliquotaPISST,
      opFisc.valorAliquotaPISST,
      opFisc.stCOFINS,
      opFisc.aliquotaCOFINS,
      opFisc.valorAliquotaCOFINS,
      opFisc.aliquotaCOFINSST,
      opFisc.valorAliquotaCOFINSST,
      opFisc.stSimplesNacional,
      opFisc.creditoSimplesNacional,
      opFisc.stICMS,
      opFisc.modalidadeBaseCalcICMS,
      opFisc.reducaoBaseICMS,
      opFisc.aliquotaICMS,
      opFisc.diferimentoICMS,
      opFisc.motivoDesoneracaoICMS,
      opFisc.idBeneficio,
      opFisc.modalidadeBaseCalcICMSST,
      opFisc.margemValorAdicionadoST,
      opFisc.reducaoBaseST,
      opFisc.aliquotaICMSST,
      opFisc.aliquotaSTSuportConsFinal,
      opFisc.reducaoBaseICMSEfetivo,
      opFisc.aliquotaICMSEfetivo,
      opFisc.aliquotaICMSUFDestinatario,
      opFisc.aliquotaICMSInterestadual,
      opFisc.partilhaICMSInterestadual,
      opFisc.aliquotaFCP,
      opFisc.aliquotaFCPST,
      opFisc.aliquotaFCPSTAnteriormente,
      opFisc.aliquotaFCPUFDestinatario
    FROM PAOPERACOESFISCAIS opFisc
    JOIN SICFOPS cfop
    ON cfop.cfop = opFisc.cfop
    LEFT JOIN PAOPERFISCALXMUNICIPIOS opXMun
    ON opXMun.operacaoFiscal = opFisc.operacaoFiscal
    AND opXMun.municipio = v_est_municipio
    AND opXMun.ativo = 1
    LEFT JOIN PAOPERFISCALXMUNICIPIOS opXMunFato
    ON opXMunFato.operacaoFiscal = opFisc.operacaoFiscal
    AND opXMunFato.municipio = p_cab_municipioFatoGerador
    AND opXMunFato.ativo = 1
    WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal)
  LOOP
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (4,6,9,10,11,12,13) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
    END IF;
    IF p_buscarGeraFinanceiroEstoque = 1 OR p_cab_origemDocumento NOT IN (4,6,9,13) THEN
      r_geraFinanceiro := CASE WHEN p_modDoc_geraFinanceiro = 1 AND opFisc.geraFinanceiro = 1 THEN 1 ELSE 0 END;
    END IF;
    r_item_cfop := opFisc.cfop;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := opFisc.indicadorISSQN;
      r_item_aliquotaISSQN           := opFisc.aliquotaISSQN;
      r_item_retidoISSQN             := opFisc.retidoISSQN;
      r_item_tributadoForaMunicipio  := opFisc.tributadoForaMunicipio;
      r_item_incentivoFiscal         := opFisc.incentivoFiscal;
      r_item_listaServicos           := opFisc.listaServicos;
      r_item_cnae                    := opFisc.cnae;
      r_item_idServicoMunicipio      := opFisc.idServicoMunicipio;
      r_item_numeroProcessoAdministr := opFisc.numeroProcessoAdministrativo;
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := opFisc.retencaoIRRF;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := opFisc.retencaoINSS;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := opFisc.retencaoPIS;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := opFisc.retencaoCOFINS;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := opFisc.retencaoCSLL;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := opFisc.retencaoOutros;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := opFisc.aliquotaII;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := opFisc.aliquotaIOF;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := opFisc.codigoEnquadramentoIPI;
      r_item_stIPI                  := opFisc.stIPI;
      r_item_aliquotaIPI            := opFisc.aliquotaIPI;
      r_item_valorAliquotaIPI       := opFisc.valorAliquotaIPI;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := opFisc.stPIS;
      r_item_aliquotaPIS      := opFisc.aliquotaPIS;
      r_item_valorAliquotaPIS := opFisc.valorAliquotaPIS;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := opFisc.aliquotaPISST;
      r_item_valorAliquotaPISST := opFisc.valorAliquotaPISST;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := opFisc.stCOFINS;
      r_item_aliquotaCOFINS      := opFisc.aliquotaCOFINS;
      r_item_valorAliquotaCOFINS := opFisc.valorAliquotaCOFINS;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := opFisc.aliquotaCOFINSST;
      r_item_valorAliquotaCOFINSST := opFisc.valorAliquotaCOFINSST;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := opFisc.stSimplesNacional;
      r_item_creditoSimplesNacional := opFisc.creditoSimplesNacional;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS := opFisc.stICMS;
      ADD_ITEM_DESON_FISCAL_BUSCA (
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_pessoa,
        p_cab_vendaConsumidor,
        p_munEndEst_uf,
        p_munEndPess_uf,
        r_item_stICMS,
        p_gradProd_produto,
        p_prod_origemMercadoria,
        p_prod_idNcm,
        /* Retornos */
        v_encontouDesoneracao,
        r_item_modalidadeBaseCalcICMS,
        r_item_reducaoBaseICMS,
        r_item_aliquotaICMS,
        r_item_diferimentoICMS,
        r_item_motivoDesoneracaoICMS,
        r_item_idBeneficio,
        v_auxNumber);
      IF v_encontouDesoneracao = 0 THEN
        r_item_modalidadeBaseCalcICMS := opFisc.modalidadeBaseCalcICMS;
        r_item_reducaoBaseICMS        := opFisc.reducaoBaseICMS;
        r_item_aliquotaICMS           := opFisc.aliquotaICMS;
        r_item_diferimentoICMS        := opFisc.diferimentoICMS;
        r_item_motivoDesoneracaoICMS  := opFisc.motivoDesoneracaoICMS;
        r_item_idBeneficio            := opFisc.idBeneficio;
      ELSIF opFisc.idBeneficio <> 0 THEN
        r_item_idBeneficio            := opFisc.idBeneficio;
      END IF;
      IF r_item_aliquotaICMS = 0 AND r_item_stICMS in ('00','10','20','70') THEN
        SELECT COALESCE(MAX(aliquotaIcms),0)
        INTO r_item_aliquotaICMS
        FROM PAUFORIGEMXUFDESTINO
        WHERE ufOrigem =
          CASE
            WHEN p_cab_entradaSaida  = 'S'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END
        AND ufDestino =
          CASE
            WHEN p_cab_entradaSaida  = 'E'
            OR p_munEndPess_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END;
      END IF;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := opFisc.modalidadeBaseCalcICMSST;
      r_item_margemValorAdicST   := opFisc.margemValorAdicionadoST;
      r_item_reducaoBaseST       := opFisc.reducaoBaseST;
      r_item_aliquotaICMSST      := opFisc.aliquotaICMSST;
      r_item_somarICMSST         := 1;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := opFisc.aliquotaSTSuportConsFinal;
      r_item_reducaoBaseICMSEfetivo := opFisc.reducaoBaseICMSEfetivo;
      r_item_aliquotaICMSEfetivo    := opFisc.aliquotaICMSEfetivo;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := CASE WHEN p_cab_nfFornecedor = 1 AND p_prod_tipoProduto IN('07','08') THEN '90' WHEN p_cab_nfFornecedor = 1 AND r_item_stICMS IN('10','30','70') OR p_cab_nfFornecedor = 1 AND r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN '60' WHEN r_item_stICMS <> ' ' THEN r_item_stICMS WHEN r_item_stSimplesNacional IN ('101','102') AND r_item_reducaoBaseICMS = 0 THEN '00' WHEN r_item_stSimplesNacional IN ('101','102') THEN '20' WHEN r_item_stSimplesNacional IN ('103','300') THEN '40' WHEN r_item_stSimplesNacional IN ('201','202','203') AND r_item_reducaoBaseICMS = 0 THEN '10' WHEN r_item_stSimplesNacional IN ('201','202','203') THEN '70' WHEN r_item_stSimplesNacional = '400' THEN '41' ELSE '90' END;
      r_item_reducaoBaseICMSEscrit := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_reducaoBaseICMS ELSE 0 END;
      r_item_aliquotaICMSEscrit    := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_aliquotaICMS WHEN r_item_stSimplesNacional IN ('101','201') THEN r_item_creditoSimplesNacional ELSE 0 END;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_margemValorAdicST END;
      r_item_reducaoBaseSTEscrit     := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_reducaoBaseST END;
      r_item_aliquotaICMSSTEscrit    := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_aliquotaICMSST END;
      r_item_diferimentoICMSEscrit   := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_diferimentoICMS END;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      IF p_cab_entradaSaida='S'
        AND NOT(p_cab_finalidadeNota IN('2','3'))
        AND p_cab_localDestinoOperacao = '2'
        AND p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9'
        AND (p_cab_pessoa = 0
          OR p_cab_vendaConsumidor = 1
          OR p_cab_enderecoEntregaPessoa = p_endPess_enderecoPessoa
          OR p_munEndEntr_uf <> p_munEndEst_uf)
        AND NOT (r_item_cfop IN(6552,6922,6929))
        AND (p_prod_tipoProduto <> '09'
          OR NOT (r_item_indicadorISSQN IN('1','2','3','4','5','6','7')))
        AND NOT(r_item_stSimplesNacional IN('103','300','400'))
        AND NOT(r_item_stICMS IN('10','40','41','90')) THEN
        r_item_aliquotaICMSUFDestinat := opFisc.aliquotaICMSUFDestinatario;
        r_item_aliquotaICMSInterestad := opFisc.aliquotaICMSInterestadual;
        r_item_partilhaICMSInterestad := opFisc.partilhaICMSInterestadual;
        IF r_item_aliquotaICMSUFDestinat = 0
          AND r_item_aliquotaICMSInterestad = 0
          AND r_item_partilhaICMSInterestad = 0
          AND (r_item_stSimplesNacional = ''
            OR r_item_stSimplesNacional = ' '
            OR r_item_stSimplesNacional = '  '
            OR r_item_stSimplesNacional = '   ')
        THEN
          SELECT COALESCE(MAX(aliquotaIcms),0)
          INTO r_item_aliquotaICMSUFDestinat
          FROM PAUFORIGEMXUFDESTINO
          WHERE ufOrigem = p_munEndPess_uf
          AND ufDestino = p_munEndPess_uf;
          IF p_prod_origemMercadoria = '0' THEN
            SELECT COALESCE(MAX(aliquotaIcms),0)
            INTO r_item_aliquotaICMSInterestad
            FROM PAUFORIGEMXUFDESTINO
            WHERE ufOrigem = p_munEndEst_uf
            AND ufDestino = p_munEndPess_uf;
          ELSE
            r_item_aliquotaICMSInterestad := 4;
          END IF;
          r_item_partilhaICMSInterestad := 100;
        END IF;
      ELSE
        r_item_aliquotaICMSUFDestinat := 0;
        r_item_aliquotaICMSInterestad := 0;
        r_item_partilhaICMSInterestad := 0;
      END IF;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := opFisc.aliquotaFCP;
      r_item_aliquotaFCPST          := opFisc.aliquotaFCPST;
      r_item_aliquotaFCPSTAnteriorm := opFisc.aliquotaFCPSTAnteriormente;
      r_item_aliquotaFCPUFDestinat  := opFisc.aliquotaFCPUFDestinatario;
    END IF;
    r_encontrouRegistro := 1;
  END LOOP;  
  IF r_encontrouRegistro = 1 THEN
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
      IF p_cab_entradaSaida = 'S' AND p_cab_devolucaoAnulacaoRetorno = 0 THEN
        ADD_BUSCA_IBPT (
          p_cab_dataEmissao,
          p_munEndEst_uf,
          p_prod_origemMercadoria,
          p_prod_idNcm,
          p_prod_listaServicos,
          /* Retornos */
          v_auxNumber,
          v_auxNumber,
          r_item_aliquotaEstImpFederais,
          r_item_aliquotaEstImpEstaduais,
          r_item_aliquotaEstImpMunicipai,
          v_auxVarchar,
          v_auxVarchar,
          v_auxVarchar
        );
      END IF;
    END IF;
  ELSE
    IF p_cab_origemDocumento NOT IN (4,6,9,10,11,12) THEN
      r_movimentaEstoque       := p_modDoc_movimentaEstoque;
      r_movimentaEstoqueFiscal := p_modDoc_movimentaEstoque;
      r_geraFinanceiro         := p_modDoc_geraFinanceiro;
    END IF;
    r_item_cfop := 0;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := ' ';
      r_item_aliquotaISSQN           := 0;
      r_item_retidoISSQN             := 0;
      r_item_tributadoForaMunicipio  := 0;
      r_item_incentivoFiscal         := 0;
      r_item_listaServicos           := 0;
      r_item_cnae                    := 0;
      r_item_idServicoMunicipio      := 0;
      r_item_numeroProcessoAdministr := ' ';
    END IF;
    IF p_atualizarRetencaoIRRF = 1 THEN
      r_item_retencaoIRRF := 0;
    END IF;
    IF p_atualizarRetencaoINSS = 1 THEN
      r_item_retencaoINSS := 0;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS := 0;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS := 0;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL := 0;
    END IF;
    IF p_atualizarRetencaoOutros = 1 THEN
      r_item_retencaoOutros := 0;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII := 0;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF := 0;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI := 0;
      r_item_stIPI            := '  ';
      r_item_aliquotaIPI      := 0;
      r_item_valorAliquotaIPI := 0;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS            := '  ';
      r_item_aliquotaPIS      := 0;
      r_item_valorAliquotaPIS := 0;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST      := 0;
      r_item_valorAliquotaPISST := 0;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS            := '  ';
      r_item_aliquotaCOFINS      := 0;
      r_item_valorAliquotaCOFINS := 0;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST      := 0;
      r_item_valorAliquotaCOFINSST := 0;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional      := '   ';
      r_item_creditoSimplesNacional := 0;
    END IF;
    IF p_atualizarICMS = 1 THEN
      r_item_stICMS                 := '  ';
      r_item_modalidadeBaseCalcICMS := ' ';
      r_item_reducaoBaseICMS        := 0;
      r_item_aliquotaICMS           := 0;
      r_item_diferimentoICMS        := 0;
      r_item_motivoDesoneracaoICMS  := '  ';
      r_item_idBeneficio            := 0;
    END IF;
    IF p_atualizarICMSST = 1 THEN
      r_item_modalBaseCalcICMSST := ' ';
      r_item_margemValorAdicST   := 0;
      r_item_reducaoBaseST       := 0;
      r_item_aliquotaICMSST      := 0;
      r_item_somarICMSST         := 0;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet = 1 THEN
      r_item_aliquotaSTSuportConsF  := 0;
      r_item_reducaoBaseICMSEfetivo := 0;
      r_item_aliquotaICMSEfetivo    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_stICMSEscrit          := '  ';
      r_item_reducaoBaseICMSEscrit := 0;
      r_item_aliquotaICMSEscrit    := 0;
    END IF;
    IF p_atualizarICMSEscrituracao = 1 THEN
      r_item_margemValorAdicSTEscrit := 0;
      r_item_reducaoBaseSTEscrit     := 0;
      r_item_aliquotaICMSSTEscrit    := 0;
      r_item_diferimentoICMSEscrit   := 0;
    END IF;
    IF p_atualizarDIFAL = 1 THEN
      r_item_aliquotaICMSUFDestinat := 0;
      r_item_aliquotaICMSInterestad := 0;
      r_item_partilhaICMSInterestad := 0;
    END IF;
    IF p_atualizarFCP = 1 THEN
      r_item_aliquotaFCP            := 0;
      r_item_aliquotaFCPST          := 0;
      r_item_aliquotaFCPSTAnteriorm := 0;
      r_item_aliquotaFCPUFDestinat  := 0;
    END IF;
    IF p_atualizarImpostosEstimados = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
    END IF;
  END IF;
END ADD_ITEM_OPERACAO_FISCAL_BUSCA;

/

-- SISITUACOESFUNILCRM
CREATE TABLE SISITUACOESFUNILCRM
  (
    situacaoFunilCRM CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SISITUACOESFUNILCRM ADD CONSTRAINT SISITUACOESFUNILCRM_PK1 PRIMARY KEY (situacaoFunilCRM);
CREATE INDEX SISITUACOESFUNILCRM_K2 ON SISITUACOESFUNILCRM (descricao);
CREATE INDEX SISITUACOESFUNILCRM_K3 ON SISITUACOESFUNILCRM (ordenacao, situacaoFunilCRM);

INSERT INTO SISITUACOESFUNILCRM (situacaoFunilCRM, ordenacao, descricao, ativo, observacoes) VALUES (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SISITUACOESFUNILCRM (situacaoFunilCRM, ordenacao, descricao, ativo, observacoes) values ('A', 1, 'Aberto', 1, ' ');
INSERT INTO SISITUACOESFUNILCRM (situacaoFunilCRM, ordenacao, descricao, ativo, observacoes) values ('E', 2, 'Encerrado', 1, ' ');
INSERT INTO SISITUACOESFUNILCRM (situacaoFunilCRM, ordenacao, descricao, ativo, observacoes) values ('C', 3, 'Cancelado', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SISITUACOESFUNILCRM', 'Situações Funil CRM', 1, 533, 'SI', 'situacaoFunilCRM', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesFunilCRM', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (965, 'Situações Funil CRM', 1, 9090009650, 10, 'SIS', 40, 965, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesFunilCRM', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAFUNISCRM
CREATE TABLE PAFUNISCRM
  (
    funilCRM    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao   VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAFUNISCRM ADD CONSTRAINT PAFUNISCRM_PK1 PRIMARY KEY (funilCRM);
CREATE INDEX PAFUNISCRM_K2 ON PAFUNISCRM (descricao);

INSERT INTO PAFUNISCRM (funilCRM, descricao, ativo, observacoes) VALUES (0, 'SELECIONE', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAFUNISCRM', 'Funis CRM', 1, 31672, 'PA', 'funilCRM', 'N', 14, 'descricao', 1, ' ', 0, 800001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFunisCRM', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (966, 'Funis CRM', 1, 5060009660, 10, 'PAR', 40, 966, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFunisCRM', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAFUNILCRMXETAPAS
CREATE TABLE PAFUNILCRMXETAPAS
  (
    etapaFunilCRM    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    funilCRM         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    situacaoFunilCRM CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_PK1 PRIMARY KEY (etapaFunilCRM);
CREATE INDEX PAFUNILCRMXETAPAS_K2 ON PAFUNILCRMXETAPAS (descricao);
CREATE INDEX PAFUNILCRMXETAPAS_K3 ON PAFUNILCRMXETAPAS (funilCRM, ordenacao, etapaFunilCRM);
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_FK1 FOREIGN KEY (funilCRM) REFERENCES PAFUNISCRM (funilCRM);
ALTER TABLE PAFUNILCRMXETAPAS ADD CONSTRAINT PAFUNILCRMXETAPAS_FK2 FOREIGN KEY (situacaoFunilCRM) REFERENCES SISITUACOESFUNILCRM (situacaoFunilCRM);

INSERT INTO PAFUNILCRMXETAPAS (etapaFunilCRM, descricao, ativo, funilCRM, ordenacao, situacaoFunilCRM, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAFUNILCRMXETAPAS', 'Funil CRM X Etapas', 1, 31672, 'PA', 'etapaFunilCRM', 'N', 14, 'descricao', 1, ' ', 0, 800001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFunilCRMXEtapas', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (967, 'Funil CRM X Etapas', 1, 5060009670, 10, 'PAR', 40, 966, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFunilCRMXEtapas', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PATIPOSACOESCRMPERMITIDAS
CREATE TABLE PATIPOSACOESCRMPERMITIDAS
  (
    id               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoAcaoCRM      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    perfilUsuario    NUMERIC (6,0) DEFAULT 0 NOT NULL,
    usuario          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    funilCRM         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    etapaFunilCRM    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    listaCRM         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    permitePesquisar NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteCriar     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteModificar NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteExcluir   NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PATIPOSACOESCRMPERMITIDAS_K2 ON PATIPOSACOESCRMPERMITIDAS (tipoAcaoCRM, estabelecimento, perfilUsuario, usuario, funilCRM, etapaFunilCRM, listaCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK1 FOREIGN KEY (tipoAcaoCRM) REFERENCES PATIPOSACOESCRM (tipoAcaoCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK3 FOREIGN KEY (perfilUsuario) REFERENCES PAPERFISUSUARIO (perfilUsuario);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK4 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK5 FOREIGN KEY (funilCRM) REFERENCES PAFUNISCRM (funilCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK6 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK7 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PATIPOSACOESCRMPERMITIDAS', 'Tipos Acões CRM Permitidas', 1, 31672, 'PA', 'etapaFunilCRM', 'N', 14, 'descricao', 1, ' ', 0, 800001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposAcoesCRMPermitidas', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (968, 'Tipos Acões CRM Permitidos', 1, 5060009680, 10, 'PAR', 40, 968, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposAcoesCRMPermitidos', ' ', 0, 0, NULL, ' ');

COMMIT;

CREATE TABLE PALISTASCRM_2402 AS SELECT * FROM PALISTASCRM;

ALTER TABLE PALISTACRMXESTABELEC DROP CONSTRAINT PALISTACRMXESTABELEC_FK1;
ALTER TABLE PALISTACRMXPERFISUSUARIOS DROP CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1;
ALTER TABLE PALISTACRMXUSUARIOS DROP CONSTRAINT PALISTACRMXUSUARIOS_FK1;
ALTER TABLE PALISTACRMXREGRAS DROP CONSTRAINT PALISTACRMXREGRAS_FK1;
ALTER TABLE PATIPOSACOESCRMPERMITIDAS DROP CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK7;
ALTER TABLE MOCRMS DROP CONSTRAINT MOCRMS_FK1;

DROP TABLE PALISTASCRM;

-- PALISTASCRM
CREATE TABLE PALISTASCRM
  (
    listaCRM                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                NUMERIC (11,0) DEFAULT 0 NOT NULL,
    vendedorFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    vendasFiltrar            CHAR (1) DEFAULT ' ' NOT NULL,
    vendasDiasInicial        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vendasDiasFinal          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    cadastroDiasInicial      NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroDiasFinal        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    diasUltimaListaEncerrada NUMERIC (6,0) DEFAULT 0 NOT NULL,
    filtrarEstabelecimentos  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    produtoSelecionados      CLOB,
    produtoJoin              CLOB,
    produtoAndWhere          CLOB,
    funilCRM                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    enviarSms                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarWhatsApp           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    textoSmsWhatsApp         VARCHAR (4000) DEFAULT ' ' NOT NULL,
    exibirDataNascimento     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasSemComprar     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalCompras       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalOrcamentos    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasAtraso         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAbertos       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAVencer       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalVencidos      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoBloqueada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorBloqueado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoLiberada  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorLiberado      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoResgatada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorResgatado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_PK1 PRIMARY KEY (listaCRM);
CREATE INDEX PALISTASCRM_K2 ON PALISTASCRM (descricao);
CREATE INDEX PALISTASCRM_K3 ON PALISTASCRM (ordenacao, descricao, listaCRM);
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_FK1 FOREIGN KEY (funilCRM) REFERENCES PAFUNISCRM (funilCRM);

INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, funilCRM, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ', ' ', 0, 0, ' ', 0, 0, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, funilCRM, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) SELECT listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, 0, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes FROM PALISTASCRM_2402 WHERE listaCRM > 0;

COMMIT;

ALTER TABLE PALISTACRMXESTABELEC ADD CONSTRAINT PALISTACRMXESTABELEC_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXPERFISUSUARIOS ADD CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXUSUARIOS ADD CONSTRAINT PALISTACRMXUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXREGRAS ADD CONSTRAINT PALISTACRMXREGRAS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PATIPOSACOESCRMPERMITIDAS ADD CONSTRAINT PATIPOSACOESCRMPERMITIDAS_FK7 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);

CREATE TABLE MOCRMXHISTORICO_2401 AS SELECT * FROM MOCRMXHISTORICO;

DROP TABLE MOCRMXHISTORICO;

CREATE TABLE MOCRMS_2402 AS SELECT * FROM MOCRMS;

ALTER TABLE MOCRMXORCAMENTOS DROP CONSTRAINT MOCRMXORCAMENTOS_FK1;

DROP TABLE MOCRMS;

-- MOCRMS
CREATE TABLE MOCRMS
  (
    idCRM                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (256) DEFAULT ' ' NOT NULL,
    listaCRM                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoVenda               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoa                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    enderecoPessoa          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    usuario                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataCriacao             DATE,
    etapaFunilCRM           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoAcaoCRM             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    situacaoCRM             CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio              DATE,
    dataTermino             DATE,
    dataProximoContato      DATE,
    horaProximoContatoFinal CHAR(6),
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_PK1 PRIMARY KEY (idCRM);
CREATE INDEX MOCRMS_K2 ON MOCRMS (descricao);
CREATE INDEX MOCRMS_K3 ON MOCRMS (listaCRM);
CREATE INDEX MOCRMS_K4 ON MOCRMS (tipoVenda);
CREATE INDEX MOCRMS_K5 ON MOCRMS (estabelecimento);
CREATE INDEX MOCRMS_K6 ON MOCRMS (pessoa);
CREATE INDEX MOCRMS_K7 ON MOCRMS (enderecoPessoa);
CREATE INDEX MOCRMS_K8 ON MOCRMS (usuario);
CREATE INDEX MOCRMS_K9 ON MOCRMS (etapaFunilCRM);
CREATE INDEX MOCRMS_K10 ON MOCRMS (tipoAcaoCRM);
CREATE INDEX MOCRMS_K11 ON MOCRMS (situacaoCRM);
CREATE INDEX MOCRMS_K12 ON MOCRMS (dataCriacao);
CREATE INDEX MOCRMS_K13 ON MOCRMS (dataInicio);
CREATE INDEX MOCRMS_K14 ON MOCRMS (dataTermino);
CREATE INDEX MOCRMS_K15 ON MOCRMS (dataProximoContato);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK2 FOREIGN KEY (tipoVenda) REFERENCES PATIPOSVENDA (tipoVenda);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK3 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK4 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK5 FOREIGN KEY (enderecoPessoa) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK6 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK7 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK8 FOREIGN KEY (tipoAcaoCRM) REFERENCES PATIPOSACOESCRM (tipoAcaoCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK9 FOREIGN KEY (situacaoCRM) REFERENCES SISITUACOESCRM (situacaoCRM);

INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) VALUES (0, 'SELECIONE', 0, 0, 0, 0, 0, 0, NULL, 0, 0, ' ', NULL, NULL, NULL, NULL, ' ');
INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) SELECT idCRM, descricao, listaCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, usuario, CASE WHEN dataInicio IS NULL THEN SYSDATE ELSE dataInicio END, 0, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes FROM MOCRMS_2402 WHERE idCRM > 0;

COMMIT;

ALTER TABLE MOCRMXORCAMENTOS ADD CONSTRAINT MOCRMXORCAMENTOS_FK1 FOREIGN KEY (idCRM) REFERENCES MOCRMS (idCRM);

-- MOCRMXHISTORICO
CREATE TABLE MOCRMXHISTORICO
  (
    id                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idCRM                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    usuario                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataCriacao             DATE,
    etapaFunilCRM           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoAcaoCRM             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    situacaoCRM             CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio              DATE,
    dataTermino             DATE,
    dataProximoContato      DATE,
    horaProximoContatoFinal CHAR(6),
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_PK1 PRIMARY KEY (id);
CREATE INDEX MOCRMXHISTORICO_K2 ON MOCRMXHISTORICO (idCRM);
CREATE INDEX MOCRMXHISTORICO_K3 ON MOCRMXHISTORICO (usuario);
CREATE INDEX MOCRMXHISTORICO_K4 ON MOCRMXHISTORICO (etapaFunilCRM);
CREATE INDEX MOCRMXHISTORICO_K5 ON MOCRMXHISTORICO (tipoAcaoCRM);
CREATE INDEX MOCRMXHISTORICO_K6 ON MOCRMXHISTORICO (situacaoCRM);
CREATE INDEX MOCRMXHISTORICO_K7 ON MOCRMXHISTORICO (idCRM, dataCriacao);
CREATE INDEX MOCRMXHISTORICO_K8 ON MOCRMXHISTORICO (idCRM, dataInicio);
CREATE INDEX MOCRMXHISTORICO_K9 ON MOCRMXHISTORICO (idCRM, dataTermino);
CREATE INDEX MOCRMXHISTORICO_K10 ON MOCRMXHISTORICO (idCRM, dataProximoContato);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK1 FOREIGN KEY (idCRM) REFERENCES MOCRMS (idCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK3 FOREIGN KEY (etapaFunilCRM) REFERENCES PAFUNILCRMXETAPAS (etapaFunilCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK4 FOREIGN KEY (tipoAcaoCRM) REFERENCES PATIPOSACOESCRM (tipoAcaoCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK5 FOREIGN KEY (situacaoCRM) REFERENCES SISITUACOESCRM (situacaoCRM);

INSERT INTO MOCRMXHISTORICO (id, idCRM, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) VALUES (0, 0, 0, NULL, 0, 0, ' ', NULL, NULL, NULL, NULL, ' ');
INSERT INTO MOCRMXHISTORICO (id, idCRM, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) SELECT a.id, a.idCRM, a.usuario, CASE WHEN a.dataInicio IS NULL THEN b.dataCriacao ELSE a.dataInicio END, 0, a.tipoAcaoCRM, a.situacaoCRM, a.dataInicio, a.dataTermino, a.dataProximoContato, a.horaProximoContatoFinal, a.observacoes FROM MOCRMXHISTORICO_2401 a JOIN MOCRMS b ON b.idCRM = a.idCRM WHERE a.id > 0;

COMMIT;

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_config_425_addInfoComplNFSe IN NUMBER,
  p_idDocumentoFiscal           IN NUMBER,
  p_seqLoteWebServiceEnvio      IN NUMBER,
  p_loteWebService              IN VARCHAR)
  RETURN CLOB
IS
  v_xml                         CLOB;
  v_estab_nomeRazaoSocial       VARCHAR (60);
  v_estab_indicadorPessoa       CHAR (1);
  v_estab_tipo                  VARCHAR (4);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR (20);
  v_estab_inscricaoMunicipal    VARCHAR (15);
  v_estab_logradouro            VARCHAR (60);
  v_estab_numero                VARCHAR (60);
  v_estab_complemento           VARCHAR (60);
  v_estab_bairroDistrito        VARCHAR (60);
  v_estab_municipio             VARCHAR (7);
  v_estab_cep                   CHAR (8);
  v_estab_tecnologiaNfse        NUMBER;
  v_estab_fone                  VARCHAR (14);
  v_estab_email                 VARCHAR (60);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_optanteSimplesNacional      CHAR (1);
  v_incentivadorCultural        CHAR (1);
  v_indicadorAmbienteNfse       CHAR (1);
  v_incentivoFiscal             CHAR (1);
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR (60);
  v_pess_apelidoFantasia        VARCHAR (60);
  v_pess_indicadorPessoa        CHAR (1);
  v_pess_tipo                   VARCHAR (4);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR (20);
  v_pess_inscricaoEstadual      VARCHAR (14);
  v_pess_inscricaoMunicipal     VARCHAR (15);
  v_pess_logradouro             VARCHAR (60);
  v_pess_numero                 VARCHAR (60);
  v_pess_complemento            VARCHAR (60);
  v_pess_bairroDistrito         VARCHAR (60);
  v_pess_municipio              VARCHAR (7);
  v_pess_cep                    CHAR (8);
  v_pess_pais                   VARCHAR (4);
  v_pess_uf                     CHAR (2);
  v_pess_fone                   VARCHAR (14);
  v_pess_email                  VARCHAR (60);
  v_entr_logradouro             VARCHAR (60);
  v_entr_numero                 VARCHAR (60);
  v_entr_complemento            VARCHAR (60);
  v_entr_bairroDistrito         VARCHAR (60);
  v_entr_municipio              VARCHAR (7);
  v_entr_municipio_descricao    VARCHAR (60);
  v_entr_cep                    CHAR (8);
  v_entr_uf                     CHAR (2);
  v_entr_pais                   VARCHAR (4);
  v_entr_pais_descricao         VARCHAR (60);
  v_interm_nomeRazaoSocial      VARCHAR (60);
  v_interm_indicadorPessoa      CHAR (1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR (20);
  v_interm_inscricaoMunicipal   VARCHAR (15);
  v_interm_logradouro           VARCHAR (60);
  v_interm_numero               VARCHAR (60);
  v_interm_complemento          VARCHAR (60);
  v_interm_bairroDistrito       VARCHAR (60);
  v_interm_municipio            VARCHAR (7);
  v_interm_cep                  CHAR (8);
  v_interm_fone                 VARCHAR (14);
  v_interm_email                VARCHAR (60);
  v_numeroRPS                   VARCHAR (15);
  v_serieFiscal                 VARCHAR (4);
  v_dataEmissao                 DATE;
  v_dataHoraEmissao             VARCHAR (20);
  v_dataCompetencia             VARCHAR (20);
  v_dataHoraCompetencia         VARCHAR (20);
  v_chaveNFe                    VARCHAR (60);
  v_numeroProcesso              VARCHAR (60);
  v_codigoObra                  VARCHAR (60);
  v_art                         VARCHAR (60);
  v_outrasInformacoes           VARCHAR (4000);
  v_descricaoServico            VARCHAR (4000);
  v_valorServicos               VARCHAR (20);
  v_aliquotaIssqn               VARCHAR (20);
  v_valorIssqn                  VARCHAR (20);
  v_valorInss                   VARCHAR (20);
  v_valorIrrf                   VARCHAR (20);
  v_retencaoPis                 VARCHAR (20);
  v_baseRetPis                  VARCHAR (20);
  v_valorRetPis                 VARCHAR (20);
  v_retencaoCofins              VARCHAR (20);
  v_valorRetCofins              VARCHAR (20);
  v_valorRetCsll                VARCHAR (20);
  v_valorOutrasRetencoes        VARCHAR (20);
  v_stPis                       CHAR (2);
  v_aliquotaPis                 VARCHAR (20);
  v_basePis                     VARCHAR (20);
  v_valorPis                    VARCHAR (20);
  v_aliquotaCofins              VARCHAR (20);
  v_valorCofins                 VARCHAR (20);
  v_pisCofinsRetido             CHAR (1);
  v_percentualCargaTributariaFe VARCHAR (20);
  v_valorCargaTributariaFederal VARCHAR (20);
  v_percentualCargaTributariaEs VARCHAR (20);
  v_valorCargaTributariaEstad   VARCHAR (20);
  v_percentualCargaTributariaMu VARCHAR (20);
  v_valorCargaTributariaMunicip VARCHAR (20);
  v_valorDescontoTotal          VARCHAR (20);
  v_issRetido                   CHAR (1);
  v_municipioIncidencia         VARCHAR (7);
  v_listaServicos               CHAR (5);
  v_cnae                        CHAR (7);
  v_codigoTributacaoMunicipio   VARCHAR (60);
BEGIN
  WITH DOC AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      a.serieFiscal,
      a.documentoFiscal,
      a.dataEmissao,
      a.qrCode,
      a.enderecoEntregaPessoa,
      a.municipioFatoGerador,
      a.chaveNFe,
      est.pessoaEstabelecimento,
      docXServ.dataCompetencia,
      docXServ.descricaoServico,
      docxServ.intermediario,
      docxServ.numeroRPS,
      docxServ.numeroNFSe,
      docxServ.codigoVerificacaoNFSe,
      docXServ.idObra,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = est.pessoaEstabelecimento
        AND end.ativo = 1
        AND end.principal = 1), 0) endEst_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonEst_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) siteEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = COALESCE (docXServ.intermediario, 0)
        AND end.ativo = 1
        AND end.principal = 1), 0) endInterm_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = COALESCE (docXServ.intermediario, 0)
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonInterm_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = COALESCE (docXServ.intermediario, 0)
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailInterm_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = a.pessoa
        AND end.ativo = 1
        AND end.principal = 1), 0) endPess_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonPess_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailPess_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) sitePess_idEmailPessoa
    FROM MODOCUMENTOSFISCAIS a
    LEFT JOIN MODOCFISCALXSERVICO docXServ
    ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal),
  ITEM AS (
    SELECT
      COALESCE (MAX (a.incentivoFiscal), 0) incentivoFiscal,
      COALESCE (MAX (a.cnae), 0) cnae,
      COALESCE (MAX (a.numeroProcessoAdministrativo), ' ') numeroProcessoAdministrativo,
      COALESCE (MAX (a.tributadoForaMunicipio), 0) tributadoForaMunicipio,
      COALESCE (MAX (a.unidadeMedidaConversao), ' ') unidadeMedidaConversao,
      COALESCE (SUM (a.quantidadeConvertida), 0) quantidadeConvertida,
      COALESCE ((SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) / CASE WHEN SUM (a.quantidadeConvertida) = 0 THEN 1 ELSE SUM (a.quantidadeConvertida) END), 0) precoUnitarioConvertido,
      SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) valorProdutoServico,
      SUM (CASE WHEN endEst.municipio = 4309407 THEN 0 ELSE a.valorDescontoTotal END) valorDescontoTotal,
      COALESCE (MAX (a.indicadorIssqn), ' ') indicadorIssqn,
      COALESCE (MAX (a.aliquotaIssqn), 0) aliquotaIssqn,
      COALESCE (MAX (a.retidoIssqn), 0) retidoIssqn,
      COALESCE (MAX (a.listaServicos), 0) listaServicos,
      COALESCE (SUM (a.baseIssqn), 0) baseIssqn,
      COALESCE (SUM (a.valorIssqn), 0) valorIssqn,
      COALESCE (SUM (a.valorRetIrrf), 0) valorRetIrrf,
      COALESCE (SUM (a.valorRetInss), 0) valorRetInss,
      COALESCE (MAX (a.retencaoPis), 0) retencaoPis,
      COALESCE (SUM (a.baseRetPis), 0) baseRetPis,
      COALESCE (SUM (a.valorRetPis), 0) valorRetPis,
      COALESCE (MAX (a.retencaoCofins), 0) retencaoCofins,
      COALESCE (SUM (a.valorRetCofins), 0) valorRetCofins,
      COALESCE (SUM (a.valorRetCsll), 0) valorRetCsll,
      COALESCE (SUM (a.valorRetOutros), 0) valorRetOutros,
      COALESCE (SUM (a.valorIof), 0) valorIof,
      COALESCE (SUM (a.valorIpi), 0) valorIpi,
      COALESCE (MAX (a.stPis), '00') stPis,
      COALESCE (MAX (a.aliquotaPis), 0) aliquotaPis,
      COALESCE (SUM (a.basePis), 0) basePis,
      COALESCE (SUM (a.valorPis), 0) valorPis,
      COALESCE (MAX (a.aliquotaCofins), 0) aliquotaCofins,
      COALESCE (SUM (a.valorCofins), 0) valorCofins,
      COALESCE (SUM (a.valorIcms), 0) valorIcms,
      CASE WHEN COALESCE (SUM (a.valorRetPis), 0) + COALESCE (SUM (a.valorRetCofins), 0) > 0 THEN 1 ELSE 0 END pisCofinsRetido,
      COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0) aliquotaEstimadaImpFederais,
      COALESCE (SUM (a.valorEstimadoImpFederais), 0) valorEstimadoImpFederais,
      COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0) aliquotaEstimadaImpEstaduais,
      COALESCE (SUM (a.valorEstimadoImpEstaduais), 0) valorEstimadoImpEstaduais,
      COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0) aliquotaEstimadaImpMunicipais,
      COALESCE (SUM (a.valorEstimadoImpMunicipais), 0) valorEstimadoImpMunicipais,
      COALESCE (MAX (CASE WHEN servMun.codigoServicoMunicipio = ' ' THEN '0' ELSE servMun.codigoServicoMunicipio END), '0') codigoServicoMunicipio,
      COALESCE (MAX (servMun.descricao), ' ') servMun_descricao,
      COALESCE (MAX (listServ.descricao), ' ') listServ_descricao,
      COALESCE (MAX (indicIssqn.descricao), ' ') indicIssqn_descricao
    FROM MODOCFISCALXITENS a
    JOIN PASERVICOSMUNICIPIOS servMun
    ON servMun.idServicoMunicipio = a.idServicoMunicipio
    JOIN SILISTASERVICOS listServ
    ON listServ.listaServicos = a.listaServicos
    JOIN SIINDICISSQN indicIssqn
    ON indicIssqn.indicadorISSQN = a.indicadorISSQN
    JOIN DOC doc
    ON 1=1
    JOIN CAENDERECOSPESSOA endEst
    ON endEst.enderecoPessoa = doc.endEst_enderecoPessoa
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0)
  SELECT
    CASE
      WHEN endEst.municipio = 4314902
        AND munEst.tecnologiaNfse <> 4
      THEN TO_CHAR (a.dataEmissao, 'YYYY')
        || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.dataEmissao,
    CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataCompetencia, 'HH24:MI:SS') END,
    a.chaveNFe,
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    pessEst.indicadorPessoa,
    CASE WHEN pessEst.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    CASE WHEN pessEst.regimeTributario IN ('1', '2', '4') THEN '1' ELSE '2' END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.bairroDistrito),
    TO_CHAR (endEst.municipio),
    LPAD (endEst.cep, 8 , '0'),
    munEst.tecnologiaNfse,
    CASE WHEN fonEst.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN emailEst.idEmailPessoa = 0 THEN ' ' ELSE emailEst.email END,
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN COALESCE (estXnfse.incentivadorCultural, 0) = 1 THEN '1' ELSE '2' END,
    COALESCE (estXnfse.indicadorAmbienteNfse, '0'),
    a.intermediario,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE WHEN pess.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    TO_CHAR (endPess.municipio),
    LPAD (endPess.cep, 8 , '0'),
    endPess.pais,
    munPess.uf,
    CASE WHEN fonPess.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN emailPess.idEmailPessoa = 0 THEN ' ' ELSE emailPess.email END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.bairroDistrito),
    TO_CHAR (endEntr.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEntr.descricao),
    LPAD (endEntr.cep, 8 , '0'),
    munEntr.uf,
    endEntr.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEntr.descricao),
    CASE WHEN COALESCE (a.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.bairroDistrito),
    TO_CHAR (endInterm.municipio),
    LPAD (endInterm.cep, 8 , '0'),
    CASE WHEN fonInterm.idFonePessoa = 0 THEN ' ' ELSE fonInterm.fone END,
    CASE WHEN emailInterm.idEmailPessoa = 0 THEN ' ' ELSE emailInterm.email END,
    COALESCE (SUBSTR( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (REPLACE (
      CASE
        WHEN a.descricaoServico = ' '
        THEN COALESCE ((
          SELECT LISTAGG (TO_CHAR (item2.quantidadeConvertida)
            || ' ' || item2.unidadeMedidaConversao
            || ' X ' || TRIM (TRIM (gradProd.descricaoImpressa)) || ' ' || TRIM (item2.observacoes), '
')
          WITHIN GROUP (ORDER BY item2.sequencia)
          FROM MODOCFISCALXITENS item2
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = item2.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE item2.idDocumentoFiscal = p_idDocumentoFiscal
          AND item2.cancelado = 0), ' ')
        ELSE a.descricaoServico
      END ||
      CASE
        WHEN endEst.municipio IN (4202008, 4314902)
        THEN '
Trib. Aprox.: R$ ' || TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ '
        || TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
        ELSE ''
      END ||
      CASE
        WHEN p_config_425_addInfoComplNFSe = 1
        AND munEst.versaoNFSe <> '2.00'
        AND endEst.municipio <> 4304606
        AND EXISTS (
          SELECT 1
          FROM MODOCFISCALXINFOCOMPLEMEN infCompl
          WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
          AND infCompl.geradoPeloSistema = 1
          AND infCompl.descInformacaoComplementar <> ' ')
        THEN '
        ' || COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), '')
        ELSE ''
      END, '
', '&#xD&#xA'))), 1, 2000), ' '),
    COALESCE (SUBSTR( TRIM (COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 2000),' '),
    REPLACE (TO_CHAR (item.valorProdutoServico, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorDescontoTotal, 'FM9999999999990D00'), ',', '.'),
    item.indicadorIssqn,
    REPLACE (TO_CHAR (item.valorIssqn, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaIssqn, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.retidoIssqn = 1 THEN '1' ELSE '2' END,
    TO_CHAR (CASE WHEN item.tributadoForaMunicipio = 1 THEN a.municipioFatoGerador ELSE endEst.municipio END),
    CASE WHEN item.incentivoFiscal = 1 THEN '1' ELSE '2' END,
    SUBSTR (LPAD (item.listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (item.listaServicos, 4, '0'), 3, 2),
    LPAD (item.cnae, 7, '0'),
    item.codigoServicoMunicipio,
    item.numeroProcessoAdministrativo,
    REPLACE (TO_CHAR (item.valorRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetOutros, 'FM9999999999990D00'), ',', '.'),
    item.stPis,
    REPLACE (TO_CHAR (item.aliquotaPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.basePis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorCofins, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.pisCofinsRetido = 1 THEN '1' ELSE '2' END,
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpMunicipais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00'), ',', '.')
  INTO
    v_numeroRPS,
    v_serieFiscal,
    v_dataEmissao,
    v_dataHoraEmissao,
    v_dataCompetencia,
    v_dataHoraCompetencia,
    v_chaveNFe,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_indicadorPessoa,
    v_estab_tipo,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoMunicipal,
    v_optanteSimplesNacional,
    v_estab_logradouro,
    v_estab_numero,
    v_estab_complemento,
    v_estab_bairroDistrito,
    v_estab_municipio,
    v_estab_cep,
    v_estab_tecnologiaNfse,
    v_estab_fone,
    v_estab_email,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_indicadorAmbienteNfse,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_tipo,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_cep,
    v_pess_pais,
    v_pess_uf,
    v_pess_fone,
    v_pess_email,
    v_entr_logradouro,
    v_entr_numero,
    v_entr_complemento,
    v_entr_bairroDistrito,
    v_entr_municipio,
    v_entr_municipio_descricao,
    v_entr_cep,
    v_entr_uf,
    v_entr_pais,
    v_entr_pais_descricao,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal,
    v_interm_logradouro,
    v_interm_numero,
    v_interm_complemento,
    v_interm_bairroDistrito,
    v_interm_municipio,
    v_interm_cep,
    v_interm_fone,
    v_interm_email,
    v_descricaoServico,
    v_outrasInformacoes,
    v_valorServicos,
    v_valorDescontoTotal,
    v_indicadorIssqn,
    v_valorIssqn,
    v_aliquotaIssqn,
    v_issRetido,
    v_municipioIncidencia,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoTributacaoMunicipio,
    v_numeroProcesso,
    v_valorInss,
    v_valorIrrf,
    v_retencaoPis,
    v_baseRetPis,
    v_valorRetPis,
    v_retencaoCofins,
    v_valorRetCofins,
    v_valorRetCsll,
    v_valorOutrasRetencoes,
    v_stPis,
    v_aliquotaPis,
    v_basePis,
    v_valorPis,
    v_aliquotaCofins,
    v_valorCofins,
    v_pisCofinsRetido,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip
  FROM DOC a
  JOIN ITEM item
  ON 1=1
  JOIN PAOBRAS obra
  ON obra.idObra = a.idObra
  JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = a.pessoaEstabelecimento
  JOIN SIREGIMESTRIBUTARIO regTrib
  ON regTrib.regimeTributario = pessEst.regimeTributario
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = a.endEst_enderecoPessoa
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN CAFONESPESSOA fonEst
  ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
  JOIN CAEMAILSPESSOA emailEst
  ON emailEst.idEmailPessoa = a.emailEst_idEmailPessoa
  JOIN CAEMAILSPESSOA siteEst
  ON siteEst.idEmailPessoa = a.siteEst_idEmailPessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = a.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEntr
  ON munEntr.municipio = endEntr.municipio
  JOIN SIPAISES paisEntr
  ON paisEntr.pais = endEntr.pais
  JOIN CAPESSOAS interm
  ON interm.pessoa = a.intermediario
  JOIN CAENDERECOSPESSOA endInterm
  ON endInterm.enderecoPessoa = a.endInterm_enderecoPessoa
  JOIN SIMUNICIPIOS munInterm
  ON munInterm.municipio = endInterm.municipio
  JOIN CAFONESPESSOA fonInterm
  ON fonInterm.idFonePessoa = a.fonInterm_idFonePessoa
  JOIN CAEMAILSPESSOA emailInterm
  ON emailInterm.idEmailPessoa = a.emailInterm_idEmailPessoa
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = a.endPess_enderecoPessoa
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = a.emailPess_idEmailPessoa
  JOIN CAEMAILSPESSOA sitePess
  ON sitePess.idEmailPessoa = a.sitePess_idEmailPessoa
  JOIN SIMUNICIPIOS munServ
  ON munServ.municipio =
    CASE
      WHEN item.tributadoForaMunicipio = 1
      THEN a.municipioFatoGerador
      ELSE endEst.municipio
    END
  JOIN SIUNIDADESMEDIDA unid
  ON unid.unidadeMedida = item.unidadeMedidaConversao;

  IF v_estab_tecnologiaNfse = 4 THEN
    -- NFS-e
    v_xml := '<NFSe xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
  || '<infNFSe id="NFS' || v_chaveNFe || '">'
    || '<DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
      || '<infDPS id="DPS'
      || v_estab_municipio
      || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '2' ELSE '1' END
      || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
      || SUBSTR ('00000' || TRIM (v_serieFiscal), -5)
      || SUBSTR ('000000000000000' || TRIM (v_numeroRPS), -15)
      || '">'
-- 1 - Producao, 2 - Homologacao
        || '<tpAmb>' || v_indicadorAmbienteNfse || '</tpAmb>'
-- Formato AAAA-MM-DDThh:mm:ssTZD
        || '<dhEmi>' || v_dataHoraEmissao || '</dhEmi>'
-- Versão do aplicativo que gerou o DPS
        || '<verAplic>ADDERI 2024</verAplic>'
-- Número do equipamento emissor do DPS ou série do DPS</serie>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nDPS>' || v_numeroRPS || '</nDPS>'
-- Data em que se iniciou a prestação do serviço: Dia, mês e ano (AAAAMMDD)
        || '<dCompet>' || v_dataCompetencia || '</dCompet>'
-- Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário
        || '<tpEmit>1</tpEmit>'
        || '<cLocEmi>' || v_estab_municipio || '</cLocEmi>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
        || '<prest>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_estab_indicadorPessoa = 'J' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_estab_indicadorPessoa = 'F' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
          || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
          || FUNC_ADD_TAG_XML ('email', v_estab_email)
        || '</prest>';

    -- Tomador (Cliente)
    v_xml := v_xml
        || '<toma>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_pess_indicadorPessoa = 'J' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_pess_indicadorPessoa = 'F' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
          || '<xNome>' || v_pess_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
          || FUNC_ADD_TAG_XML ('email', v_pess_email)
        || '</toma>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
        || '<interm>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_interm_indicadorPessoa = 'J' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_interm_indicadorPessoa = 'F' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_interm_inscricaoMunicipal)
          || '<xNome>' || v_interm_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_interm_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_interm_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_interm_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_interm_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_interm_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_interm_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_interm_fone)
          || FUNC_ADD_TAG_XML ('email', v_interm_email)
        || '</interm>';
    END IF;

-- Serviço
    v_xml := v_xml
        || '<serv>'
          || '<locPrest>'
-- Codigo ibge do municipio onde o servico e prestado</locPrest>
            || '<locPrest>' || v_municipioIncidencia || '</locPrest>'
-- Pais onde ocorreu a prestacao do servico
            || '<cPaisPrestacao>1058</cPaisPrestacao>'
          || '</locPrest>'
          || '<cServ>'
-- Código de tributação nacional do ISSQN.
            || '<cTribNac>' || v_indicadorIssqn || '</cTribNac>'
-- Descrição completa do serviço prestado
            || '<xDescServ>' || v_descricaoServico || '</xDescServ>'
          || '</cServ>'
          || '<obra>'
-- numero identificacao da obra
            || '<cObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</cObra>'
            || '<end>'
              || FUNC_ADD_TAG_XML ('CEP', v_entr_cep)
              || FUNC_ADD_TAG_XML ('xLgr', v_entr_logradouro)
              || FUNC_ADD_TAG_XML ('nro', v_entr_numero)
              || FUNC_ADD_TAG_XML ('xCpl', v_entr_complemento)
              || FUNC_ADD_TAG_XML ('xBairro', v_entr_bairroDistrito)
            || '</end>'
          || '</obra>'
        || '</serv>';

-- Valores
    v_xml := v_xml
        || '<valores>'
          || '<vServPrest>'
-- Valor monetário recebido pelo intermediário do serviço (R$)
            || '<vReceb>0.00</vReceb>'
-- Valor do serviço (R$)
            || '<vServ>' || v_valorServicos || '</vServ>'
          || '</vServPrest>'
          || '<vDescCondIncond>'
            || '<vDescIncond>' || v_valorDescontoTotal || '</vDescIncond>'
            || '<vDescCond>0.00</vDescCond>'
          || '</vDescCondIncond>'
          || '<trib>'
            || '<tribFed>'
              || '<piscofins>'
-- Código de Situação Tributária do PIS/COFINS (CST):
-- 00 - Nenhum;
-- 01 - Operação Tributável com Alíquota Básica;
-- 02 - Operação Tributável com Alíquota Diferenciada;
-- 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto;
-- 04 - Operação Tributável monofásica - Revenda a Alíquota Zero;
-- 05 - Operação Tributável por Substituição Tributária;
-- 06 - Operação Tributável a Alíquota Zero;
-- 07 - Operação Tributável da Contribuição;
-- 08 - Operação sem Incidência da Contribuição;
-- 09 - Operação com Suspensão da Contribuição;
            || '<CST>' || CASE WHEN v_pisCofinsRetido = '1' THEN '01' ELSE v_stPis END || '</CST>'
-- Valor da Base de Cálculo do PIS/COFINS (R$)
            || '<vBCPisCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_baseRetPis ELSE v_basePis END || '</vBCPisCofins>'
-- Valor da Alíquota do PIS (%).
            || '<pAliqPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</pAliqPis>'
-- Valor da Alíquota da COFINS (%).
            || '<pAliqCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</pAliqCofins>'
-- Valor monetário do PIS (R$).
            || '<vPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</vPis>'
-- Valor monetário do COFINS (R$).
            || '<vCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</vCofins>'
-- Tipo de retencao do Pis/Cofins:1 - Retido;2 - Não Retido;
            || '<tpRetPisCofins>' || v_pisCofinsRetido || '</tpRetPisCofins>' 
              || '</piscofins>'
-- Valor monetário do CP(R$).
              || '<vRetCP>0.00</vRetCP>'
-- Valor monetário do IRRF (R$).
              || '<vRetIRRF>' || v_valorIrrf || '</vRetIRRF>'
-- Valor monetário do CSLL (R$).
              || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
            || '</tribFed>'
            || '<tribMun>'
-- Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Exportação de serviço; 3 - Não Incidência; 4 - Imunidade;
              || '<tribISSQN>' || CASE v_indicadorIssqn WHEN '2' THEN '3' WHEN '4' THEN '2' WHEN '5' THEN '4' ELSE '1' END ||'</tribISSQN>'
-- Tipo de retencao do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediario;
              || '<tpRetISSQN>' || CASE WHEN v_issRetido = '1' THEN '2' ELSE '1' END || '</tpRetISSQN>'
            || '</tribMun>'
            || '<totTrib>'
-- Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<vTotTrib>0</vTotTrib>'
-- Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<pTotTrib>0</pTotTrib>'
-- Indicador de informação de valor total de tributos. Possui valor fixo igual a zero (indTotTrib=0). Não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não;
              || '<indTotTrib>0</indTotTrib>'
-- Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%)
              || '<pTotTribSN>0</pTotTribSN>'
            || '</totTrib>'
          || '</trib>'
        || '</valores>'
      || '</infDPS>'
    || '</DPS>'
  || '</infNFSe>'
|| '</NFSe>';
  
-- Município: 4202008 - Balneário Camboriú - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4202008' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>102</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4300703 - Anta Gorda - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4300703' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4300703</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4300703</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4301404 - Arvorezinha - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4301404' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';
          
    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;
    
    -- Construção Civil
    v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
          || '</ConstrucaoCivil>';
          
    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4302105 - Bento Gonçalves - RS
-- Empresa: ABASE
-- Tecnologia: 1 - SOAP
-- Versão: 2.01
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4302105' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://nfse.abase.com.br/nfse.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
  || '<LoteRps Id="1'
    || TO_CHAR (v_dataEmissao, 'YYYY')
    || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
    || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
    || '" versao="2.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_cnae = '4322301' THEN
      v_xml := v_xml
          || '<dadosDaObra>'
            || FUNC_ADD_TAG_XML ('xLogObra', v_entr_logradouro)
            || '<cCidadeObra>' || v_entr_municipio || '</cCidadeObra>'
            || FUNC_ADD_TAG_XML ('xCidadeObra', v_entr_municipio_descricao)
            || FUNC_ADD_TAG_XML ('xUfObra', v_entr_uf)
           || FUNC_ADD_TAG_XML ('cPaisObra', v_entr_pais)
            || FUNC_ADD_TAG_XML ('xPaisObra', v_entr_pais_descricao)
          || '</dadosDaObra>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4304606 - Canoas - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4304606' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="' || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END || LPAD (p_loteWebService, 4, '0') || '">'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>RPS</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValTotTributos>0.00</ValTotTributos>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ResponsavelRetencao>1</ResponsavelRetencao>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
              || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '<Contato/>' ELSE '<Contato>'
                || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
                || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
              || '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
              || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309100 - Gramado - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4309100' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309407 - Guaporé - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309407' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
            || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309902 - Ibiraiaras - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4312906 - Nova Bassano - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4312906' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4312906</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4312906</IdCidade>'            
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313300 - Nova Prata - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313300' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4313300</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4313300</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313409 - Novo Hamburgo - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313409' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4314902 - Porto Alegre - RS
-- Empresa: BHISS
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: InfRps, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4314902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_numeroRPS || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>4314902</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4318705 - São Leopoldo - RS
-- Empresa: THEMA
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4318705' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4318705</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4318705</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4320800 - Soledade - RS
-- Empresa: GOV BR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4320800' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            --|| CASE WHEN v_issRetido = '2' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<IntermediarioServico>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
            || FUNC_ADD_TAG_XML ('Art', v_art)
          || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  -- Município Inválido
  ELSE
    v_xml := 'Município Inválido';
  END IF;

  RETURN v_xml;
END;

/

create or replace PROCEDURE ADD_TROCA_PESSOA (
  p_pessoaDe   IN NUMBER,
  p_pessoaPara IN NUMBER)
IS
  v_existe NUMBER;
BEGIN
  -- Pessoa Fisica
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOASFISICAS
  WHERE pessoa = p_pessoaPara;
  IF v_existe = 0 THEN
    INSERT INTO CAPESSOASFISICAS (
      pessoa,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado)
    SELECT p_pessoaPara,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado
    FROM CAPESSOASFISICAS
    WHERE pessoa = p_pessoaDe;
  END IF;
  -- Transportadora
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATRANSPORTADORAS a
    SET a.ativo            = 1
    WHERE a.transportadora = p_pessoaPara
    AND a.ativo            = 0
    AND EXISTS
      (SELECT 1
      FROM CATRANSPORTADORAS b
      WHERE b.transportadora = p_pessoaDe
      AND b.ativo            = 1
      );
  ELSE
    INSERT INTO CATRANSPORTADORAS (
      transportadora,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CATRANSPORTADORAS
    WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAVENDEDORES a
    SET a.ativo      = 1
    WHERE a.vendedor = p_pessoaPara
    AND a.ativo      = 0
    AND EXISTS
      (SELECT 1 FROM CAVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.ativo = 1
      );
  ELSE
    INSERT INTO CAVENDEDORES (
      vendedor,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CAVENDEDORES
    WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSB a
    SET a.ativo           = 1
    WHERE a.comissionadoB = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSB b
      WHERE b.comissionadoB = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSB (
      comissionadoB,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CACOMISSIONADOSB
    WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSC a
    SET a.ativo           = 1
    WHERE a.comissionadoC = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSC b
      WHERE b.comissionadoC = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSC (
      comissionadoC,
      ativo,
      percentualComissaoB,
      percentualComissaoC)
    SELECT p_pessoaPara,
      ativo,
      percentualComissaoB,
      percentualComissaoC
    FROM CACOMISSIONADOSC
    WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaborador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOLABORADORES a
    SET a.ativo         = 1
    WHERE a.colaborador = p_pessoaPara
    AND a.ativo         = 0
    AND EXISTS
      (SELECT 1
      FROM CACOLABORADORES b
      WHERE b.colaborador = p_pessoaDe
      AND b.ativo         = 1
      );
  ELSE
    INSERT INTO CACOLABORADORES (
      colaborador,
      ativo,
      permiteDescontoEmFolha)
    SELECT p_pessoaPara,
      ativo,
      permiteDescontoEmFolha
    FROM CACOLABORADORES
    WHERE colaborador = p_pessoaDe;
  END IF;
  -- Usuário
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAUSUARIOS a
    SET a.login = COALESCE((SELECT MAX(b.login)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.senha = COALESCE((SELECT MAX(b.senha)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.ativo     = 1
    WHERE a.usuario = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CAUSUARIOS (
      usuario,
      ativo,
      login,
      senha,
      perfilUsuario)
    SELECT p_pessoaPara,
      ativo,
      login,
      senha,
      perfilUsuario
    FROM CAUSUARIOS
    WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnico
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATECNICOS a
    SET a.ativo     = 1
    WHERE a.tecnico = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CATECNICOS b
      WHERE b.tecnico = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CATECNICOS (
      tecnico,
      ativo,
      equipeTecnica)
    SELECT p_pessoaPara,
      ativo,
      equipeTecnica
    FROM CATECNICOS
    WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CASEPARADORES a
    SET a.ativo       = 1
    WHERE a.separador = p_pessoaPara
    AND a.ativo       = 0
    AND EXISTS
      (SELECT 1
      FROM CASEPARADORES b
      WHERE b.separador = p_pessoaDe
      AND b.ativo       = 1
      );
  ELSE
    INSERT INTO CASEPARADORES (
      separador,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CASEPARADORES
    WHERE separador = p_pessoaDe;
  END IF;
  -- Profissional Registrado
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPROFISSIONAISREGISTRAD a
    SET a.ativo                    = 1
    WHERE a.profissionalRegistrado = p_pessoaPara
    AND a.ativo                    = 0
    AND EXISTS
      (SELECT 1
      FROM CAPROFISSIONAISREGISTRAD b
      WHERE b.profissionalRegistrado = p_pessoaDe
      AND b.ativo                    = 1
      );
  ELSE
    INSERT INTO CAPROFISSIONAISREGISTRAD (
      profissionalRegistrado,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro)
    SELECT p_pessoaPara,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro
    FROM CAPROFISSIONAISREGISTRAD
    WHERE profissionalRegistrado = p_pessoaDe;
  END IF;
  -- Credenciadora Cartão
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACREDENCIADORASCARTAO a
    SET a.ativo                 = 1
    WHERE a.credenciadoraCartao = p_pessoaPara
    AND a.ativo                 = 0
    AND EXISTS
      (SELECT 1
      FROM CACREDENCIADORASCARTAO b
      WHERE b.credenciadoraCartao = p_pessoaDe
      AND b.ativo                 = 1
      );
  ELSE
    INSERT INTO CACREDENCIADORASCARTAO (
      credenciadoraCartao,
      ativo,
      credenciadoraTef)
    SELECT p_pessoaPara,
      ativo,
      credenciadoraTef
    FROM CACREDENCIADORASCARTAO
    WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Orgão Federal / Estadual / Municipal
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAORGAOSFEDERESTADMUNIC
  WHERE orgaoFederalEstadualMunicipal = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAORGAOSFEDERESTADMUNIC a
    SET a.ativo                           = 1
    WHERE a.orgaoFederalEstadualMunicipal = p_pessoaPara
    AND a.ativo                           = 0
    AND EXISTS
      (SELECT 1
      FROM CAORGAOSFEDERESTADMUNIC b
      WHERE b.orgaoFederalEstadualMunicipal = p_pessoaDe
      AND b.ativo                           = 1
      );
  ELSE
    INSERT INTO CAORGAOSFEDERESTADMUNIC (
        orgaoFederalEstadualMunicipal,
        ativo,
        federalEstadualMunicipal)
    SELECT p_pessoaPara,
      ativo,
      federalEstadualMunicipal
    FROM CAORGAOSFEDERESTADMUNIC
    WHERE orgaoFederalEstadualMunicipal = p_pessoaDe;
  END IF;
  -- Pessoa Estabelecimento
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPESSOAESTABELECIMENTOS a
    SET a.ativo                   = 1
    WHERE a.pessoaEstabelecimento = p_pessoaPara
    AND a.ativo                   = 0
    AND EXISTS
      (SELECT 1
      FROM CAPESSOAESTABELECIMENTOS b
      WHERE b.pessoaEstabelecimento = p_pessoaDe
      AND b.ativo                   = 1
      );
  ELSE
    INSERT INTO CAPESSOAESTABELECIMENTOS (
      pessoaEstabelecimento,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CAPESSOAESTABELECIMENTOS
    WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Cliente
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACLIENTES a
    SET a.ativo     = 1
    WHERE a.cliente = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CACLIENTES b
      WHERE b.cliente = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CACLIENTES (
      cliente,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento)
    SELECT p_pessoaPara,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento
    FROM CACLIENTES
    WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAFORNECEDORES a
    SET a.ativo        = 1
    WHERE a.fornecedor = p_pessoaPara
    AND a.ativo        = 0
    AND EXISTS
      (SELECT 1
      FROM CAFORNECEDORES b
      WHERE b.fornecedor = fornecedor
      AND b.ativo        = 1
      );
  ELSE
    INSERT INTO CAFORNECEDORES (
      fornecedor,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra)
    SELECT p_pessoaPara,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra
    FROM CAFORNECEDORES
    WHERE fornecedor = p_pessoaDe;
  END IF;
  -- Botões
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoa = p_pessoaPara AND b.pessoaAutorizada = a.pessoaAutorizada);
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoaAutorizada = p_pessoaPara WHERE a.pessoaAutorizada = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoaAutorizada = p_pessoaPara AND b.pessoa = a.pessoa);
  UPDATE CAREFERBANCARIASPESSOA    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERBANCARIASPESSOA b WHERE b.pessoa = p_pessoaPara AND b.banco = a.banco AND b.agenciaBanco = a.agenciaBanco AND b.contaBanco = a.contaBanco);
  UPDATE CAREFERCOMERCIAISPESSOA   a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERCOMERCIAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.empresa = a.empresa);
  UPDATE CAREFERPESSOAISPESSOA     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAREFERPESSOAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.contato = a.contato);
  UPDATE CAPESSOAXARQUIVOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CAPESSOAXBIOMETRIAS       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXBIOMETRIAS b WHERE b.pessoa = p_pessoaPara AND b.dedo = a.dedo);
  UPDATE CAPESSOAXUFS              a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXUFS b WHERE b.pessoa = p_pessoaPara AND b.uf = a.uf);
  UPDATE CAPESSOAXCONTASCONTABEIS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOAXCONTASCONTABEIS b WHERE b.pessoa = p_pessoaPara AND b.categoriaContabil = a.categoriaContabil AND b.idPlanoContaContabil = a.idPlanoContaContabil);
  UPDATE CAPLACAS                    SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento);
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaDe AND b.estabelecimento = a.estabelecimento AND b.ativo = 1);
  -- Parâmetros / Cadastros
  UPDATE PAFILTROCABECXPESSOAS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho);
  UPDATE PAFILTROCABECXPESSOAS     a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
  UPDATE PAREGRASFRETE             a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASFRETE b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.uf = a.uf AND b.mesorregiaoGeografica = a.mesorregiaoGeografica AND b.microrregiaoGeografica = a.microrregiaoGeografica AND b.municipio = a.municipio AND b.bairroDistrito = a.bairroDistrito AND b.exclusivoPessoaA = a.exclusivoPessoaA AND b.exclusivoPessoaB = a.exclusivoPessoaB AND b.exclusivoPessoaC = a.exclusivoPessoaC AND b.exclusivoPessoaD = a.exclusivoPessoaD AND b.exclusivoPessoaE = a.exclusivoPessoaE);
  UPDATE CAGRADEPRODUTOXPESSOAS    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAGRADEPRODUTOXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.gradeProduto = a.gradeProduto AND b.codigoProduto = a.codigoProduto);
  UPDATE PAPROJETOS                  SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PACARTOESPROPRIOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CARECEITASLENTESCLIENTE     SET paciente = p_pessoaPara WHERE paciente = p_pessoaDe;
  UPDATE PAMETAXCONTEUDOS            SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE PAMETAXCOMISSIONADO       a SET a.comissionado = p_pessoaPara WHERE a.comissionado = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo);
  UPDATE PAMETAXCOMISSIONADO       a SET a.ativo = 1 WHERE a.comissionado = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAMETAXCOMISSIONADO b WHERE b.comissionado = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
  UPDATE PAMODELOSFINANCEIRO         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAOPERFISCALXPESSOAS      a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAOPERFISCALXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.operacaoFiscal = a.operacaoFiscal);
  UPDATE PAOPERFISCALXPESSOAS      a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAOPERFISCALXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.operacaoFiscal = a.operacaoFiscal AND b.ativo = 1);
  UPDATE PAMVAS                    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMVAS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem);
  UPDATE PADESONERACOESFISCAIS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PADESONERACOESFISCAIS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem AND b.stICMS = a.stICMS);
  -- Movimentações
  UPDATE MOHISTORICOCREDITO          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTABEIS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MOORCAMENTOXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONTRATOS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTRATOS                 SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MOPREDOCUMXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMXPAGAMENTOS       SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST     SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXSERVICO         SET intermediario = p_pessoaPara WHERE intermediario = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
  UPDATE MODOCFISCALXSERVICO         SET intermediario = p_pessoaPara WHERE intermediario = p_pessoaDe;
  UPDATE MODOCFISCALXNFREF           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MODOCFISCALXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET beneficiario = p_pessoaPara WHERE beneficiario = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOFINANCEIROXCOMISSOES      SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE MOFINANCEIROXBAIXAS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MONEGOCIACOESDIVIDAS        SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCELAMENTOS           SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCXPAGAMENTOS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSPCREGISTROS              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCOBRANCA         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCRMS                      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPONTUACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSEPARACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXITENS   SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXFISC    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOESTOQUES                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTROCA           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCTROCAXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOBALANCOS                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTRANSFERENCIA   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONSERTOS                 SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  UPDATE MORESERVASESTOQUE           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOMOTIVOSBLOQUEIOS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOLOTESINGRESSO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOEVENTOS                   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  -- Transportadoras
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAREGRASFRETE               SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Cadastros
    UPDATE CAPLACAS                    SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.filtroProduto = a.filtroProduto);
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.filtroProduto = a.filtroProduto AND b.ativo = 1);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaPara AND b.tabelaPreco = a.tabelaPreco);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.tabelaPreco = a.tabelaPreco AND b.ativo = 1);
    UPDATE PAMETAXVENDEDOR           a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo);
    UPDATE PAMETAXVENDEDOR           a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaPara AND b.cliente = a.cliente);
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOS                SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOORCAMENTOXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOPREDOCUMXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCFISCALXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOVALESDESCONTO             SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTROCA           SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCTROCAXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOMOTIVOSBLOQUEIOS          SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaboradores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAINDICADORES               SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPLANEJAMENTOATIVIDADES    SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRetirada = p_pessoaPara WHERE colaboradorResponsavelRetirada = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRecebim  = p_pessoaPara WHERE colaboradorResponsavelRecebim  = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOCONTRATOS                 SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOENTREGAS                  SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET comprador = p_pessoaPara WHERE comprador = p_pessoaDe;
    UPDATE MOLOTESINGRESSO             SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
  END IF;
  -- Usuários
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAMENUSCUSTOMIZADOS         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MONOTIFICACOES              SET usuarioCriacao = p_pessoaPara WHERE usuarioCriacao = p_pessoaDe;
    UPDATE MONOTIFICACAOXUSUARIOS      SET usuarioNotificado = p_pessoaPara WHERE usuarioNotificado = p_pessoaDe;
    UPDATE MOMARCADORES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAWHATSAPPCONEXOES        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAWHATSAPPCONEXOES b WHERE b.usuario = p_pessoaPara AND b.wsWhatsApp = a.wsWhatsApp AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAWHATSAPPCONEXOES        a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAWHATSAPPCONEXOES b WHERE b.usuario = p_pessoaDe AND b.wsWhatsApp = a.wsWhatsApp AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho);
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
    UPDATE PACLASSIFICPRODXREGRAS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACLASSIFICPRODXREGRAS b WHERE b.usuario = p_pessoaPara AND b.classificacaoProduto = a.classificacaoProduto AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONFIGURACAOXCONTEUDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONFIGURACAOXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.configuracao = a.configuracao AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAPERSCAMPOSXCONTEUDOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAPERSCAMPOSXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.personalizacaoCampo = a.personalizacaoCampo AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXPERMISSOES         a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXPERMISSOES b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXFAVORITOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXFAVORITOS b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXATALHOS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXATALHOS b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMENUXLAYOUTPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMENUXLAYOUTPESQUISA b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo);
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONTASFINANCPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONTASFINANCPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.contaFinanceira = a.contaFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAVALIDACOESPESSOA        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAVALIDACOESPESSOA b WHERE b.usuario = p_pessoaPara AND b.campoValidarPessoa = a.campoValidarPessoa AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.localValidarCampoPessoa = a.localValidarCampoPessoa AND b.meioPagamento = a.meioPagamento);
    UPDATE PACONTROLESENTREGA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASENTREGA             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.permiteOrcamento = 'S' WHERE a.usuario = p_pessoaPara AND a.permiteOrcamento <> 'S' AND EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permiteOrcamento = 'S');
    UPDATE PACONTROLESENTREGAPERMIT  a SET a.permiteLogistica = 'S' WHERE a.usuario = p_pessoaPara AND a.permiteLogistica <> 'S' AND EXISTS (SELECT 1 FROM PACONTROLESENTREGAPERMIT b WHERE b.usuario = p_pessoaPara AND b.controleEntrega = a.controleEntrega AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permiteLogistica = 'S');
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCobranca = a.listaCobranca);
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCobranca = a.listaCobranca AND b.ativo = 1);
    UPDATE PALISTACRMXUSUARIOS       a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCRM = a.listaCRM);
    UPDATE PALISTACRMXUSUARIOS       a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCRM = a.listaCRM AND b.ativo = 1);
    UPDATE PAREGRASCREDITO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAMOTORCREDITO              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMOTIVOSBLOQPERMITIDOS   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMOTIVOSBLOQPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.motivoBloqueioDocumento = a.motivoBloqueioDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAETAPASORCAMENTODEPARA   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAETAPASORCAMENTODEPARA b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.etapaOrcamentoDe = a.etapaOrcamentoDe AND b.etapaOrcamentoPara = a.etapaOrcamentoPara);
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS (SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAEMAILS                  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaPara AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAEMAILS                  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaDe AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAWEBSERVICESCONEXOES     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAWEBSERVICESCONEXOES b WHERE b.usuario = p_pessoaPara AND b.tipoWebService = a.tipoWebService AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAWEBSERVICESCONEXOES     a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PAWEBSERVICESCONEXOES b WHERE b.usuario = p_pessoaDe AND b.tipoWebService = a.tipoWebService AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAIMAGENSSISTEMA          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAIMAGENSSISTEMA b WHERE b.usuario = p_pessoaPara AND b.tipoImagemSistema = a.tipoImagemSistema AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo);
    UPDATE PAIMPRESSORAXDOCUMENTO    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAIMPRESSORAXDOCUMENTO b WHERE b.usuario = p_pessoaPara AND b.tipoDocumentoImpresso = a.tipoDocumentoImpresso AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC AND b.etapaOrcamento = a.etapaOrcamento);
    UPDATE PACAIXASUSUARIOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACAIXASUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC);
    UPDATE PAMEIOSPAGAMENTOABRIRGAV  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOABRIRGAV b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMEIOSPAGAMENTOABRIRGAV  a SET a.abrirGaveta = 1 WHERE a.usuario = p_pessoaPara AND a.abrirGaveta = 0 AND EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOABRIRGAV b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.abrirGaveta = 1);
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS (SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PACONDICOESPAGAMENTOAUTO  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONDICOESPAGAMENTOAUTO b WHERE b.usuario = p_pessoaPara AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACONDICOESPAGAMENTOAUTO  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS (SELECT 1 FROM PACONDICOESPAGAMENTOAUTO b WHERE b.usuario = p_pessoaPara AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PAREGRASCAIXAS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASCAIXAS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PAREGRASMARGEMCONTRIBUIC  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PAREGRASMARGEMCONTRIBUIC b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario);
    UPDATE PACATEGORIASPRODUTOSVENDA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASFAIXASATRASO        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Cadastros
    UPDATE CAPRODUTOS                  SET usuarioInclusao = p_pessoaPara WHERE usuarioInclusao = p_pessoaDe;
    UPDATE CAPRODUTOS                  SET usuarioAlteracao = p_pessoaPara WHERE usuarioAlteracao = p_pessoaDe;
    UPDATE CATABELAPRECOXALTERACOES    SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE CAPRODUTOXCONTROLEENTREGA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Movimentações
    UPDATE MOCATEGORIASMENUUSUARIO   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOCATEGORIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.areaMenu = a.areaMenu AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu);
    UPDATE MOGUIASMENUUSUARIO        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOGUIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.guia = a.guia AND b.categoria = a.categoria);
    UPDATE MOACESSOSMENU             a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM MOACESSOSMENU b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu);
    UPDATE MOSESSOES                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOLOGALTERACOES             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSULTASDADOSCPF         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCCONSULTAS              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXETAPAS          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOSESSOESCAIXA              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXSTATUS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXBLOQUEIOSEST     SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCFISCALXSITUACOES       SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MODOCFISCALXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MONEGOCIACOESDIVIDAS        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOREPARCELAMENTOS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCREGISTROS              SET usuarioRegistroSPC = p_pessoaPara WHERE usuarioRegistroSPC = p_pessoaDe;
    UPDATE MOSPCREGISTROS              SET usuarioExclusaoSPC = p_pessoaPara WHERE usuarioExclusaoSPC = p_pessoaDe;
    UPDATE MOHISTORICOCOBRANCA         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCRMS                      SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCRMXHISTORICO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCOBRANCA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPONTUACOES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCONCILIACOES      SET usuarioImportacao = p_pessoaPara WHERE usuarioImportacao = p_pessoaDe;
    UPDATE MOCONCILIACOESCARTOES       SET usuarioProcessamento = p_pessoaPara WHERE usuarioProcessamento = p_pessoaDe;
    UPDATE MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente);
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred);
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor);
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico);
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT EXISTS (SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto);
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS (SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

create or replace PROCEDURE ADD_CRM_ATUALIZA_CFE_HISTORICO (
  p_idCRM IN NUMBER)
IS
  v_historicoExiste NUMBER;
BEGIN
  v_historicoExiste := 0;
  FOR a IN (
    SELECT
      a.tipoAcaoCRM,
      a.situacaoCRM,
      ( SELECT MIN (c.dataCriacao)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataCriacao IS NOT NULL) dataCriacao,
      ( SELECT MIN (c.dataInicio)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataInicio IS NOT NULL) dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          ORDER BY
            a.dataCriacao DESC,
            a.dataInicio DESC,
            a.dataTermino DESC,
            a.id DESC) ordenacao,
        a.tipoAcaoCRM,
        a.situacaoCRM,
        a.dataTermino,
        a.dataProximoContato,
        a.horaProximoContatoFinal,
        a.observacoes
      FROM MOCRMXHISTORICO a
      WHERE a.idCRM = p_idCRM) a
    WHERE a.ordenacao = 1)
  LOOP
    UPDATE MOCRMS b SET
      b.tipoAcaoCRM             = a.tipoAcaoCRM,
      b.situacaoCRM             = a.situacaoCRM,
      b.dataCriacao             = a.dataCriacao,
      b.dataInicio              = a.dataInicio,
      b.dataTermino             = a.dataTermino,
      b.dataProximoContato      = a.dataProximoContato,
      b.horaProximoContatoFinal = a.horaProximoContatoFinal,
      b.observacoes             = a.observacoes
    WHERE b.idCRM = p_idCRM;
    v_historicoExiste := 1;
  END LOOP;
  IF v_historicoExiste = 0 THEN
    DELETE MOCRMXORCAMENTOS
    WHERE idCRM = p_idCRM;
    DELETE MOCRMS
    WHERE idCRM = p_idCRM;
  END IF;
END ADD_CRM_ATUALIZA_CFE_HISTORICO;

/

create or replace PROCEDURE ADD_CRM_HISTORICO_EXCLUI (
  p_id IN NUMBER)
IS
  v_idCRM NUMBER;
BEGIN
  SELECT COALESCE (MAX (idCRM), 0)
  INTO v_idCRM
  FROM MOCRMXHISTORICO
  WHERE id = p_id;
  DELETE MOCRMXHISTORICO
  WHERE id = p_id;
  IF v_idCRM > 0 THEN
    ADD_CRM_ATUALIZA_CFE_HISTORICO (v_idCRM);
  END IF;
END ADD_CRM_HISTORICO_EXCLUI;

/

create or replace PROCEDURE ADD_CRM_HISTORICO_GRAVA (
  p_estabelecimentoAtivo    IN NUMBER,
  p_id                      IN NUMBER,
  p_idCRM                   IN NUMBER,
  p_descricao               IN VARCHAR,
  p_listaCRM                IN NUMBER,
  p_tipoVenda               IN NUMBER,
  p_estabelecimento         IN NUMBER,
  p_pessoa                  IN NUMBER,
  p_enderecoPessoa          IN NUMBER,
  p_usuario                 IN NUMBER,
  p_dataCriacao             IN DATE,
  p_etapaFunilCRM           IN NUMBER,
  p_tipoAcaoCRM             IN NUMBER,
  p_situacaoCRM             IN CHAR,
  p_dataInicio              IN DATE,
  p_dataTermino             IN DATE,
  p_dataProximoContato      IN DATE,
  p_horaProximoContatoFinal IN CHAR,
  p_observacoes             IN VARCHAR,
  /* Retornos */
  r_id                      OUT NUMBER,
  r_idCRM                   OUT NUMBER)
IS
BEGIN
  IF p_idCRM > 0 THEN
    r_idCRM := p_idCRM;
  ELSE
    r_idCRM := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOCRMS',
      'idCRM',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  IF p_id > 0 THEN
    r_id := p_id;
  ELSE
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOCRMXHISTORICO',
      'id',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  MERGE INTO MOCRMS a USING (
    SELECT
      r_idCRM                   idCRM,
      p_descricao               descricao,
      p_listaCRM                listaCRM,
      p_tipoVenda               tipoVenda,
      p_estabelecimento         estabelecimento,
      p_pessoa                  pessoa,
      p_enderecoPessoa          enderecoPessoa,
      p_usuario                 usuario,
      p_dataCriacao             dataCriacao,
      p_etapaFunilCRM           etapaFunilCRM,
      p_tipoAcaoCRM             tipoAcaoCRM,
      p_situacaoCRM             situacaoCRM,
      p_dataInicio              dataInicio,
      p_dataTermino             dataTermino,
      p_dataProximoContato      dataProximoContato,
      p_horaProximoContatoFinal horaProximoContatoFinal,
      p_observacoes             observacoes
    FROM DUAL) b
  ON (a.idCRM = b.idCRM)
  WHEN MATCHED THEN UPDATE SET
    a.descricao       = b.descricao,
    a.listaCRM        = b.listaCRM,
    a.tipoVenda       = b.tipoVenda,
    a.estabelecimento = b.estabelecimento,
    a.pessoa          = b.pessoa,
    a.enderecoPessoa  = b.enderecoPessoa
  WHEN NOT MATCHED THEN INSERT (
    idCRM,
    descricao,
    listaCRM,
    tipoVenda,
    estabelecimento,
    pessoa,
    enderecoPessoa,
    usuario,
    dataCriacao,
    etapaFunilCRM,
    tipoAcaoCRM,
    situacaoCRM,
    dataInicio,
    dataTermino,
    dataProximoContato,
    horaProximoContatoFinal,
    observacoes)
  VALUES (
    b.idCRM,
    b.descricao,
    b.listaCRM,
    b.tipoVenda,
    b.estabelecimento,
    b.pessoa,
    b.enderecoPessoa,
    b.usuario,
    b.dataCriacao,
    b.etapaFunilCRM,
    b.tipoAcaoCRM,
    b.situacaoCRM,
    b.dataInicio,
    b.dataTermino,
    b.dataProximoContato,
    b.horaProximoContatoFinal,
    b.observacoes);
  MERGE INTO MOCRMXHISTORICO a USING (
    SELECT
      r_id                      id,
      r_idCRM                   idCRM,
      p_usuario                 usuario,
      p_dataCriacao             dataCriacao,
      p_etapaFunilCRM           etapaFunilCRM,
      p_tipoAcaoCRM             tipoAcaoCRM,
      p_situacaoCRM             situacaoCRM,
      p_dataInicio              dataInicio,
      p_dataTermino             dataTermino,
      p_dataProximoContato      dataProximoContato,
      p_horaProximoContatoFinal horaProximoContatoFinal,
      p_observacoes             observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idCRM                   = b.idCRM,
    a.usuario                 = b.usuario,
    a.dataCriacao             = b.dataCriacao,
    a.etapaFunilCRM           = b.etapaFunilCRM,
    a.tipoAcaoCRM             = b.tipoAcaoCRM,
    a.situacaoCRM             = b.situacaoCRM,
    a.dataInicio              = b.dataInicio,
    a.dataTermino             = b.dataTermino,
    a.dataProximoContato      = b.dataProximoContato,
    a.horaProximoContatoFinal = b.horaProximoContatoFinal,
    a.observacoes             = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idCRM,
    usuario,
    dataCriacao,
    etapaFunilCRM,
    tipoAcaoCRM,
    situacaoCRM,
    dataInicio,
    dataTermino,
    dataProximoContato,
    horaProximoContatoFinal,
    observacoes)
  VALUES (
    b.id,
    b.idCRM,
    b.usuario,
    b.dataCriacao,
    b.etapaFunilCRM,
    b.tipoAcaoCRM,
    b.situacaoCRM,
    b.dataInicio,
    b.dataTermino,
    b.dataProximoContato,
    b.horaProximoContatoFinal,
    b.observacoes);
  ADD_CRM_ATUALIZA_CFE_HISTORICO (r_idCRM);
END ADD_CRM_HISTORICO_GRAVA;

/

create or replace PROCEDURE ADD_CRM_ATUALIZA_CFE_HISTORICO (
  p_idCRM IN NUMBER)
IS
  v_historicoExiste NUMBER;
BEGIN
  v_historicoExiste := 0;
  FOR a IN (
    SELECT
      a.etapaFunilCRM,
      a.tipoAcaoCRM,
      a.situacaoCRM,
      ( SELECT MIN (c.dataCriacao)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataCriacao IS NOT NULL) dataCriacao,
      ( SELECT MIN (c.dataInicio)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataInicio IS NOT NULL) dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          ORDER BY
            a.dataCriacao DESC,
            a.dataInicio DESC,
            a.dataTermino DESC,
            a.id DESC) ordenacao,
        a.etapaFunilCRM,
        a.tipoAcaoCRM,
        a.situacaoCRM,
        a.dataTermino,
        a.dataProximoContato,
        a.horaProximoContatoFinal,
        a.observacoes
      FROM MOCRMXHISTORICO a
      WHERE a.idCRM = p_idCRM) a
    WHERE a.ordenacao = 1)
  LOOP
    UPDATE MOCRMS b SET
      b.etapaFunilCRM           = a.etapaFunilCRM,
      b.tipoAcaoCRM             = a.tipoAcaoCRM,
      b.situacaoCRM             = a.situacaoCRM,
      b.dataCriacao             = a.dataCriacao,
      b.dataInicio              = a.dataInicio,
      b.dataTermino             = a.dataTermino,
      b.dataProximoContato      = a.dataProximoContato,
      b.horaProximoContatoFinal = a.horaProximoContatoFinal,
      b.observacoes             = a.observacoes
    WHERE b.idCRM = p_idCRM;
    v_historicoExiste := 1;
  END LOOP;
  IF v_historicoExiste = 0 THEN
    DELETE MOCRMXORCAMENTOS
    WHERE idCRM = p_idCRM;
    DELETE MOCRMS
    WHERE idCRM = p_idCRM;
  END IF;
END ADD_CRM_ATUALIZA_CFE_HISTORICO;

/

-- Atualizar Etapa Funil CRM com Tipo Ação CRM
--INSERT INTO PAFUNISCRM (funilCRM, descricao, ativo, observacoes) VALUES (1, 'Funil', 1, ' ');
--INSERT INTO PAFUNILCRMXETAPAS (etapaFunilCRM, descricao, ativo, funilCRM, ordenacao, situacaoFunilCRM, observacoes) SELECT tipoAcaoCRM, descricao, ativo, 1, ordenacao, CASE WHEN situacaoCRM IN ('C','E') THEN situacaoCRM ELSE 'A' END, observacoes FROM PATIPOSACOESCRM WHERE tipoAcaoCRM > 0;
--INSERT INTO PATIPOSACOESCRMPERMITIDAS (id, tipoAcaoCRM, estabelecimento, perfilUsuario, usuario, funilCRM, etapaFunilCRM, listaCRM, permitePesquisar, permiteCriar, permiteModificar, permiteExcluir) SELECT tipoAcaoCRM, tipoAcaoCRM, 0, 0, 0, 0, tipoAcaoCRM, 0, 1, 1, 1, 1 FROM PATIPOSACOESCRM WHERE tipoAcaoCRM > 0;
--UPDATE PALISTASCRM SET funilCRM = 1 WHERE listaCRM > 0;
--UPDATE MOCRMS SET etapaFunilCRM = tipoAcaoCRM WHERE idCRM > 0;
--UPDATE MOCRMXHISTORICO SET etapaFunilCRM = tipoAcaoCRM WHERE id > 0;

--COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('04/11/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 2' WHERE idVersaoSistema = 2024001005;

COMMIT;

-- FIM BETA 2 - 04/11/2024

DROP INDEX MOEVENTOS_K2;

CREATE INDEX MOEVENTOS_K2 ON MOEVENTOS (tabelaSistema, id, data DESC);

UPDATE SIGRUPOSNCM SET ativo = 0 WHERE grupoNcm = '3906904';

INSERT INTO SIGRUPOSNCM (grupoNcm, descricao, ativo, subcapituloNcm, observacoes) VALUES ('3906905', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros', 1, 3906, ' ');
INSERT INTO SIGRUPOSNCM (grupoNcm, descricao, ativo, subcapituloNcm, observacoes) VALUES ('3906906', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo', 1, 3906, ' ');

UPDATE SINCMS SET ativo = 0 WHERE idNcm IN (32071010000, 39069041000, 39069041001, 39069042000, 39069043000, 39069044000, 39069045000, 39069046000, 39069047000, 39069048000, 39069049000, 39069049001, 73151100000);

INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (32071020000, '32071020','   ', 'Pigmentos, opacificantes e cores preparados, composições vitrificáveis, engobos, polimentos (esmaltes metálicos*) líquidos e preparações semelhantes, do tipo utilizado nas indústrias da cerâmica, do esmalte e do vidro; fritas de vidro e outros vidros, e...', 1, '320710', 0, 'Pigmentos, opacificantes e cores preparados, composições vitrificáveis, engobos, polimentos (esmaltes metálicos*) líquidos e preparações semelhantes, do tipo utilizado nas indústrias da cerâmica, do esmalte e do vidro; fritas de vidro e outros vidros, em pó, em grânulos, em lamelas ou em flocos. - Pigmentos, opacificantes e cores preparados e preparações semelhantes Suspensão de pigmentos em solventes orgânicos, do tipo utilizado em impressoras de jato de tinta para decoração de superfícies cerâmicas por cozimento');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (32071030000, '32071030','   ', 'Pigmentos, opacificantes e cores preparados, composições vitrificáveis, engobos, polimentos (esmaltes metálicos*) líquidos e preparações semelhantes, do tipo utilizado nas indústrias da cerâmica, do esmalte e do vidro; fritas de vidro e outros vidros, e...', 1, '320710', 0, 'Pigmentos, opacificantes e cores preparados, composições vitrificáveis, engobos, polimentos (esmaltes metálicos*) líquidos e preparações semelhantes, do tipo utilizado nas indústrias da cerâmica, do esmalte e do vidro; fritas de vidro e outros vidros, em pó, em grânulos, em lamelas ou em flocos. - Pigmentos, opacificantes e cores preparados e preparações semelhantes Outros, à base de zircônio ou de seus sais');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069051000, '39069051','   ', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Poli(ácido acrílico) e seus sais', 1, '3906905', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069052000, '39069052','   ', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Sal sódico do poli(ácido acrilamídico), solúvel em água', 1, '3906905', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069053000, '39069053','   ', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Carboxipolimetileno, em pó', 1, '3906905', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069054000, '39069054','   ', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Poli(acrilato de sódio), com capacidade de absorção de uma solução aquosa de cloreto de sódio 0,9 %, em peso, igual ou superior a vin...', 1, '3906905', 2806400, 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Poli(acrilato de sódio), com capacidade de absorção de uma solução aquosa de cloreto de sódio 0,9 %, em peso, igual ou superior a vinte vezes seu próprio peso');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069059000, '39069059','   ', 'Polímeros acrílicos, em formas primárias. - Outros Nas formas previstas na Nota 6 b) deste Capítulo, exceto copolímeros Outros', 1, '3906905', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069061000, '39069061','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Copolímero de acrilato de potássio e acrilamida, com capacidade de absorção de água destilada de até quatrocentas vezes seu próprio peso', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069062000, '39069062','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Copolímeros de acrilato de metila-etileno com um conteúdo de acrilato de metila igual ou superior a 50 %, em peso', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069063000, '39069063','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Copolímero de acrilato de etila, acrilato de n-butila e acrilato de 2-metoxietila', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069064000, '39069064','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Copolímero de acrilato de potássio e ácido acrílico, com capacidade de absorção de água destilada de até quatrocentas vezes seu próprio peso', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069065000, '39069065','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Copolímero de acrilamida e acrilato de sódio', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39069069000, '39069069','   ', 'Polímeros acrílicos, em formas primárias. - Outros Copolímeros nas formas previstas na Nota 6 b) deste Capítulo Outros ', 1, '3906906', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (73151110000, '73151110','   ', 'Correntes, cadeias, e suas partes, de ferro fundido, ferro ou aço. - Correntes de elos articulados e suas partes: -- Correntes de rolos Do tipo utilizado em bicicletas, com passo de 12,7 mm (1/2") e largura interna igual ou superior a 1,98 mm (5/64"), m...', 1, '73151', 2806300, 'Correntes, cadeias, e suas partes, de ferro fundido, ferro ou aço. - Correntes de elos articulados e suas partes: -- Correntes de rolos Do tipo utilizado em bicicletas, com passo de 12,7 mm (1/2") e largura interna igual ou superior a 1,98 mm (5/64"), mas inferior ou igual a 3,17 mm (1/8")');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (73151190000, '73151190','   ', 'Correntes, cadeias, e suas partes, de ferro fundido, ferro ou aço. - Correntes de elos articulados e suas partes: -- Correntes de rolos Outras', 1, '73151', 2806300, ' ');

COMMIT;

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_config_425_addInfoComplNFSe IN NUMBER,
  p_idDocumentoFiscal           IN NUMBER,
  p_seqLoteWebServiceEnvio      IN NUMBER,
  p_loteWebService              IN VARCHAR)
  RETURN CLOB
IS
  v_xml                         CLOB;
  v_estab_nomeRazaoSocial       VARCHAR (60);
  v_estab_indicadorPessoa       CHAR (1);
  v_estab_tipo                  VARCHAR (4);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR (20);
  v_estab_inscricaoMunicipal    VARCHAR (15);
  v_estab_logradouro            VARCHAR (60);
  v_estab_numero                VARCHAR (60);
  v_estab_complemento           VARCHAR (60);
  v_estab_bairroDistrito        VARCHAR (60);
  v_estab_municipio             VARCHAR (7);
  v_estab_cep                   CHAR (8);
  v_estab_tecnologiaNfse        NUMBER;
  v_estab_fone                  VARCHAR (14);
  v_estab_email                 VARCHAR (60);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_optanteSimplesNacional      CHAR (1);
  v_incentivadorCultural        CHAR (1);
  v_indicadorAmbienteNfse       CHAR (1);
  v_incentivoFiscal             CHAR (1);
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR (60);
  v_pess_apelidoFantasia        VARCHAR (60);
  v_pess_indicadorPessoa        CHAR (1);
  v_pess_tipo                   VARCHAR (4);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR (20);
  v_pess_inscricaoEstadual      VARCHAR (14);
  v_pess_inscricaoMunicipal     VARCHAR (15);
  v_pess_logradouro             VARCHAR (60);
  v_pess_numero                 VARCHAR (60);
  v_pess_complemento            VARCHAR (60);
  v_pess_bairroDistrito         VARCHAR (60);
  v_pess_municipio              VARCHAR (7);
  v_pess_cep                    CHAR (8);
  v_pess_pais                   VARCHAR (4);
  v_pess_uf                     CHAR (2);
  v_pess_fone                   VARCHAR (14);
  v_pess_email                  VARCHAR (60);
  v_entr_logradouro             VARCHAR (60);
  v_entr_numero                 VARCHAR (60);
  v_entr_complemento            VARCHAR (60);
  v_entr_bairroDistrito         VARCHAR (60);
  v_entr_municipio              VARCHAR (7);
  v_entr_municipio_descricao    VARCHAR (60);
  v_entr_cep                    CHAR (8);
  v_entr_uf                     CHAR (2);
  v_entr_pais                   VARCHAR (4);
  v_entr_pais_descricao         VARCHAR (60);
  v_interm_nomeRazaoSocial      VARCHAR (60);
  v_interm_indicadorPessoa      CHAR (1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR (20);
  v_interm_inscricaoMunicipal   VARCHAR (15);
  v_interm_logradouro           VARCHAR (60);
  v_interm_numero               VARCHAR (60);
  v_interm_complemento          VARCHAR (60);
  v_interm_bairroDistrito       VARCHAR (60);
  v_interm_municipio            VARCHAR (7);
  v_interm_cep                  CHAR (8);
  v_interm_fone                 VARCHAR (14);
  v_interm_email                VARCHAR (60);
  v_numeroRPS                   VARCHAR (15);
  v_serieFiscal                 VARCHAR (4);
  v_dataEmissao                 DATE;
  v_dataHoraEmissao             VARCHAR (20);
  v_dataCompetencia             VARCHAR (20);
  v_dataHoraCompetencia         VARCHAR (20);
  v_chaveNFe                    VARCHAR (60);
  v_numeroProcesso              VARCHAR (60);
  v_codigoObra                  VARCHAR (60);
  v_art                         VARCHAR (60);
  v_outrasInformacoes           VARCHAR (4000);
  v_descricaoServico            VARCHAR (4000);
  v_valorServicos               VARCHAR (20);
  v_aliquotaIssqn               VARCHAR (20);
  v_valorIssqn                  VARCHAR (20);
  v_valorInss                   VARCHAR (20);
  v_valorIrrf                   VARCHAR (20);
  v_retencaoPis                 VARCHAR (20);
  v_baseRetPis                  VARCHAR (20);
  v_valorRetPis                 VARCHAR (20);
  v_retencaoCofins              VARCHAR (20);
  v_valorRetCofins              VARCHAR (20);
  v_valorRetCsll                VARCHAR (20);
  v_valorOutrasRetencoes        VARCHAR (20);
  v_stPis                       CHAR (2);
  v_aliquotaPis                 VARCHAR (20);
  v_basePis                     VARCHAR (20);
  v_valorPis                    VARCHAR (20);
  v_aliquotaCofins              VARCHAR (20);
  v_valorCofins                 VARCHAR (20);
  v_pisCofinsRetido             CHAR (1);
  v_percentualCargaTributariaFe VARCHAR (20);
  v_valorCargaTributariaFederal VARCHAR (20);
  v_percentualCargaTributariaEs VARCHAR (20);
  v_valorCargaTributariaEstad   VARCHAR (20);
  v_percentualCargaTributariaMu VARCHAR (20);
  v_valorCargaTributariaMunicip VARCHAR (20);
  v_valorDescontoTotal          VARCHAR (20);
  v_issRetido                   CHAR (1);
  v_municipioIncidencia         VARCHAR (7);
  v_listaServicos               CHAR (5);
  v_cnae                        CHAR (7);
  v_codigoTributacaoMunicipio   VARCHAR (60);
BEGIN
  WITH DOC AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      a.serieFiscal,
      a.documentoFiscal,
      a.dataEmissao,
      a.qrCode,
      a.enderecoEntregaPessoa,
      a.municipioFatoGerador,
      a.chaveNFe,
      est.pessoaEstabelecimento,
      docXServ.dataCompetencia,
      docXServ.descricaoServico,
      docxServ.intermediario,
      docxServ.numeroRPS,
      docxServ.numeroNFSe,
      docxServ.codigoVerificacaoNFSe,
      docXServ.idObra,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = est.pessoaEstabelecimento
        AND end.ativo = 1
        AND end.principal = 1), 0) endEst_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonEst_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) siteEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = COALESCE (docXServ.intermediario, 0)
        AND end.ativo = 1
        AND end.principal = 1), 0) endInterm_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = COALESCE (docXServ.intermediario, 0)
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonInterm_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = COALESCE (docXServ.intermediario, 0)
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailInterm_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = a.pessoa
        AND end.ativo = 1
        AND end.principal = 1), 0) endPess_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonPess_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailPess_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) sitePess_idEmailPessoa
    FROM MODOCUMENTOSFISCAIS a
    LEFT JOIN MODOCFISCALXSERVICO docXServ
    ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal),
  ITEM AS (
    SELECT
      COALESCE (MAX (a.incentivoFiscal), 0) incentivoFiscal,
      COALESCE (MAX (a.cnae), 0) cnae,
      COALESCE (MAX (a.numeroProcessoAdministrativo), ' ') numeroProcessoAdministrativo,
      COALESCE (MAX (a.tributadoForaMunicipio), 0) tributadoForaMunicipio,
      COALESCE (MAX (a.unidadeMedidaConversao), ' ') unidadeMedidaConversao,
      COALESCE (SUM (a.quantidadeConvertida), 0) quantidadeConvertida,
      COALESCE ((SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) / CASE WHEN SUM (a.quantidadeConvertida) = 0 THEN 1 ELSE SUM (a.quantidadeConvertida) END), 0) precoUnitarioConvertido,
      SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) valorProdutoServico,
      SUM (CASE WHEN endEst.municipio = 4309407 THEN 0 ELSE a.valorDescontoTotal END) valorDescontoTotal,
      COALESCE (MAX (a.indicadorIssqn), ' ') indicadorIssqn,
      COALESCE (MAX (a.aliquotaIssqn), 0) aliquotaIssqn,
      COALESCE (MAX (a.retidoIssqn), 0) retidoIssqn,
      COALESCE (MAX (a.listaServicos), 0) listaServicos,
      COALESCE (SUM (a.baseIssqn), 0) baseIssqn,
      COALESCE (SUM (a.valorIssqn), 0) valorIssqn,
      COALESCE (SUM (a.valorRetIrrf), 0) valorRetIrrf,
      COALESCE (SUM (a.valorRetInss), 0) valorRetInss,
      COALESCE (MAX (a.retencaoPis), 0) retencaoPis,
      COALESCE (SUM (a.baseRetPis), 0) baseRetPis,
      COALESCE (SUM (a.valorRetPis), 0) valorRetPis,
      COALESCE (MAX (a.retencaoCofins), 0) retencaoCofins,
      COALESCE (SUM (a.valorRetCofins), 0) valorRetCofins,
      COALESCE (SUM (a.valorRetCsll), 0) valorRetCsll,
      COALESCE (SUM (a.valorRetOutros), 0) valorRetOutros,
      COALESCE (SUM (a.valorIof), 0) valorIof,
      COALESCE (SUM (a.valorIpi), 0) valorIpi,
      COALESCE (MAX (a.stPis), '00') stPis,
      COALESCE (MAX (a.aliquotaPis), 0) aliquotaPis,
      COALESCE (SUM (a.basePis), 0) basePis,
      COALESCE (SUM (a.valorPis), 0) valorPis,
      COALESCE (MAX (a.aliquotaCofins), 0) aliquotaCofins,
      COALESCE (SUM (a.valorCofins), 0) valorCofins,
      COALESCE (SUM (a.valorIcms), 0) valorIcms,
      CASE WHEN COALESCE (SUM (a.valorRetPis), 0) + COALESCE (SUM (a.valorRetCofins), 0) > 0 THEN 1 ELSE 0 END pisCofinsRetido,
      COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0) aliquotaEstimadaImpFederais,
      COALESCE (SUM (a.valorEstimadoImpFederais), 0) valorEstimadoImpFederais,
      COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0) aliquotaEstimadaImpEstaduais,
      COALESCE (SUM (a.valorEstimadoImpEstaduais), 0) valorEstimadoImpEstaduais,
      COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0) aliquotaEstimadaImpMunicipais,
      COALESCE (SUM (a.valorEstimadoImpMunicipais), 0) valorEstimadoImpMunicipais,
      COALESCE (MAX (CASE WHEN servMun.codigoServicoMunicipio = ' ' THEN '0' ELSE servMun.codigoServicoMunicipio END), '0') codigoServicoMunicipio,
      COALESCE (MAX (servMun.descricao), ' ') servMun_descricao,
      COALESCE (MAX (listServ.descricao), ' ') listServ_descricao,
      COALESCE (MAX (indicIssqn.descricao), ' ') indicIssqn_descricao
    FROM MODOCFISCALXITENS a
    JOIN PASERVICOSMUNICIPIOS servMun
    ON servMun.idServicoMunicipio = a.idServicoMunicipio
    JOIN SILISTASERVICOS listServ
    ON listServ.listaServicos = a.listaServicos
    JOIN SIINDICISSQN indicIssqn
    ON indicIssqn.indicadorISSQN = a.indicadorISSQN
    JOIN DOC doc
    ON 1=1
    JOIN CAENDERECOSPESSOA endEst
    ON endEst.enderecoPessoa = doc.endEst_enderecoPessoa
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0)
  SELECT
    CASE
      WHEN endEst.municipio = 4314902
        AND munEst.tecnologiaNfse <> 4
      THEN TO_CHAR (a.dataEmissao, 'YYYY')
        || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.dataEmissao,
    CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataCompetencia, 'HH24:MI:SS') END,
    a.chaveNFe,
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    pessEst.indicadorPessoa,
    CASE WHEN pessEst.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    CASE WHEN pessEst.regimeTributario IN ('1', '2', '4') THEN '1' ELSE '2' END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.bairroDistrito),
    TO_CHAR (endEst.municipio),
    LPAD (endEst.cep, 8 , '0'),
    munEst.tecnologiaNfse,
    CASE WHEN fonEst.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN emailEst.idEmailPessoa = 0 THEN ' ' ELSE emailEst.email END,
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN COALESCE (estXnfse.incentivadorCultural, 0) = 1 THEN '1' ELSE '2' END,
    COALESCE (estXnfse.indicadorAmbienteNfse, '0'),
    a.intermediario,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE WHEN pess.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    TO_CHAR (endPess.municipio),
    LPAD (endPess.cep, 8 , '0'),
    endPess.pais,
    munPess.uf,
    CASE WHEN fonPess.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN emailPess.idEmailPessoa = 0 THEN ' ' ELSE emailPess.email END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.bairroDistrito),
    TO_CHAR (endEntr.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEntr.descricao),
    LPAD (endEntr.cep, 8 , '0'),
    munEntr.uf,
    endEntr.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEntr.descricao),
    CASE WHEN COALESCE (a.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.bairroDistrito),
    TO_CHAR (endInterm.municipio),
    LPAD (endInterm.cep, 8 , '0'),
    CASE WHEN fonInterm.idFonePessoa = 0 THEN ' ' ELSE fonInterm.fone END,
    CASE WHEN emailInterm.idEmailPessoa = 0 THEN ' ' ELSE emailInterm.email END,
    COALESCE (SUBSTR( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (REPLACE (
      CASE
        WHEN a.descricaoServico = ' '
        THEN COALESCE ((
          SELECT LISTAGG (TO_CHAR (item2.quantidadeConvertida)
            || ' ' || item2.unidadeMedidaConversao
            || ' X ' || TRIM (TRIM (gradProd.descricaoImpressa)) || ' ' || TRIM (item2.observacoes), '
')
          WITHIN GROUP (ORDER BY item2.sequencia)
          FROM MODOCFISCALXITENS item2
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = item2.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE item2.idDocumentoFiscal = p_idDocumentoFiscal
          AND item2.cancelado = 0), ' ')
        ELSE a.descricaoServico
      END ||
      CASE
        WHEN endEst.municipio IN (4202008, 4314902)
        THEN '
Trib. Aprox.: R$ ' || TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ '
        || TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
        ELSE ''
      END ||
      CASE
        WHEN p_config_425_addInfoComplNFSe = 1
        AND munEst.versaoNFSe <> '2.00'
        AND endEst.municipio <> 4304606
        AND EXISTS (
          SELECT 1
          FROM MODOCFISCALXINFOCOMPLEMEN infCompl
          WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
          AND infCompl.geradoPeloSistema = 1
          AND infCompl.descInformacaoComplementar <> ' ')
        THEN '
        ' || COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), '')
        ELSE ''
      END, '
', '&#xD&#xA'))), 1, 2000), ' '),
    COALESCE (SUBSTR( TRIM (COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 2000),' '),
    REPLACE (TO_CHAR (item.valorProdutoServico, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorDescontoTotal, 'FM9999999999990D00'), ',', '.'),
    item.indicadorIssqn,
    REPLACE (TO_CHAR (item.valorIssqn, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaIssqn, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.retidoIssqn = 1 THEN '1' ELSE '2' END,
    TO_CHAR (CASE WHEN item.tributadoForaMunicipio = 1 THEN a.municipioFatoGerador ELSE endEst.municipio END),
    CASE WHEN item.incentivoFiscal = 1 THEN '1' ELSE '2' END,
    SUBSTR (LPAD (item.listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (item.listaServicos, 4, '0'), 3, 2),
    LPAD (item.cnae, 7, '0'),
    item.codigoServicoMunicipio,
    item.numeroProcessoAdministrativo,
    REPLACE (TO_CHAR (item.valorRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetOutros, 'FM9999999999990D00'), ',', '.'),
    item.stPis,
    REPLACE (TO_CHAR (item.aliquotaPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.basePis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorCofins, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.pisCofinsRetido = 1 THEN '1' ELSE '2' END,
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpMunicipais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00'), ',', '.')
  INTO
    v_numeroRPS,
    v_serieFiscal,
    v_dataEmissao,
    v_dataHoraEmissao,
    v_dataCompetencia,
    v_dataHoraCompetencia,
    v_chaveNFe,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_indicadorPessoa,
    v_estab_tipo,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoMunicipal,
    v_optanteSimplesNacional,
    v_estab_logradouro,
    v_estab_numero,
    v_estab_complemento,
    v_estab_bairroDistrito,
    v_estab_municipio,
    v_estab_cep,
    v_estab_tecnologiaNfse,
    v_estab_fone,
    v_estab_email,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_indicadorAmbienteNfse,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_tipo,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_cep,
    v_pess_pais,
    v_pess_uf,
    v_pess_fone,
    v_pess_email,
    v_entr_logradouro,
    v_entr_numero,
    v_entr_complemento,
    v_entr_bairroDistrito,
    v_entr_municipio,
    v_entr_municipio_descricao,
    v_entr_cep,
    v_entr_uf,
    v_entr_pais,
    v_entr_pais_descricao,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal,
    v_interm_logradouro,
    v_interm_numero,
    v_interm_complemento,
    v_interm_bairroDistrito,
    v_interm_municipio,
    v_interm_cep,
    v_interm_fone,
    v_interm_email,
    v_descricaoServico,
    v_outrasInformacoes,
    v_valorServicos,
    v_valorDescontoTotal,
    v_indicadorIssqn,
    v_valorIssqn,
    v_aliquotaIssqn,
    v_issRetido,
    v_municipioIncidencia,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoTributacaoMunicipio,
    v_numeroProcesso,
    v_valorInss,
    v_valorIrrf,
    v_retencaoPis,
    v_baseRetPis,
    v_valorRetPis,
    v_retencaoCofins,
    v_valorRetCofins,
    v_valorRetCsll,
    v_valorOutrasRetencoes,
    v_stPis,
    v_aliquotaPis,
    v_basePis,
    v_valorPis,
    v_aliquotaCofins,
    v_valorCofins,
    v_pisCofinsRetido,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip
  FROM DOC a
  JOIN ITEM item
  ON 1=1
  JOIN PAOBRAS obra
  ON obra.idObra = a.idObra
  JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = a.pessoaEstabelecimento
  JOIN SIREGIMESTRIBUTARIO regTrib
  ON regTrib.regimeTributario = pessEst.regimeTributario
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = a.endEst_enderecoPessoa
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN CAFONESPESSOA fonEst
  ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
  JOIN CAEMAILSPESSOA emailEst
  ON emailEst.idEmailPessoa = a.emailEst_idEmailPessoa
  JOIN CAEMAILSPESSOA siteEst
  ON siteEst.idEmailPessoa = a.siteEst_idEmailPessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = a.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEntr
  ON munEntr.municipio = endEntr.municipio
  JOIN SIPAISES paisEntr
  ON paisEntr.pais = endEntr.pais
  JOIN CAPESSOAS interm
  ON interm.pessoa = a.intermediario
  JOIN CAENDERECOSPESSOA endInterm
  ON endInterm.enderecoPessoa = a.endInterm_enderecoPessoa
  JOIN SIMUNICIPIOS munInterm
  ON munInterm.municipio = endInterm.municipio
  JOIN CAFONESPESSOA fonInterm
  ON fonInterm.idFonePessoa = a.fonInterm_idFonePessoa
  JOIN CAEMAILSPESSOA emailInterm
  ON emailInterm.idEmailPessoa = a.emailInterm_idEmailPessoa
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = a.endPess_enderecoPessoa
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = a.emailPess_idEmailPessoa
  JOIN CAEMAILSPESSOA sitePess
  ON sitePess.idEmailPessoa = a.sitePess_idEmailPessoa
  JOIN SIMUNICIPIOS munServ
  ON munServ.municipio =
    CASE
      WHEN item.tributadoForaMunicipio = 1
      THEN a.municipioFatoGerador
      ELSE endEst.municipio
    END
  JOIN SIUNIDADESMEDIDA unid
  ON unid.unidadeMedida = item.unidadeMedidaConversao;

  IF v_estab_tecnologiaNfse = 4 THEN
    -- NFS-e
    v_xml := '<NFSe xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
  || '<infNFSe id="NFS' || v_chaveNFe || '">'
    || '<DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
      || '<infDPS id="DPS'
      || v_estab_municipio
      || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '2' ELSE '1' END
      || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
      || SUBSTR ('00000' || TRIM (v_serieFiscal), -5)
      || SUBSTR ('000000000000000' || TRIM (v_numeroRPS), -15)
      || '">'
-- 1 - Producao, 2 - Homologacao
        || '<tpAmb>' || v_indicadorAmbienteNfse || '</tpAmb>'
-- Formato AAAA-MM-DDThh:mm:ssTZD
        || '<dhEmi>' || v_dataHoraEmissao || '</dhEmi>'
-- Versão do aplicativo que gerou o DPS
        || '<verAplic>ADDERI 2024</verAplic>'
-- Número do equipamento emissor do DPS ou série do DPS</serie>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nDPS>' || v_numeroRPS || '</nDPS>'
-- Data em que se iniciou a prestação do serviço: Dia, mês e ano (AAAAMMDD)
        || '<dCompet>' || v_dataCompetencia || '</dCompet>'
-- Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário
        || '<tpEmit>1</tpEmit>'
        || '<cLocEmi>' || v_estab_municipio || '</cLocEmi>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
        || '<prest>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_estab_indicadorPessoa = 'J' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_estab_indicadorPessoa = 'F' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
          || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
          || FUNC_ADD_TAG_XML ('email', v_estab_email)
        || '</prest>';

    -- Tomador (Cliente)
    v_xml := v_xml
        || '<toma>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_pess_indicadorPessoa = 'J' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_pess_indicadorPessoa = 'F' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
          || '<xNome>' || v_pess_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
          || FUNC_ADD_TAG_XML ('email', v_pess_email)
        || '</toma>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
        || '<interm>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_interm_indicadorPessoa = 'J' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_interm_indicadorPessoa = 'F' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_interm_inscricaoMunicipal)
          || '<xNome>' || v_interm_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_interm_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_interm_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_interm_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_interm_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_interm_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_interm_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_interm_fone)
          || FUNC_ADD_TAG_XML ('email', v_interm_email)
        || '</interm>';
    END IF;

-- Serviço
    v_xml := v_xml
        || '<serv>'
          || '<locPrest>'
-- Codigo ibge do municipio onde o servico e prestado</locPrest>
            || '<locPrest>' || v_municipioIncidencia || '</locPrest>'
-- Pais onde ocorreu a prestacao do servico
            || '<cPaisPrestacao>1058</cPaisPrestacao>'
          || '</locPrest>'
          || '<cServ>'
-- Código de tributação nacional do ISSQN.
            || '<cTribNac>' || v_indicadorIssqn || '</cTribNac>'
-- Descrição completa do serviço prestado
            || '<xDescServ>' || v_descricaoServico || '</xDescServ>'
          || '</cServ>'
          || '<obra>'
-- numero identificacao da obra
            || '<cObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</cObra>'
            || '<end>'
              || FUNC_ADD_TAG_XML ('CEP', v_entr_cep)
              || FUNC_ADD_TAG_XML ('xLgr', v_entr_logradouro)
              || FUNC_ADD_TAG_XML ('nro', v_entr_numero)
              || FUNC_ADD_TAG_XML ('xCpl', v_entr_complemento)
              || FUNC_ADD_TAG_XML ('xBairro', v_entr_bairroDistrito)
            || '</end>'
          || '</obra>'
        || '</serv>';

-- Valores
    v_xml := v_xml
        || '<valores>'
          || '<vServPrest>'
-- Valor monetário recebido pelo intermediário do serviço (R$)
            || '<vReceb>0.00</vReceb>'
-- Valor do serviço (R$)
            || '<vServ>' || v_valorServicos || '</vServ>'
          || '</vServPrest>'
          || '<vDescCondIncond>'
            || '<vDescIncond>' || v_valorDescontoTotal || '</vDescIncond>'
            || '<vDescCond>0.00</vDescCond>'
          || '</vDescCondIncond>'
          || '<trib>'
            || '<tribFed>'
              || '<piscofins>'
-- Código de Situação Tributária do PIS/COFINS (CST):
-- 00 - Nenhum;
-- 01 - Operação Tributável com Alíquota Básica;
-- 02 - Operação Tributável com Alíquota Diferenciada;
-- 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto;
-- 04 - Operação Tributável monofásica - Revenda a Alíquota Zero;
-- 05 - Operação Tributável por Substituição Tributária;
-- 06 - Operação Tributável a Alíquota Zero;
-- 07 - Operação Tributável da Contribuição;
-- 08 - Operação sem Incidência da Contribuição;
-- 09 - Operação com Suspensão da Contribuição;
            || '<CST>' || CASE WHEN v_pisCofinsRetido = '1' THEN '01' ELSE v_stPis END || '</CST>'
-- Valor da Base de Cálculo do PIS/COFINS (R$)
            || '<vBCPisCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_baseRetPis ELSE v_basePis END || '</vBCPisCofins>'
-- Valor da Alíquota do PIS (%).
            || '<pAliqPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</pAliqPis>'
-- Valor da Alíquota da COFINS (%).
            || '<pAliqCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</pAliqCofins>'
-- Valor monetário do PIS (R$).
            || '<vPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</vPis>'
-- Valor monetário do COFINS (R$).
            || '<vCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</vCofins>'
-- Tipo de retencao do Pis/Cofins:1 - Retido;2 - Não Retido;
            || '<tpRetPisCofins>' || v_pisCofinsRetido || '</tpRetPisCofins>' 
              || '</piscofins>'
-- Valor monetário do CP(R$).
              || '<vRetCP>0.00</vRetCP>'
-- Valor monetário do IRRF (R$).
              || '<vRetIRRF>' || v_valorIrrf || '</vRetIRRF>'
-- Valor monetário do CSLL (R$).
              || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
            || '</tribFed>'
            || '<tribMun>'
-- Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Exportação de serviço; 3 - Não Incidência; 4 - Imunidade;
              || '<tribISSQN>' || CASE v_indicadorIssqn WHEN '2' THEN '3' WHEN '4' THEN '2' WHEN '5' THEN '4' ELSE '1' END ||'</tribISSQN>'
-- Tipo de retencao do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediario;
              || '<tpRetISSQN>' || CASE WHEN v_issRetido = '1' THEN '2' ELSE '1' END || '</tpRetISSQN>'
            || '</tribMun>'
            || '<totTrib>'
-- Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<vTotTrib>0</vTotTrib>'
-- Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<pTotTrib>0</pTotTrib>'
-- Indicador de informação de valor total de tributos. Possui valor fixo igual a zero (indTotTrib=0). Não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não;
              || '<indTotTrib>0</indTotTrib>'
-- Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%)
              || '<pTotTribSN>0</pTotTribSN>'
            || '</totTrib>'
          || '</trib>'
        || '</valores>'
      || '</infDPS>'
    || '</DPS>'
  || '</infNFSe>'
|| '</NFSe>';
  
-- Município: 4202008 - Balneário Camboriú - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4202008' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>102</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4300703 - Anta Gorda - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4300703' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4300703</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4300703</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4301404 - Arvorezinha - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4301404' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';
          
    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;
    
    -- Construção Civil
    v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
          || '</ConstrucaoCivil>';
          
    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4302105 - Bento Gonçalves - RS
-- Empresa: ABASE
-- Tecnologia: 1 - SOAP
-- Versão: 2.01
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4302105' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://nfse.abase.com.br/nfse.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
  || '<LoteRps Id="1'
    || TO_CHAR (v_dataEmissao, 'YYYY')
    || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
    || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
    || '" versao="2.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    IF v_cnae = '4322301' THEN
      v_xml := v_xml
          || '<dadosDaObra>'
            || FUNC_ADD_TAG_XML ('xLogObra', v_entr_logradouro)
            || '<cCidadeObra>' || v_entr_municipio || '</cCidadeObra>'
            || FUNC_ADD_TAG_XML ('xCidadeObra', v_entr_municipio_descricao)
            || FUNC_ADD_TAG_XML ('xUfObra', v_entr_uf)
           || FUNC_ADD_TAG_XML ('cPaisObra', v_entr_pais)
            || FUNC_ADD_TAG_XML ('xPaisObra', v_entr_pais_descricao)
          || '</dadosDaObra>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4304606 - Canoas - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4304606' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="' || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END || LPAD (p_loteWebService, 4, '0') || '">'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>RPS</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValTotTributos>0.00</ValTotTributos>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ResponsavelRetencao>1</ResponsavelRetencao>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
              || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '<Contato/>' ELSE '<Contato>'
                || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
                || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
              || '</Contato>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
              || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309100 - Gramado - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4309100' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309407 - Guaporé - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309407' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
            || '<CodigoObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</CodigoObra>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4309902 - Ibiraiaras - RS
-- Empresa: GOVBR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4309902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsEnvio>';

-- Município: 4312906 - Nova Bassano - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4312906' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4312906</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4312906</IdCidade>'            
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313300 - Nova Prata - RS
-- Empresa: MULTI24H
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313300' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4313300</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4313300</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4313409 - Novo Hamburgo - RS
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4313409' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="2.04">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<Prestador>'
      || '<CpfCnpj>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
      || '</CpfCnpj>'
    || '</Prestador>'
    || '<QuantidadeRps>1</QuantidadeRps>' 
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico Id="1'
          || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
          || LPAD (p_loteWebService, 14, '0')
          || '">'          
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>1</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

  -- Serviço
  v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
          || '</Prestador>';

  -- Tomador (Cliente)
  v_xml := v_xml
          || '<TomadorServico>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
              || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '<Contato>' END
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Telefone', v_pess_fone) END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Email', v_pess_email) END
            || CASE WHEN v_pess_fone = ' ' AND v_pess_email = ' ' THEN '' ELSE '</Contato>' END
          || '</TomadorServico>';

  -- Outros
  v_xml := v_xml
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4314902 - Porto Alegre - RS
-- Empresa: BHISS
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: InfRps, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4314902' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_numeroRPS || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>4314902</CodigoMunicipio>'
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
                  || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || '<Cep>' || v_pess_cep || '</Cep>'
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
    || '</EnviarLoteRpsEnvio>';

-- Município: 4318705 - São Leopoldo - RS
-- Empresa: THEMA
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4318705' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>UNICA</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<Status>1</Status>'
            || '</Rps>'
            || '<Competencia>' || v_dataHoraCompetencia || '</Competencia>'
            || '<IdCidade>4318705</IdCidade>';

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || '<BaseCalculoCRS>0.00</BaseCalculoCRS>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
              || '</CpfCnpj>'
              || '<RazaoSocial>' || v_estab_nomeRazaoSocial || '</RazaoSocial>'
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || '<Cep>' || v_pess_cep || '</Cep>'
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || '<NaturezaOperacao>' || v_indicadorIssqn || '</NaturezaOperacao>'
            || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
            || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
            || '<PercentualCargaTributaria>' || v_percentualCargaTributariaFe || '</PercentualCargaTributaria>'
            || '<ValorCargaTributaria>' || v_valorCargaTributariaFederal || '</ValorCargaTributaria>'
            || '<PercentualCargaTributariaEstadual>' || v_percentualCargaTributariaEs || '</PercentualCargaTributariaEstadual>'
            || '<ValorCargaTributariaEstadual>' || v_valorCargaTributariaEstad || '</ValorCargaTributariaEstadual>'
            || '<PercentualCargaTributariaMunicipal>' || v_percentualCargaTributariaMu || '</PercentualCargaTributariaMunicipal>'
            || '<ValorCargaTributariaMunicipal>' || v_valorCargaTributariaMunicip || '</ValorCargaTributariaMunicipal>'
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || '<SiglaUF>RS</SiglaUF>'
            || '<IdCidade>4318705</IdCidade>'
            || '<FormaPagamento>0</FormaPagamento>'
            || '<NumeroParcelas>0</NumeroParcelas>'
          || '</InfDeclaracaoPrestacaoServico>'
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

-- Município: 4320800 - Soledade - RS
-- Empresa: GOV BR ISS DIGITAL
-- Tecnologia: 1 - SOAP
-- Versão: 2.03
-- Assinar: LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4320800' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>0</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            --|| CASE WHEN v_issRetido = '2' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (v_pess_tipo, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE '<Numero>' || v_pess_numero || '</Numero>' END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE '<Complemento>' || v_pess_complemento || '</Complemento>' END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE '<Bairro>' || v_pess_bairroDistrito || '</Bairro>' END
              || '<CodigoMunicipio>' || v_pess_municipio || '</CodigoMunicipio>'
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || '<Cep>' || v_pess_cep || '</Cep>'
            || '</Endereco>'
            || '<Contato></Contato>'
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
          || '<Intermediario>'
            || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
          || '</Intermediario>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
          || '<ConstrucaoCivil>'
            || '<CodigoObra>' || v_codigoObra || '</CodigoObra>'
            || FUNC_ADD_TAG_XML ('Art', v_art)
          || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
          || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
          || '<IncentivoFiscal>' || v_incentivoFiscal || '</IncentivoFiscal>'
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  -- Município Inválido
  ELSE
    v_xml := 'Município Inválido';
  END IF;

  RETURN v_xml;
END;

/

UPDATE SICONFIGURACOES SET tipoCampo = 'A', mascara = '256', exibirCampo = 'P' WHERE configuracao = 38;

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (173, 'N', 'Não', 38, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (174, 'S', 'Sim', 38, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (175, 'T', 'Todas Pessoas', 38, 1, 3, ' ');

COMMIT;

create or replace PROCEDURE ADD_GRADE_PRODUTO_TROCA (
  p_config_28_somenteProdEst     IN NUMBER,
  p_config_31_pesqPeloIdProduto  IN NUMBER,
  p_config_32_pesqPeloEanGtin    IN NUMBER,
  p_config_33_pesqPelaReferencia IN NUMBER,
  p_config_34_pesqPeloIdGradePro IN NUMBER,
  p_config_35_pesqPeloProdutoImp IN NUMBER,
  p_config_36_pesqPeloCodFabrica IN NUMBER,
  p_config_37_pesqPeloCodAnterio IN NUMBER,
  p_config_38_pesqPeloProdXPess  IN CHAR,
  p_config_39_pesqPeloLote       IN NUMBER,
  p_config_40_pesqPeloNumSerie   IN NUMBER,
  p_config_142_digitosProdEanInt IN CHAR,
  p_config_348_excessaoBuscaCod  IN NUMBER,
  p_config_424_pesqPeloIdLoteEst IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_codigoDescricao              IN VARCHAR2,
  p_trocou                       IN NUMBER,
  p_join                         IN CLOB,
  p_andWhere                     IN CLOB,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_produto                      IN NUMBER,
  /* Retornos */
  r_gradeProduto                 OUT NUMBER,
  r_codigoDescricao              OUT VARCHAR2,
  r_trocou                       OUT NUMBER,
  r_selecionou                   OUT NUMBER,
  r_abrirTelaOnline              OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2,
  r_observacoesErro              OUT CLOB,
  r_codigoEANInterno             OUT VARCHAR2,
  r_idLoteEstoque                OUT NUMBER,
  r_loteEstoque                  OUT VARCHAR2,
  r_idNumeroSerie                OUT NUMBER,
  r_numeroSerie                  OUT VARCHAR2,
  r_quantidade                   OUT NUMBER)
IS
  v_codigoDescricaoComPontos   VARCHAR2(4000);
  v_codigoDescricaoSemPontos   VARCHAR2(4000);
  v_codigoDescricaoLoop        VARCHAR2(4000);
  v_contadorSubSelects         NUMBER;
  v_select                     CLOB;
  v_gradeProduto               NUMBER;
  v_produtoImpresso            VARCHAR2(60);
  v_descricaoImpressa          VARCHAR2(120);
  v_idLoteEstoque              NUMBER;
  v_loteEstoque                VARCHAR2(20);
  v_idNumeroSerie              NUMBER;
  v_numeroSerie                VARCHAR2(60);
  v_quantidade                 NUMBER;
  v_contaRegistros             NUMBER;
BEGIN
  r_gradeProduto               := p_gradeProduto;
  r_codigoDescricao            := p_codigoDescricao;
  r_trocou                     := p_trocou;
  r_selecionou                 := 0;
  r_abrirTelaOnline            := 0;
  r_mensagemErro               := ' ';
  r_observacoesErro            := ' ';
  r_codigoEANInterno           := ' ';
  r_idLoteEstoque              := 0;
  r_loteEstoque                := ' ';
  r_idNumeroSerie              := 0;
  r_numeroSerie                := ' ';
  r_quantidade                 := p_quantidade;
  v_codigoDescricaoComPontos   := ' ';
  v_codigoDescricaoSemPontos   := ' ';
  v_codigoDescricaoLoop        := ' ';
  v_contadorSubSelects         := 0;
  v_select                     := ' ';
  v_gradeProduto               := 0;
  v_produtoImpresso            := ' ';
  v_descricaoImpressa          := ' ';
  v_idLoteEstoque              := 0;
  v_loteEstoque                := ' ';
  v_idNumeroSerie              := 0;
  v_numeroSerie                := ' ';
  v_quantidade                 := 0;
  v_contaRegistros             := 0;
  IF p_codigoDescricao = ' ' AND p_produto = 0 THEN
    r_gradeProduto := 0;
    r_selecionou   := 1;
    r_trocou       := 0;
  ELSE
    IF p_config_142_digitosProdEanInt IN ('4','5','6')
      AND p_produto = 0
      AND SUBSTR(p_codigoDescricao,1,1)='2'
      AND LENGTH (RTRIM(p_codigoDescricao))=13
      AND FUNC_ADD_CONTEUDO_NUMERICO(p_codigoDescricao) = 1 THEN
      SELECT
        COALESCE(MAX(gradeProduto),0),
        COALESCE(MAX(produtoImpresso),' '),
        COALESCE(MAX(descricaoImpressa),' '),
        COUNT(1) contaRegistros
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_contaRegistros
      FROM CAGRADESPRODUTO
      WHERE produtoImpresso = TRIM(TO_CHAR(TO_NUMBER(SUBSTR(p_codigoDescricao,2,TO_NUMBER(p_config_142_digitosProdEanInt)))));
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_codigoEANInterno  := p_codigoDescricao;
      ELSE
        v_gradeProduto      := 0;
        v_produtoImpresso   := ' ';
        v_descricaoImpressa := ' ';
        v_contaRegistros    := 0;
      END IF;
    END IF;
    IF v_contaRegistros = 0 THEN
      IF p_codigoDescricao = ' ' THEN
        v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
      ELSE
        v_codigoDescricaoComPontos := UPPER (REPLACE (REPLACE (TRIM (r_codigoDescricao), '*', '%'), '''', ''''''));
        IF p_config_348_excessaoBuscaCod = 1 AND LENGTH (TRIM (v_codigoDescricaoComPontos)) = 16 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoComPontos) = 1 THEN
          v_codigoDescricaoComPontos := SUBSTR(v_codigoDescricaoComPontos,1,12);
        END IF;
        v_codigoDescricaoSemPontos := REPLACE (REPLACE (REPLACE (REPLACE (RTRIM (v_codigoDescricaoComPontos), '.', ''), '-', ''), '/', ''), '\', '');
        IF v_codigoDescricaoSemPontos = ' ' THEN 
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
        ELSE
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (';
          v_contadorSubSelects := 0;
          -- Se digitou número
          IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
            IF p_config_31_pesqPeloIdProduto = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_32_pesqPeloEanGtin = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_34_pesqPeloIdGradePro = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_36_pesqPeloCodFabrica = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_424_pesqPeloIdLoteEst = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          -- Se não digitou número
          ELSE
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
          END IF;
          -- Válido tanto para números quanto não números
          IF p_config_33_pesqPelaReferencia = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_37_pesqPeloCodAnterio = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
      || '
    AND ' || CASE WHEN p_cab_pessoa = 0 THEN 'prodXPess.pessoa = 0' ELSE '(prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_39_pesqPeloLote = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_40_pesqPeloNumSerie = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          v_select := v_select || '
  ) a
  WHERE ROWNUM <=2
) a';
          IF v_contadorSubSelects = 0 THEN
            v_select := 'SELECT
  0,
  '' '',
  '' '',
  0,
  '' '',
  0,
  '' '',
  0,
  0
FROM DUAL';
          END IF;
        END IF;
      END IF;
      EXECUTE IMMEDIATE v_select
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_idLoteEstoque,
        v_loteEstoque,
        v_idNumeroSerie,
        v_numeroSerie,
        v_quantidade,
        v_contaRegistros;
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_idLoteEstoque     := v_idLoteEstoque;
        r_loteEstoque       := v_loteEstoque;
        r_idNumeroSerie     := v_idNumeroSerie;
        r_numeroSerie       := v_numeroSerie;
        IF v_quantidade > 0 THEN
          r_quantidade      := v_quantidade;
        END IF;
      ELSE
        IF v_contaRegistros > 1 THEN
          r_abrirTelaOnline   := 1;
        ELSE
          r_mensagemErro      := 'Nenhum produto encontrado.';
          r_observacoesErro   := '-- Componente: TrocaGradeProduto
-- Select da pesquisa:
' || v_select;
          IF v_codigoDescricaoSemPontos <> ' ' THEN
            v_select := 'SELECT COUNT (1)
FROM (';
            v_contadorSubSelects := 0;
            -- Se digitou número
            IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
              IF p_config_31_pesqPeloIdProduto = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_32_pesqPeloEanGtin = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_34_pesqPeloIdGradePro = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_36_pesqPeloCodFabrica = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_424_pesqPeloIdLoteEst = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            -- Se não digitou número
            ELSE
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
            END IF;
            -- Válido tanto para números quanto não números
            IF p_config_33_pesqPelaReferencia = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_37_pesqPeloCodAnterio = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
  AND prodXPess.pessoa = 0' ELSE '
  AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND ' || CASE WHEN p_cab_pessoa = 0 THEN 'prodXPess.pessoa = 0' ELSE '(prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_39_pesqPeloLote = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_40_pesqPeloNumSerie = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            v_select := v_select || '
) a';
            IF v_contadorSubSelects = 0 THEN
              v_select := 'SELECT 0 FROM DUAL';
            END IF;
            EXECUTE IMMEDIATE v_select
            INTO v_contaRegistros;            
            IF v_contaRegistros > 0 THEN
              r_mensagemErro      := 'Produto inativo.';
            END IF;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_GRADE_PRODUTO_TROCA;

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (427, 'Exibir Lotes na pesquisa de estoque', 1, 20002, 'L', '1', 'E', 0, 'S', ' ', ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (428, 'Versão tela de pagamentos', 1, 30001, 'N', '4', 'P', 0, '1', ' ', ' ');

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (176, '1', '1 - Versão Original', 428, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (177, '2', '2 - Versão 2', 428, 1, 2, ' ');

COMMIT;

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_PRE_DOC (
  p_exclusivo               IN VARCHAR2,
  p_1_NFCe_2_ConsFinal_3_NF IN VARCHAR2,
  p_preDocumento            IN NUMBER,
  p_estabelecimentoAtivo    IN NUMBER,
  p_nfFornecedor            IN NUMBER,
  p_idSerieFiscal           IN NUMBER,
  p_serieFiscal             IN VARCHAR2,
  p_subSerieFiscal          IN NUMBER,
  p_modeloDocumentoFiscal   IN VARCHAR2,
  p_documentoFiscal         IN NUMBER,
  p_data                    IN DATE,
  p_timezone                IN VARCHAR2,
  p_versaoAplicativo        IN VARCHAR2,
  r_idDocumentoFiscal       OUT NUMBER)
IS
  v_excluirPreDoc     NUMBER;
  v_tipoDocumento     NUMBER;
  v_fatocontabil      NUMBER;
  v_estabelecimento   NUMBER;
  v_pessoa            NUMBER;
  v_sequenciaItem     NUMBER;
  v_documentoFiscal   NUMBER;
  CURSOR c_itens IS
    SELECT
      item.idItemPreDocumento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.estabelecimentoOriginal,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorDescontoCustoOpItem,
      item.valorAcrescimoCustoOpItem, 
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorAcrescimoExtempGeral,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorAcrescimoExtempTotal,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpTotal,
      item.percentualDevolucao,
      item.valorIPIDevolucao, 
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd
     ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod
     ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia;
  CURSOR c_endEst
  IS SELECT a.idEnderecoEstoquePreDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXENDERECOESTOQ', 'idEnderecoEstoqueDocFiscal', 0, p_estabelecimentoAtivo, NULL) idEnderecoEstoqueDocFiscal, a.idEnderecoEstoque, a.posicaoCaixaEstoque, a.quantidade, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.observacoes
     FROM MOPREDOCUMXENDERECOESTOQ a
     JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
     WHERE b.preDocumento = p_preDocumento
     AND b.cancelado = 0;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT a.idMotivoBloqueioDocumento, a.idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOPREDOCUMXPAGAMENTOS b ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
    WHERE b.preDocumento = p_preDocumento;
  CURSOR c_mot_pag2 IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'P'
      AND a.idCabecalho = p_preDocumento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXPREDOCUMPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  r_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_estabelecimentoAtivo, NULL);
  SELECT 
    CASE
      WHEN COALESCE(TRUNC(preDoc.dataEmissao),TO_DATE('01/01/1900','DD/MM/YYYY'))
         = COALESCE(TRUNC(p_data),TO_DATE('01/01/1900','DD/MM/YYYY'))
      THEN 1
      ELSE 0
    END,
    CASE
      WHEN preDoc.entradaSaida='E'
        AND preDoc.devolucaoAnulacaoRetorno = 1
      THEN 602
      WHEN preDoc.entradaSaida='E'
      THEN 601
      WHEN preDoc.devolucaoAnulacaoRetorno = 1
      THEN 502
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '1'
        OR p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 503
      ELSE 501
    END,
    preDoc.fatocontabil,
    preDoc.estabelecimento,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 0
      ELSE preDoc.pessoa
    END,
    CASE
      WHEN p_nfFornecedor = 1
      THEN p_documentoFiscal
      ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|' || LPAD (preDoc.estabelecimento,4,'0') || '|' || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_data))
    END
  INTO
    v_excluirPreDoc,
    v_tipoDocumento,
    v_fatocontabil,
    v_estabelecimento,
    v_pessoa,
    v_documentoFiscal
  FROM MOPREDOCUMENTOS preDoc
  WHERE preDoc.preDocumento = p_preDocumento;
  IF v_excluirPreDoc = 1 THEN
    IF v_fatocontabil > 0 THEN
      UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
    END IF;
  ELSE
    v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOFATOSCONTABEIS (
      fatoContabil,
      estabelecimento,
      data,
      ordenacao,
      situacaoTransacao,
      situacaoContabilizacao,
      sessao,
      observacoes)
    VALUES (
      v_fatoContabil,
      v_estabelecimento,
      p_data,
      0,
      'A',
      'A',
      0,
      ' ');
  END IF;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    quantidadeExtemporanea,
    valorAcrescimoExtempSubtotal,
    valorAcrescimoExtempItem,
    valorAcrescimoExtempGeral,
    valorAcrescimoExtempTotal,
    versaoAplicativo)
  SELECT
    r_idDocumentoFiscal,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.origemDocumento ELSE 13 END,
    v_tipoDocumento,
    preDoc.tipoVenda,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.validoFaturamento ELSE 0 END,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    v_fatoContabil,
    preDoc.idTerminalSiTef,
    preDoc.estabelecimentoOriginal,
    v_estabelecimento,
    preDoc.enderecoRetiradaEstabeleciment,
    preDoc.indicadorPresencaComprador,
    preDoc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_data dataEmissao,
    p_timezone timezoneEmissao,
    p_data dataEntradaSaida,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.pessoa END pessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 1 ELSE 0 END vendaConsumidor,
    preDoc.indicadorPessoa,
    preDoc.indicadorDocumentoPessoa,
    preDoc.cnpjCpfIdEstrangeiro,
    preDoc.nomeRazaoSocial,
    preDoc.fone,
    preDoc.indicadorFone,
    preDoc.operadoraTelefonia,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE preDoc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    preDoc.projeto,
    preDoc.contratoCompra,
    preDoc.comissionadoB,
    preDoc.comissionadoC,
    CASE WHEN preDoc.modalidadeFrete = ' ' THEN '9' ELSE preDoc.modalidadeFrete END,
    CASE WHEN preDoc.tipoPagamentoFrete = ' ' THEN 'N' ELSE preDoc.tipoPagamentoFrete END,
    preDoc.transportadora,
    preDoc.enderecoTransportadora,
    preDoc.motorista,
    preDoc.placa,
    preDoc.vagao,
    preDoc.balsa,
    preDoc.quantidadeVolume,
    preDoc.especieVolume,
    preDoc.descricaoMarca,
    preDoc.numeracaoVolume,
    preDoc.codigoIntegracao,
    preDoc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    ' ' chaveNfe,
    11 situacaoDocumentoFiscal,
    preDoc.ultimoVendedorItem,
    preDoc.quantidade,
    preDoc.pesoLiquido,
    preDoc.pesoBruto,
    preDoc.valorProdutosBruto,
    preDoc.valorProdutos,
    preDoc.valorDescontoProdutos,
    preDoc.valorAcrescimoProdutos,
    preDoc.valorServicosBruto,
    preDoc.valorServicos,
    preDoc.valorDescontoServicos,
    preDoc.valorAcrescimoServicos,
    preDoc.valorFreteItem,
    preDoc.valorSeguroItem,
    preDoc.valorAdicFreteMarinhaMerItem,
    preDoc.valorDespesasAduaneirasItem,
    preDoc.valorFreteGeral,
    preDoc.valorSeguroGeral,
    preDoc.valorDescontoGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorDescontoPagamento END,
    preDoc.valorOutrasDespesasGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorOutrasDespesasPagamento + preDoc.valorJurosPagamento END,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.numeroParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.somaPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorXPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedio ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedioPonderado ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorBasePagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaMinimo ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorEntradaMinima ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaEntrada ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoBruto ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorDescontoPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorOutrasDespesasPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorJurosPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoLiquido ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorTroco ELSE 0 END,
    preDoc.valorFreteTotal,
    preDoc.valorSeguroTotal,
    preDoc.valorDescontoTotal,
    preDoc.valorOutrasDespesasTotal,
    preDoc.valorAdicFreteMarinhaMerTotal,
    preDoc.valorDespesasAduaneirasTotal,
    preDoc.impostosEditados,
    preDoc.valorImpostosSomaPagamento,
    preDoc.valorImpostosDiminuiPagamento,
    preDoc.valorLiquidoItem,
    preDoc.valorDescontoCustoOpItem,
    preDoc.valorDescontoCustoOpGeral,
    preDoc.valorDescontoCustoOpTotal,
    preDoc.valorAcrescimoCustoOpItem,
    preDoc.valorAcrescimoCustoOpGeral,
    preDoc.valorAcrescimoCustoOpTotal,
    preDoc.valorCustoOperacao,
    preDoc.valorCMV,
    preDoc.quantidadeExtemporanea,
    preDoc.valorAcrescimoExtempSubtotal,
    preDoc.valorAcrescimoExtempItem,
    preDoc.valorAcrescimoExtempGeral,
    preDoc.valorAcrescimoExtempTotal,
    p_versaoAplicativo
  FROM MOPREDOCUMENTOS preDoc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preDoc.estabelecimento
  WHERE preDoc.preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPERSPROJETO (
    idPersonProjetoDocFiscal,
    idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo
  FROM MOPREDOCUMXPERSPROJETO
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (
    id,
    idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar
  FROM MOPREDOCUMXINFOCOMPLENT
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPROMOCOES (
    id,
    idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    idItemDocFiscal,
    idPagamentoDocFiscal,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    0,
    0,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes
  FROM MOPREDOCUMXPROMOCOES
  WHERE preDocumento = p_preDocumento
  AND idItemPreDocumento = 0
  AND idPagamentoPreDocumento = 0;
  v_sequenciaItem := 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0 THEN
      v_sequenciaItem := v_sequenciaItem + 1;
        INSERT INTO MODOCFISCALXITENS (
        idItemDocFiscal,
        idDocumentoFiscal,
        sequencia,
        cancelado,
        pedidoCompraFornecedor,
        sequenciaPedidoCompraFornec,
        modeloDocumento,
        estabelecimentoOriginal,
        vendedor,
        gradeProduto,
        idFormulaTinta,
        personalizacao,
        idLoteEstoque,
        localEstoque,
        pessoaParticipante,
        controleQuantidade,
        unidadeMedidaConversao,
        conversorQuantidade,
        loteMinimo,
        loteMultiplo,
        altura,
        largura,
        comprimento,
        pecas,
        quantidade,
        quantidadeConvertida,
        quantidadeDevolvidaRetornada,
        pesoLiquido,
        pesoBruto,
        tipoPreco,
        tabelaPreco,
        precoSugestaoAPrazo,
        precoSugestaoAVista,
        precoDesconto,
        precoMinimo,
        usarPrecoAVista,
        precoUnitarioBruto,
        acrescimoUnitarioComposicao,
        precoUnitario,
        precoUnitarioConvertido,
        valorProdutoServicoBruto,
        valorProdutoServico,
        percDescontoItem,
        valorDescontoItem,
        percAcrescimoItem,
        valorAcrescimoItem,
        valorFreteItem,
        valorSeguroItem,
        valorAdicFreteMarinhaMerItem,
        valorDespesasAduaneirasItem,
        quantidadeExtemporanea,
        acrescimoUnitarioExtemporaneo,
        valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempItem,
        valorDescontoCustoOpItem,
        valorAcrescimoCustoOpItem,
        observacoesDigitadas,
        observacoes,
        valorFreteGeral,
        valorSeguroGeral,
        valorDescontoGeral,
        valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral,
        valorDespesasAduaneirasGeral,
        valorAcrescimoExtempGeral,
        valorDescontoCustoOpGeral,
        valorAcrescimoCustoOpGeral,
        valorDescontoPagamento,
        valorOutrasDespesasPagamento,
        valorJurosPagamento,
        valorFreteTotal,
        valorSeguroTotal,
        valorDescontoTotal,
        valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal,
        valorDespesasAduaneirasTotal,
        valorAcrescimoExtempTotal,
        valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpTotal,
        percentualDevolucao,
        valorIPIDevolucao,
        operacaoFiscal,
        movimentaEstoque,
        movimentaEstoqueFiscal,
        geraFinanceiro,
        cfop,
        indicadorISSQN,
        aliquotaISSQN,
        retidoISSQN,
        tributadoForaMunicipio,
        incentivoFiscal,
        listaServicos,
        cnae,
        idServicoMunicipio,
        numeroProcessoAdministrativo,
        retencaoIRRF,
        retencaoINSS,
        retencaoPIS,
        retencaoCOFINS,
        retencaoCSLL,
        retencaoOutros,
        aliquotaII,
        aliquotaIOF,
        codigoEnquadramentoIPI,
        stIPI,
        aliquotaIPI,
        valorAliquotaIPI,
        stPIS,
        aliquotaPIS,
        valorAliquotaPIS,
        aliquotaPISST,
        valorAliquotaPISST,
        stCOFINS,
        aliquotaCOFINS,
        valorAliquotaCOFINS,
        aliquotaCOFINSST,
        valorAliquotaCOFINSST,
        stSimplesNacional,
        creditoSimplesNacional,
        stICMS,
        modalidadeBaseCalcICMS,
        reducaoBaseICMS,
        aliquotaICMS,
        diferimentoICMS,
        motivoDesoneracaoICMS,
        idBeneficio,
        modalidadeBaseCalcICMSST,
        margemValorAdicionadoST,
        reducaoBaseST,
        aliquotaICMSST,
        aliquotaSTSuportConsFinal,
        reducaoBaseICMSEfetivo,
        aliquotaICMSEfetivo,
        stICMSEscrituracao,
        reducaoBaseICMSEscrituracao,
        aliquotaICMSEscrituracao,
        diferimentoICMSEscrituracao,
        margemValorAdicSTEscrituracao,
        reducaoBaseSTEscrituracao,
        aliquotaICMSSTEscrituracao,
        somarICMSST,
        aliquotaICMSUFDestinatario,
        aliquotaICMSInterestadual,
        partilhaICMSInterestadual,
        aliquotaFCP,
        aliquotaFCPST,
        aliquotaFCPSTAnteriormente,
        aliquotaFCPUFDestinatario,
        aliquotaEstimadaImpFederais,
        aliquotaEstimadaImpEstaduais,
        aliquotaEstimadaImpMunicipais,
        baseISSQN,
        valorISSQN,
        baseRetIRRF,
        valorRetIRRF,
        baseRetINSS,
        valorRetINSS,
        baseRetPIS,
        valorRetPIS,
        baseRetCOFINS,
        valorRetCOFINS,
        baseRetCSLL,
        valorRetCSLL,
        baseRetOutros,
        valorRetOutros,
        baseII,
        valorII,
        baseIOF,
        valorIOF,
        baseIPI,
        valorIPI,
        basePIS,
        valorPIS,
        basePISST,
        valorPISST,
        baseCOFINS,
        valorCOFINS,
        baseCOFINSST,
        valorCOFINSST,
        baseCreditoSimplesNacional,
        valorCreditoSimplesNacional,
        baseICMS,
        valorICMSOperacao,
        valorICMSDiferido,
        valorICMS,
        valorICMSDesoneracao,
        baseICMSST,
        valorICMSST,
        baseICMSSTAnteriormente,
        valorICMSSTAnteriormente,
        valorICMSProprioSubstituto,
        baseICMSEfetivo,
        valorICMSEfetivo,
        baseICMSEscrituracao,
        valorICMSEscrituracao,
        valorICMSDesonEscrituracao,
        baseICMSSTEscrituracao,
        valorICMSSTEscrituracao,
        baseICMSUFDestinatario,
        valorICMSUFDestinatario,
        baseICMSUFRemetente,
        valorICMSUFRemetente,
        baseFCP,
        valorFCP,
        baseFCPST,
        valorFCPST,
        baseFCPSTAnteriormente,
        valorFCPSTAnteriormente,
        baseFCPUFDestinatario,
        valorFCPUFDestinatario,
        baseEstimadaImpostos,
        valorEstimadoImpFederais,
        valorEstimadoImpEstaduais,
        valorEstimadoImpMunicipais,
        valorBasePagamento,
        valorLiquidoItem,
        precoCustoOperacao,
        valorCustoOperacao,
        precoCMV,
        valorCMV)
      VALUES (
        itens.idItemDocFiscal,
        r_idDocumentoFiscal,
        itens.sequencia,
        itens.cancelado,
        itens.pedidoCompraFornecedor,
        itens.sequenciaPedidoCompraFornec,
        itens.modeloDocumento,
        itens.estabelecimentoOriginal,
        itens.vendedor,
        itens.gradeProduto,
        itens.idFormulaTinta,
        itens.personalizacao,
        itens.idLoteEstoque,
        itens.localEstoque,
        itens.pessoaParticipante,
        itens.controleQuantidade,
        itens.unidadeMedidaConversao,
        itens.conversorQuantidade,
        itens.loteMinimo,
        itens.loteMultiplo,
        itens.altura,
        itens.largura,
        itens.comprimento,
        itens.pecas,
        itens.quantidade,
        itens.quantidadeConvertida,
        0,
        itens.pesoLiquido,
        itens.pesoBruto,
        itens.tipoPreco,
        itens.tabelaPreco,
        itens.precoSugestaoAPrazo,
        itens.precoSugestaoAVista,
        itens.precoDesconto,
        itens.precoMinimo,
        itens.usarPrecoAVista,
        itens.precoUnitarioBruto,
        itens.acrescimoUnitarioComposicao,
        itens.precoUnitario,
        itens.precoUnitarioConvertido,
        itens.valorProdutoServicoBruto,
        itens.valorProdutoServico,
        itens.percDescontoItem,
        itens.valorDescontoItem,
        itens.percAcrescimoItem,
        itens.valorAcrescimoItem,
        itens.valorFreteItem,
        itens.valorSeguroItem,
        itens.valorAdicFreteMarinhaMerItem,
        itens.valorDespesasAduaneirasItem,
        itens.quantidadeExtemporanea,
        itens.acrescimoUnitarioExtemporaneo,
        itens.valorAcrescimoExtempSubtotal,
        itens.valorAcrescimoExtempItem,
        itens.valorDescontoCustoOpItem,
        itens.valorAcrescimoCustoOpItem,
        itens.observacoesDigitadas,
        itens.observacoes,
        itens.valorFreteGeral,
        itens.valorSeguroGeral,
        itens.valorDescontoGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorDescontoPagamento
        END,
        itens.valorOutrasDespesasGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorOutrasDespesasPagamento + itens.valorJurosPagamento
        END,
        itens.valorAdicFreteMarinhaMerGeral,
        itens.valorDespesasAduaneirasGeral,
        itens.valorAcrescimoExtempGeral,
        itens.valorDescontoCustoOpGeral,
        itens.valorAcrescimoCustoOpGeral,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorDescontoPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorOutrasDespesasPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorJurosPagamento
          ELSE 0
        END,
        itens.valorFreteTotal,
        itens.valorSeguroTotal,
        itens.valorDescontoTotal,
        itens.valorOutrasDespesasTotal,
        itens.valorAdicFreteMarinhaMerTotal,
        itens.valorDespesasAduaneirasTotal,
        itens.valorAcrescimoExtempTotal,
        itens.valorDescontoCustoOpTotal,
        itens.valorAcrescimoCustoOpTotal,
        itens.percentualDevolucao,
        itens.valorIPIDevolucao,
        itens.operacaoFiscal,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.movimentaEstoque
          ELSE 0
        END,
        itens.movimentaEstoque,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.geraFinanceiro
          ELSE 0
        END,
        itens.cfop,
        itens.indicadorISSQN,
        itens.aliquotaISSQN,
        itens.retidoISSQN,
        itens.tributadoForaMunicipio,
        itens.incentivoFiscal,
        itens.listaServicos,
        itens.cnae,
        itens.idServicoMunicipio,
        itens.numeroProcessoAdministrativo,
        itens.retencaoIRRF,
        itens.retencaoINSS,
        itens.retencaoPIS,
        itens.retencaoCOFINS,
        itens.retencaoCSLL,
        itens.retencaoOutros,
        itens.aliquotaII,
        itens.aliquotaIOF,
        itens.codigoEnquadramentoIPI,
        itens.stIPI,
        itens.aliquotaIPI,
        itens.valorAliquotaIPI,
        itens.stPIS,
        itens.aliquotaPIS,
        itens.valorAliquotaPIS,
        itens.aliquotaPISST,
        itens.valorAliquotaPISST,
        itens.stCOFINS,
        itens.aliquotaCOFINS,
        itens.valorAliquotaCOFINS,
        itens.aliquotaCOFINSST,
        itens.valorAliquotaCOFINSST,
        itens.stSimplesNacional,
        itens.creditoSimplesNacional,
        itens.stICMS,
        itens.modalidadeBaseCalcICMS,
        itens.reducaoBaseICMS,
        itens.aliquotaICMS,
        itens.diferimentoICMS,
        itens.motivoDesoneracaoICMS,
        itens.idBeneficio,
        itens.modalidadeBaseCalcICMSST,
        itens.margemValorAdicionadoST,
        itens.reducaoBaseST,
        itens.aliquotaICMSST,
        itens.aliquotaSTSuportConsFinal,
        itens.reducaoBaseICMSEfetivo,
        itens.aliquotaICMSEfetivo,
        itens.stICMSEscrituracao,
        itens.reducaoBaseICMSEscrituracao,
        itens.aliquotaICMSEscrituracao,
        itens.diferimentoICMSEscrituracao,
        itens.margemValorAdicSTEscrituracao,
        itens.reducaoBaseSTEscrituracao,
        itens.aliquotaICMSSTEscrituracao,
        itens.somarICMSST,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual,
        itens.partilhaICMSInterestadual,
        itens.aliquotaFCP,
        itens.aliquotaFCPST,
        itens.aliquotaFCPSTAnteriormente,
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaEstimadaImpFederais,
        itens.aliquotaEstimadaImpEstaduais,
        itens.aliquotaEstimadaImpMunicipais,
        itens.baseISSQN,
        itens.valorISSQN,
        itens.baseRetIRRF,
        itens.valorRetIRRF,
        itens.baseRetINSS,
        itens.valorRetINSS,
        itens.baseRetPIS,
        itens.valorRetPIS,
        itens.baseRetCOFINS,
        itens.valorRetCOFINS,
        itens.baseRetCSLL,
        itens.valorRetCSLL,
        itens.baseRetOutros,
        itens.valorRetOutros,
        itens.baseII,
        itens.valorII,
        itens.baseIOF,
        itens.valorIOF,
        itens.baseIPI,
        itens.valorIPI,
        itens.basePIS,
        itens.valorPIS,
        itens.basePISST,
        itens.valorPISST,
        itens.baseCOFINS,
        itens.valorCOFINS,
        itens.baseCOFINSST,
        itens.valorCOFINSST,
        itens.baseCreditoSimplesNacional,
        itens.valorCreditoSimplesNacional,
        itens.baseICMS,
        itens.valorICMSOperacao,
        itens.valorICMSDiferido,
        itens.valorICMS,
        itens.valorICMSDesoneracao,
        itens.baseICMSST,
        itens.valorICMSST,
        itens.baseICMSSTAnteriormente,
        itens.valorICMSSTAnteriormente,
        itens.valorICMSProprioSubstituto,
        itens.baseICMSEfetivo,
        itens.valorICMSEfetivo,
        itens.baseICMSEscrituracao,
        itens.valorICMSEscrituracao,
        itens.valorICMSDesonEscrituracao,
        itens.baseICMSSTEscrituracao,
        itens.valorICMSSTEscrituracao,
        itens.baseICMSUFDestinatario,
        itens.valorICMSUFDestinatario,
        itens.baseICMSUFRemetente,
        itens.valorICMSUFRemetente,
        itens.baseFCP,
        itens.valorFCP,
        itens.baseFCPST,
        itens.valorFCPST,
        itens.baseFCPSTAnteriormente,
        itens.valorFCPSTAnteriormente,
        itens.baseFCPUFDestinatario,
        itens.valorFCPUFDestinatario,
        itens.baseEstimadaImpostos,
        itens.valorEstimadoImpFederais,
        itens.valorEstimadoImpEstaduais,
        itens.valorEstimadoImpMunicipais,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorBasePagamento
          ELSE 0
        END,
        itens.valorLiquidoItem,
        itens.precoCustoOperacao,
        itens.valorCustoOperacao,
        itens.precoCMV,
        itens.valorCMV);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (
        id,
        idItemDocFiscal,
        composicaoPreco,
        selecionado,
        quantidade,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.composicaoPreco,
        x.selecionado,
        x.quantidade,
        x.observacoes
      FROM MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (
        idEmbalagemTintaDocFiscal,
        idItemDocFiscal,
        embalagemTinta,
        quantidade,
        quantidadeSaldo,
        quantidadeConferida,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.embalagemTinta,
        x.quantidade,
        x.quantidadeSaldo,
        x.quantidadeConferida,
        x.observacoes
      FROM MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (
        idNumeroSerieDocFiscal,
        idItemDocFiscal,
        idEnderecoEstoqueDocFiscal,
        gradeProduto,
        idNumeroSerie,
        devolvidoRetornado)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        0,
        x.gradeProduto,
        x.idNumeroSerie,
        x.devolvidoRetornado
      FROM MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento
      AND x.idEnderecoEstoquePreDocumento = 0;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (
        idCentroCustoDocFiscal,
        idItemDocFiscal,
        idCentroCusto,
        percentualRateio)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.idCentroCusto,
        x.percentualRateio
      FROM MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROJETOS (id,
        idItemDocFiscal,
        projeto)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROJETOS', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.projeto
      FROM MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        itens.sequencia,
        itens.idItemDocFiscal,
        0,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      FOR endEst IN c_endEst
      LOOP
        IF endEst.idItemPreDocumento = itens.idItemPreDocumento THEN
          INSERT INTO MODOCFISCALXENDERECOESTOQ (
            idEnderecoEstoqueDocFiscal,
            idItemDocFiscal,
            idEnderecoEstoque,
            posicaoCaixaEstoque,
            quantidade,
            quantidadeDevolvidaRetornada,
            quantidadeConferida,
            observacoes)
          VALUES (
            endEst.idEnderecoEstoqueDocFiscal,
            itens.idItemDocFiscal,
            endEst.idEnderecoEstoque,
            endEst.posicaoCaixaEstoque,
            endEst.quantidade,
            endEst.quantidadeDevolvidaRetornada,
            endEst.quantidadeConferida,
            endEst.observacoes);
          INSERT INTO MODOCFISCALXNUMEROSSERIE (
            idNumeroSerieDocFiscal,
            idItemDocFiscal,
            idEnderecoEstoqueDocFiscal,
            gradeProduto,
            idNumeroSerie,
            devolvidoRetornado)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_estabelecimentoAtivo, NULL),
            itens.idItemDocFiscal,
            endEst.idEnderecoEstoqueDocFiscal,
            x.gradeProduto,
            x.idNumeroSerie,
            x.devolvidoRetornado
          FROM MOPREDOCUMXNUMEROSSERIE x
          WHERE x.idItemPreDocumento = itens.idItemPreDocumento
          AND x.idEnderecoEstoquePreDocumento = endEst.idEnderecoEstoquePreDocumento;
        END IF;
      END LOOP;
    END IF;
    FOR mot IN c_mot_item
    LOOP
      IF mot.idItemPreDocumento = itens.idItemPreDocumento THEN
        INSERT INTO MOMOTIVOSBLOQUEIOS (
          idMotivoBloqueioDocumento,
          origem,
          idCabecalho,
          tipoDocumento,
          idDocumento,
          estabelecimento,
          pessoa,
          cabecalhoItemPagamento,
          sequencia,
          condicaoPagamento,
          vendedor,
          gradeProduto,
          unidadeMedidaConversao,
          quantidadeConvertida,
          valorLiquido,
          motivoBloqueioDocumento,
          dataBloqueio,
          baseBloqueado,
          valorBloqueado,
          percentualBloqueado,
          situacaoLiberacao,
          observacoes)
        SELECT
          mot.idMotivoBloqueioNovo,
          'D',
          r_idDocumentoFiscal,
          v_tipoDocumento,
          v_documentoFiscal,
          v_estabelecimento,
          v_pessoa,
          a.cabecalhoItemPagamento,
          itens.sequencia,
          a.condicaoPagamento,
          a.vendedor,
          a.gradeProduto,
          a.unidadeMedidaConversao,
          a.quantidadeConvertida,
          a.valorLiquido,
          a.motivoBloqueioDocumento,
          a.dataBloqueio,
          a.baseBloqueado,
          a.valorBloqueado,
          a.percentualBloqueado,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTIVOSBLOQUEIOS a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        INSERT INTO MOMOTBLOQXDOCFISCALITENS (
          id,
          idMotivoBloqueioDocumento,
          idItemDocFiscal)
        VALUES (
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          itens.idItemDocFiscal);
        INSERT INTO MOMOTBLOQXLIBERACOES (
          id,
          idMotivoBloqueioDocumento,
          usuario,
          dataLiberacao,
          valorLiberado,
          percentualLiberado,
          percentualAlcada,
          situacaoLiberacao,
          observacoes)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          a.usuario,
          a.dataLiberacao,
          a.valorLiberado,
          a.percentualLiberado,
          a.percentualAlcada,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTBLOQXLIBERACOES a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        IF v_excluirPreDoc = 1 THEN
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMITENS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END IF;
    END LOOP;
    IF v_excluirPreDoc = 1 THEN
      IF itens.cancelado = 0 THEN
        INSERT INTO MODOCFISCALXORCAMENTOITEM (
          id,
          idItemDocFiscal,
          idItemOrcamento,
          quantidade,
          efetivacao)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemOrcamento,
          x.quantidade,
          x.efetivacao
        FROM MOPREDOCUMXORCAMENTOITEM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOPREDOCUMXDOCFISCAL (
          id,
          idItemPreDocumento,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemPreDocumento,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXPREDOCUM (
          id,
          idItemDocFiscal,
          idItemPreDocReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemPreDocReferenciado,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemDocFiscal,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCFISCALXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemDocFiscalReferenciado,
          x.quantidade
        FROM MOPREDOCUMXDOCFISCAL x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCTRANSFXDOCFISCAL (
          id,
          entradaSaidaOriginal,
          idItemDocTransferencia,
          idItemDocFiscal,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCTRANSFXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.entradaSaidaOriginal,
          x.idItemDocTransferencia,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCTRANSFXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXESTOQUE (
          id,
          idItemDocFiscal,
          idEstoque)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXESTOQUE', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idEstoque
        FROM MOPREDOCUMXESTOQUE x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOVALEDESCXITEMDOCFISCAL (
          id,
          idValeDesconto,
          idItemDocFiscal)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXITEMDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idValeDesconto,
          itens.idItemDocFiscal
        FROM MOVALEDESCXITEMPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      END IF;
      UPDATE MOSEPARACAOXITENS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      UPDATE MODOCTROCAXITENS x SET
        x.idItemPreDocumentoSaida = 0,
        x.idItemDocFiscalSaida = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoSaida = itens.idItemPreDocumento;
      UPDATE MOENTREGAS x SET
        x.idItemPreDocumentoRemessa = 0,
        x.idItemDocFiscalRemessa = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoRemessa = itens.idItemPreDocumento;
      UPDATE MOINGRESSOS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXESTOQUE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPRODUTOFILHO x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MODOCFISCALXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXDOCFISCAL x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MODOCTRANSFXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXORCAMENTOITEM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXENDERECOESTOQ x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOVALEDESCXITEMPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    ELSIF itens.cancelado = 0 THEN
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        itens.idItemPreDocumento,
        itens.quantidade);
    END IF;
  END LOOP;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      0,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (
      id,
      idMotivoBloqueioDocumento,
      idDocumentoFiscal)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      r_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTBLOQXPREDOCUMENTOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  FOR mot IN c_mot_pag2
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      a.sequencia,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  IF v_excluirPreDoc = 1 THEN
    FOR pagtos IN (
      SELECT
        idPagamentoPreDocumento,
        FUNC_ADD_BUSCA_PROXIMO_ID (
          'MODOCFISCALXPAGAMENTOS',
          'idPagamentoDocFiscal',
          0,
          p_estabelecimentoAtivo,
          NULL) idPagamentoDocFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento
      ORDER BY
        pagamentoTroco,
        sequencia)
    LOOP
      INSERT INTO MODOCFISCALXPAGAMENTOS (
        idPagamentoDocFiscal,
        idDocumentoFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes)
      VALUES (
        pagtos.idPagamentoDocFiscal,
        r_idDocumentoFiscal,
        pagtos.pagamentoTroco,
        pagtos.sequencia,
        pagtos.indicadorFormaPagamento,
        pagtos.meioPagamento,
        pagtos.condicaoPagamento,
        pagtos.cobranca,
        pagtos.numeroParcelas,
        pagtos.somaPrazoParcelas,
        pagtos.valorXPrazoParcelas,
        pagtos.prazoMedio,
        pagtos.prazoMedioPonderado,
        pagtos.valorEntradaMinima,
        pagtos.valorPagamentoBruto,
        pagtos.percDescontoPagamento,
        pagtos.valorDescontoPagamento,
        pagtos.percOutrasDespesasPagamento,
        pagtos.valorOutrasDespesasPagamento,
        pagtos.fatorJurosPagamento,
        pagtos.valorJurosPagamento,
        pagtos.valorPagamentoImpostosSoma,
        pagtos.valorPagamentoImpostosDiminui,
        pagtos.valorPagamentoLiquido,
        pagtos.valorFinanceiro,
        pagtos.observacoes);
      UPDATE MOPREVFINANCXFINANCEIRO x SET
      x.preDocumento = 0,
      x.idDocumentoFiscal = r_idDocumentoFiscal
      WHERE EXISTS (
        SELECT 1
        FROM MOFINANCEIROS y
        WHERE y.idFinanceiro = x.idFinanceiro
        AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal),
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      UPDATE MOTRANSACOESTEF x SET
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        x.sequencia,
        0,
        pagtos.idPagamentoDocFiscal,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      FOR mot IN c_mot_pag
      LOOP
        IF mot.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (
            idMotivoBloqueioDocumento,
            origem,
            idCabecalho,
            tipoDocumento,
            idDocumento,
            estabelecimento,
            pessoa,
            cabecalhoItemPagamento,
            sequencia,
            condicaoPagamento,
            vendedor,
            gradeProduto,
            unidadeMedidaConversao,
            quantidadeConvertida,
            valorLiquido,
            motivoBloqueioDocumento,
            dataBloqueio,
            baseBloqueado,
            valorBloqueado,
            percentualBloqueado,
            situacaoLiberacao,
            observacoes)
          SELECT
            mot.idMotivoBloqueioNovo,
            'D',
            r_idDocumentoFiscal,
            v_tipoDocumento,
            v_documentoFiscal,
            v_estabelecimento,
            v_pessoa,
            a.cabecalhoItemPagamento,
            pagtos.sequencia,
            a.condicaoPagamento,
            a.vendedor,
            a.gradeProduto,
            a.unidadeMedidaConversao,
            a.quantidadeConvertida,
            a.valorLiquido,
            a.motivoBloqueioDocumento,
            a.dataBloqueio,
            a.baseBloqueado,
            a.valorBloqueado,
            a.percentualBloqueado,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALPAGAM (
            id,
            idMotivoBloqueioDocumento,
            idPagamentoDocFiscal)
          VALUES (
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALPAGAM', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            pagtos.idPagamentoDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (
            id,
            idMotivoBloqueioDocumento,
            usuario,
            dataLiberacao,
            valorLiberado,
            percentualLiberado,
            percentualAlcada,
            situacaoLiberacao,
            observacoes)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            a.usuario,
            a.dataLiberacao,
            a.valorLiberado,
            a.percentualLiberado,
            a.percentualAlcada,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMPAGAM a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a WHERE
          a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END LOOP;
    INSERT INTO MOBAIXAFINANCXDOCFISCAL (
      id,
      idBaixaFinanceiro,
      idDocumentoFiscal)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idBaixaFinanceiro,
      r_idDocumentoFiscal
    FROM MOBAIXAFINANCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MOVALEDESCXDOCFISCAL (
      id,
      idValeDesconto,
      idDocumentoFiscal,
      valor)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idValeDesconto,
      r_idDocumentoFiscal,
      x.valor
    FROM MOVALEDESCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXBLOQUEIOSEST (
      id,
      idDocumentoFiscal,
      sequencia,
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      idEnderecoEstoque,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXBLOQUEIOSEST', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.sequencia,
      x.dataBloqueio,
      x.estabelecimento,
      x.localEstoque,
      x.pessoaParticipante,
      x.idEnderecoEstoque,
      x.gradeProduto,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.quantidade,
      x.quantidadeEstoque,
      x.quantidadeReservas,
      x.situacaoLiberacao,
      x.usuarioLiberacao,
      x.dataLiberacao,
      x.observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXCONFERENCIAS (
      id,
      idDocumentoFiscal,
      documentoTransferencia,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      codigoErro,
      quantidadeConferida,
      encerrado,
      idItemDocTransferencia,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCONFERENCIAS', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.documentoTransferencia,
      x.gradeProduto,
      x.idFormulaTinta,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.codigoErro,
      x.quantidadeConferida,
      x.encerrado,
      x.idItemDocTransferencia,
      x.observacoes
    FROM MOPREDOCUMXCONFERENCIAS x
    WHERE x.preDocumento = p_preDocumento;
    DELETE MOBAIXAFINANCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPERSPROJETO
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXINFOCOMPLENT
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_preDocumento
    AND idItemPreDocumento = 0
    AND idPagamentoPreDocumento = 0;
    DELETE MOVALEDESCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXCONFERENCIAS
    WHERE preDocumento = p_preDocumento;
    UPDATE MOPREVFINANCXFINANCEIRO SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXCOMISSOES SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXDOCUMENTOS SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOEVENTOS SET
      tabelaSistema = 'MODOCUMENTOSFISCAIS',
      id = r_idDocumentoFiscal
    WHERE tabelaSistema = 'MOPREDOCUMENTOS'
    AND id = p_preDocumento;
    DELETE MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXSTATUS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  ELSE
    UPDATE MOPREDOCUMENTOS
    SET statusPreDocumento = 'F'
    WHERE preDocumento = p_preDocumento;
    FOR pagtos IN (
      SELECT idPagamentoPreDocumento
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento)
    LOOP
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal)
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (247, 50001007, 'Coluna "Orçamento" nos itens do Recebimento Retaguarda', 1, 50001, 'A', '120', 'E', 0, 0, 1, 0, 0, 0, 'Orçamento', ' ', ' ', ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('11/11/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 3' WHERE idVersaoSistema = 2024001005;

COMMIT;

-- FIM BETA 3 - 18/11/2024
