CREATE TABLE MOAVALIAMARGENSPRODUTOS_2501 AS SELECT * FROM MOAVALIAMARGENSPRODUTOS;

ALTER TABLE MOAVALIAMARGEMPRODXINCID DROP CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK1;
ALTER TABLE MOAVALIAMARGEMPRODXORCAM DROP CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK1;
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC DROP CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK1;
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC DROP CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK1;

DROP TABLE MOAVALIAMARGENSPRODUTOS;

-- MOAVALIAMARGENSPRODUTOS
CREATE TABLE MOAVALIAMARGENSPRODUTOS
  (
    idAvaliaMargemProduto          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                           DATE,
    usuario                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumentoEntrada         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    fornecedor                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPessoaFornecedor      CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorInscricaoEstadFornec  CHAR (1) DEFAULT ' ' NOT NULL,
    ufFornecedor                   CHAR (2) DEFAULT '  ' NOT NULL,
    condicaoPagamentoEntrada       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    modeloDocumentoSaida           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cliente                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPessoaCliente         CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorInscricaoEstadCliente CHAR (1) DEFAULT ' ' NOT NULL,
    ufCliente                      CHAR (2) DEFAULT '  ' NOT NULL,
    condicaoPagamentoSaida         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeProduto                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNcm                          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    quantidade                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tabelaPreco                    VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitario                  NUMERIC (15,7) DEFAULT 0 NOT NULL,
    idProdutoXCusto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoCompra                    NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCusto                     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    operacaoFiscalEntrada          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscalSaida            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    margemSobreReceitaBruta        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    markup                         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    margemSobreReceitaLiquida      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percMargemAdicional            NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicional           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkup                   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_PK1 PRIMARY KEY (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K2 ON MOAVALIAMARGENSPRODUTOS (estabelecimento);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K3 ON MOAVALIAMARGENSPRODUTOS (data);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K4 ON MOAVALIAMARGENSPRODUTOS (usuario);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K5 ON MOAVALIAMARGENSPRODUTOS (modeloDocumentoEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K6 ON MOAVALIAMARGENSPRODUTOS (fornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K7 ON MOAVALIAMARGENSPRODUTOS (indicadorPessoaFornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K8 ON MOAVALIAMARGENSPRODUTOS (indicadorInscricaoEstadFornec);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K9 ON MOAVALIAMARGENSPRODUTOS (ufFornecedor);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K10 ON MOAVALIAMARGENSPRODUTOS (condicaoPagamentoEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K11 ON MOAVALIAMARGENSPRODUTOS (modeloDocumentoSaida);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K12 ON MOAVALIAMARGENSPRODUTOS (cliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K13 ON MOAVALIAMARGENSPRODUTOS (indicadorPessoaCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K14 ON MOAVALIAMARGENSPRODUTOS (indicadorInscricaoEstadCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K15 ON MOAVALIAMARGENSPRODUTOS (ufCliente);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K16 ON MOAVALIAMARGENSPRODUTOS (condicaoPagamentoSaida);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K17 ON MOAVALIAMARGENSPRODUTOS (gradeProduto);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K18 ON MOAVALIAMARGENSPRODUTOS (idNcm);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K19 ON MOAVALIAMARGENSPRODUTOS (tabelaPreco);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K20 ON MOAVALIAMARGENSPRODUTOS (operacaoFiscalEntrada);
CREATE INDEX MOAVALIAMARGENSPRODUTOS_K21 ON MOAVALIAMARGENSPRODUTOS (operacaoFiscalSaida);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK3 FOREIGN KEY (modeloDocumentoEntrada) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK4 FOREIGN KEY (fornecedor) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK5 FOREIGN KEY (indicadorPessoaFornecedor) REFERENCES SIINDICPESSOA (indicadorPessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK6 FOREIGN KEY (indicadorInscricaoEstadFornec) REFERENCES SIINDICINSCRICAOESTADUAL (indicadorInscricaoEstadual);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK7 FOREIGN KEY (ufFornecedor) REFERENCES SIUFS (uf);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK8 FOREIGN KEY (condicaoPagamentoEntrada) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK9 FOREIGN KEY (modeloDocumentoSaida) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK10 FOREIGN KEY (cliente) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK11 FOREIGN KEY (indicadorPessoaCliente) REFERENCES SIINDICPESSOA (indicadorPessoa);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK12 FOREIGN KEY (indicadorInscricaoEstadCliente) REFERENCES SIINDICINSCRICAOESTADUAL (indicadorInscricaoEstadual);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK13 FOREIGN KEY (ufCliente) REFERENCES SIUFS (uf);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK14 FOREIGN KEY (condicaoPagamentoSaida) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK15 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK16 FOREIGN KEY (idNcm) REFERENCES SINCMS (idNcm);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK17 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK18 FOREIGN KEY (idProdutoXCusto) REFERENCES CAPRODUTOXCUSTOS (idProdutoXCusto);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK19 FOREIGN KEY (operacaoFiscalEntrada) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK20 FOREIGN KEY (operacaoFiscalSaida) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);

INSERT INTO MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto, estabelecimento, data, usuario, modeloDocumentoEntrada, fornecedor, indicadorPessoaFornecedor, indicadorInscricaoEstadFornec, ufFornecedor, condicaoPagamentoEntrada, modeloDocumentoSaida, cliente, indicadorPessoaCliente, indicadorInscricaoEstadCliente, ufCliente, condicaoPagamentoSaida, gradeProduto, idNcm, quantidade, tabelaPreco, precoUnitario, idProdutoXCusto, precoCompra, precoCusto, operacaoFiscalEntrada, operacaoFiscalSaida, margemSobreReceitaBruta, markup, margemSobreReceitaLiquida, percMargemAdicional, valorMargemAdicional, margemMarkup, observacoes) VALUES (0, 0, NULL, 0, 0, 0, ' ', ' ', '  ', 0, 0, 0, ' ', ' ', '  ', 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto, estabelecimento, data, usuario, modeloDocumentoEntrada, fornecedor, indicadorPessoaFornecedor, indicadorInscricaoEstadFornec, ufFornecedor, condicaoPagamentoEntrada, modeloDocumentoSaida, cliente, indicadorPessoaCliente, indicadorInscricaoEstadCliente, ufCliente, condicaoPagamentoSaida, gradeProduto, idNcm, quantidade, tabelaPreco, precoUnitario, idProdutoXCusto, precoCompra, precoCusto, operacaoFiscalEntrada, operacaoFiscalSaida, margemSobreReceitaBruta, markup, margemSobreReceitaLiquida, percMargemAdicional, valorMargemAdicional, margemMarkup, observacoes) SELECT idAvaliaMargemProduto, estabelecimento, data, usuario, modeloDocumentoEntrada, fornecedor, indicadorPessoaFornecedor, indicadorInscricaoEstadFornec, ufFornecedor, condicaoPagamentoEntrada, modeloDocumentoSaida, cliente, indicadorPessoaCliente, indicadorInscricaoEstadCliente, ufCliente, condicaoPagamentoSaida, gradeProduto, idNcm, quantidade, tabelaPreco, precoUnitario, 0, precoCompra, precoCusto, operacaoFiscalEntrada, operacaoFiscalSaida, margemSobreReceitaBruta, markup, margemSobreReceitaLiquida, percMargemAdicional, valorMargemAdicional, margemMarkup, observacoes FROM MOAVALIAMARGENSPRODUTOS_2501 WHERE idAvaliaMargemProduto > 0;

COMMIT;

ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);

create or replace PROCEDURE ADD_AVALMARG_EXCLUI (
  p_idAvaliaMargemProduto IN NUMBER)
IS
BEGIN
  DELETE MOAVALIAMARGEMPRODXDOCFISC
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXPREDOC
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXORCAM
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGEMPRODXINCID
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
  DELETE MOAVALIAMARGENSPRODUTOS
  WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto;
END ADD_AVALMARG_EXCLUI;

/

create or replace PROCEDURE ADD_AVALMARG_CABECALHO_GRAVA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idAvaliaMargemProduto        IN NUMBER,
  p_estabelecimento              IN NUMBER,
  p_data                         IN DATE,
  p_usuario                      IN NUMBER,
  p_modeloDocumentoEntrada       IN NUMBER,
  p_fornecedor                   IN NUMBER,
  p_indicadorPessoaFornecedor    IN CHAR,
  p_indicadorInscricaoEstadForn  IN CHAR,
  p_ufFornecedor                 IN CHAR,
  p_condicaoPagamentoEntrada     IN NUMBER,
  p_modeloDocumentoSaida         IN NUMBER,
  p_cliente                      IN NUMBER,
  p_indicadorPessoaCliente       IN CHAR,
  p_indicadorInscricaoEstadClien IN CHAR,
  p_ufCliente                    IN CHAR,
  p_condicaoPagamentoSaida       IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_idNcm                        IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_tabelaPreco                  IN VARCHAR2,
  p_precoUnitario                IN NUMBER,
  p_idProdutoXCusto              IN NUMBER,
  p_precoCompra                  IN NUMBER,
  p_precoCusto                   IN NUMBER,
  p_operacaoFiscalEntrada        IN NUMBER,
  p_operacaoFiscalSaida          IN NUMBER,
  p_margemSobreReceitaBruta      IN NUMBER,
  p_markup                       IN NUMBER,
  p_margemSobreReceitaLiquida    IN NUMBER,
  p_percMargemAdicional          IN NUMBER,
  p_valorMargemAdicional         IN NUMBER,
  p_margemMarkup                 IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  r_idAvaliaMargemProduto        OUT NUMBER)
IS
BEGIN
  r_idAvaliaMargemProduto := p_idAvaliaMargemProduto;
  IF r_idAvaliaMargemProduto = 0 THEN
    r_idAvaliaMargemProduto := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGENSPRODUTOS',
      'idAvaliaMargemProduto',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGENSPRODUTOS a 
  USING (
    SELECT
      r_idAvaliaMargemProduto        idAvaliaMargemProduto,
      p_estabelecimento              estabelecimento,
      p_data                         data,
      p_usuario                      usuario,
      p_modeloDocumentoEntrada       modeloDocumentoEntrada,
      p_fornecedor                   fornecedor,
      p_indicadorPessoaFornecedor    indicadorPessoaFornecedor,
      p_indicadorInscricaoEstadForn  indicadorInscricaoEstadFornec,
      p_ufFornecedor                 ufFornecedor,
      p_condicaoPagamentoEntrada     condicaoPagamentoEntrada,
      p_modeloDocumentoSaida         modeloDocumentoSaida,
      p_cliente                      cliente,
      p_indicadorPessoaCliente       indicadorPessoaCliente,
      p_indicadorInscricaoEstadClien indicadorInscricaoEstadCliente,
      p_ufCliente                    ufCliente,
      p_condicaoPagamentoSaida       condicaoPagamentoSaida,
      p_gradeProduto                 gradeProduto,
      p_idNcm                        idNcm,
      p_quantidade                   quantidade,
      p_tabelaPreco                  tabelaPreco,
      p_precoUnitario                precoUnitario,
      p_idProdutoXCusto              idProdutoXCusto,
      p_precoCompra                  precoCompra,
      p_precoCusto                   precoCusto,
      p_operacaoFiscalEntrada        operacaoFiscalEntrada,
      p_operacaoFiscalSaida          operacaoFiscalSaida,
      p_margemSobreReceitaBruta      margemSobreReceitaBruta,
      p_markup                       markup,
      p_margemSobreReceitaLiquida    margemSobreReceitaLiquida,
      p_percMargemAdicional          percMargemAdicional,
      p_valorMargemAdicional         valorMargemAdicional,
      p_margemMarkup                 margemMarkup,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.idAvaliaMargemProduto = b.idAvaliaMargemProduto)
  WHEN MATCHED THEN UPDATE SET
    a.estabelecimento                = b.estabelecimento,
    a.data                           = b.data,
    a.usuario                        = b.usuario,
    a.modeloDocumentoEntrada         = b.modeloDocumentoEntrada,
    a.fornecedor                     = b.fornecedor,
    a.indicadorPessoaFornecedor      = b.indicadorPessoaFornecedor,
    a.indicadorInscricaoEstadFornec  = b.indicadorInscricaoEstadFornec,
    a.ufFornecedor                   = b.ufFornecedor,
    a.condicaoPagamentoEntrada       = b.condicaoPagamentoEntrada,
    a.modeloDocumentoSaida           = b.modeloDocumentoSaida,
    a.cliente                        = b.cliente,
    a.indicadorPessoaCliente         = b.indicadorPessoaCliente,
    a.indicadorInscricaoEstadCliente = b.indicadorInscricaoEstadCliente,
    a.ufCliente                      = b.ufCliente,
    a.condicaoPagamentoSaida         = b.condicaoPagamentoSaida,
    a.gradeProduto                   = b.gradeProduto,
    a.idNcm                          = b.idNcm,
    a.quantidade                     = b.quantidade,
    a.tabelaPreco                    = b.tabelaPreco,
    a.precoUnitario                  = b.precoUnitario,
    a.idProdutoXCusto                = b.idProdutoXCusto,
    a.precoCompra                    = b.precoCompra,
    a.precoCusto                     = b.precoCusto,
    a.operacaoFiscalEntrada          = b.operacaoFiscalEntrada,
    a.operacaoFiscalSaida            = b.operacaoFiscalSaida,
    a.margemSobreReceitaBruta        = b.margemSobreReceitaBruta,
    a.markup                         = b.markup,
    a.margemSobreReceitaLiquida      = b.margemSobreReceitaLiquida,
    a.percMargemAdicional            = b.percMargemAdicional,
    a.valorMargemAdicional           = b.valorMargemAdicional,
    a.margemMarkup                   = b.margemMarkup,
    a.observacoes                    = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAvaliaMargemProduto,
    estabelecimento,
    data,
    usuario,
    modeloDocumentoEntrada,
    fornecedor,
    indicadorPessoaFornecedor,
    indicadorInscricaoEstadFornec,
    ufFornecedor,
    condicaoPagamentoEntrada,
    modeloDocumentoSaida,
    cliente,
    indicadorPessoaCliente,
    indicadorInscricaoEstadCliente,
    ufCliente,
    condicaoPagamentoSaida,
    gradeProduto,
    idNcm,
    quantidade,
    tabelaPreco,
    precoUnitario,
    idProdutoXCusto,
    precoCompra,
    precoCusto,
    operacaoFiscalEntrada,
    operacaoFiscalSaida,
    margemSobreReceitaBruta,
    markup,
    margemSobreReceitaLiquida,
    percMargemAdicional,
    valorMargemAdicional,
    margemMarkup,
    observacoes)
  VALUES (
    b.idAvaliaMargemProduto,
    b.estabelecimento,
    b.data,
    b.usuario,
    b.modeloDocumentoEntrada,
    b.fornecedor,
    b.indicadorPessoaFornecedor,
    b.indicadorInscricaoEstadFornec,
    b.ufFornecedor,
    b.condicaoPagamentoEntrada,
    b.modeloDocumentoSaida,
    b.cliente,
    b.indicadorPessoaCliente,
    b.indicadorInscricaoEstadCliente,
    b.ufCliente,
    b.condicaoPagamentoSaida,
    b.gradeProduto,
    b.idNcm,
    b.quantidade,
    b.tabelaPreco,
    b.precoUnitario,
    b.idProdutoXCusto,
    b.precoCompra,
    b.precoCusto,
    b.operacaoFiscalEntrada,
    b.operacaoFiscalSaida,
    b.margemSobreReceitaBruta,
    b.markup,
    b.margemSobreReceitaLiquida,
    b.percMargemAdicional,
    b.valorMargemAdicional,
    b.margemMarkup,
    b.observacoes);
END ADD_AVALMARG_CABECALHO_GRAVA;

/

create or replace FUNCTION FUNC_ADD_BUSCA_CENARIO_CALC_PR (
  p_compraVenda          IN CHAR,
  p_cab_estabelecimento  IN NUMBER,
  p_munEndEst_uf         IN CHAR,
  p_munEndPess_uf        IN CHAR,
  p_item_modeloDocumento IN NUMBER,
  p_item_tabelaPreco     IN VARCHAR)
  RETURN NUMBER
IS 
  v_idCenarioCalculoPreco NUMBER;
BEGIN
  SELECT COALESCE (MAX (a.idCenarioCalculoPreco), 0)
  INTO v_idCenarioCalculoPreco
  FROM (
    SELECT
      a.idCenarioCalculoPreco,
      ROW_NUMBER() OVER (
        ORDER BY
          CASE
            WHEN a.modeloDocumento = p_item_modeloDocumento
              AND p_item_modeloDocumento <> 0
            THEN 1
            WHEN a.modeloDocumento = 0
            THEN 2
            ELSE 3
          END,
          CASE
            WHEN a.uf = p_munEndPess_uf
              AND p_munEndPess_uf <> ' '
              AND p_munEndPess_uf <> '  '
            THEN 1
            ELSE 2
          END,
          a.idCenarioCalculoPreco DESC) ordenacao
    FROM PACENARIOSCALCULOPRECO a
    WHERE a.idCenarioCalculoPreco > 0
    AND a.compraVenda = p_compraVenda
    AND a.ativo = 1
    AND (a.filtrarEstabelecimentos = 0
      OR EXISTS (
        SELECT 1
        FROM PACENARIOCALCPRECOXESTAB cenXEst
        WHERE cenXEst.idCenarioCalculoPreco = a.idCenarioCalculoPreco
        AND cenXEst.estabelecimento = p_cab_estabelecimento
        AND cenXEst.ativo = 1))
    AND EXISTS (
      SELECT 1
      FROM PACENARIOCALCPRECOINCID incid
      WHERE incid.idCenarioCalculoPreco = a.idCenarioCalculoPreco)
    AND (a.compraVenda = 'C'
      OR (a.uf = ' '
        OR a.uf = '  '
        OR (p_munEndEst_uf = ' '
          OR p_munEndEst_uf = '  ')
        AND (p_munEndPess_uf = ' '
          OR p_munEndPess_uf = '  ')
        OR a.uf = p_munEndEst_uf
        OR a.uf = p_munEndPess_uf)
      AND (p_item_tabelaPreco = ' '
        OR EXISTS (
          SELECT 1
          FROM PACENARIOCALCPRECOTABELAS cenXTab
          WHERE cenXTab.idCenarioCalculoPreco = a.idCenarioCalculoPreco
          AND cenXTab.tabelaPreco = p_item_tabelaPreco
          AND cenXTab.ativo = 1)))) a
  WHERE a.ordenacao = 1;
  RETURN v_idCenarioCalculoPreco;
END;

/

create or replace FUNCTION FUNC_ADD_DOC_FISC_IMPOSTO_MARG (
  p_sys_usuarioLogado       IN NUMBER,
  p_sys_perfilUsuarioLogado IN NUMBER,
  p_idItemDocFiscal         IN NUMBER)
  RETURN NUMBER
IS 
  v_idCenarioCalculoPreco NUMBER;
  v_valorImpostos         NUMBER;
  v_percentualRegra       NUMBER;
  v_valorRegra            NUMBER;
BEGIN
  v_valorImpostos := 0;
  FOR item IN (
    SELECT
      item.idItemDocFiscal,
      item.modeloDocumento,
      item.quantidade,
      item.tabelaPreco,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.retidoISSQN,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      cab.estabelecimento,
      gradProd.produto,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto,
      COALESCE ((
        SELECT MAX (avalMarg.idAvaliaMargemProduto)
        FROM MOAVALIAMARGEMPRODXDOCFISC avalMarg
        WHERE avalMarg.idItemDocFiscal = item.idItemDocFiscal), 0) idAvaliaMargemProduto,
      CASE
        WHEN cab.estabelecimento = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = est.pessoaEstabelecimento
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munEst_uf,
      CASE
        WHEN cab.pessoa = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = cab.pessoa
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munPess_uf
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = cab.estabelecimento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
    WHERE item.idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    IF item.idAvaliaMargemProduto > 0 THEN
      SELECT COALESCE (SUM (ROUND ((item.quantidade * ABS (avalXInc.valor) * CASE avalXInc.somaDiminuiIgnora WHEN 'S' THEN -1 ELSE 1 END), 2)), 0)
      INTO v_valorImpostos
      FROM MOAVALIAMARGEMPRODXINCID avalXInc
      WHERE avalXInc.idAvaliaMargemProduto = item.idAvaliaMargemProduto
      AND avalXInc.entradaSaidaDre = 'S'
      AND avalXInc.indicadorConta = 'A'
      AND avalXInc.somaDiminuiIgnora IN ('D','S')
      AND avalXInc.ordenacao <= 8598
      AND avalXInc.ordenacao <> 4599;
    ELSE
      v_idCenarioCalculoPreco := FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        item.estabelecimento,
        item.munEst_uf,
        item.munPess_uf,
        item.modeloDocumento,
        item.tabelaPreco);
      IF v_idCenarioCalculoPreco > 0 THEN
        FOR cenXInc IN (
          SELECT
            cenXInc.idCenarioCalculoPrecoXIncid,
            cenXInc.incidenciaFormacaoPreco,
            cenXInc.somaDiminuiIgnora,
            cenXInc.origemDado,
            cenXInc.percentual,
            cenXInc.valor
          FROM PACENARIOCALCPRECOINCID cenXInc
          WHERE cenXInc.idCenarioCalculoPreco = v_idCenarioCalculoPreco
          AND cenXInc.somaDiminuiIgnora IN ('D','S')
          AND cenXInc.incidenciaFormacaoPreco <= 8598
          AND cenXInc.incidenciaFormacaoPreco <> 4599
          ORDER BY cenXInc.incidenciaFormacaoPreco)
        LOOP
          v_percentualRegra := 0;
          v_valorRegra := 0;
          IF cenXInc.origemDado = 'R' THEN
            SELECT
              COALESCE (MIN (cenXInc.percentual), 0),
              COALESCE (MIN (cenXInc.valor), 0)
            INTO
              v_percentualRegra,
              v_valorRegra
            FROM (
              SELECT
                percentual,
                valor,
              ROW_NUMBER() OVER (
                ORDER BY
                  regra.ordenacao,
                  regra.idCenarioCalculoPrecoXRegra) ordenacao            
              FROM PACENARIOCALCPRECOREGRAS regra
              JOIN PAFILTROSCABECALHO filtroCab
              ON filtroCab.filtroCabecalho = regra.filtroCabecalho
              JOIN PAFILTROSPRODUTO filtroProd
              ON regra.filtroProduto = filtroProd.filtroProduto
              WHERE regra.idCenarioCalculoPrecoXIncid = cenXInc.idCenarioCalculoPrecoXIncid
              AND regra.ativo = 1
              AND filtroCab.ativo = 1
              AND filtroProd.ativo = 1
              AND (regra.filtroCabecalho = 0
                OR (filtroCab.filtrarEstabelecimentos = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXESTABELEC filCabEst
                    WHERE filCabEst.filtroCabecalho = regra.filtroCabecalho
                    AND filCabEst.estabelecimento = item.estabelecimento
                    AND filCabEst.ativo = 1))
                AND (filtroCab.filtrarUfs = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUFS filCabUf
                    WHERE filCabUf.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUf.uf =
                      CASE
                        WHEN item.munPess_uf = ' '
                          OR item.munPess_uf = '  '
                        THEN item.munEst_uf
                        ELSE item.munPess_uf
                      END
                    AND filCabUf.ativo = 1))
                AND (filtroCab.filtrarPessoas = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPESSOAS filCabPess
                    WHERE filCabPess.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPess.pessoa = 0
                    AND filCabPess.ativo = 1))
                AND (filtroCab.filtrarPerfisUsuario = 0
                  AND filtroCab.filtrarUsuarios = 0
                  OR filtroCab.filtrarPerfisUsuario = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
                    WHERE filCabPerfUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPerfUs.perfilUsuario = p_sys_perfilUsuarioLogado
                    AND filCabPerfUs.ativo = 1)
                  OR filtroCab.filtrarUsuarios = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUSUARIOS filCabUs
                    WHERE filCabUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUs.usuario = p_sys_usuarioLogado
                    AND filCabUs.ativo = 1))
                AND filtroCab.indicadorPessoa = ' '
                AND (filtroCab.colaborador = ' '
                  OR filtroCab.colaborador = 'N'))
              AND (regra.filtroProduto = 0
                OR filtroProd.filtrarVendedores = 0
                AND filtroProd.filtrarLocaisEstoque = 0
                AND (filtroProd.filtrarProdutos = 0
                  AND filtroProd.filtrarCategoriasProdutos = 0
                  AND filtroProd.filtrarSubcategoriasProdutos = 0
                  AND filtroProd.filtrarMarcas = 0
                  AND filtroProd.filtrarCaracteristicasA = 0
                  AND filtroProd.filtrarCaracteristicasB = 0
                  AND filtroProd.filtrarCaracteristicasC = 0
                  AND filtroProd.filtrarCaracteristicasD = 0
                  AND filtroProd.filtrarCaracteristicasE = 0
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND filtroProd.filtrarNCMs = 0
                  AND filtroProd.filtrarListasServicos = 0
                  OR filtroProd.filtrarProdutos = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
                    WHERE filtroProdXProd.filtroProduto = regra.filtroProduto
                    AND filtroProdXProd.produto = item.produto
                    AND filtroProdXProd.ativo = 1)
                  OR (filtroProd.filtrarCategoriasProdutos = 1
                    OR filtroProd.filtrarSubcategoriasProdutos = 1
                    OR filtroProd.filtrarMarcas = 1
                    OR filtroProd.filtrarCaracteristicasA = 1
                    OR filtroProd.filtrarCaracteristicasB = 1
                    OR filtroProd.filtrarCaracteristicasC = 1
                    OR filtroProd.filtrarCaracteristicasD = 1
                    OR filtroProd.filtrarCaracteristicasE = 1
                    OR filtroProd.filtrarCores = 1
                    OR filtroProd.filtrarTamanhos = 1
                    OR filtroProd.filtrarNCMs = 1
                    OR filtroProd.filtrarListasServicos = 1)
                  AND (filtroProd.filtrarCategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCATEGPROD filtroProdXCatProd
                      WHERE filtroProdXCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXCatProd.categoriaProduto = item.categoriaProduto
                      AND filtroProdXCatProd.ativo = 1))
                  AND (filtroProd.filtrarSubcategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXSUBCAPROD filtroProdXSubCatProd
                      WHERE filtroProdXSubCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXSubCatProd.subcategoriaProduto = item.subcategoriaProduto
                      AND filtroProdXSubCatProd.ativo = 1))
                  AND (filtroProd.filtrarMarcas = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXMARCAS filtroProdXMarc
                      WHERE filtroProdXMarc.filtroProduto = regra.filtroProduto
                      AND filtroProdXMarc.marca = item.marca
                      AND filtroProdXMarc.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasA = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERA filtroProdXCarA
                      WHERE filtroProdXCarA.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarA.caracteristicaA = item.caracteristicaA
                      AND filtroProdXCarA.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasB = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERB filtroProdXCarB
                      WHERE filtroProdXCarB.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarB.caracteristicaB = item.caracteristicaB
                      AND filtroProdXCarB.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasC = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERC filtroProdXCarC
                      WHERE filtroProdXCarC.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarC.caracteristicaC = item.caracteristicaC
                      AND filtroProdXCarC.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasD = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERD filtroProdXCarD
                      WHERE filtroProdXCarD.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarD.caracteristicaD = item.caracteristicaD
                      AND filtroProdXCarD.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasE = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERE filtroProdXCarE
                      WHERE filtroProdXCarE.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarE.caracteristicaE = item.caracteristicaE
                      AND filtroProdXCarE.ativo = 1))
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND (filtroProd.filtrarNCMs = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXNCMS filtroProdXNcms
                      WHERE filtroProdXNcms.filtroProduto = regra.filtroProduto
                      AND filtroProdXNcms.idNcm = item.idNcm
                      AND filtroProdXNcms.ativo = 1))
                  AND (filtroProd.filtrarListasServicos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXLISTASSE filtroProdXListServ
                      WHERE filtroProdXListServ.filtroProduto = regra.filtroProduto
                      AND filtroProdXListServ.listaServicos = item.listaServicos
                      AND filtroProdXListServ.ativo = 1))))) cenXInc
            WHERE cenXInc.ordenacao = 1;
          END IF;
          v_valorImpostos := v_valorImpostos + ROUND (
            CASE cenXInc.origemDado
              WHEN 'P'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * cenXInc.percentual / 100
                + item.quantidade
                * cenXInc.valor
              WHEN 'R'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * v_percentualRegra / 100
                + item.quantidade
                * v_valorRegra
              WHEN 'D'
              THEN
                CASE cenXInc.incidenciaFormacaoPreco
                  WHEN 2001 THEN item.valorICMS
                  WHEN 2002 THEN item.valorPIS + item.valorPISST
                  WHEN 2003 THEN item.valorCOFINS + item.valorCOFINSST
                  WHEN 2004 THEN item.valorICMSST
                  WHEN 2005 THEN item.valorIPI + item.valorIPIDevolucao
                  WHEN 2006 THEN item.valorICMSUFDestinatario + item.valorICMSUFRemetente
                  WHEN 2007 THEN item.valorII
                  WHEN 2008 THEN CASE WHEN item.retidoISSQN = 0 THEN item.valorISSQN ELSE 0 END
                  WHEN 2009 THEN CASE WHEN item.retidoISSQN = 1 THEN item.valorISSQN ELSE 0 END
                  WHEN 2010 THEN item.valorRetIRRF
                  WHEN 2011 THEN item.valorRetINSS
                  WHEN 2012 THEN item.valorRetPIS
                  WHEN 2013 THEN item.valorRetCOFINS
                  WHEN 2014 THEN item.valorRetIRRF
                  WHEN 2015 THEN item.valorRetCSLL
                  ELSE 0
                END
              ELSE 0
            END *
            CASE cenXInc.somaDiminuiIgnora
              WHEN 'S'
              THEN -1
              WHEN 'D'
              THEN +1
              ELSE 0
            END, 2);
        END LOOP;
      ELSE
        v_valorImpostos :=
          item.valorII
          + item.valorIOF
          + item.valorIPI
          + item.valorIPIDevolucao
          + item.valorPIS
          + item.valorPISST
          + item.valorCOFINS
          + item.valorCOFINSST
          + item.valorCreditoSimplesNacional
          + item.valorICMSOperacao
          + item.valorICMSDiferido
          + item.valorICMS
          + item.valorICMSDesoneracao
          + item.valorICMSST
          + item.valorICMSUFDestinatario
          + item.valorICMSUFRemetente
          + item.valorFCP
          + item.valorFCPST
          + item.valorFCPSTAnteriormente
          + item.valorFCPUFDestinatario;
      END IF;
    END IF;
  END LOOP;
  RETURN v_valorImpostos;
END;

/

create or replace FUNCTION FUNC_ADD_PRE_DOC_IMPOSTO_MARG (
  p_sys_usuarioLogado       IN NUMBER,
  p_sys_perfilUsuarioLogado IN NUMBER,
  p_idItemPreDocumento      IN NUMBER)
  RETURN NUMBER
IS 
  v_idCenarioCalculoPreco NUMBER;
  v_valorImpostos         NUMBER;
  v_percentualRegra       NUMBER;
  v_valorRegra            NUMBER;
BEGIN
  v_valorImpostos := 0;
  FOR item IN (
    SELECT
      item.idItemPreDocumento,
      item.modeloDocumento,
      item.quantidade,
      item.tabelaPreco,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.retidoISSQN,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      cab.estabelecimento,
      gradProd.produto,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto,
      COALESCE ((
        SELECT MAX (avalMarg.idAvaliaMargemProduto)
        FROM MOAVALIAMARGEMPRODXPREDOC avalMarg
        WHERE avalMarg.idItemPreDocumento = item.idItemPreDocumento), 0) idAvaliaMargemProduto,
      CASE
        WHEN cab.estabelecimento = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = est.pessoaEstabelecimento
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munEst_uf,
      CASE
        WHEN cab.pessoa = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = cab.pessoa
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munPess_uf
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = cab.estabelecimento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
    WHERE item.idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    IF item.idAvaliaMargemProduto > 0 THEN
      SELECT COALESCE (SUM (ROUND ((item.quantidade * ABS (avalXInc.valor) * CASE avalXInc.somaDiminuiIgnora WHEN 'S' THEN -1 ELSE 1 END), 2)), 0)
      INTO v_valorImpostos
      FROM MOAVALIAMARGEMPRODXINCID avalXInc
      WHERE avalXInc.idAvaliaMargemProduto = item.idAvaliaMargemProduto
      AND avalXInc.entradaSaidaDre = 'S'
      AND avalXInc.indicadorConta = 'A'
      AND avalXInc.somaDiminuiIgnora IN ('D','S')
      AND avalXInc.ordenacao <= 8598
      AND avalXInc.ordenacao <> 4599;
    ELSE
      v_idCenarioCalculoPreco := FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        item.estabelecimento,
        item.munEst_uf,
        item.munPess_uf,
        item.modeloDocumento,
        item.tabelaPreco);
      IF v_idCenarioCalculoPreco > 0 THEN
        FOR cenXInc IN (
          SELECT
            cenXInc.idCenarioCalculoPrecoXIncid,
            cenXInc.incidenciaFormacaoPreco,
            cenXInc.somaDiminuiIgnora,
            cenXInc.origemDado,
            cenXInc.percentual,
            cenXInc.valor
          FROM PACENARIOCALCPRECOINCID cenXInc
          WHERE cenXInc.idCenarioCalculoPreco = v_idCenarioCalculoPreco
          AND cenXInc.somaDiminuiIgnora IN ('D','S')
          AND cenXInc.incidenciaFormacaoPreco <= 8598
          AND cenXInc.incidenciaFormacaoPreco <> 4599
          ORDER BY cenXInc.incidenciaFormacaoPreco)
        LOOP
          v_percentualRegra := 0;
          v_valorRegra := 0;
          IF cenXInc.origemDado = 'R' THEN
            SELECT
              COALESCE (MIN (cenXInc.percentual), 0),
              COALESCE (MIN (cenXInc.valor), 0)
            INTO
              v_percentualRegra,
              v_valorRegra
            FROM (
              SELECT
                percentual,
                valor,
              ROW_NUMBER() OVER (
                ORDER BY
                  regra.ordenacao,
                  regra.idCenarioCalculoPrecoXRegra) ordenacao            
              FROM PACENARIOCALCPRECOREGRAS regra
              JOIN PAFILTROSCABECALHO filtroCab
              ON filtroCab.filtroCabecalho = regra.filtroCabecalho
              JOIN PAFILTROSPRODUTO filtroProd
              ON regra.filtroProduto = filtroProd.filtroProduto
              WHERE regra.idCenarioCalculoPrecoXIncid = cenXInc.idCenarioCalculoPrecoXIncid
              AND regra.ativo = 1
              AND filtroCab.ativo = 1
              AND filtroProd.ativo = 1
              AND (regra.filtroCabecalho = 0
                OR (filtroCab.filtrarEstabelecimentos = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXESTABELEC filCabEst
                    WHERE filCabEst.filtroCabecalho = regra.filtroCabecalho
                    AND filCabEst.estabelecimento = item.estabelecimento
                    AND filCabEst.ativo = 1))
                AND (filtroCab.filtrarUfs = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUFS filCabUf
                    WHERE filCabUf.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUf.uf =
                      CASE
                        WHEN item.munPess_uf = ' '
                          OR item.munPess_uf = '  '
                        THEN item.munEst_uf
                        ELSE item.munPess_uf
                      END
                    AND filCabUf.ativo = 1))
                AND (filtroCab.filtrarPessoas = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPESSOAS filCabPess
                    WHERE filCabPess.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPess.pessoa = 0
                    AND filCabPess.ativo = 1))
                AND (filtroCab.filtrarPerfisUsuario = 0
                  AND filtroCab.filtrarUsuarios = 0
                  OR filtroCab.filtrarPerfisUsuario = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
                    WHERE filCabPerfUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPerfUs.perfilUsuario = p_sys_perfilUsuarioLogado
                    AND filCabPerfUs.ativo = 1)
                  OR filtroCab.filtrarUsuarios = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUSUARIOS filCabUs
                    WHERE filCabUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUs.usuario = p_sys_usuarioLogado
                    AND filCabUs.ativo = 1))
                AND filtroCab.indicadorPessoa = ' '
                AND (filtroCab.colaborador = ' '
                  OR filtroCab.colaborador = 'N'))
              AND (regra.filtroProduto = 0
                OR filtroProd.filtrarVendedores = 0
                AND filtroProd.filtrarLocaisEstoque = 0
                AND (filtroProd.filtrarProdutos = 0
                  AND filtroProd.filtrarCategoriasProdutos = 0
                  AND filtroProd.filtrarSubcategoriasProdutos = 0
                  AND filtroProd.filtrarMarcas = 0
                  AND filtroProd.filtrarCaracteristicasA = 0
                  AND filtroProd.filtrarCaracteristicasB = 0
                  AND filtroProd.filtrarCaracteristicasC = 0
                  AND filtroProd.filtrarCaracteristicasD = 0
                  AND filtroProd.filtrarCaracteristicasE = 0
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND filtroProd.filtrarNCMs = 0
                  AND filtroProd.filtrarListasServicos = 0
                  OR filtroProd.filtrarProdutos = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
                    WHERE filtroProdXProd.filtroProduto = regra.filtroProduto
                    AND filtroProdXProd.produto = item.produto
                    AND filtroProdXProd.ativo = 1)
                  OR (filtroProd.filtrarCategoriasProdutos = 1
                    OR filtroProd.filtrarSubcategoriasProdutos = 1
                    OR filtroProd.filtrarMarcas = 1
                    OR filtroProd.filtrarCaracteristicasA = 1
                    OR filtroProd.filtrarCaracteristicasB = 1
                    OR filtroProd.filtrarCaracteristicasC = 1
                    OR filtroProd.filtrarCaracteristicasD = 1
                    OR filtroProd.filtrarCaracteristicasE = 1
                    OR filtroProd.filtrarCores = 1
                    OR filtroProd.filtrarTamanhos = 1
                    OR filtroProd.filtrarNCMs = 1
                    OR filtroProd.filtrarListasServicos = 1)
                  AND (filtroProd.filtrarCategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCATEGPROD filtroProdXCatProd
                      WHERE filtroProdXCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXCatProd.categoriaProduto = item.categoriaProduto
                      AND filtroProdXCatProd.ativo = 1))
                  AND (filtroProd.filtrarSubcategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXSUBCAPROD filtroProdXSubCatProd
                      WHERE filtroProdXSubCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXSubCatProd.subcategoriaProduto = item.subcategoriaProduto
                      AND filtroProdXSubCatProd.ativo = 1))
                  AND (filtroProd.filtrarMarcas = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXMARCAS filtroProdXMarc
                      WHERE filtroProdXMarc.filtroProduto = regra.filtroProduto
                      AND filtroProdXMarc.marca = item.marca
                      AND filtroProdXMarc.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasA = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERA filtroProdXCarA
                      WHERE filtroProdXCarA.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarA.caracteristicaA = item.caracteristicaA
                      AND filtroProdXCarA.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasB = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERB filtroProdXCarB
                      WHERE filtroProdXCarB.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarB.caracteristicaB = item.caracteristicaB
                      AND filtroProdXCarB.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasC = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERC filtroProdXCarC
                      WHERE filtroProdXCarC.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarC.caracteristicaC = item.caracteristicaC
                      AND filtroProdXCarC.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasD = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERD filtroProdXCarD
                      WHERE filtroProdXCarD.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarD.caracteristicaD = item.caracteristicaD
                      AND filtroProdXCarD.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasE = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERE filtroProdXCarE
                      WHERE filtroProdXCarE.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarE.caracteristicaE = item.caracteristicaE
                      AND filtroProdXCarE.ativo = 1))
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND (filtroProd.filtrarNCMs = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXNCMS filtroProdXNcms
                      WHERE filtroProdXNcms.filtroProduto = regra.filtroProduto
                      AND filtroProdXNcms.idNcm = item.idNcm
                      AND filtroProdXNcms.ativo = 1))
                  AND (filtroProd.filtrarListasServicos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXLISTASSE filtroProdXListServ
                      WHERE filtroProdXListServ.filtroProduto = regra.filtroProduto
                      AND filtroProdXListServ.listaServicos = item.listaServicos
                      AND filtroProdXListServ.ativo = 1))))) cenXInc
            WHERE cenXInc.ordenacao = 1;
          END IF;
          v_valorImpostos := v_valorImpostos + ROUND (
            CASE cenXInc.origemDado
              WHEN 'P'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * cenXInc.percentual / 100
                + item.quantidade
                * cenXInc.valor
              WHEN 'R'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * v_percentualRegra / 100
                + item.quantidade
                * v_valorRegra
              WHEN 'D'
              THEN
                CASE cenXInc.incidenciaFormacaoPreco
                  WHEN 2001 THEN item.valorICMS
                  WHEN 2002 THEN item.valorPIS + item.valorPISST
                  WHEN 2003 THEN item.valorCOFINS + item.valorCOFINSST
                  WHEN 2004 THEN item.valorICMSST
                  WHEN 2005 THEN item.valorIPI + item.valorIPIDevolucao
                  WHEN 2006 THEN item.valorICMSUFDestinatario + item.valorICMSUFRemetente
                  WHEN 2007 THEN item.valorII
                  WHEN 2008 THEN CASE WHEN item.retidoISSQN = 0 THEN item.valorISSQN ELSE 0 END
                  WHEN 2009 THEN CASE WHEN item.retidoISSQN = 1 THEN item.valorISSQN ELSE 0 END
                  WHEN 2010 THEN item.valorRetIRRF
                  WHEN 2011 THEN item.valorRetINSS
                  WHEN 2012 THEN item.valorRetPIS
                  WHEN 2013 THEN item.valorRetCOFINS
                  WHEN 2014 THEN item.valorRetIRRF
                  WHEN 2015 THEN item.valorRetCSLL
                  ELSE 0
                END
              ELSE 0
            END *
            CASE cenXInc.somaDiminuiIgnora
              WHEN 'S'
              THEN -1
              WHEN 'D'
              THEN +1
              ELSE 0
            END, 2);
        END LOOP;
      ELSE
        v_valorImpostos :=
          item.valorII
          + item.valorIOF
          + item.valorIPI
          + item.valorIPIDevolucao
          + item.valorPIS
          + item.valorPISST
          + item.valorCOFINS
          + item.valorCOFINSST
          + item.valorCreditoSimplesNacional
          + item.valorICMSOperacao
          + item.valorICMSDiferido
          + item.valorICMS
          + item.valorICMSDesoneracao
          + item.valorICMSST
          + item.valorICMSUFDestinatario
          + item.valorICMSUFRemetente
          + item.valorFCP
          + item.valorFCPST
          + item.valorFCPSTAnteriormente
          + item.valorFCPUFDestinatario;
      END IF;
    END IF;
  END LOOP;
  RETURN v_valorImpostos;
END;

/

create or replace FUNCTION FUNC_ADD_ORCAMENT_IMPOSTO_MARG (
  p_sys_usuarioLogado       IN NUMBER,
  p_sys_perfilUsuarioLogado IN NUMBER,
  p_idItemOrcamento         IN NUMBER)
  RETURN NUMBER
IS 
  v_idCenarioCalculoPreco NUMBER;
  v_valorImpostos         NUMBER;
  v_percentualRegra       NUMBER;
  v_valorRegra            NUMBER;
BEGIN
  v_valorImpostos := 0;
  FOR item IN (
    SELECT
      item.idItemOrcamento,
      item.modeloDocumento,
      item.quantidade,
      item.tabelaPreco,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.retidoISSQN,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      cab.estabelecimento,
      gradProd.produto,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto,
      COALESCE ((
        SELECT MAX (avalMarg.idAvaliaMargemProduto)
        FROM MOAVALIAMARGEMPRODXORCAM avalMarg
        WHERE avalMarg.idItemOrcamento = item.idItemOrcamento), 0) idAvaliaMargemProduto,
      CASE
        WHEN cab.estabelecimento = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = est.pessoaEstabelecimento
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munEst_uf,
      CASE
        WHEN cab.pessoa = 0
        THEN '  '
        ELSE COALESCE ((
          SELECT MAX (mun.uf)
          FROM CAENDERECOSPESSOA end
          JOIN SIMUNICIPIOS mun
          ON mun.municipio = end.municipio
          WHERE end.pessoa = cab.pessoa
          AND end.ativo = 1
          AND end.principal = 1), '  ')
      END munPess_uf
    FROM MOORCAMENTOXITENS item
    JOIN MOORCAMENTOS cab
    ON cab.orcamento = item.orcamento
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = cab.estabelecimento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
    WHERE item.idItemOrcamento = p_idItemOrcamento)
  LOOP
    IF item.idAvaliaMargemProduto > 0 THEN
      SELECT COALESCE (SUM (ROUND ((item.quantidade * ABS (avalXInc.valor) * CASE avalXInc.somaDiminuiIgnora WHEN 'S' THEN -1 ELSE 1 END), 2)), 0)
      INTO v_valorImpostos
      FROM MOAVALIAMARGEMPRODXINCID avalXInc
      WHERE avalXInc.idAvaliaMargemProduto = item.idAvaliaMargemProduto
      AND avalXInc.entradaSaidaDre = 'S'
      AND avalXInc.indicadorConta = 'A'
      AND avalXInc.somaDiminuiIgnora IN ('D','S')
      AND avalXInc.ordenacao <= 8598
      AND avalXInc.ordenacao <> 4599;
    ELSE
      v_idCenarioCalculoPreco := FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        item.estabelecimento,
        item.munEst_uf,
        item.munPess_uf,
        item.modeloDocumento,
        item.tabelaPreco);
      IF v_idCenarioCalculoPreco > 0 THEN
        FOR cenXInc IN (
          SELECT
            cenXInc.idCenarioCalculoPrecoXIncid,
            cenXInc.incidenciaFormacaoPreco,
            cenXInc.somaDiminuiIgnora,
            cenXInc.origemDado,
            cenXInc.percentual,
            cenXInc.valor
          FROM PACENARIOCALCPRECOINCID cenXInc
          WHERE cenXInc.idCenarioCalculoPreco = v_idCenarioCalculoPreco
          AND cenXInc.somaDiminuiIgnora IN ('D','S')
          AND cenXInc.incidenciaFormacaoPreco <= 8598
          AND cenXInc.incidenciaFormacaoPreco <> 4599
          ORDER BY cenXInc.incidenciaFormacaoPreco)
        LOOP
          v_percentualRegra := 0;
          v_valorRegra := 0;
          IF cenXInc.origemDado = 'R' THEN
            SELECT
              COALESCE (MIN (cenXInc.percentual), 0),
              COALESCE (MIN (cenXInc.valor), 0)
            INTO
              v_percentualRegra,
              v_valorRegra
            FROM (
              SELECT
                percentual,
                valor,
              ROW_NUMBER() OVER (
                ORDER BY
                  regra.ordenacao,
                  regra.idCenarioCalculoPrecoXRegra) ordenacao            
              FROM PACENARIOCALCPRECOREGRAS regra
              JOIN PAFILTROSCABECALHO filtroCab
              ON filtroCab.filtroCabecalho = regra.filtroCabecalho
              JOIN PAFILTROSPRODUTO filtroProd
              ON regra.filtroProduto = filtroProd.filtroProduto
              WHERE regra.idCenarioCalculoPrecoXIncid = cenXInc.idCenarioCalculoPrecoXIncid
              AND regra.ativo = 1
              AND filtroCab.ativo = 1
              AND filtroProd.ativo = 1
              AND (regra.filtroCabecalho = 0
                OR (filtroCab.filtrarEstabelecimentos = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXESTABELEC filCabEst
                    WHERE filCabEst.filtroCabecalho = regra.filtroCabecalho
                    AND filCabEst.estabelecimento = item.estabelecimento
                    AND filCabEst.ativo = 1))
                AND (filtroCab.filtrarUfs = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUFS filCabUf
                    WHERE filCabUf.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUf.uf =
                      CASE
                        WHEN item.munPess_uf = ' '
                          OR item.munPess_uf = '  '
                        THEN item.munEst_uf
                        ELSE item.munPess_uf
                      END
                    AND filCabUf.ativo = 1))
                AND (filtroCab.filtrarPessoas = 0
                  OR EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPESSOAS filCabPess
                    WHERE filCabPess.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPess.pessoa = 0
                    AND filCabPess.ativo = 1))
                AND (filtroCab.filtrarPerfisUsuario = 0
                  AND filtroCab.filtrarUsuarios = 0
                  OR filtroCab.filtrarPerfisUsuario = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
                    WHERE filCabPerfUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabPerfUs.perfilUsuario = p_sys_perfilUsuarioLogado
                    AND filCabPerfUs.ativo = 1)
                  OR filtroCab.filtrarUsuarios = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROCABECXUSUARIOS filCabUs
                    WHERE filCabUs.filtroCabecalho = regra.filtroCabecalho
                    AND filCabUs.usuario = p_sys_usuarioLogado
                    AND filCabUs.ativo = 1))
                AND filtroCab.indicadorPessoa = ' '
                AND (filtroCab.colaborador = ' '
                  OR filtroCab.colaborador = 'N'))
              AND (regra.filtroProduto = 0
                OR filtroProd.filtrarVendedores = 0
                AND filtroProd.filtrarLocaisEstoque = 0
                AND (filtroProd.filtrarProdutos = 0
                  AND filtroProd.filtrarCategoriasProdutos = 0
                  AND filtroProd.filtrarSubcategoriasProdutos = 0
                  AND filtroProd.filtrarMarcas = 0
                  AND filtroProd.filtrarCaracteristicasA = 0
                  AND filtroProd.filtrarCaracteristicasB = 0
                  AND filtroProd.filtrarCaracteristicasC = 0
                  AND filtroProd.filtrarCaracteristicasD = 0
                  AND filtroProd.filtrarCaracteristicasE = 0
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND filtroProd.filtrarNCMs = 0
                  AND filtroProd.filtrarListasServicos = 0
                  OR filtroProd.filtrarProdutos = 1
                  AND EXISTS (
                    SELECT 1
                    FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
                    WHERE filtroProdXProd.filtroProduto = regra.filtroProduto
                    AND filtroProdXProd.produto = item.produto
                    AND filtroProdXProd.ativo = 1)
                  OR (filtroProd.filtrarCategoriasProdutos = 1
                    OR filtroProd.filtrarSubcategoriasProdutos = 1
                    OR filtroProd.filtrarMarcas = 1
                    OR filtroProd.filtrarCaracteristicasA = 1
                    OR filtroProd.filtrarCaracteristicasB = 1
                    OR filtroProd.filtrarCaracteristicasC = 1
                    OR filtroProd.filtrarCaracteristicasD = 1
                    OR filtroProd.filtrarCaracteristicasE = 1
                    OR filtroProd.filtrarCores = 1
                    OR filtroProd.filtrarTamanhos = 1
                    OR filtroProd.filtrarNCMs = 1
                    OR filtroProd.filtrarListasServicos = 1)
                  AND (filtroProd.filtrarCategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCATEGPROD filtroProdXCatProd
                      WHERE filtroProdXCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXCatProd.categoriaProduto = item.categoriaProduto
                      AND filtroProdXCatProd.ativo = 1))
                  AND (filtroProd.filtrarSubcategoriasProdutos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXSUBCAPROD filtroProdXSubCatProd
                      WHERE filtroProdXSubCatProd.filtroProduto = regra.filtroProduto
                      AND filtroProdXSubCatProd.subcategoriaProduto = item.subcategoriaProduto
                      AND filtroProdXSubCatProd.ativo = 1))
                  AND (filtroProd.filtrarMarcas = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXMARCAS filtroProdXMarc
                      WHERE filtroProdXMarc.filtroProduto = regra.filtroProduto
                      AND filtroProdXMarc.marca = item.marca
                      AND filtroProdXMarc.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasA = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERA filtroProdXCarA
                      WHERE filtroProdXCarA.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarA.caracteristicaA = item.caracteristicaA
                      AND filtroProdXCarA.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasB = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERB filtroProdXCarB
                      WHERE filtroProdXCarB.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarB.caracteristicaB = item.caracteristicaB
                      AND filtroProdXCarB.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasC = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERC filtroProdXCarC
                      WHERE filtroProdXCarC.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarC.caracteristicaC = item.caracteristicaC
                      AND filtroProdXCarC.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasD = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERD filtroProdXCarD
                      WHERE filtroProdXCarD.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarD.caracteristicaD = item.caracteristicaD
                      AND filtroProdXCarD.ativo = 1))
                  AND (filtroProd.filtrarCaracteristicasE = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXCARACTERE filtroProdXCarE
                      WHERE filtroProdXCarE.filtroProduto = regra.filtroProduto
                      AND filtroProdXCarE.caracteristicaE = item.caracteristicaE
                      AND filtroProdXCarE.ativo = 1))
                  AND filtroProd.filtrarCores = 0
                  AND filtroProd.filtrarTamanhos = 0
                  AND (filtroProd.filtrarNCMs = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXNCMS filtroProdXNcms
                      WHERE filtroProdXNcms.filtroProduto = regra.filtroProduto
                      AND filtroProdXNcms.idNcm = item.idNcm
                      AND filtroProdXNcms.ativo = 1))
                  AND (filtroProd.filtrarListasServicos = 0
                    OR EXISTS (
                      SELECT 1
                      FROM PAFILTROPRODUTOXLISTASSE filtroProdXListServ
                      WHERE filtroProdXListServ.filtroProduto = regra.filtroProduto
                      AND filtroProdXListServ.listaServicos = item.listaServicos
                      AND filtroProdXListServ.ativo = 1))))) cenXInc
            WHERE cenXInc.ordenacao = 1;
          END IF;
          v_valorImpostos := v_valorImpostos + ROUND (
            CASE cenXInc.origemDado
              WHEN 'P'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * cenXInc.percentual / 100
                + item.quantidade
                * cenXInc.valor
              WHEN 'R'
              THEN (item.valorLiquidoItem
                - item.valorFreteItem
                - item.valorSeguroItem
                - item.valorFreteGeral
                - item.valorSeguroGeral
                - item.valorAdicFreteMarinhaMerTotal
                - item.valorDespesasAduaneirasTotal)
                * v_percentualRegra / 100
                + item.quantidade
                * v_valorRegra
              WHEN 'D'
              THEN
                CASE cenXInc.incidenciaFormacaoPreco
                  WHEN 2001 THEN item.valorICMS
                  WHEN 2002 THEN item.valorPIS + item.valorPISST
                  WHEN 2003 THEN item.valorCOFINS + item.valorCOFINSST
                  WHEN 2004 THEN item.valorICMSST
                  WHEN 2005 THEN item.valorIPI
                  WHEN 2006 THEN item.valorICMSUFDestinatario + item.valorICMSUFRemetente
                  WHEN 2007 THEN item.valorII
                  WHEN 2008 THEN CASE WHEN item.retidoISSQN = 0 THEN item.valorISSQN ELSE 0 END
                  WHEN 2009 THEN CASE WHEN item.retidoISSQN = 1 THEN item.valorISSQN ELSE 0 END
                  WHEN 2010 THEN item.valorRetIRRF
                  WHEN 2011 THEN item.valorRetINSS
                  WHEN 2012 THEN item.valorRetPIS
                  WHEN 2013 THEN item.valorRetCOFINS
                  WHEN 2014 THEN item.valorRetIRRF
                  WHEN 2015 THEN item.valorRetCSLL
                  ELSE 0
                END
              ELSE 0
            END *
            CASE cenXInc.somaDiminuiIgnora
              WHEN 'S'
              THEN -1
              WHEN 'D'
              THEN +1
              ELSE 0
            END, 2);
        END LOOP;
      ELSE
        v_valorImpostos :=
          item.valorII
          + item.valorIOF
          + item.valorIPI
          + item.valorPIS
          + item.valorPISST
          + item.valorCOFINS
          + item.valorCOFINSST
          + item.valorCreditoSimplesNacional
          + item.valorICMSOperacao
          + item.valorICMSDiferido
          + item.valorICMS
          + item.valorICMSDesoneracao
          + item.valorICMSST
          + item.valorICMSUFDestinatario
          + item.valorICMSUFRemetente
          + item.valorFCP
          + item.valorFCPST
          + item.valorFCPSTAnteriormente
          + item.valorFCPUFDestinatario;
      END IF;
    END IF;
  END LOOP;
  RETURN v_valorImpostos;
END;

/

DROP FUNCTION FUNC_ADD_BUSCA_IMPOSTOS_MARGEM;

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 VARCHAR,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_DocFiscal_PreDocum_Orcamento IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_item_id                      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_valorLiquidoItem        IN NUMBER,
  r_valorCaptacao                OUT NUMBER,
  r_valorImpostos                OUT NUMBER,
  r_precoCusto                   OUT NUMBER)
IS
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             VARCHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_idAvaliaMargemProduto        NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR(10);
BEGIN
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO (
    p_cab_prazoMedioPonderado,
    p_regMarg_taxaCapitacaoCustoFi,
    (p_item_valorLiquidoItem
      - p_item_valorFreteItem
      - p_item_valorSeguroItem
      - p_item_valorFreteGeral
      - p_item_valorSeguroGeral
      - p_item_valorAdicFreteMarTotal
      - p_item_valorDespesasAduanTotal));
  r_valorImpostos := 0;
  IF p_regMarg_reduzirImpostos = 1 THEN
    IF p_DocFiscal_PreDocum_Orcamento = 'D' THEN
      r_valorImpostos := FUNC_ADD_DOC_FISC_IMPOSTO_MARG (
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_item_id);
    ELSIF p_DocFiscal_PreDocum_Orcamento = 'P' THEN
      r_valorImpostos := FUNC_ADD_PRE_DOC_IMPOSTO_MARG (
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_item_id);
    ELSIF p_DocFiscal_PreDocum_Orcamento = 'O' THEN
      r_valorImpostos := FUNC_ADD_ORCAMENT_IMPOSTO_MARG (
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_item_id);
    ELSE
      r_valorImpostos := 0;
    END IF;
  END IF;
  IF p_regMarg_tipoPreco = 'F' THEN
    IF p_DocFiscal_PreDocum_Orcamento = 'D' THEN
      SELECT COALESCE (MAX (avalMarg.idAvaliaMargemProduto), 0)
      INTO v_idAvaliaMargemProduto
      FROM MOAVALIAMARGEMPRODXDOCFISC avalMarg
      WHERE avalMarg.idItemDocFiscal = p_item_id;
    ELSIF p_DocFiscal_PreDocum_Orcamento = 'P' THEN
      SELECT COALESCE (MAX (avalMarg.idAvaliaMargemProduto), 0)
      INTO v_idAvaliaMargemProduto
      FROM MOAVALIAMARGEMPRODXPREDOC avalMarg
      WHERE avalMarg.idItemPreDocumento = p_item_id;
    ELSIF p_DocFiscal_PreDocum_Orcamento = 'O' THEN
      SELECT COALESCE (MAX (avalMarg.idAvaliaMargemProduto), 0)
      INTO v_idAvaliaMargemProduto
      FROM MOAVALIAMARGEMPRODXORCAM avalMarg
      WHERE avalMarg.idItemOrcamento = p_item_id;
    ELSE
      v_idAvaliaMargemProduto := 0;
    END IF;
  ELSE
    v_idAvaliaMargemProduto := 0;
  END IF;
  IF v_idAvaliaMargemProduto > 0 THEN
    SELECT COALESCE (MAX (avalMarg.precoCusto), 0)
    INTO r_precoCusto
    FROM MOAVALIAMARGENSPRODUTOS avalMarg
    WHERE avalMarg.idAvaliaMargemProduto = v_idAvaliaMargemProduto;
  ELSE
    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);
  END IF;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_TEMPMARGEMCONTRIB_GRAVA (
  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_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_contadorSessaoTEMPMARGEMCONT IN NUMBER,
  p_DocFiscal_PreDocum_Orcamento IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_item_id                      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_valorLiquidoItem        IN NUMBER)
IS
  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
  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_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_DocFiscal_PreDocum_Orcamento,
    p_cab_estabelecimento,
    p_cab_dataEmissao,
    p_cab_prazoMedioPonderado,
    p_munEndEst_uf,
    p_item_id,
    p_item_gradeProduto,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_quantidade,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorLiquidoItem,
    v_item_valorCaptacao,
    v_item_valorImpostos,
    v_item_precoCusto);
  v_item_valorLiquidoSemFreteSeg :=
    p_item_valorLiquidoItem
    - p_item_valorFreteItem
    - p_item_valorSeguroItem
    - p_item_valorFreteGeral
    - p_item_valorSeguroGeral
    - p_item_valorAdicFreteMarTotal
    - p_item_valorDespesasAduanTotal;
  v_item_valorCusto := ROUND ((p_item_quantidade * v_item_precoCusto), 2);  
  v_item_valorMargem := v_item_valorLiquidoSemFreteSeg
    - v_item_valorCaptacao
    - v_item_valorImpostos
    - v_item_valorCusto;
  v_item_percentualMargem :=
    CASE
      WHEN v_item_valorLiquidoSemFreteSeg = 0
      THEN 0
      WHEN ROUND ((100 * v_item_valorMargem / v_item_valorLiquidoSemFreteSeg), 8) > 9999999.99999999
      THEN 9999999.99999999
      WHEN ROUND ((100 * v_item_valorMargem / v_item_valorLiquidoSemFreteSeg), 8) < -9999999.99999999
      THEN -9999999.99999999
      ELSE ROUND ((100 * v_item_valorMargem / v_item_valorLiquidoSemFreteSeg), 8)
    END;
  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;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      p_DocFiscal_PreDocum_Orcamento orcamentoPredocumentoDocumento,
      p_contadorSessaoTEMPMARGEMCONT contadorSessao,
      p_item_id                      id,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      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.contadorSessao = b.contadorSessao
      AND a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    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,
    contadorSessao,
    id,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.id,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
END ADD_TEMPMARGEMCONTRIB_GRAVA;

/

create or replace FUNCTION FUNC_ADD_LINK_PAGAMENTO_JSON (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_docFis_PreD_Orc_Efef_Fin_Bai IN CHAR,
  p_estabelecimento              IN NUMBER,
  p_transacaoLinkPagamento       IN VARCHAR,
  p_pedidoLinkPagamento          IN VARCHAR,
  p_condicaoPagamento            IN NUMBER,
  p_baixa_atraso                 IN NUMBER,
  p_valorLiquido                 IN NUMBER)
  RETURN CLOB
IS
  v_json                 CLOB;
  v_categoriaAnterior    VARCHAR (30);
  v_categoria            VARCHAR (30);
  v_subCategoriaAnterior VARCHAR (30);
  v_subCategoria         VARCHAR (30);
  v_nomeCampo            VARCHAR (30);
BEGIN
  v_json := '{';
  FOR estXLink IN (
    SELECT
      chaveEstabLinkPag,
      codigoEstabLinkPag,
      nomeEstabLinkPag,
      mccEstabLinkPag,
      subadquirenteEstabLinkPag
    FROM PAESTABELECIMENTOXLINKPAG
    WHERE estabelecimento = p_estabelecimento)
  LOOP
    v_json := v_json || '
    "merchant_id": "' || estXLink.codigoEstabLinkPag || '",
    "merchant_key": "' || estXLink.chaveEstabLinkPag || '",';
    IF estXLink.nomeEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "soft_descriptor": "' || estXLink.nomeEstabLinkPag || '",';
    END IF;
    IF estXLink.mccEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "mcc": "' || estXLink.mccEstabLinkPag || '",';
    END IF;
    IF estXLink.subadquirenteEstabLinkPag <> ' ' THEN
      v_json := v_json || '
    "subacquirer_merchant_id": "' || estXLink.subadquirenteEstabLinkPag || '",';
    END IF;
  END LOOP;
  IF p_transacaoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "merchant_usn": "' || p_transacaoLinkPagamento || '",';
  END IF;
  IF p_pedidoLinkPagamento <> ' ' THEN
    v_json := v_json || '
    "order_id": "' || p_pedidoLinkPagamento || '",';
  END IF;
  v_json := v_json || '
    "amount": "' || REPLACE (REPLACE (TO_CHAR (p_valorLiquido, 'FM9999999999990D00'), ',', ''), '.', '') || '"';
  FOR regraLink IN (
    SELECT
      regraLink.idRegraLinkPagamento
    FROM (
      SELECT
        regraLink.idRegraLinkPagamento,
        ROW_NUMBER() OVER (
          ORDER BY
            regraLink.ordenacao,
            regraLink.condicaoPagamento,
            regraLink.usuario,
            regraLink.perfilUsuario,
            regraLink.estabelecimento,
            regraLink.atrasoDe,
            regraLink.atrasoAte,
            regraLink.idRegraLinkPagamento) ordenacao
      FROM PAREGRASLINKPAGAMENTO regraLink
      WHERE regraLink.idRegraLinkPagamento > 0
      AND regraLink.ativo = 1
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai = 'B'
        OR regraLink.validoVenda = 1)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.validoRecebimento = 1)
      AND (regraLink.condicaoPagamento = 0
        OR regraLink.condicaoPagamento = p_condicaoPagamento)
      AND (regraLink.usuario = 0
        OR regraLink.usuario = p_sys_usuarioLogado)
      AND (regraLink.perfilUsuario = 0
        OR regraLink.perfilUsuario = p_sys_perfilUsuarioLogado)
      AND (regraLink.estabelecimento = 0
        OR regraLink.estabelecimento = p_estabelecimento)
      AND (p_docFis_PreD_Orc_Efef_Fin_Bai <> 'B'
        OR regraLink.atrasoDe <= p_baixa_atraso
        AND regraLink.atrasoAte >= p_baixa_atraso)) regraLink
    WHERE regraLink.ordenacao = 1)
  LOOP
    v_categoriaAnterior    := ' ';
    v_categoria            := ' ';
    v_subCategoriaAnterior := ' ';
    v_subCategoria         := ' ';
    v_nomeCampo            := ' ';
    FOR campRegr IN (
      SELECT
        campRegr.campoLinkPagamento,
        campRegr.descricao,
        campRegr.conteudo
      FROM (
        SELECT
          100 campoLinkPagamento,
          'payment_link' descricao,
          'true' conteudo
        FROM DUAL
        UNION ALL
        SELECT
          campRegr.campoLinkPagamento,
          campLink.descricao,
          campRegr.conteudo
        FROM PAREGRALINKPAGAMXCAMPOS campRegr
        JOIN SICAMPOSLINKPAGAMENTO campLink
        ON campLink.campoLinkPagamento = campRegr.campoLinkPagamento
        WHERE campRegr.idRegraLinkPagamento = regraLink.idRegraLinkPagamento) campRegr
      ORDER BY
        campRegr.campoLinkPagamento,
        campRegr.conteudo)
    LOOP
      IF INSTR (campRegr.descricao, '\') > 0 THEN
        v_categoria := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 1));
        IF INSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '\') > 0 THEN
          v_subCategoria := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 1));
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (SUBSTR (campRegr.descricao, INSTR (campRegr.descricao, '\') + 1, 60), '[^\]+', 1, 2));
        ELSE
          v_subCategoria := ' ';
          v_nomeCampo    := TRIM (REGEXP_SUBSTR (campRegr.descricao, '[^\]+', 1, 2));
        END IF;
      ELSE
        v_categoria    := ' ';
        v_subCategoria := ' ';
        v_nomeCampo    := campRegr.descricao;
      END IF;
      IF v_categoriaAnterior <> v_categoria THEN
        IF v_categoriaAnterior <> ' ' THEN
          IF v_subCategoriaAnterior <> ' ' THEN
            v_json := v_json || '
        ]';
          END IF;
          v_json := v_json || '
    },';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_categoria <> ' ' THEN
          v_json := v_json || '
    "' || v_categoria || '": {';
          IF v_subCategoria <> ' ' THEN
          v_json := v_json || '
        "' || v_subCategoria || '":[';
          END IF;
        END IF;
      ELSIF v_subCategoriaAnterior <> v_subCategoria THEN
        IF v_subCategoriaAnterior <> ' ' THEN
          v_json := v_json || '
        ],';
        ELSE
          v_json := v_json || ',';
        END IF;
        IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
        "' || v_subCategoria || '":[';
        END IF;
      END IF;
      IF v_categoria = v_categoriaAnterior AND v_subCategoria = v_subCategoriaAnterior THEN
        v_json := v_json || ',';
      END IF;
      IF v_subCategoria <> ' ' THEN
        v_json := v_json || '
            {"' || v_nomeCampo || '": "' || campRegr.conteudo || '"}';
      ELSIF v_categoria <> ' ' THEN
        v_json := v_json || '
        "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      ELSE
        v_json := v_json || '
    "' || v_nomeCampo || '": "' || campRegr.conteudo || '"';
      END IF;
    v_categoriaAnterior    := v_categoria;
    v_subCategoriaAnterior := v_subCategoria;
    END LOOP;
    IF v_subCategoria <> ' ' THEN
      v_json := v_json || '
        ]';
    END IF;
    IF v_categoria <> ' ' THEN
      v_json := v_json || '
    }';
    END IF;
  END LOOP;
  v_json := v_json || '
}';
  RETURN v_json;
END;

/

create or replace PROCEDURE ADD_LINKPAG_SITUACAO_TROCA (
  p_sessaoClient                 IN VARCHAR,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_195_umReciboParaCadaR IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_226_baixarFinEstabOri IN NUMBER,
  p_config_349_prazoValidadePont IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_436_modFinLinkPagamen IN NUMBER,
  p_config_441_etapaOrcamLinkPag IN NUMBER,
  p_config_442_etapaOrSerLinkPag IN NUMBER,
  p_idLinkPagamento              IN NUMBER,
  p_situacaoLinkPagamento        IN CHAR,
  p_observacoes                  IN VARCHAR)
IS
  v_contadorSessaoTEMPRECEBIMENT NUMBER;
  v_contadorSessaoTEMPPAGAMENTOS NUMBER;
  v_contadorSessaoTEMPPARCELAS   NUMBER;
  v_contadorSessaoTEMPSELECIONAD NUMBER;
  v_sessaoCaixa                  NUMBER;
  v_fatoContabil                 NUMBER;
  v_dataAtual                    DATE;
  v_idFinanceiroAdiantamento     NUMBER;
  v_parc_contador                NUMBER;
  v_parc_valorJurosDeMora        NUMBER;
  v_parc_valorMulta              NUMBER;
  v_parc_valorLiquido            NUMBER;
  v_2_contratosCompra            CLOB;
  v_3_contratosCompra            CLOB;
  v_23_idsFinanceiro             CLOB;
  v_29_contratosCompra           CLOB;
  v_36_contratosCompra           CLOB;
  v_46_idsFinanceiro             CLOB;
  v_auxNumber                    NUMBER;
BEGIN
  v_contadorSessaoTEMPRECEBIMENT := 1;
  v_contadorSessaoTEMPPAGAMENTOS := 1;
  v_contadorSessaoTEMPPARCELAS   := 1;
  v_contadorSessaoTEMPSELECIONAD := 1;
  v_sessaoCaixa                  := 0;
  v_fatoContabil                 := 0;
  v_dataAtual                    := SYSDATE;
  v_2_contratosCompra            := ' ';
  v_3_contratosCompra            := ' ';
  v_23_idsFinanceiro             := ' ';
  v_29_contratosCompra           := ' ';
  v_36_contratosCompra           := ' ';
  v_46_idsFinanceiro             := ' ';
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
  FOR linkPag IN (
    SELECT
      linkPag.idLinkPagamento,
      linkPag.estabelecimento,
      linkPag.pedidoLinkPagamento,
      linkPag.complemento,
      linkPag.cobranca,
      linkPag.carteiraFinanceira,
      linkPag.valorJurosTotal,
      linkPag.valorMultaTotal,
      linkPag.valorDescontoInformado,
      linkPag.valorAcrescimoInformado,
      linkPag.valor,
      linkPag.idFinanceiroAdiantamento,
      est.pessoaEstabelecimento est_pessoaEstabelecimento
    FROM MOLINKSPAGAMENTO linkPag
    JOIN PAESTABELECIMENTOS est
    ON linkPag.estabelecimento = est.estabelecimento
    WHERE linkPag.idLinkPagamento = p_idLinkPagamento)
  LOOP
    v_idFinanceiroAdiantamento := linkPag.idFinanceiroAdiantamento;
    -- SUCESSO
    IF p_situacaoLinkPagamento = 'S' THEN
      -- GERA CRÉDITO
      IF linkPag.idFinanceiroAdiantamento = 0
        AND p_config_436_modFinLinkPagamen <> 0
      THEN
        FOR modDoc IN (
          SELECT
            modDoc.operacaoFinanceira,
            modDoc.meioPagamento,
            modDoc.contaFinanceira,
            modDoc.carteiraFinanceira,
            modDoc.pessoa,
            modDoc.diasSomarData,
            modDoc.prazoPadrao,
            opFin.pagamentoRecebimento
          FROM PAMODELOSFINANCEIRO modDoc
          JOIN SIOPERACOESFINANCEIRAS opFin
          ON opFin.operacaoFinanceira = modDoc.operacaoFinanceira
          WHERE modDoc.modeloFinanceiro = p_config_436_modFinLinkPagamen)
        LOOP
          ADD_FATO_CONTABIL_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_fatoContabil,
            CASE
              WHEN p_config_226_baixarFinEstabOri = 1
              THEN linkPag.estabelecimento
              ELSE p_sys_estabelecimentoAtivo
            END, -- p_estabelecimento
            v_dataAtual,
            'A', -- p_situacaoContabilizacao
            v_fatoContabil);
          ADD_FINANC_ATUALIZA (
            p_sys_estabelecimentoAtivo,
            p_config_349_prazoValidadePont,
            p_config_354_estabProximoId,
            0, -- p_financ_idFinanceiro,
            v_sessaoCaixa,
            v_fatoContabil,
            linkPag.estabelecimento,
            v_dataAtual, -- p_financ_data
            v_dataAtual, -- p_financ_dataEmissao
            modDoc.prazoPadrao, -- p_financ_prazoPadrao,
            modDoc.prazoPadrao, -- p_financ_prazo,
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimento
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_vencimentoNegociado
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_financ_naoCobrarJurosMultaAt
            modDoc.contaFinanceira,
            modDoc.pagamentoRecebimento,
            modDoc.operacaoFinanceira,
            linkPag.complemento, -- p_financ_complemento
            0, -- p_financ_contratoCompra
            0, -- p_financ_idPagamentoPreDocumen
            0, -- p_financ_idPagamentoDocFiscal
            linkPag.pedidoLinkPagamento, -- p_financ_documento
            linkPag.pedidoLinkPagamento, -- p_financ_fatura
            1, -- p_financ_parcelaAtual
            1, -- p_financ_parcelasTotais
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_pessoa
            0, -- p_financ_autorizadoPessoa
            CASE
              WHEN linkPag.cobranca > 0
              THEN linkPag.cobranca
              WHEN modDoc.pessoa > 0
              THEN modDoc.pessoa
              ELSE linkPag.est_pessoaEstabelecimento
            END, -- p_financ_cobranca
            modDoc.meioPagamento,
            modDoc.carteiraFinanceira,
            linkPag.valor, -- p_financ_valor
            0, -- p_financ_valorDesconto
            0, -- p_financ_valorAcrescimo
            linkPag.valor, -- p_financ_saldo
            ' ', -- p_financ_indexador
            0, -- p_financ_cotacao
            0, -- p_financ_valorIndexado
            0, -- p_financ_saldoIndexado
            0, -- p_financ_efetivado
            0, -- p_financ_tarifaDescontoAteVenc
            'S', -- p_financ_tipoPagamentoAntecipa
            0, -- p_financ_tarifaMensalDescontoA
            'S', -- p_financ_tipoJuroDeMora
            0, -- p_financ_tarifaMensalJuroDeMor
            0, -- p_financ_tarifaMulta
            0, -- p_financ_valorFixoMulta
            0, -- p_financ_desconsiderarSPC
            '   ', -- b_boleto_banco
            ' ', -- b_boleto_nossoNumero
            ' ', -- b_boleto_linhaDigitavelBoleto
            ' ', -- b_boleto_codigoBarrasBoleto
            ' ', -- b_boleto_contratoCobrancaBolet
            0, -- b_boleto_boletoImpresso
            0, -- b_boleto_remessaEnviada
            0, -- b_boleto_retornoProcessado
            0, -- p_cartao_credenciadoraCartao
            0, -- p_cartao_bandeiraCartaoDebCred
            ' ', -- p_cartao_transacaoCartaoNSU
            ' ', -- p_cartao_autorizacaoCartao
            0, -- p_cartao_tarifaCartao
            0, -- p_cartao_valorTarifaCartao
            ' ', -- p_cartaoProprio_cartaoProprio
            ' ', -- p_cheque_compensacao
            '   ', -- p_cheque_banco
            ' ', -- p_cheque_agenciaBanco
            0, -- p_cheque_c1
            ' ', -- p_cheque_contaBanco
            0, -- p_cheque_c2
            0, -- p_cheque_cheque
            0, -- p_cheque_c3
            TRUNC (v_dataAtual) + modDoc.prazoPadrao, -- p_cheque_bomPara
            ' ', -- p_cheque_indicadorPessoa
            ' ', -- p_cheque_titular
            ' ', -- p_cheque_indicadorDocumentoPes
            ' ', -- p_cheque_cnpjCpfIdEstrangeiro
            ' ', -- p_cheque_fone
            NULL, -- p_cheque_desde
            ' ', -- p_cheque_autenticacao
            1, -- p_cheque_statusCheque
            NULL, -- p_cheque_dataPrimeiroDeposito
            NULL, -- p_cheque_dataCompensacaoDevolu
            NULL, -- p_cheque_dataSegundoDeposito
            NULL, -- p_cheque_dataSegundaComponsaca
            0, -- p_cheque_indicadorFone
            0, -- p_cheque_operadoraTelefonia
            ' ', -- p_cheque_observacoesFone
            0, -- p_pix_salvar
            '   ', -- p_pix_banco
            ' ', -- p_pix_txIdPix
            ' ', -- p_pix_locationPix
            ' ', -- p_pix_chavePix
            ' ', -- p_pix_qrCode
            NULL, -- p_pix_dataCriacao
            ' ', -- p_pix_timezoneCriacao
            0, -- p_pix_segundosExpiracao
            ' ', -- p_pix_nomeRazaoSocial
            ' ', -- p_pix_cnpjCpfIdEstrangeiro
            ' ', -- p_pix_statusPix
            0, -- p_pix_numeroRevisao
            ' ', -- p_pix_observacoes
            0, -- p_correl_id
            0, -- p_correl_idFinanceiroCorrelato
            CASE
              WHEN modDoc.operacaoFinanceira IN (34,74)
                AND modDoc.meioPagamento NOT IN (30,31,32,33,38,39,40)
              THEN 1
              ELSE 0
            END, -- p_baixaAutomatica
            0, -- p_idFinanceiroAdiantamento
            0, -- p_idPrevisaoFinanceira
            0, -- p_preDocumento
            0, -- p_idDocumentoFiscal 
            v_idFinanceiroAdiantamento,
            v_auxNumber, -- v_financ_saldo
            v_auxNumber, -- v_financ_saldoIndexado
            v_auxNumber, -- v_financ_efetivado
            v_auxNumber, -- v_correl_id
            v_auxNumber); -- v_idBaixaFinanceiroAdiantament
        END LOOP;
        -- Lê Adiantamento para Liquidar parcelas
        FOR adiant IN (
          SELECT
            adiant.idFinanceiro,
            adiant.complemento,
            adiant.documento,
            adiant.meioPagamento,
            adiant.carteiraFinanceira,
            adiant.saldo
          FROM MOFINANCEIROS adiant
          WHERE adiant.idFinanceiro = v_idFinanceiroAdiantamento
          AND adiant.saldo > 0
          AND adiant.efetivado = 0)
        LOOP
          -- Gera Temporário Parcelas
          v_parc_contador         := 0;
          v_parc_valorJurosDeMora := 0;
          v_parc_valorMulta       := 0;
          v_parc_valorLiquido     := 0;
          FOR linkParc IN (
            SELECT
              linkParc.id,
              linkParc.idLinkPagamento,
              linkParc.idFinanceiro,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido,
              financ.pagamentoRecebimento
            FROM MOLINKPAGAMENTOXBAIXAS linkParc
            JOIN MOFINANCEIROS financ
            ON financ.idFinanceiro = linkParc.idFinanceiro
            WHERE linkParc.idLinkPagamento = linkPag.idLinkPagamento
            AND linkParc.idBaixaFinanceiro = 0
            ORDER BY linkParc.id)
          LOOP
            v_parc_contador         := v_parc_contador + 1;
            v_parc_valorJurosDeMora := v_parc_valorJurosDeMora + linkParc.valorJurosDeMora;
            v_parc_valorMulta       := v_parc_valorMulta + linkParc.valorMulta;
            v_parc_valorLiquido     := v_parc_valorLiquido + linkParc.valorLiquido;
            INSERT INTO TEMPRECEBIMENTO (
              sessaoClient,
              contadorSessao,
              origem,
              id,
              ordenacao,
              quebra,
              selecionado,
              legenda,
              pagamentoRecebimento,
              cotacao,
              valor,
              saldo,
              saldoIndexado,
              valorVariacaoIndexador,
              valorJurosDeMora,
              valorMulta,
              valorTarifaCartao,
              valorDescontos,
              valorOutrosAcrescimos,
              valorLiquido)
            VALUES (
              p_sessaoClient,
              v_contadorSessaoTEMPRECEBIMENT,
              'F',
              linkParc.idFinanceiro,
              LPAD (v_parc_contador, 14, '0'),
              LPAD (linkParc.id, 14, '0'),
              1,
              0,
              linkParc.pagamentoRecebimento,
              linkParc.cotacao,
              linkParc.valor,
              linkParc.saldo,
              linkParc.saldoIndexado,
              linkParc.valorVariacaoIndexador,
              linkParc.valorJurosDeMora,
              linkParc.valorMulta,
              linkParc.valorTarifaCartao,
              linkParc.valorDescontos,
              linkParc.valorOutrosAcrescimos,
              linkParc.valorLiquido);
          END LOOP;
          IF v_parc_contador > 0 THEN
            INSERT INTO TEMPSELECAODOCUMENTO (
              sessaoClient,
              nomePublico,
              quebra,
              origem,
              idCabecalho,
              sequencia,
              idItem,
              quebraB,
              linhaA,
              campoA,
              idA,
              idB,
              idC,
              idD,
              valorA,
              simNaoA,
              BLOB)
            VALUES (
              p_sessaoClient,
              'PagamentosRecebimentos',
              ' ',
              ' ',
              0,
              1,
              0,
              ' ',
              adiant.complemento,
              adiant.documento,
              adiant.meioPagamento,
              adiant.carteiraFinanceira,
              adiant.idFinanceiro,
              0,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END,
              0,
              NULL);
            -- Efetua Liquidação
            ADD_FINANC_TEMPRECEBIMENTO_EF (
              p_sessaoClient,
              p_sys_estabelecimentoAtivo,
              p_config_195_umReciboParaCadaR,
              p_config_226_baixarFinEstabOri,
              p_config_349_prazoValidadePont,
              p_config_354_estabProximoId,
              v_contadorSessaoTEMPRECEBIMENT,
              v_contadorSessaoTEMPPAGAMENTOS,
              v_contadorSessaoTEMPPARCELAS,
              v_contadorSessaoTEMPSELECIONAD,
              0, -- p_idNegociacaoDivida
              v_sessaoCaixa,
              v_dataAtual, -- p_dataBaixa
              v_parc_valorJurosDeMora,
              v_parc_valorMulta,
              'R', -- p_confirm_pagamentoRecebimento
              v_parc_valorLiquido,
              linkPag.valorJurosTotal,
              linkPag.valorMultaTotal,
              linkPag.valorDescontoInformado,
              linkPag.valorAcrescimoInformado,
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotal
              CASE
                WHEN adiant.saldo > v_parc_valorLiquido
                THEN v_parc_valorLiquido
                ELSE adiant.saldo
              END, -- p_confirm_valorTotalPago
              0, -- p_confirm_troco_meioPagamento
              0, -- p_confirm_troco_condicaoPagam
              v_auxNumber,
              v_2_contratosCompra,
              v_3_contratosCompra,
              v_23_idsFinanceiro,
              v_29_contratosCompra,
              v_36_contratosCompra,
              v_46_idsFinanceiro);
          END IF;
          FOR tempSel IN (
            SELECT
              tempSel.id idBaixaFinanceiro,
              finXBaix.idFinanceiro
            FROM TEMPSELECIONADOS tempSel
            JOIN MOFINANCEIROXBAIXAS finXBaix
            ON finXBaix.idBaixaFinanceiro = tempSel.id
            WHERE tempSel.sessaoClient = p_sessaoClient
            AND tempSel.contadorSessao = v_contadorSessaoTEMPSELECIONAD
            AND tempSel.id > 0)
          LOOP
            UPDATE MOLINKPAGAMENTOXBAIXAS x
            SET x.idBaixaFinanceiro = tempSel.idBaixaFinanceiro
            WHERE x.idLinkPagamento = linkPag.idLinkPagamento
            AND x.idFinanceiro = tempSel.idFinanceiro
            AND x.idBaixaFinanceiro = 0;
          END LOOP;
        END LOOP;
      END IF;
      FOR orc IN (
        SELECT
          orc.orcamento,
          orc.tipoDocumento,
          orc.etapaOrcamento
        FROM MOLINKPAGAMENTOXORCAMENTO linkXOrc
        JOIN MOORCAMENTOXPAGAMENTOS orcXPag
        ON orcXPag.idPagamentoOrcamento = linkXOrc.idPagamentoOrcamento
        JOIN MOORCAMENTOS orc
        ON orc.orcamento = orcXPag.orcamento
        WHERE linkXOrc.idLinkPagamento = linkPag.idLinkPagamento)
      LOOP
        IF orc.tipoDocumento = 102
          AND p_config_442_etapaOrSerLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_442_etapaOrSerLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_442_etapaOrSerLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        ELSIF (orc.tipoDocumento <> 102
          OR p_config_442_etapaOrSerLinkPag = 0)
          AND p_config_441_etapaOrcamLinkPag <> 0
          AND orc.etapaOrcamento <> p_config_441_etapaOrcamLinkPag
        THEN
          ADD_ORCAMENTO_CAB_ETAPA_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_138_etapOrcEmProcesso,
            p_person_139_etapOrcLiberado,
            p_person_190_modeloFrete,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            orc.orcamento,
            p_sys_usuarioLogado, -- p_usuario
            p_config_441_etapaOrcamLinkPag, -- p_novaEtapaOrcamento
            ' ', -- p_justificativaCancelamento
            0, -- p_cancelandoOrcamento
            0); -- p_colaboradorRespRecebimento
        END IF;
      END LOOP;
    -- CANCELAMENTO
    ELSIF p_situacaoLinkPagamento = 'C' THEN
      -- EXCLUI CRÉDITO
      IF linkPag.idFinanceiroAdiantamento > 0 THEN
        ADD_FINANC_EXCLUI (linkPag.idFinanceiroAdiantamento);
        v_idFinanceiroAdiantamento :=0;
      END IF;
      FOR linkParc IN (
        SELECT linkParc.idBaixaFinanceiro
        FROM MOLINKPAGAMENTOXBAIXAS linkParc
        WHERE linkParc.idLinkPagamento = linkPag.idLinkPagamento
        AND linkParc.idBaixaFinanceiro > 0
        ORDER BY linkParc.idBaixaFinanceiro)
      LOOP
        ADD_FINANC_BAIXA_EXCLUI (linkParc.idBaixaFinanceiro);
      END LOOP;
    END IF;
    UPDATE MOLINKSPAGAMENTO x SET
      x.situacaoLinkPagamento = p_situacaoLinkPagamento,
      x.idFinanceiroAdiantamento = v_idFinanceiroAdiantamento,
      x.observacoes = p_observacoes
    WHERE x.idLinkPagamento = p_idLinkPagamento;
  END LOOP;
  DELETE TEMPRECEBIMENTO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPRECEBIMENT;
  DELETE TEMPPAGAMENTOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPAGAMENTOS;
  DELETE TEMPPARCELAS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPPARCELAS;
  DELETE TEMPSELECIONADOS
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = v_contadorSessaoTEMPSELECIONAD; 
  DELETE TEMPSELECAODOCUMENTO
  WHERE sessaoClient = p_sessaoClient
  AND nomePublico = 'PagamentosRecebimentos';
END ADD_LINKPAG_SITUACAO_TROCA;

/

create or replace PROCEDURE ADD_WS_SITEF_LINK_PAGAMENTO (
  p_conteudo           IN CLOB,
  r_situacaoWebService OUT CHAR,
  r_observacoes        OUT VARCHAR)
IS
  v_rede                       VARCHAR (300);
  v_tipoFinanciamento          VARCHAR (300);
  v_valor                      VARCHAR (300);
  v_binCartao                  VARCHAR (300);
  v_acquirerdId                VARCHAR (300);
  v_nsuesitef                  VARCHAR (300);
  v_parcelas                   VARCHAR (300);
  v_nsu                        VARCHAR (300);
  v_autorizadora               VARCHAR (300);
  v_nit                        VARCHAR (300);
  v_pedido                     VARCHAR (300);
  v_tipoPagamento              VARCHAR (300);
  v_finalCartao                VARCHAR (300);
  v_status                     VARCHAR (300);
  v_idLinkPagamento            NUMBER;
  v_situacaoLinkPagamentoAtual CHAR (1);
  v_situacaoLinkPagamentoNova  CHAR (1);
  v_observacoesLinkPagamento   VARCHAR (4000);
  sessaoClient                 VARCHAR (30);
  sys_usuarioLogado            NUMBER;
  sys_perfilUsuarioLogado      NUMBER;
  sys_estabelecimentoAtivo     NUMBER;
  person_138_etapOrcEmProcesso NUMBER;
  person_139_etapOrcLiberado   NUMBER;
  person_190_modeloFrete       CHAR (1);
  config_195_umReciboParaCadaR NUMBER;
  config_209_filtrarGrupoEcon  NUMBER;
  config_226_baixarFinEstabOri NUMBER;
  config_349_prazoValidadePont NUMBER;
  config_354_estabProximoId    NUMBER;
  config_362_calcCustoPorGrade NUMBER;
  config_378_calcularVolumes   NUMBER;
  config_436_modFinLinkPagamen NUMBER;
  config_441_etapaOrcamLinkPag NUMBER;
  config_442_etapaOrSerLinkPag NUMBER;
BEGIN
  r_situacaoWebService         := 'F';
  r_observacoes                := 'Erro genérico.';
  v_rede                       := ' ';
  v_tipoFinanciamento          := ' ';
  v_valor                      := ' ';
  v_binCartao                  := ' ';
  v_acquirerdId                := ' ';
  v_nsuesitef                  := ' ';
  v_parcelas                   := ' ';
  v_nsu                        := ' ';
  v_autorizadora               := ' ';
  v_nit                        := ' ';
  v_pedido                     := ' ';
  v_tipoPagamento              := ' ';
  v_finalCartao                := ' ';
  v_status                     := ' ';
  v_idLinkPagamento            := 0;
  v_situacaoLinkPagamentoAtual := ' ';
  v_situacaoLinkPagamentoNova  := ' ';
  sessaoClient                 := 'ADD_WS_SITEF_LINK_PAGAMENTO';
  FOR linhas IN (
    SELECT
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 1) AS nomeCampo,
      REGEXP_SUBSTR (REGEXP_SUBSTR (p_conteudo, '[^,]+', 1, LEVEL), '[^":"]+', 1, 2) AS conteudo
    FROM DUAL
    CONNECT BY LEVEL <= REGEXP_COUNT (p_conteudo, ',') + 1)
  LOOP
    IF linhas.nomeCampo = 'rede' THEN
      v_rede := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'tipoFinanciamento' THEN
      v_tipoFinanciamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'valor' THEN
      v_valor := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'binCartao' THEN
      v_binCartao := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'acquirerdId' THEN
      v_acquirerdId := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nsuesitef' THEN
      v_nsuesitef := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'parcelas' THEN
      v_parcelas := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nsu' THEN
      v_nsu := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'autorizadora' THEN
      v_autorizadora := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'nit' THEN
      v_nit := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'pedido' THEN
      v_pedido := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'tipoPagamento' THEN
      v_tipoPagamento := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'finalCartao' THEN
      v_finalCartao := linhas.conteudo;
    ELSIF linhas.nomeCampo = 'status' THEN
      v_status := linhas.conteudo;
    END IF;
  END LOOP;
  IF v_nit <> ' ' THEN
    SELECT
      COALESCE (MAX (idLinkPagamento), 0),
      COALESCE (MAX (situacaoLinkPagamento), ' ')
    INTO
      v_idLinkPagamento,
      v_situacaoLinkPagamentoAtual
    FROM MOLINKSPAGAMENTO
    WHERE nitLinkPagamento = v_nit;
    IF v_idLinkPagamento > 0 THEN
      v_observacoesLinkPagamento := COALESCE (RTRIM (SUBSTR (CAST (p_conteudo AS VARCHAR), 1, 4000)), ' ');
      IF v_status = 'CAN' THEN
        v_situacaoLinkPagamentoNova := 'C';
      ELSIF v_status = 'CON' THEN
        v_situacaoLinkPagamentoNova := 'S';
      ELSIF v_status IN ('NOV', 'PPV', 'PEN', 'AGU', 'RET') THEN
        v_situacaoLinkPagamentoNova := 'A';
      ELSE
        v_situacaoLinkPagamentoNova := 'F';
      END IF;
      IF v_situacaoLinkPagamentoAtual <> 'A'
        AND v_situacaoLinkPagamentoNova <> 'A'
      THEN
        r_situacaoWebService := 'F';
        r_observacoes        := 'Situação Link Pagamento atual (' || v_situacaoLinkPagamentoAtual || ') não pode ser alterada.';
      ELSIF v_situacaoLinkPagamentoNova = 'A' THEN
        UPDATE MOLINKSPAGAMENTO x
        SET x.observacoes = v_observacoesLinkPagamento
        WHERE x.idLinkPagamento = v_idLinkPagamento;
        r_situacaoWebService := 'S';
        r_observacoes        := 'Situação Link Pagamento não alterada.';
      ELSE
        sys_usuarioLogado := 99999999999999;
        SELECT COALESCE (MAX (perfilUsuario), 0)
        INTO sys_perfilUsuarioLogado
        FROM CAUSUARIOS
        WHERE usuario = sys_usuarioLogado;
        SELECT COALESCE (MAX (estabelecimento), 0)
        INTO sys_estabelecimentoAtivo
        FROM MOLINKSPAGAMENTO
        WHERE idLinkPagamento = v_idLinkPagamento;
        person_138_etapOrcEmProcesso := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_PERSON_CONTEUDO (138, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        person_139_etapOrcLiberado   := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_PERSON_CONTEUDO (139, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        person_190_modeloFrete       := COALESCE (FUNC_ADD_BUSCA_PERSON_CONTEUDO (190, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo), ' ');
        config_195_umReciboParaCadaR := CASE WHEN FUNC_ADD_BUSCA_CONFIG (195, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_209_filtrarGrupoEcon  := CASE WHEN FUNC_ADD_BUSCA_CONFIG (209, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_226_baixarFinEstabOri := CASE WHEN FUNC_ADD_BUSCA_CONFIG (226, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_349_prazoValidadePont := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (349, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_354_estabProximoId    := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (354, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_362_calcCustoPorGrade := CASE WHEN FUNC_ADD_BUSCA_CONFIG (362, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_378_calcularVolumes   := CASE WHEN FUNC_ADD_BUSCA_CONFIG (378, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo) = 'S' THEN 1 ELSE 0 END;
        config_436_modFinLinkPagamen := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (436, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_441_etapaOrcamLinkPag := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (441, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        config_442_etapaOrSerLinkPag := COALESCE (TO_NUMBER (FUNC_ADD_BUSCA_CONFIG (442, sys_perfilUsuarioLogado, sys_usuarioLogado, sys_estabelecimentoAtivo)), 0);
        ADD_LINKPAG_SITUACAO_TROCA (
          sessaoClient,
          sys_usuarioLogado,
          sys_estabelecimentoAtivo,
          person_138_etapOrcEmProcesso,
          person_139_etapOrcLiberado,
          person_190_modeloFrete,
          config_195_umReciboParaCadaR,
          config_209_filtrarGrupoEcon,
          config_226_baixarFinEstabOri,
          config_349_prazoValidadePont,
          config_354_estabProximoId,
          config_362_calcCustoPorGrade,
          config_378_calcularVolumes,
          config_436_modFinLinkPagamen,
          config_441_etapaOrcamLinkPag,
          config_442_etapaOrSerLinkPag,
          v_idLinkPagamento,
          v_situacaoLinkPagamentoNova,
          v_observacoesLinkPagamento); -- p_observacoes
        r_situacaoWebService := 'S';
        r_observacoes        := ' ';
      END IF;
    ELSE
      r_situacaoWebService := 'F';
      r_observacoes        := 'Link Pagamento não localizado NIT "' || v_nit || '".';
    END IF;
  ELSE
    r_situacaoWebService := 'F';
    r_observacoes        := 'NIT não localizado.';
  END IF;
END ADD_WS_SITEF_LINK_PAGAMENTO;

/

create or replace PROCEDURE ADD_WEB_SERVICE_REQUIS_PROCESS (
  p_idWebServiceRequisicao IN NUMBER)
IS
  v_situacaoWebService CHAR (1);
  v_observacoes        VARCHAR (4000);
BEGIN
  FOR a IN (
    SELECT
      servicoWebService,
      conteudo
    FROM MOWEBSERVICEREQUISICOES
    WHERE idWebServiceRequisicao = p_idWebServiceRequisicao
    AND situacaoWebService in ('P','F'))
  LOOP
    -- PROCESSA REQUISIÇÃO
    v_situacaoWebService := 'F';
    v_observacoes := 'Serviço não localizado.';
    IF a.servicoWebService = 'SiTefLinkPagamento' THEN
      ADD_WS_SITEF_LINK_PAGAMENTO (
        a.conteudo,
        v_situacaoWebService,
        v_observacoes);
    END IF;
    UPDATE MOWEBSERVICEREQUISICOES SET
      situacaoWebService = v_situacaoWebService,
      observacoes = v_observacoes
    WHERE idWebServiceRequisicao = p_idWebServiceRequisicao;
  END LOOP;
END ADD_WEB_SERVICE_REQUIS_PROCESS;

/

create or replace PROCEDURE ADD_WEB_SERVICE (
  p_servicoWebService IN VARCHAR,
  p_conteudo          IN CLOB)
IS
  sys_estabelecimentoAtivo  NUMBER;
  config_354_estabProximoId NUMBER;
  v_idWebServiceRequisicao  NUMBER;
 PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  -- CRIA REQUISIÇÃO
  sys_estabelecimentoAtivo  := 0;
  config_354_estabProximoId := 0;
  ADD_WEB_SERVICE_REQUIS_GRAVA (
    sys_estabelecimentoAtivo,
    config_354_estabProximoId,
    0, -- p_idWebServiceRequisicao
    SYSDATE, -- p_dataCriacao
    p_servicoWebService,
    'P', -- p_situacaoWebService,
    NULL, -- p_dataProcessamento
    ' ', -- p_observacoes
    p_conteudo,
  v_idWebServiceRequisicao);
  COMMIT;
  -- PROCESSA REQUISIÇÃO
  ADD_WEB_SERVICE_REQUIS_PROCESS (
    v_idWebServiceRequisicao);
  COMMIT;
END ADD_WEB_SERVICE;

/

UPDATE SICONFIGURACOES SET conteudoSugestao = '0' WHERE configuracao IN (441,442);

COMMIT;

UPDATE SICONFIGURACOES SET descricao = 'Ao aprovar link de pagamento, passar a etapa da ordem de serviço para' WHERE configuracao = 442;

COMMIT;

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
  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_gradeProduto                 IN NUMBER,
  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_residuoISSQN                 IN NUMBER,
  p_valorISSQN                   IN NUMBER,
  p_calcularRetencaoIRRF         IN NUMBER,
  p_retencaoIRRF                 IN NUMBER,
  p_baseRetIRRF                  IN NUMBER,
  p_residuoRetIRRF               IN NUMBER,
  p_valorRetIRRF                 IN NUMBER,
  p_calcularRetencaoINSS         IN NUMBER,
  p_retencaoINSS                 IN NUMBER,
  p_baseRetINSS                  IN NUMBER,
  p_residuoRetINSS               IN NUMBER,
  p_valorRetINSS                 IN NUMBER,
  p_calcularRetencaoPIS          IN NUMBER,
  p_retencaoPIS                  IN NUMBER,
  p_baseRetPIS                   IN NUMBER,
  p_residuoRetPIS                IN NUMBER,
  p_valorRetPIS                  IN NUMBER,
  p_calcularRetencaoCOFINS       IN NUMBER,
  p_retencaoCOFINS               IN NUMBER,
  p_baseRetCOFINS                IN NUMBER,
  p_residuoRetCOFINS             IN NUMBER,
  p_valorRetCOFINS               IN NUMBER,
  p_calcularRetencaoCSLL         IN NUMBER,
  p_retencaoCSLL                 IN NUMBER,
  p_baseRetCSLL                  IN NUMBER,
  p_residuoRetCSLL               IN NUMBER,
  p_valorRetCSLL                 IN NUMBER,
  p_calcularRetencaoOutros       IN NUMBER,
  p_retencaoOutros               IN NUMBER,
  p_baseRetOutros                IN NUMBER,
  p_residuoRetOutros             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_prod_tipoProduto             IN CHAR,
  p_prod_precoPautaTabelado      IN NUMBER,
  /* Retornos */
  r_baseISSQN                    OUT NUMBER,
  r_residuoISSQN                 OUT NUMBER,
  r_valorISSQN                   OUT NUMBER,
  r_baseRetIRRF                  OUT NUMBER,
  r_residuoRetIRRF               OUT NUMBER,
  r_valorRetIRRF                 OUT NUMBER,
  r_baseRetINSS                  OUT NUMBER,
  r_residuoRetINSS               OUT NUMBER,
  r_valorRetINSS                 OUT NUMBER,
  r_baseRetPIS                   OUT NUMBER,
  r_residuoRetPIS                OUT NUMBER,
  r_valorRetPIS                  OUT NUMBER,
  r_baseRetCOFINS                OUT NUMBER,
  r_residuoRetCOFINS             OUT NUMBER,
  r_valorRetCOFINS               OUT NUMBER,
  r_baseRetCSLL                  OUT NUMBER,
  r_residuoRetCSLL               OUT NUMBER,
  r_valorRetCSLL                 OUT NUMBER,
  r_baseRetOutros                OUT NUMBER,
  r_residuoRetOutros             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
  r_baseISSQN                   := p_baseISSQN;
  r_residuoISSQN                := p_residuoISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseRetIRRF                 := p_baseRetIRRF;
  r_residuoRetIRRF              := p_residuoRetIRRF;
  r_valorRetIRRF                := p_valorRetIRRF;
  r_baseRetINSS                 := p_baseRetINSS;
  r_residuoRetINSS              := p_residuoRetINSS;
  r_valorRetINSS                := p_valorRetINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_residuoRetPIS               := p_residuoRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_residuoRetCOFINS            := p_residuoRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_residuoRetCSLL              := p_residuoRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseRetOutros               := p_baseRetOutros;
  r_residuoRetOutros            := p_residuoRetOutros;
  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' AND p_aliquotaISSQN > 0 THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 2);
      r_residuoISSQN := (r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN - ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 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) + r_residuoRetIRRF, 2);
      r_residuoRetIRRF := (r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF - ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF, 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) + r_residuoRetINSS, 2);
      r_residuoRetINSS := (r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS - ROUND ((r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS, 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) + r_residuoRetPIS, 2);
      r_residuoRetPIS := (r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS - ROUND ((r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS, 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) + r_residuoRetCOFINS , 2);
      r_residuoRetCOFINS := (r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS - ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS, 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) + r_residuoRetCSLL, 2);
      r_residuoRetCSLL := (r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL - ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL, 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) + r_residuoRetOutros, 2);
      r_residuoRetOutros := (r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros - ROUND ((r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros, 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 = '1'
                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 = '1'
                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 = '1'
                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 = '900' AND p_diferimentoICMS <> 0 OR (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 = '900'
        AND p_diferimentoICMS <> 0
        OR (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 = '1'
                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_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataEntradaSaida,
      p_gradeProduto,
      p_personalizacao,
      p_quantidade,
      p_calcularICMSSTAnterEfetivo,
      p_calcularFCP,
      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 = '1'
                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 = '1'
                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 = '1'
                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 = '1'
                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 = '1'
                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;

/

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 COALESCE (opXMunFato.tributadoForaMunicipio, COALESCE (opXMun.tributadoForaMunicipio, 0)) = 1 THEN COALESCE (opXMunFato.aliquotaISSQN, opXMun.aliquotaISSQN) ELSE opXMun.aliquotaISSQN END), 0) aliquotaISSQN,
      COALESCE ((CASE WHEN COALESCE (opXMunFato.tributadoForaMunicipio, COALESCE (opXMun.tributadoForaMunicipio, 0)) = 1 THEN COALESCE (opXMunFato.retidoISSQN, opXMun.retidoISSQN) ELSE opXMun.retidoISSQN END), 0) retidoISSQN,
      COALESCE (opXMunFato.tributadoForaMunicipio, 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 (2,3,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 r_item_indicadorISSQN NOT IN ('1','2','3','4','5','6','7'))
        AND r_item_stSimplesNacional NOT IN ('300','400')
        AND r_item_stICMS NOT 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 (2,3,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;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_ETAPA_TROCA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_documentoTransferencia    IN NUMBER,
  p_etapaTransferencia        IN NUMBER,
  p_usuario                   IN NUMBER,
  p_motivoCancelamento        IN VARCHAR,
  p_origem                    IN VARCHAR)
IS
  v_situacaoDocTransferenciaOrig CHAR (1);
  v_situacaoDocTransferenciaNovo CHAR (1);
  v_observacoes                  VARCHAR (4000);
  v_auxNumber                    NUMBER;
BEGIN
  SELECT
    etap.situacaoDocTransferencia,
    a.observacoes
  INTO
    v_situacaoDocTransferenciaOrig,
    v_observacoes
  FROM MODOCUMENTOSTRANSFERENCIA a
  JOIN PAETAPASTRANSFERENCIA etap
  ON etap.etapaTransferencia = a.etapaTransferencia
  WHERE a.documentoTransferencia = p_documentoTransferencia;
  SELECT situacaoDocTransferencia
  INTO v_situacaoDocTransferenciaNovo
  FROM PAETAPASTRANSFERENCIA
  WHERE etapaTransferencia = p_etapaTransferencia;
  IF v_observacoes <> ' '
    AND p_motivoCancelamento <> ' '
  THEN
    v_observacoes := RTRIM (SUBSTR (RTRIM (v_observacoes) || ' - ' || p_motivoCancelamento, 1, 4000));
  ELSIF p_motivoCancelamento <> ' ' THEN
    v_observacoes := p_motivoCancelamento;
  END IF;
  IF v_situacaoDocTransferenciaOrig = 'F'
    AND v_situacaoDocTransferenciaNovo <> 'F'
    OR v_situacaoDocTransferenciaOrig <> 'C'
    AND v_situacaoDocTransferenciaNovo = 'C'
  THEN
    FOR a IN (
      SELECT idItemDocTransferencia
      FROM MODOCUMENTOTRANSFXITENS
      WHERE documentoTransferencia = p_documentoTransferencia
      AND cancelado = 0)
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        a.idItemDocTransferencia,
        CASE
          WHEN v_situacaoDocTransferenciaNovo = 'C'
          THEN 'C'
          ELSE 'R'
        END); -- p_cancela_Exclui_Reabre
    END LOOP;
  END IF;
  UPDATE MODOCUMENTOSTRANSFERENCIA SET
    etapaTransferencia = p_etapaTransferencia,
    observacoes = v_observacoes
  WHERE documentoTransferencia = p_documentoTransferencia;
  ADD_DOCTRANSF_CAB_ETAPA_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    0, -- p_id,
    p_documentoTransferencia,
    SYSDATE, -- p_data
    p_usuario,
    p_etapaTransferencia,
    CASE
      WHEN p_origem IS NULL
        OR p_origem = ' '
      THEN ''
      ELSE TRIM(p_origem) || ' - '
    END || 'ADD_DOCTRANSF_CAB_ETAPA_GRAVA',
    v_auxNumber);
  ADD_RESERVA_ESTOQUE_TRA_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_documentoTransferencia);
END ADD_DOCTRANSF_CAB_ETAPA_TROCA;

/

BEGIN
  FOR a IN (
    SELECT item.idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAETAPASTRANSFERENCIA etap
    ON etap.etapaTransferencia = cab.etapaTransferencia
    WHERE item.idItemDocTransferencia > 0
    AND item.documentoTransferencia > 0
    AND item.cancelado = 0
    AND etap.situacaoDocTransferencia = 'C')
  LOOP
    ADD_DOCTRANSF_ITEM_EXCLUI (
      a.idItemDocTransferencia,
      'C'); -- p_cancela_Exclui_Reabre
  END LOOP;
END;

/

create or replace PROCEDURE ADD_FINANC_CARTAO_PROPR_GRAVA (
  p_idFinanceiro  IN NUMBER,
  p_cartaoProprio IN VARCHAR2)
IS
BEGIN
  MERGE INTO MOFINANCEIROXCARTPROPRIO a
  USING (
    SELECT
      p_idFinanceiro  idFinanceiro,
      p_cartaoProprio cartaoProprio
    FROM DUAL) b
  ON (a.idFinanceiro = b.idFinanceiro)
  WHEN MATCHED THEN UPDATE SET
    a.cartaoProprio = b.cartaoProprio
  WHEN NOT MATCHED THEN INSERT (
    idFinanceiro,
    cartaoProprio)
  VALUES (
    b.idFinanceiro,
    b.cartaoProprio);
END ADD_FINANC_CARTAO_PROPR_GRAVA;

/

create or replace FUNCTION FUNC_ADD_GERA_XML_DFE (
  p_idDocumentoFiscal IN NUMBER)
  RETURN CLOB
IS
  v_xml      CLOB;
  v_auxNumer NUMBER;
BEGIN
  v_xml := '<CTe xmlns="http://www.portalfiscal.inf.br/cte">';
  FOR a IN (
    SELECT
      a.modeloDocumentoFiscal,
      a.serieFiscal,
      a.documentoFiscal,
      a.dataEmissao,
      a.timezoneEmissao,
      a.municipioFatoGerador,
      a.tipoCTe,
      a.codigoNumericoNfe,
      a.digitoVerificadorNfe,
      a.formaEmissaoNfe,
      CASE WHEN a.indicadorAmbienteNfe = ' ' THEN '1' ELSE a.indicadorAmbienteNfe END indicadorAmbienteNfe,
      a.chaveNFe,
      a.qrCode,
      a.versaoAplicativo,
      a.valorLiquidoItem,
      a.tomadorCTe,
      a.modalidadeTransporte,
      a.tipoServicoCTe,
      a.municipioOrigem,
      a.retira,
      a.detalhesRetiradaCTe,
      a.produtoPredominanteCTe,
      a.outrasCaracteristicasProdCTe,
      a.unidadeMedidaCTe,
      a.quantidadeCarga,
      a.valorCarga,
      a.cfop,
      a.descricaoLegal,
      a.valorEstimadoImpostos,
      a.descInformacaoComplementar,
      a.fatura,
      unMed.descricao unMed_descricao,
      munOrig.descricao munOrig_descricao,
      munOrig.uf munOrig_uf,
      munFim.descricao munFim_descricao,
      munFim.uf munFim_uf,
      -- Estabelecimento (Emitente)
      COALESCE (estCte.rntrc, ' ') rntrc,
      pessEst.indicadorPessoa pessEst_indicadorPessoa,
      pessEst.cnpjCpfIdEstrangeiro pessEst_cnpjCpfIdEstrangeiro,
      pessEst.inscricaoEstadual pessEst_inscricaoEstadual,
      pessEst.nomeRazaoSocial pessEst_nomeRazaoSocial,
      pessEst.apelidoFantasia pessEst_apelidoFantasia,
      pessEst.regimeTributario pessEst_regimeTributario,
      fonEst.idFonePessoa fonEst_idFonePessoa,
      fonEst.fone fonEst_fone,
      endEst.logradouro endEst_logradouro,
      endEst.numero endEst_numero,
      endEst.complemento endEst_complemento,
      endEst.bairroDistrito endEst_bairroDistrito,
      endEst.municipio endEst_municipio,
      endEst.cep endEst_cep,
      munEst.descricao munEst_descricao,
      munEst.uf munEst_uf,
      ufEst.ufIbge ufEst_ufIbge,
      -- Pessoa (Tomador)
      pess.indicadorPessoa pess_indicadorPessoa,
      pess.cnpjCpfIdEstrangeiro pess_cnpjCpfIdEstrangeiro,
      pess.indicadorInscricaoEstadual pess_indicadorInscricaoEstad,
      pess.inscricaoEstadual pess_inscricaoEstadual,
      pess.nomeRazaoSocial pess_nomeRazaoSocial,
      pess.apelidoFantasia pess_apelidoFantasia,
      fonPess.idFonePessoa fonPess_idFonePessoa,
      fonPess.fone fonPess_fone,
      emailPess.idEmailPessoa emailPess_idEmailPessoa,
      emailPess.email emailPess_email,
      endPess.logradouro endPess_logradouro,
      endPess.numero endPess_numero,
      endPess.complemento endPess_complemento,
      endPess.bairroDistrito endPess_bairroDistrito,
      endPess.municipio endPess_municipio,
      munPess.descricao munPess_descricao,
      endPess.cep endPess_cep,
      munPess.uf munPess_uf,
      paisPess.pais paisPess_pais,
      paisPess.descricao paisPess_descricao,
      -- Remetente
      rem.indicadorPessoa rem_indicadorPessoa,
      rem.cnpjCpfIdEstrangeiro rem_cnpjCpfIdEstrangeiro,
      rem.inscricaoEstadual rem_inscricaoEstadual,
      rem.nomeRazaoSocial rem_nomeRazaoSocial,
      rem.apelidoFantasia rem_apelidoFantasia,
      fonRem.idFonePessoa fonRem_idFonePessoa,
      fonRem.fone fonRem_fone,
      emailRem.idEmailPessoa emailRem_idEmailPessoa,
      emailRem.email emailRem_email,
      endRem.logradouro endRem_logradouro,
      endRem.numero endRem_numero,
      endRem.complemento endRem_complemento,
      endRem.bairroDistrito endRem_bairroDistrito,
      endRem.municipio endRem_municipio,
      munRem.descricao munRem_descricao,
      endRem.cep endRem_cep,
      munRem.uf munRem_uf,
      paisRem.pais paisRem_pais,
      paisRem.descricao paisRem_descricao,
      -- Expedidor
      exp.indicadorPessoa exp_indicadorPessoa,
      exp.cnpjCpfIdEstrangeiro exp_cnpjCpfIdEstrangeiro,
      exp.inscricaoEstadual exp_inscricaoEstadual,
      exp.nomeRazaoSocial exp_nomeRazaoSocial,
      exp.apelidoFantasia exp_apelidoFantasia,
      fonExp.idFonePessoa fonExp_idFonePessoa,
      fonExp.fone fonExp_fone,
      emailExp.idEmailPessoa emailExp_idEmailPessoa,
      emailExp.email emailExp_email,
      endExp.logradouro endExp_logradouro,
      endExp.numero endExp_numero,
      endExp.complemento endExp_complemento,
      endExp.bairroDistrito endExp_bairroDistrito,
      endExp.municipio endExp_municipio,
      munExp.descricao munExp_descricao,
      endExp.cep endExp_cep,
      munExp.uf munExp_uf,
      paisExp.pais paisExp_pais,
      paisExp.descricao paisExp_descricao,
      -- Recebedor
      rec.indicadorPessoa rec_indicadorPessoa,
      rec.cnpjCpfIdEstrangeiro rec_cnpjCpfIdEstrangeiro,
      rec.inscricaoEstadual rec_inscricaoEstadual,
      rec.nomeRazaoSocial rec_nomeRazaoSocial,
      rec.apelidoFantasia rec_apelidoFantasia,
      fonRec.idFonePessoa fonRec_idFonePessoa,
      fonRec.fone fonRec_fone,
      emailRec.idEmailPessoa emailRec_idEmailPessoa,
      emailRec.email emailRec_email,
      endRec.logradouro endRec_logradouro,
      endRec.numero endRec_numero,
      endRec.complemento endRec_complemento,
      endRec.bairroDistrito endRec_bairroDistrito,
      endRec.municipio endRec_municipio,
      munRec.descricao munRec_descricao,
      endRec.cep endRec_cep,
      munRec.uf munRec_uf,
      paisRec.pais paisRec_pais,
      paisRec.descricao paisRec_descricao,
      -- Destinatario
      dest.indicadorPessoa dest_indicadorPessoa,
      dest.cnpjCpfIdEstrangeiro dest_cnpjCpfIdEstrangeiro,
      dest.inscricaoEstadual dest_inscricaoEstadual,
      dest.nomeRazaoSocial dest_nomeRazaoSocial,
      dest.apelidoFantasia dest_apelidoFantasia,
      fonDest.idFonePessoa fonDest_idFonePessoa,
      fonDest.fone fonDest_fone,
      emailDest.idEmailPessoa emailDest_idEmailPessoa,
      emailDest.email emailDest_email,
      endDest.logradouro endDest_logradouro,
      endDest.numero endDest_numero,
      endDest.complemento endDest_complemento,
      endDest.bairroDistrito endDest_bairroDistrito,
      endDest.municipio endDest_municipio,
      munDest.descricao munDest_descricao,
      endDest.cep endDest_cep,
      munDest.uf munDest_uf,
      paisDest.pais paisDest_pais,
      paisDest.descricao paisDest_descricao
    FROM (
      SELECT
        a.estabelecimento,
        a.pessoa,
        a.modeloDocumentoFiscal,
        a.serieFiscal,
        a.documentoFiscal,
        a.dataEmissao,
        a.timezoneEmissao,
        a.municipioFatoGerador,
        a.tipoCTe,
        a.codigoNumericoNfe,
        a.digitoVerificadorNfe,
        a.formaEmissaoNfe,
        a.indicadorAmbienteNfe,
        a.chaveNFe,
        a.qrCode,
        a.versaoAplicativo,
        a.valorLiquidoItem,
        cte.remetente,
        cte.expedidor,
        cte.recebedor,
        cte.destinatario,
        cte.tomadorCTe,
        cte.modalidadeTransporte,
        cte.tipoServicoCTe,
        cte.municipioOrigem,
        cte.retira,
        cte.detalhesRetiradaCTe,
        cte.produtoPredominanteCTe,
        cte.outrasCaracteristicasProdCTe,
        cte.unidadeMedidaCTe,
        cte.quantidadeCarga,
        cte.valorCarga,
        est.pessoaEstabelecimento,
        FUNC_ADD_DOC_FISC_CFOP (a.idDocumentoFiscal) cfop,
        FUNC_ADD_DOC_FISC_DESCR_LEGAL (a.idDocumentoFiscal) descricaoLegal,
        FUNC_ADD_DOC_FISC_VAL_EST_IMP (a.idDocumentoFiscal) valorEstimadoImpostos,
        FUNC_ADD_DOC_FISC_DESCR_COMPL (a.idDocumentoFiscal) descInformacaoComplementar,
        FUNC_ADD_DOC_FISC_FATURA (a.idDocumentoFiscal, a.documentoFiscal) fatura,
        FUNC_ADD_PESSOA_FONE (est.pessoaEstabelecimento) fonEst_idFonePessoa,
        FUNC_ADD_PESSOA_ENDERECO (est.pessoaEstabelecimento) endEst_enderecoPessoa,
        FUNC_ADD_PESSOA_FONE (a.pessoa) fonPess_idFonePessoa,
        FUNC_ADD_PESSOA_EMAIL_SITE (a.pessoa, 1) emailPess_idEmailPessoa,
        FUNC_ADD_PESSOA_ENDERECO (a.pessoa) endPess_enderecoPessoa,
        FUNC_ADD_PESSOA_FONE (cte.remetente) fonRem_idFonePessoa,
        FUNC_ADD_PESSOA_EMAIL_SITE (cte.remetente, 1) emailRem_idEmailPessoa,
        FUNC_ADD_PESSOA_ENDERECO (cte.remetente) endRem_enderecoPessoa,
        FUNC_ADD_PESSOA_FONE (cte.expedidor) fonExp_idFonePessoa,
        FUNC_ADD_PESSOA_EMAIL_SITE (cte.expedidor, 1) emailExp_idEmailPessoa,
        FUNC_ADD_PESSOA_ENDERECO (cte.expedidor) endExp_enderecoPessoa,
        FUNC_ADD_PESSOA_FONE (cte.recebedor) fonRec_idFonePessoa,
        FUNC_ADD_PESSOA_EMAIL_SITE (cte.recebedor, 1) emailRec_idEmailPessoa,
        FUNC_ADD_PESSOA_ENDERECO (cte.recebedor) endRec_enderecoPessoa,
        FUNC_ADD_PESSOA_FONE (cte.destinatario) fonDest_idFonePessoa,
        FUNC_ADD_PESSOA_EMAIL_SITE (cte.destinatario, 1) emailDest_idEmailPessoa,
        FUNC_ADD_PESSOA_ENDERECO (cte.destinatario) endDest_enderecoPessoa
      FROM MODOCUMENTOSFISCAIS a
      JOIN MODOCFISCALXCTE cte
      ON cte.idDocumentoFiscal = a.idDocumentoFiscal
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal) a
    JOIN SIUNIDADESMEDIDACTE unMed
    ON unMed.unidadeMedidaCTe = a.unidadeMedidaCTe
    JOIN SIMUNICIPIOS munOrig
    ON munOrig.municipio = a.municipioOrigem
    JOIN SIMUNICIPIOS munFim
    ON munFim.municipio = a.municipioFatoGerador
    -- Estabelecimento (Emitente)
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    LEFT JOIN PAESTABELECIMENTOXCTE estCte
    ON estCte.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pessEst
    ON pessEst.pessoa = a.pessoaEstabelecimento
    JOIN CAFONESPESSOA fonEst
    ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
    JOIN CAENDERECOSPESSOA endEst
    ON endEst.enderecoPessoa = a.endEst_enderecoPessoa
    JOIN SIMUNICIPIOS munEst
    ON munEst.municipio = endEst.municipio
    JOIN SIUFS ufEst
    ON ufEst.uf = munEst.uf
    -- Pessoa (Tomador)
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    JOIN CAFONESPESSOA fonPess
    ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
    JOIN CAEMAILSPESSOA emailPess
    ON emailPess.idEmailPessoa = a.emailPess_idEmailPessoa
    JOIN CAENDERECOSPESSOA endPess
    ON endPess.enderecoPessoa = a.endPess_enderecoPessoa
    JOIN SIMUNICIPIOS munPess
    ON munPess.municipio = endPess.municipio
    JOIN SIUFS ufPess
    ON ufPess.uf = munPess.uf
    JOIN SIPAISES paisPess
    ON paisPess.pais = CASE WHEN endPess.pais = ' ' THEN '1058' ELSE endPess.pais END
    -- Remetente
    JOIN CAPESSOAS rem
    ON rem.pessoa = a.remetente
    JOIN CAFONESPESSOA fonRem
    ON fonRem.idFonePessoa = a.fonRem_idFonePessoa
    JOIN CAEMAILSPESSOA emailRem
    ON emailRem.idEmailPessoa = a.emailRem_idEmailPessoa
    JOIN CAENDERECOSPESSOA endRem
    ON endRem.enderecoPessoa = a.endRem_enderecoPessoa
    JOIN SIMUNICIPIOS munRem
    ON munRem.municipio = endRem.municipio
    JOIN SIUFS ufRem
    ON ufRem.uf = munRem.uf
    JOIN SIPAISES paisRem
    ON paisRem.pais = CASE WHEN endRem.pais = ' ' THEN '1058' ELSE endRem.pais END
    -- Expedidor
    JOIN CAPESSOAS exp
    ON exp.pessoa = a.expedidor
    JOIN CAFONESPESSOA fonExp
    ON fonExp.idFonePessoa = a.fonExp_idFonePessoa
    JOIN CAEMAILSPESSOA emailExp
    ON emailExp.idEmailPessoa = a.emailExp_idEmailPessoa
    JOIN CAENDERECOSPESSOA endExp
    ON endExp.enderecoPessoa = a.endExp_enderecoPessoa
    JOIN SIMUNICIPIOS munExp
    ON munExp.municipio = endExp.municipio
    JOIN SIUFS ufExp
    ON ufExp.uf = munExp.uf
    JOIN SIPAISES paisExp
    ON paisExp.pais = CASE WHEN endExp.pais = ' ' THEN '1058' ELSE endExp.pais END
    -- Recebedor
    JOIN CAPESSOAS rec
    ON rec.pessoa = a.recebedor
    JOIN CAFONESPESSOA fonRec
    ON fonRec.idFonePessoa = a.fonRec_idFonePessoa
    JOIN CAEMAILSPESSOA emailRec
    ON emailRec.idEmailPessoa = a.emailRec_idEmailPessoa
    JOIN CAENDERECOSPESSOA endRec
    ON endRec.enderecoPessoa = a.endRec_enderecoPessoa
    JOIN SIMUNICIPIOS munRec
    ON munRec.municipio = endRec.municipio
    JOIN SIUFS ufRec
    ON ufRec.uf = munRec.uf
    JOIN SIPAISES paisRec
    ON paisRec.pais = CASE WHEN endRec.pais = ' ' THEN '1058' ELSE endRec.pais END
    -- Destinatario
    JOIN CAPESSOAS dest
    ON dest.pessoa = a.destinatario
    JOIN CAFONESPESSOA fonDest
    ON fonDest.idFonePessoa = a.fonDest_idFonePessoa
    JOIN CAEMAILSPESSOA emailDest
    ON emailDest.idEmailPessoa = a.emailDest_idEmailPessoa
    JOIN CAENDERECOSPESSOA endDest
    ON endDest.enderecoPessoa = a.endDest_enderecoPessoa
    JOIN SIMUNICIPIOS munDest
    ON munDest.municipio = endDest.municipio
    JOIN SIUFS ufDest
    ON ufDest.uf = munDest.uf
    JOIN SIPAISES paisDest
    ON paisDest.pais = CASE WHEN endDest.pais = ' ' THEN '1058' ELSE endDest.pais END)
  LOOP
    v_xml := v_xml
      || '<infCte Id="CTe' || a.chaveNFe || '" versao="4.00">'
        -- IDE
        || '<ide>'
          || '<cUF>' || TO_CHAR (a.ufEst_ufIbge) || '</cUF>'
          || '<cCT>' || LPAD (a.codigoNumericoNfe, 8 , '0') || '</cCT>'
          || '<CFOP>' || TO_CHAR (a.cfop) || '</CFOP>'
          || FUNC_ADD_TAG_XML ('natOp', COALESCE (TRIM (SUBSTR (a.descricaoLegal, 1, 60)), ' '))
          || '<mod>' || a.modeloDocumentoFiscal || '</mod>'
          || '<serie>' || a.serieFiscal || '</serie>'
          || '<nCT>' || TO_CHAR (a.documentoFiscal) || '</nCT>'
          || '<dhEmi>' ||
            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 || a.timezoneEmissao || '</dhEmi>'
          || '<tpImp>' || a.formaEmissaoNfe || '</tpImp>'
          || '<tpEmis>1</tpEmis>'
          || '<cDV>' || TO_CHAR (a.digitoVerificadorNfe) || '</cDV>'
          || '<tpAmb>' || a.indicadorAmbienteNfe || '</tpAmb>'
          || '<tpCTe>' || a.tipoCTe || '</tpCTe>'
          || '<procEmi>0</procEmi>'
          || '<verProc>ADDERI ' || a.versaoAplicativo || '</verProc>'
          || '<cMunEnv>' || TO_CHAR (a.endEst_municipio) || '</cMunEnv>'
          || '<xMunEnv>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munEst_descricao) || '</xMunEnv>'
          || '<UFEnv>' || a.munEst_uf || '</UFEnv>'
          || '<modal>' || a.modalidadeTransporte || '</modal>'
          || '<tpServ>' || a.tipoServicoCTe || '</tpServ>'
          || '<cMunIni>' || TO_CHAR (a.municipioOrigem) || '</cMunIni>'
          || '<xMunIni>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munOrig_descricao) || '</xMunIni>'
          || '<UFIni>' || a.munOrig_uf || '</UFIni>'
          || '<cMunFim>' || TO_CHAR (a.municipioFatoGerador) || '</cMunFim>'
          || '<xMunFim>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munFim_descricao) || '</xMunFim>'
          || '<UFFim>' || a.munFim_uf || '</UFFim>'
          || '<retira>' || CASE WHEN a.retira = 1 THEN '0' ELSE '1' END || '</retira>'
          || CASE WHEN a.retira = 1 THEN FUNC_ADD_TAG_XML ('xDetRetira', a.detalhesRetiradaCTe) ELSE '' END;
    -- Tomador
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('indIEToma', a.pess_indicadorInscricaoEstad)
          || CASE
               WHEN a.tomadorCTe = '4'
               THEN '<toma4>'
            || '<toma>' || a.tomadorCTe || '</toma>'
            || FUNC_ADD_TAG_XML (CASE WHEN a.pess_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
              CASE
                WHEN a.pess_cnpjCpfIdEstrangeiro <> ' '
                THEN a.pess_cnpjCpfIdEstrangeiro
                WHEN a.pess_indicadorPessoa = 'J'
                THEN '00000000000000'
                ELSE '00000000000'
              END)
            || CASE WHEN a.pess_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.pess_inscricaoEstadual || '</IE>' END
            || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.pess_nomeRazaoSocial))
            -- || CASE WHEN a.pess_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.pess_apelidoFantasia)) ELSE '' END
            || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonPess_idFonePessoa = 0 THEN ' ' ELSE a.fonPess_fone END)
            || '<enderToma>'
              || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endPess_logradouro))
              || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endPess_numero))
              -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endPess_complemento))
              || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endPess_bairroDistrito))
              || '<cMun>' || TO_CHAR (a.endPess_municipio) || '</cMun>'
              || '<xMun>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munPess_descricao) || '</xMun>'
              || '<CEP>' || LPAD (a.endPess_cep, 8 , '0') || '</CEP>'
              || '<UF>' || a.munPess_uf || '</UF>'
              || '<cPais>' || a.paisPess_pais || '</cPais>'
              || '<xPais>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.paisPess_descricao) || '</xPais>'
            || '</enderToma>'
            || CASE
                 WHEN a.emailPess_idEmailPessoa = 0 OR a.emailPess_email = ' '
                 THEN ''
                 ELSE '<email>' || a.emailPess_email || '</email>'
               END
          || '</toma4>'
               ELSE '<toma3>'
            || '<toma>' || a.tomadorCTe || '</toma>'
          || '</toma3>'
             END
        || '</ide>';
    -- Emitente
    v_xml := v_xml
        || '<emit>'
          || FUNC_ADD_TAG_XML (CASE WHEN a.pessEst_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
            CASE
              WHEN a.pessEst_cnpjCpfIdEstrangeiro <> ' '
              THEN a.pessEst_cnpjCpfIdEstrangeiro
              WHEN a.pessEst_indicadorPessoa = 'J'
              THEN '00000000000000'
              ELSE '00000000000'
            END)
          || CASE WHEN a.pessEst_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.pessEst_inscricaoEstadual || '</IE>' END
          || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.pessEst_nomeRazaoSocial))
          || CASE WHEN a.pessEst_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.pessEst_apelidoFantasia)) ELSE '' END
          || '<enderEmit>'
            || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endEst_logradouro))
            || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endEst_numero))
            -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endEst_complemento))
            || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endEst_bairroDistrito))
            || '<cMun>' || TO_CHAR (a.endEst_municipio) || '</cMun>'
            || FUNC_ADD_TAG_XML ('xMun', FUNC_ADD_REMOVE_CARACT_ESPEC (a.munEst_descricao))
            || FUNC_ADD_TAG_XML ('CEP', LPAD (a.endEst_cep, 8 , '0'))
            || '<UF>' || a.munEst_uf || '</UF>'
            || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonEst_idFonePessoa = 0 THEN ' ' ELSE a.fonEst_fone END)
          || '</enderEmit>'
          || FUNC_ADD_TAG_XML ('CRT', a.pessEst_regimeTributario)
        || '</emit>';
    -- Remetente
    v_xml := v_xml
        || '<rem>'
          || FUNC_ADD_TAG_XML (CASE WHEN a.rem_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
            CASE
              WHEN a.rem_cnpjCpfIdEstrangeiro <> ' '
              THEN a.rem_cnpjCpfIdEstrangeiro
              WHEN a.rem_indicadorPessoa = 'J'
              THEN '00000000000000'
              ELSE '00000000000'
            END)
          || CASE WHEN a.rem_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.rem_inscricaoEstadual || '</IE>' END
          || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.rem_nomeRazaoSocial))
          -- || CASE WHEN a.rem_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.rem_apelidoFantasia)) ELSE '' END
          || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonRem_idFonePessoa = 0 THEN ' ' ELSE a.fonRem_fone END)
          || '<enderReme>'
            || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRem_logradouro))
            || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRem_numero))
            -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRem_complemento))
            || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRem_bairroDistrito))
            || '<cMun>' || TO_CHAR (a.endRem_municipio) || '</cMun>'
            || '<xMun>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munRem_descricao) || '</xMun>'
            || '<CEP>' || LPAD (a.endRem_cep, 8 , '0') || '</CEP>'
            || '<UF>' || a.munRem_uf || '</UF>'
            || '<cPais>' || a.paisRem_pais || '</cPais>'
            || '<xPais>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.paisRem_descricao) || '</xPais>'
          || '</enderReme>'
          || CASE WHEN a.emailRem_idEmailPessoa = 0 OR a.emailRem_email = ' ' THEN '' ELSE '<email>' || a.emailRem_email || '</email>' END
        || '</rem>';
    -- Expedidor
    v_xml := v_xml
        || '<exped>'
          || FUNC_ADD_TAG_XML (CASE WHEN a.exp_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
            CASE
              WHEN a.exp_cnpjCpfIdEstrangeiro <> ' '
              THEN a.exp_cnpjCpfIdEstrangeiro
              WHEN a.exp_indicadorPessoa = 'J'
              THEN '00000000000000'
              ELSE '00000000000'
            END)
          || CASE WHEN a.exp_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.exp_inscricaoEstadual || '</IE>' END
          || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.exp_nomeRazaoSocial))
          -- || CASE WHEN a.exp_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.exp_apelidoFantasia)) ELSE '' END
          || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonExp_idFonePessoa = 0 THEN ' ' ELSE a.fonExp_fone END)
          || '<enderExped>'
            || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endExp_logradouro))
            || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endExp_numero))
            -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endExp_complemento))
            || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endExp_bairroDistrito))
            || '<cMun>' || TO_CHAR (a.endExp_municipio) || '</cMun>'
            || '<xMun>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munExp_descricao) || '</xMun>'
            || '<CEP>' || LPAD (a.endExp_cep, 8 , '0') || '</CEP>'
            || '<UF>' || a.munExp_uf || '</UF>'
            || '<cPais>' || a.paisExp_pais || '</cPais>'
            || '<xPais>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.paisExp_descricao) || '</xPais>'
          || '</enderExped>'
          || CASE WHEN a.emailExp_idEmailPessoa = 0 OR a.emailExp_email = ' ' THEN '' ELSE '<email>' || a.emailExp_email || '</email>' END
        || '</exped>';
    -- Recebedor
    v_xml := v_xml
        || '<receb>'
          || FUNC_ADD_TAG_XML (CASE WHEN a.rec_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
            CASE
              WHEN a.rec_cnpjCpfIdEstrangeiro <> ' '
              THEN a.rec_cnpjCpfIdEstrangeiro
              WHEN a.rec_indicadorPessoa = 'J'
              THEN '00000000000000'
              ELSE '00000000000'
            END)
          || CASE WHEN a.rec_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.rec_inscricaoEstadual || '</IE>' END
          || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.rec_nomeRazaoSocial))
          -- || CASE WHEN a.rec_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.rec_apelidoFantasia)) ELSE '' END
          || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonRec_idFonePessoa = 0 THEN ' ' ELSE a.fonRec_fone END)
          || '<enderReceb>'
            || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRec_logradouro))
            || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRec_numero))
            -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRec_complemento))
            || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endRec_bairroDistrito))
            || '<cMun>' || TO_CHAR (a.endRec_municipio) || '</cMun>'
            || '<xMun>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munRec_descricao) || '</xMun>'
            || '<CEP>' || LPAD (a.endRec_cep, 8 , '0') || '</CEP>'
            || '<UF>' || a.munRec_uf || '</UF>'
            || '<cPais>' || a.paisRec_pais || '</cPais>'
            || '<xPais>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.paisRec_descricao) || '</xPais>'
          || '</enderReceb>'
          || CASE WHEN a.emailRec_idEmailPessoa = 0 OR a.emailRec_email = ' ' THEN '' ELSE '<email>' || a.emailRec_email || '</email>' END
        || '</receb>';
    -- Destinatario
    v_xml := v_xml
        || '<dest>'
          || FUNC_ADD_TAG_XML (CASE WHEN a.dest_indicadorPessoa = 'J' THEN 'CNPJ' ELSE 'CPF' END,
            CASE
              WHEN a.dest_cnpjCpfIdEstrangeiro <> ' '
              THEN a.dest_cnpjCpfIdEstrangeiro
              WHEN a.dest_indicadorPessoa = 'J'
              THEN '00000000000000'
              ELSE '00000000000'
            END)
          || CASE WHEN a.dest_inscricaoEstadual = ' ' THEN '' ELSE '<IE>' || a.dest_inscricaoEstadual || '</IE>' END
          || FUNC_ADD_TAG_XML ('xNome', FUNC_ADD_REMOVE_CARACT_ESPEC (a.dest_nomeRazaoSocial))
          -- || CASE WHEN a.dest_indicadorPessoa = 'J' THEN FUNC_ADD_TAG_XML ('xFant', FUNC_ADD_REMOVE_CARACT_ESPEC (a.dest_apelidoFantasia)) ELSE '' END
          || FUNC_ADD_TAG_XML ('fone', CASE WHEN a.fonDest_idFonePessoa = 0 THEN ' ' ELSE a.fonDest_fone END)
          || '<enderDest>'
            || FUNC_ADD_TAG_XML ('xLgr', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endDest_logradouro))
            || FUNC_ADD_TAG_XML ('nro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endDest_numero))
            -- || FUNC_ADD_TAG_XML ('xCpl', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endDest_complemento))
            || FUNC_ADD_TAG_XML ('xBairro', FUNC_ADD_REMOVE_CARACT_ESPEC (a.endDest_bairroDistrito))
            || '<cMun>' || TO_CHAR (a.endDest_municipio) || '</cMun>'
            || '<xMun>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.munDest_descricao) || '</xMun>'
            || '<CEP>' || LPAD (a.endDest_cep, 8 , '0') || '</CEP>'
            || '<UF>' || a.munDest_uf || '</UF>'
            || '<cPais>' || a.paisDest_pais || '</cPais>'
            || '<xPais>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.paisDest_descricao) || '</xPais>'
          || '</enderDest>'
          || CASE WHEN a.emailDest_idEmailPessoa = 0 OR a.emailDest_email = ' ' THEN '' ELSE '<email>' || a.emailDest_email || '</email>' END
        || '</dest>';
    v_xml := v_xml
        || '<vPrest>'
          || '<vTPrest>' || REPLACE (TO_CHAR (a.valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vTPrest>'
          || '<vRec>' || REPLACE (TO_CHAR (a.valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vRec>';
    -- Itens - Composição do Transorte
    FOR itens IN (
      SELECT
        COALESCE (TRIM (SUBSTR ((TRIM (gradProd.descricaoImpressa) ||
          CASE
            WHEN itens.observacoes = ' '
            THEN ''
            ELSE ' ' || TRIM (itens.observacoes)
          END), 1, 15)), ' ') descricao,
        SUM (itens.valorLiquidoItem) valorLiquidoItem
      FROM MODOCFISCALXITENS itens
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itens.gradeProduto
      WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
      AND itens.cancelado = 0
      GROUP BY      
        COALESCE (TRIM (SUBSTR ((TRIM (gradProd.descricaoImpressa) ||
          CASE
            WHEN itens.observacoes = ' '
            THEN ''
            ELSE ' ' || TRIM (itens.observacoes)
          END), 1, 15)), ' '))
    LOOP
      v_xml := v_xml
          || '<Comp>'
            || '<xNome>' || itens.descricao || '</xNome>'
            || '<vComp>' || REPLACE (TO_CHAR (itens.valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vComp>'
          || '</Comp>';
    END LOOP;
    v_auxNumer := 0;
    v_xml := v_xml
        || '</vPrest>'
        || '<imp>'
          || '<ICMS>';
    -- Itens - CST ICMS 00 - tributação normal ICMS
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          itens.aliquotaICMS,
          SUM (itens.baseICMS) baseICMS,
          SUM (itens.valorICMS) valorICMS
        FROM MODOCFISCALXITENS itens
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND itens.stIcms = '00'
        GROUP BY itens.aliquotaICMS)
      LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMS00>'
                || '<CST>00</CST>'
                || '<vBC>' || REPLACE (TO_CHAR (itens.baseICMS, 'FM9999999999990D00'), ',', '.') || '</vBC>'
                || '<pICMS>' || REPLACE (TO_CHAR (itens.aliquotaICMS, 'FM9999999999990D00'), ',', '.') || '</pICMS>'
                || '<vICMS>' || REPLACE (TO_CHAR (itens.valorICMS, 'FM9999999999990D00'), ',', '.') || '</vICMS>'
              || '</ICMS00>';
      END LOOP;
    END IF;
    -- Itens - CST ICMS 20 - tributação com BC reduzida do ICMS
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          itens.reducaoBaseICMS,
          itens.aliquotaICMS,
          ben.codigoBeneficio,
          SUM (itens.baseICMS) baseICMS,
          SUM (itens.valorICMS) valorICMS,
          SUM (itens.valorICMSDesoneracao) valorICMSDesoneracao
        FROM MODOCFISCALXITENS itens
        JOIN SIBENEFICIOSFISCAIS ben
        ON ben.idBeneficio = itens.idBeneficio
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND itens.stIcms = '20'
        GROUP BY
          itens.reducaoBaseICMS,
          itens.aliquotaICMS,
          ben.codigoBeneficio)
      LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMS20>'
                || '<CST>20</CST>'
                || '<pRedBC>' || REPLACE (TO_CHAR (itens.reducaoBaseICMS, 'FM9999999999990D00'), ',', '.') || '</pRedBC>'
                || '<vBC>' || REPLACE (TO_CHAR (itens.baseICMS, 'FM9999999999990D00'), ',', '.') || '</vBC>'
                || '<pICMS>' || REPLACE (TO_CHAR (itens.aliquotaICMS, 'FM9999999999990D00'), ',', '.') || '</pICMS>'
                || '<vICMS>' || REPLACE (TO_CHAR (itens.valorICMS, 'FM9999999999990D00'), ',', '.') || '</vICMS>'
                || CASE
                     WHEN itens.valorICMSDesoneracao = 0
                     THEN ''
                     ELSE '<vICMSDeson>' || REPLACE (TO_CHAR (itens.valorICMSDesoneracao, 'FM9999999999990D00'), ',', '.') || '</vICMSDeson>'
                || FUNC_ADD_TAG_XML ('cBenef', itens.codigoBeneficio)
                   END
              || '</ICMS20>';
      END LOOP;
    END IF;
    -- Itens - CST ICMS 40, 41, 51
			-- 40 - ICMS isenção;
			-- 41 - ICMS não tributada;
			-- 51 - ICMS diferido</xs:documentation>
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          itens.stIcms,
          ben.codigoBeneficio,
          SUM (itens.valorICMSDesoneracao) valorICMSDesoneracao
        FROM MODOCFISCALXITENS itens
        JOIN SIBENEFICIOSFISCAIS ben
        ON ben.idBeneficio = itens.idBeneficio
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND itens.stIcms IN ('40', '41', '51')
        GROUP BY
          itens.stIcms,
          ben.codigoBeneficio)
      LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMS45>'
                || '<CST>' || itens.stIcms || '</CST>'
                || CASE
                     WHEN itens.valorICMSDesoneracao = 0
                     THEN ''
                     ELSE '<vICMSDeson>' || REPLACE (TO_CHAR (itens.valorICMSDesoneracao, 'FM9999999999990D00'), ',', '.') || '</vICMSDeson>'
                || FUNC_ADD_TAG_XML ('cBenef', itens.codigoBeneficio)
                   END
              || '</ICMS45>';
      END LOOP;
    END IF;
    -- Itens - CST ICMS 60 - ICMS cobrado por substituição tributária
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          ben.codigoBeneficio,
          SUM (itens.valorICMSDesoneracao) valorICMSDesoneracao
        FROM MODOCFISCALXITENS itens
        JOIN SIBENEFICIOSFISCAIS ben
        ON ben.idBeneficio = itens.idBeneficio
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND itens.stIcms = '60'
        GROUP BY
          ben.codigoBeneficio)
      LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMS60>'
                || '<CST>60</CST>'
                -- Valor do frete sobre o qual será calculado o ICMS a ser substituído na Prestação.
                || '<vBCSTRet>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vBCSTRet>'
                -- Resultado da multiplicação do ¿vBCSTRet¿ x ¿pICMSSTRet¿ ¿ que será valor do ICMS a ser retido pelo Substituto. Podendo o valor do ICMS a ser retido efetivamente, sofrer ajustes conforme a opção tributaria do transportador substituído.
                || '<vICMSSTRet>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vICMSSTRet>'
                -- Percentual de Alíquota incidente na prestação de serviço de transporte.
                || '<pICMSSTRet>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</pICMSSTRet>'
                -- Preencher somente quando o transportador substituído, for optante pelo crédito outorgado previsto no Convênio 106/96 e corresponde ao percentual de 20% do valor do ICMS ST retido.
                || '<vCred>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vCred>'
                || CASE
                     WHEN itens.valorICMSDesoneracao = 0
                     THEN ''
                     ELSE '<vICMSDeson>' || REPLACE (TO_CHAR (itens.valorICMSDesoneracao, 'FM9999999999990D00'), ',', '.') || '</vICMSDeson>'
                || FUNC_ADD_TAG_XML ('cBenef', itens.codigoBeneficio)
                   END
              || '</ICMS60>';
      END LOOP;
    END IF;
    -- Itens - CST ICMS 90 - ICMS outros
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          itens.reducaoBaseICMS,
          itens.aliquotaICMS,
          ben.codigoBeneficio,
          SUM (itens.baseICMS) baseICMS,
          SUM (itens.valorICMS) valorICMS,
          SUM (itens.valorICMSDesoneracao) valorICMSDesoneracao
        FROM MODOCFISCALXITENS itens
        JOIN SIBENEFICIOSFISCAIS ben
        ON ben.idBeneficio = itens.idBeneficio
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND itens.stIcms = '90'
        GROUP BY
          itens.reducaoBaseICMS,
          itens.aliquotaICMS,
          ben.codigoBeneficio)
       LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMS90>'
                || '<CST>90</CST>'
                || CASE WHEN itens.reducaoBaseICMS = 0 THEN '' ELSE '<pRedBC>' || REPLACE (TO_CHAR (itens.reducaoBaseICMS, 'FM9999999999990D00'), ',', '.') || '</pRedBC>' END
                || '<vBC>' || REPLACE (TO_CHAR (itens.baseICMS, 'FM9999999999990D00'), ',', '.') || '</vBC>'
                || '<pICMS>' || REPLACE (TO_CHAR (itens.aliquotaICMS, 'FM9999999999990D00'), ',', '.') || '</pICMS>'
                || '<vICMS>' || REPLACE (TO_CHAR (itens.valorICMS, 'FM9999999999990D00'), ',', '.') || '</vICMS>'
                -- Preencher somente quando o transportador substituído, for optante pelo crédito outorgado previsto no Convênio 106/96 e corresponde ao percentual de 20% do valor do ICMS ST retido.
                || '<vCred>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vCred>'
                || CASE
                     WHEN itens.valorICMSDesoneracao = 0
                     THEN ''
                     ELSE '<vICMSDeson>' || REPLACE (TO_CHAR (itens.valorICMSDesoneracao, 'FM9999999999990D00'), ',', '.') || '</vICMSDeson>'
                || FUNC_ADD_TAG_XML ('cBenef', itens.codigoBeneficio)
                   END
              || '</ICMS90>';
      END LOOP;
    END IF;
    -- PENDENTE
    -- Itens - ICMS devido à UF de origem da prestação, quando  diferente da UF do emitente
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          ben.codigoBeneficio,
          SUM (itens.valorICMSDesoneracao) valorICMSDesoneracao
        FROM MODOCFISCALXITENS itens
        JOIN SIBENEFICIOSFISCAIS ben
        ON ben.idBeneficio = itens.idBeneficio
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND 1 <> 1
        GROUP BY
           ben.codigoBeneficio)
       LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMSOutraUF>'
                || '<CST>90</CST>'
                || '<pRedBCOutraUF>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</pRedBCOutraUF>'
                || '<vBCOutraUF>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vBCOutraUF>'
                || '<pICMSOutraUF>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</pICMSOutraUF>'
                || '<vICMSOutraUF>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vICMSOutraUF>'
                -- Preencher somente quando o transportador substituído, for optante pelo crédito outorgado previsto no Convênio 106/96 e corresponde ao percentual de 20% do valor do ICMS ST retido.
                || '<vCred>' || REPLACE (TO_CHAR (0, 'FM9999999999990D00'), ',', '.') || '</vCred>'
                || CASE
                     WHEN itens.valorICMSDesoneracao = 0
                     THEN ''
                     ELSE '<vICMSDeson>' || REPLACE (TO_CHAR (itens.valorICMSDesoneracao, 'FM9999999999990D00'), ',', '.') || '</vICMSDeson>'
                || FUNC_ADD_TAG_XML ('cBenef', itens.codigoBeneficio)
                   END
              || '</ICMSOutraUF>';
      END LOOP;
    END IF;
    -- 90 - ICMS Simples Nacional
    IF v_auxNumer = 0 THEN
      FOR itens IN (
        SELECT
          SUM (1) existe
        FROM MODOCFISCALXITENS itens
        WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
        AND itens.cancelado = 0
        AND TRIM(itens.stSimplesNacional) <> '')
      LOOP
        v_auxNumer := 1;
        v_xml := v_xml
              || '<ICMSSN>'
                || '<CST>90</CST>'
                || '<indSN>1</indSN>'
              || '</ICMSSN>';
      END LOOP;
    END IF;
      v_xml := v_xml
          || '</ICMS>'
          || '<vTotTrib>' || REPLACE (TO_CHAR (a.valorEstimadoImpostos, 'FM9999999999990D00'), ',', '.') || '</vTotTrib>'
          || CASE WHEN a.descInformacaoComplementar = ' ' THEN '' ELSE '<infAdFisco>' || FUNC_ADD_REMOVE_CARACT_ESPEC (a.descInformacaoComplementar) || '</infAdFisco>' END;
    FOR itens IN (
      SELECT
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual,
        SUM (itens.baseICMSUFDestinatario) baseICMSUFDestinatario,
        SUM (itens.valorFCPUFDestinatario) valorFCPUFDestinatario,
        SUM (itens.valorICMSUFDestinatario) valorICMSUFDestinatario,
        SUM (itens.valorICMSUFRemetente) valorICMSUFRemetente
      FROM MODOCFISCALXITENS itens
      WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
      AND itens.cancelado = 0
      GROUP BY
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual)
    LOOP
      v_xml := v_xml
          || '<ICMSUFFim>'
            || '<vBCUFFim>' || REPLACE (TO_CHAR (itens.baseICMSUFDestinatario, 'FM9999999999990D00'), ',', '.') || '</vBCUFFim>'
            || '<pFCPUFFim>' || REPLACE (TO_CHAR (itens.aliquotaFCPUFDestinatario, 'FM9999999999990D00'), ',', '.') || '</pFCPUFFim>'
            || '<pICMSUFFim>' || REPLACE (TO_CHAR (itens.aliquotaICMSUFDestinatario, 'FM9999999999990D00'), ',', '.') || '</pICMSUFFim>'
            || '<pICMSInter>' || REPLACE (TO_CHAR (itens.aliquotaICMSInterestadual, 'FM9999999999990D00'), ',', '.') || '</pICMSInter>'
            || '<vFCPUFFim>' || REPLACE (TO_CHAR (itens.valorFCPUFDestinatario, 'FM9999999999990D00'), ',', '.') || '</vFCPUFFim>'
            || '<vICMSUFFim>' || REPLACE (TO_CHAR (itens.valorICMSUFDestinatario, 'FM9999999999990D00'), ',', '.') || '</vICMSUFFim>'
            || '<vICMSUFIni>' || REPLACE (TO_CHAR (itens.valorICMSUFRemetente, 'FM9999999999990D00'), ',', '.') || '</vICMSUFIni>'
          || '</ICMSUFFim>';
    END LOOP;
      v_xml := v_xml
        || '</imp>';
    v_xml := v_xml
        || '<infCTeNorm>'
          || '<infCarga>'
            || '<vCarga>' || REPLACE (TO_CHAR (a.valorCarga, 'FM9999999999990D00'), ',', '.') || '</vCarga>'
            || FUNC_ADD_TAG_XML ('proPred', FUNC_ADD_REMOVE_CARACT_ESPEC (a.produtoPredominanteCTe))
            || CASE WHEN a.outrasCaracteristicasProdCTe = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('xOutCat', FUNC_ADD_REMOVE_CARACT_ESPEC (a.outrasCaracteristicasProdCTe)) END
            || '<infQ>'
              || '<cUnid>' || a.unidadeMedidaCTe || '</cUnid>'
              || '<tpMed>' || FUNC_ADD_REMOVE_CARACT_ESPEC (TRIM(SUBSTR (a.unMed_descricao, 6, 60))) || '</tpMed>'
              || '<qCarga>' || REPLACE (TO_CHAR (a.quantidadeCarga, 'FM9999999999990D0000'), ',', '.') || '</qCarga>'
           || '</infQ>'
          || '</infCarga>'
          || '<infDoc>';
    FOR itens IN (
      SELECT itens.chaveNFe
      FROM MODOCFISCALXNFREF itens
      WHERE itens.idDocumentoFiscal = p_idDocumentoFiscal
      AND itens.chaveNFe <> ' ')
    LOOP
      v_xml := v_xml
            || '<infNFe>'
              || '<chave>' || itens.chaveNFe || '</chave>'
            || '</infNFe>';
    END LOOP;
    v_xml := v_xml
          || '</infDoc>'
          || '<infModal versaoModal="4.00">'
            || '<rodo>'
              || FUNC_ADD_TAG_XML ('RNTRC', FUNC_ADD_REMOVE_CARACT_ESPEC (a.rntrc))
            || '</rodo>'
          || '</infModal>'
          || '<cobr>';
    v_xml := v_xml
            || '<fat>'
              || '<nFat>' || a.fatura || '</nFat>'
              || '<vOrig>' || REPLACE (TO_CHAR (a.valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vOrig>'
              -- || '<vDesc>0.00</vDesc>'
              || '<vLiq>' || REPLACE (TO_CHAR (a.valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vLiq>'
            || '</fat>';
    v_xml := v_xml
          || '</cobr>'
        || '</infCTeNorm>'
      || '</infCte>';
  END LOOP;
  v_xml := v_xml
  || '</CTe>';
  RETURN v_xml;
END;

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (443, 'Questionar ao inserir um item que não consta na conferencia', 1, 30001, 'L', '1', 'E', 0, 'N', ' ', ' ');
INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (444, 'Enviar e-mail com boleto apenas após finalizar último documento efetivado, com orçamento, ordem de serviço e xml´s vinculados', 1, 30001, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('08/07/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 2' WHERE idVersaoSistema = 2025001004;

COMMIT;

-- FIM BETA 2 - 08/07/2025

-- Município: 4208203 - Itajaí - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 1, versaoNFSe = '1.00' WHERE municipio = 4208203;

COMMIT;

DELETE SISERVICOSNFSE WHERE id IN (4208203000, 4208203010, 4208203020, 4208203100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4208203000, 4208203, 'EnviarLoteRps',  'https://nfsehomologacao.itajai.sc.gov.br/nfse_integracao/Services', 'https://nfse.itajai.sc.gov.br/nfse_integracao/Services', ' ', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://service.nfse.integracao.ws.publica/"><S:Body><ns2:RecepcionarLoteRps><XML>', '</XML></ns2:RecepcionarLoteRps></S:Body></S:Envelope>', 'EnviarLoteRpsResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4208203010, 4208203, 'ConsultarSituacaoLoteRps',  'https://nfsehomologacao.itajai.sc.gov.br/nfse_integracao/Services', 'https://nfse.itajai.sc.gov.br/nfse_integracao/Services', ' ', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://service.nfse.integracao.ws.publica/"><S:Body><ns2:ConsultarSituacaoLoteRps><XML>', '</XML></ns2:ConsultarSituacaoLoteRps></S:Body></S:Envelope>', 'ConsultarSituacaoLoteRpsResposta', '<ConsultarSituacaoLoteRpsEnvio xmlns="http://www.publica.inf.br"><Prestador Id="1"><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarSituacaoLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4208203020, 4208203, 'ConsultarLoteRps',  'https://nfsehomologacao.itajai.sc.gov.br/nfse_integracao/Services', 'https://nfse.itajai.sc.gov.br/nfse_integracao/Services', ' ', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://service.nfse.integracao.ws.publica/"><S:Body><ns2:ConsultarLoteRps><XML>', '</XML></ns2:ConsultarLoteRps></S:Body></S:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio xmlns="http://www.publica.inf.br"><Prestador Id="1"><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4208203100, 4208203, 'CancelarNfse',  'https://nfsehomologacao.itajai.sc.gov.br/nfse_integracao/Services', 'https://nfse.itajai.sc.gov.br/nfse_integracao/Services', ' ', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://service.nfse.integracao.ws.publica/"><S:Body><ns2:CancelarNfse><XML>', '</XML></ns2:CancelarNfse></S:Body></S:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio xmlns="http://www.publica.inf.br"><Pedido><InfPedidoCancelamento id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento>C999</CodigoCancelamento><MotivoCancelamento><!$MG_motivoCancelamento></MotivoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

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_apelidoFantasia       VARCHAR (60);
  v_estab_indicadorPessoa       CHAR (1);
  v_estab_tipo                  VARCHAR (4);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR (20);
  v_estab_inscricaoEstadual     VARCHAR (14);
  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_municipioDescricao    VARCHAR (60);
  v_estab_uf                    CHAR (2);
  v_estab_cep                   CHAR (8);
  v_estab_pais                  VARCHAR (4);
  v_estab_paisDescricao         VARCHAR (60);
  v_estab_tecnologiaNfse        NUMBER;
  v_estab_fone                  VARCHAR (14);
  v_estab_fone2                 VARCHAR (14);
  v_estab_email                 VARCHAR (60);
  v_estab_site                  VARCHAR (60);
  v_estab_senhaWS               VARCHAR (256);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_estab_regimeTributario      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_municipioDescricao    VARCHAR (60);
  v_pess_uf                    CHAR (2);
  v_pess_cep                   CHAR (8);
  v_pess_pais                  VARCHAR (4);
  v_pess_paisDescricao         VARCHAR (60);
  v_pess_observacoesEndereco    VARCHAR (4000);
  v_pess_fone                   VARCHAR (14);
  v_pess_fone2                  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_municipioDescricao     VARCHAR (60);
  v_entr_cep                    CHAR (8);
  v_entr_uf                     CHAR (2);
  v_entr_pais                   VARCHAR (4);
  v_entr_paisDescricao          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_municipioFatoGerador        NUMBER;
  v_dataEmissao                 DATE;
  v_dataHoraEmissao             VARCHAR (20);
  v_dataCompetencia             VARCHAR (20);
  v_dataCompetenciaDDMMYYYY     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_valorTotal                  VARCHAR (20);
  v_valorLiquidoItem            NUMBER;
  v_aliquotaIssqn               VARCHAR (20);
  v_baseIssqn                   VARCHAR (20);
  v_valorIssqn                  VARCHAR (20);
  v_retencaoInss                VARCHAR (20);
  v_baseRetInss                 VARCHAR (20);
  v_valorRetInss                VARCHAR (20);
  v_retencaoIrrf                VARCHAR (20);
  v_baseRetIrrf                 VARCHAR (20);
  v_valorRetIrrf                VARCHAR (20);
  v_retencaoPis                 VARCHAR (20);
  v_baseRetPis                  VARCHAR (20);
  v_valorRetPis                 VARCHAR (20);
  v_retencaoCofins              VARCHAR (20);
  v_baseRetCofins               VARCHAR (20);
  v_valorRetCofins              VARCHAR (20);
  v_retencaoCsll                VARCHAR (20);
  v_baseRetCsll                 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_tributadoForaMunicipio      CHAR (1);
  v_municipioIncidencia         VARCHAR (7);
  v_listaServicos               CHAR (5);
  v_cnae                        CHAR (7);
  v_codigoServicoMunicipio      VARCHAR (60);
  v_sequencia                   NUMBER;
  v_valor                       NUMBER;
  v_saldo                       NUMBER;
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.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 (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonEst2_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 (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonPess2_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,
      COALESCE (SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END), 0) valorProdutoServico,
      COALESCE (SUM (CASE WHEN endEst.municipio = 4309407 THEN 0 ELSE a.valorDescontoTotal END), 0) valorDescontoTotal,
      COALESCE (SUM (a.valorOutrasDespesasTotal), 0) valorOutrasDespesasTotal,
      COALESCE (SUM (a.valorLiquidoItem), 0) valorLiquidoItem,
      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 (MAX (a.retencaoIrrf), 0) retencaoIrrf,
      COALESCE (SUM (a.baseRetIrrf), 0) baseRetIrrf,
      COALESCE (SUM (a.valorRetIrrf), 0) valorRetIrrf,
      COALESCE (MAX (a.retencaoInss), 0) retencaoInss,
      COALESCE (SUM (a.baseRetInss), 0) baseRetInss,
      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.baseRetCofins), 0) baseRetCofins,
      COALESCE (SUM (a.valorRetCofins), 0) valorRetCofins,
      COALESCE (MAX (a.retencaoCsll), 0) retencaoCsll,
      COALESCE (SUM (a.baseRetCsll), 0) baseRetCsll,
      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.municipioFatoGerador,
    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 '00/00/00000' ELSE TO_CHAR (a.dataEmissao, 'DD/MM/YYYY') END ELSE TO_CHAR (a.dataCompetencia, 'DD/MM/YYYY') 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),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.apelidoFantasia),
    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.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    pessEst.regimeTributario,
    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),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEst.descricao),
    munEst.uf,
    LPAD (endEst.cep, 8 , '0'),
    paisEst.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEst.descricao),
    munEst.tecnologiaNfse,
    CASE WHEN fonEst.idFonePessoa = 0 THEN ' ' ELSE fonEst.fone END,
    CASE WHEN fonEst2.idFonePessoa = 0 THEN ' ' ELSE fonEst2.fone END,
    CASE WHEN emailEst.idEmailPessoa = 0 THEN ' ' ELSE emailEst.email END,
    CASE WHEN siteEst.idEmailPessoa = 0 THEN ' ' ELSE siteEst.email END,
    COALESCE (estXnfse.senhaWS, ' '),
    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),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munPess.descricao),
    munPess.uf,
    LPAD (endPess.cep, 8 , '0'),
    paisPess.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisPess.descricao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    CASE WHEN fonPess.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN fonPess2.idFonePessoa = 0 THEN ' ' ELSE fonPess2.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),
    munEntr.uf,
    LPAD (endEntr.cep, 8 , '0'),
    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 (FUNC_ADD_BUSCA_DESCR_SERVICO (p_idDocumentoFiscal) ||
      CASE
        WHEN endEst.municipio IN (4202008,4209102,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 NOT IN (4304606, 4305108, 4308607)
        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 (FUNC_ADD_REMOVE_CARACT_ESPEC (COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.descInformacaoComplementar <> ' '), ' '))), 1, 2000), ' '),
    REPLACE (TO_CHAR (item.valorProdutoServico, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorProdutoServico - item.valorDescontoTotal + item.valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'),
    item.valorLiquidoItem,
    REPLACE (TO_CHAR (item.valorDescontoTotal, 'FM9999999999990D00'), ',', '.'),
    item.indicadorIssqn,
    REPLACE (CASE WHEN endEst.municipio = 4318705 THEN TO_CHAR (item.aliquotaIssqn / 100, 'FM0D0000') ELSE TO_CHAR (item.aliquotaIssqn, 'FM9999999999990D00') END, ',', '.'),
    REPLACE (TO_CHAR (item.baseIssqn, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorIssqn, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.retidoIssqn = 1 THEN '1' ELSE '2' END,
    CASE WHEN item.tributadoForaMunicipio = 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.retencaoInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetIrrf, '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.baseRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetCsll, '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_municipioFatoGerador,
    v_dataEmissao,
    v_dataHoraEmissao,
    v_dataCompetencia,
    v_dataCompetenciaDDMMYYYY,
    v_dataHoraCompetencia,
    v_chaveNFe,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_apelidoFantasia,
    v_estab_indicadorPessoa,
    v_estab_tipo,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoEstadual,
    v_estab_inscricaoMunicipal,
    v_estab_regimeTributario,
    v_optanteSimplesNacional,
    v_estab_logradouro,
    v_estab_numero,
    v_estab_complemento,
    v_estab_bairroDistrito,
    v_estab_municipio,
    v_estab_municipioDescricao,
    v_estab_uf,
    v_estab_cep,
    v_estab_pais,
    v_estab_paisDescricao,
    v_estab_tecnologiaNfse,
    v_estab_fone,
    v_estab_fone2,
    v_estab_email,
    v_estab_site,
    v_estab_senhaWS,
    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_municipioDescricao,
    v_pess_uf,
    v_pess_cep,
    v_pess_pais,
    v_pess_paisDescricao,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_fone2,
    v_pess_email,
    v_entr_logradouro,
    v_entr_numero,
    v_entr_complemento,
    v_entr_bairroDistrito,
    v_entr_municipio,
    v_entr_municipioDescricao,
    v_entr_uf,
    v_entr_cep,
    v_entr_pais,
    v_entr_paisDescricao,
    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_valorTotal,
    v_valorLiquidoItem,
    v_valorDescontoTotal,
    v_indicadorIssqn,
    v_aliquotaIssqn,
    v_baseIssqn,
    v_valorIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_municipioIncidencia,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoServicoMunicipio,
    v_numeroProcesso,
    v_retencaoInss,
    v_baseRetInss,
    v_valorRetInss,
    v_retencaoIrrf,
    v_baseRetIrrf,
    v_valorRetIrrf,
    v_retencaoPis,
    v_baseRetPis,
    v_valorRetPis,
    v_retencaoCofins,
    v_baseRetCofins,
    v_valorRetCofins,
    v_retencaoCsll,
    v_baseRetCsll,
    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 SIPAISES paisEst
  ON paisEst.pais = CASE WHEN endEst.pais = ' ' THEN '1058' ELSE endEst.pais END
  JOIN CAFONESPESSOA fonEst
  ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
  JOIN CAFONESPESSOA fonEst2
  ON fonEst2.idFonePessoa = a.fonEst2_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 = CASE WHEN endEntr.pais = ' ' THEN '1058' ELSE endEntr.pais END
  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 SIPAISES paisPess
  ON paisPess.pais = CASE WHEN endPess.pais = ' ' THEN '1058' ELSE endPess.pais END
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
  JOIN CAFONESPESSOA fonPess2
  ON fonPess2.idFonePessoa = a.fonPess2_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_valorRetIrrf || '</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>' ||
                CASE v_indicadorIssqn
                  -- 118 ISS NÃO TRIBUTÁVEL
                  WHEN '2' THEN '118'
                  -- 103 ISENTO
                  WHEN '3' THEN '103'
                  -- 119 NÃO INCIDÊNCIA DE ISS - TOMADOR INTERNACIONAL
                  WHEN '4' THEN '119'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- 111 Exigibilidade suspensa por decisão judicial
                  WHEN '6' THEN '111'
                  -- 112 Exigibilidade suspensa por Processo Administrativo
                  WHEN '7' THEN '112'
                  ELSE
                    CASE
                      -- 114 ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 116 ISS devido em Balneário Camboriú, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '116'
                      -- 107 ISS devido para Balneário Camboriú (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 113 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '113'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 115 ISS devido em Balneário Camboriú, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 101 ISS devido para Balneário Camboriú
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106 ISS FIXO Prestado em Balneário Camboriú
                      -- 117 ISS Fixo Devido em Balneário Camboriú Prestado Fora
                      -- 150 NOTA AVULSA
                    END
                END || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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>' || TO_CHAR (v_municipioFatoGerador) || '</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: 4209102 - Joinville - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4209102' 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>' ||
                CASE v_indicadorIssqn
                  -- ISS NÃO TRIBUTÁVEL (NÃO TRATADO)
                  WHEN '2' THEN '000'
                  -- ISENTO (NÃO TRATADO)
                  WHEN '3' THEN '000'
                  -- 113 Não incidência de ISS - Tomador internacional
                  WHEN '4' THEN '113'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- Exigibilidade suspensa por decisão judicial (NÃO TRATADO)
                  WHEN '6' THEN '000'
                  -- Exigibilidade suspensa por Processo Administrativo (NÃO TRATADO)
                  WHEN '7' THEN '000'
                  ELSE
                    CASE
                      -- ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
--                      WHEN v_optanteSimplesNacional = '1'
--                        AND v_issRetido = '1'
--                        AND v_tributadoForaMunicipio = 1
--                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                      THEN '000'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 115 ISS devido em Joinville, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 107 ISS devido para Joinville (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 114 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 112  ISS devido em Joinville, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '112'
                      -- 101 ISS devido para Joinville
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106  Prestador enquadrado como ISS Fixo ou estimado
                      -- 112 ISS Retido pelo prestador 
                      -- 116 ISS devido para Joinville - Tomador internacional
                      -- 117 Não incidência de ISS (Simples Nacional) - Tomador internacional
                      -- 118 ISS devido para Joinville (Simples Nacional) - Tomador internacional
                      -- 119 ISS retido pelo tomador (Poder Publico) 
                      -- 150 NOTA AVULSA
                    END
                END || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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>' || TO_CHAR (v_municipioFatoGerador) || '</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 = ' ' OR v_pess_municipio <> '4209102' 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: 4218004 - Tijucas - SC
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: PRÓPRIA
-- Assinar: itens
-- Síncrono
  ELSIF v_estab_municipio = '4218004' THEN
    -- NFS-e
    v_xml := '<nfse>'
  || '<rps>'
    || '<nro_recibo_provisorio>' || v_numeroRPS || '</nro_recibo_provisorio>'
    || '<serie_recibo_provisorio>1</serie_recibo_provisorio>'
    || '<data_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END || '</data_emissao_recibo_provisorio>'
    || '<hora_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END || '</hora_emissao_recibo_provisorio>'
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
--    || '<serie_nfse>' || v_serieFiscal || '</serie_nfse>'
--    || '<data_fato_gerador>' || v_dataCompetenciaDDMMYYYY || '</data_fato_gerador>'
    || '<valor_total>' || REPLACE (v_valorTotal, '.', ',') || '</valor_total>'
    || '<valor_desconto>0,00</valor_desconto>'
    || '<valor_ir>' || REPLACE (v_valorRetIrrf, '.', ',') || '</valor_ir>'
    || '<valor_inss>' || REPLACE (v_valorRetInss, '.', ',') || '</valor_inss>'
    || '<valor_contribuicao_social>' || REPLACE (v_valorRetCsll, '.', ',') || '</valor_contribuicao_social>'
    || '<valor_rps>0,00</valor_rps>'
    || '<valor_pis>' || REPLACE (v_valorPis, '.', ',') || '</valor_pis>'
    || '<valor_cofins>' || REPLACE (v_valorCofins, '.', ',') || '</valor_cofins>'
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || '<cpfcnpj>' || v_estab_cnpjCpfIdEstrangeiro || '</cpfcnpj>'
    || '<cidade>' || v_estab_municipio || '</cidade>'
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
--    || '<endereco_informado>' || CASE WHEN v_pess_logradouro = ' ' THEN '0' ELSE '1' END || '</endereco_informado>'
    || '<tipo>' || v_pess_indicadorPessoa || '</tipo>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || '<sobrenome_nome_fantasia/>'
--    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro || ', ' || v_pess_numero)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
--    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || '<codigo_local_prestacao_servico>' || v_municipioIncidencia || '</codigo_local_prestacao_servico>'
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', REPLACE (v_listaServicos, '.', ''))
      || FUNC_ADD_TAG_XML ('descritivo', v_descricaoServico)
      || '<aliquota_item_lista_servico>' || REPLACE (v_aliquotaIssqn, '.', ',') || '</aliquota_item_lista_servico>'
      || '<situacao_tributaria>00</situacao_tributaria>'
      || '<valor_tributavel>' || REPLACE (v_valorTotal, '.', ',') || '</valor_tributavel>'
      || '<valor_deducao>0,00</valor_deducao>'
      || '<valor_issrf>' || CASE WHEN v_issRetido = '1' THEN REPLACE (v_valorIssqn, '.', ',') ELSE '0,00' END || '</valor_issrf>'
      || '<tributa_municipio_prestador>' || CASE WHEN v_tributadoForaMunicipio = '1' THEN 'N' ELSE 'S' END|| '</tributa_municipio_prestador>'
      || '<unidade_codigo>1</unidade_codigo>'
      || '<unidade_quantidade>1,00</unidade_quantidade>'
      || '<unidade_valor_unitario>' || REPLACE (v_valorTotal, '.', ',') || '</unidade_valor_unitario>'
--      || '<codigo_atividade>0</codigo_atividade>'
--      || FUNC_ADD_TAG_XML ('cno', v_codigoObra)
    || '</lista>'
  || '</itens>'
  || '<produtos> </produtos>'
  -- Assinar Aqui
|| '</nfse>';

-- 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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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 = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</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>'
              || '<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>'
              || '<CodigoMunicipio>' || v_interm_municipio || '</CodigoMunicipio>'
          || '</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: Elotech
-- Tecnologia: 5 - Elotech
-- Versão: 2.03
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4302105' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd">'
  || '<IdentificacaoRequerente>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<Senha>' || v_estab_senhaWS || '</Senha>'
    || '<Homologa>false</Homologa>'
  || '</IdentificacaoRequerente>'
  || '<LoteRps 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>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>'
              || '<AliquotaPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</AliquotaPis>'
              || '<RetidoPis>' || v_pisCofinsRetido || '</RetidoPis>'
              || '<ValorPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</ValorPis>'
              || '<AliquotaCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</AliquotaCofins>'
              || '<RetidoCofins>' || v_pisCofinsRetido || '</RetidoCofins>'
              || '<ValorCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</ValorCofins>'
              || '<AliquotaInss>' || v_retencaoInss || '</AliquotaInss>'
              || '<RetidoInss>1</RetidoInss>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<AliquotaIr>' || v_retencaoIrrf || '</AliquotaIr>'
              || '<RetidoIr>1</RetidoIr>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<AliquotaCsll>' || v_retencaoCsll || '</AliquotaCsll>'
              || '<RetidoCsll>1</RetidoCsll>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<AliquotaCpp>0.00</AliquotaCpp>'
              || '<RetidoCpp>1</RetidoCpp>'
              || '<ValorCpp>0.00</ValorCpp>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<RetidoOutrasRetencoes>1</RetidoOutrasRetencoes>'
              || '<AliquotaTotTributos>0.00</AliquotaTotTributos>'
              || '<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>'
            || CASE WHEN v_issRetido = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<CodigoNbs>0</CodigoNbs>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
            || '<ListaItensServico>'
              || '<ItemServico>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<Descricao>' || v_descricaoServico || '</Descricao>'
                || '<Unidade>UN</Unidade>'
                || '<Tributavel>1</Tributavel>'
                || '<Quantidade>1</Quantidade>'
                || '<ValorUnitario>' || v_valorTotal || '</ValorUnitario>'
                || '<ValorDesconto>0.00</ValorDesconto>'
                || '<ValorLiquido>' || v_valorTotal || '</ValorLiquido>'
              || '</ItemServico>'
            || '</ListaItensServico>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || CASE WHEN v_estab_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_estab_inscricaoMunicipal || '</InscricaoMunicipal>' END
          || '</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 '<InscricaoMunicipal>' || v_pess_inscricaoMunicipal || '</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>'
              || CASE WHEN v_pess_fone = ' ' THEN '' ELSE '<Telefone>' || v_pess_fone || '</Telefone>' END
              || CASE WHEN v_pess_email = ' ' THEN '' ELSE '<Email>' || v_pess_email || '</Email>' END
            || '</Contato>' END
            || CASE WHEN v_pess_inscricaoEstadual = ' ' THEN '' ELSE '<InscricaoEstadual>' || v_pess_inscricaoEstadual || '</InscricaoEstadual>' END
          || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      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>'
                || CASE WHEN v_interm_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_interm_inscricaoMunicipal || '</InscricaoMunicipal>' END
              || '</IdentificacaoIntermediario>'
              || '<RazaoSocial>' || v_interm_nomeRazaoSocial || '</RazaoSocial>'
              || '<CodigoMunicipio>' || v_interm_municipio || '</CodigoMunicipio>'
          || '</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
          || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
--          || '<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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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: 4305108 - Caxias do Sul - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: 
-- Síncrono
  ELSIF v_estab_municipio = '4305108' THEN

    -- NFS-e
    v_xml := '<envioLote versao="1.0">'
  || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
  || '<dhTrans>' || REPLACE (v_dataHoraEmissao, 'T', ' ' ) || '</dhTrans>'
  || '<NFS-e>'
    || '<infNFSe versao="1.1">'
      || '<Id>'
        || '<cNFS-e>' || p_loteWebService || '</cNFS-e>'
        || '<mod>90</mod>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nNFS-e>' || v_numeroRPS || '</nNFS-e>'
        || '<dEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</dEmi>'
        || '<hEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI') END || '</hEmi>'
        || '<tpNF>1</tpNF>'
        || '<refNF>' || v_chaveNFe || '</refNF>'
        || '<tpImp>1</tpImp>'
        || '<tpEmis>N</tpEmis>'
        || '<cancelada>N</cancelada>'
        || '<canhoto>1</canhoto>'
      || '</Id>';

    -- Prestador
    v_xml := v_xml
      || '<prest>'
        || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
        || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
        || '<xFant>' || v_estab_apelidoFantasia || '</xFant>'
        || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('xEmail', v_estab_email)
        || FUNC_ADD_TAG_XML ('xSite', v_estab_site)
        || '<end>'
          || 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)
          || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_estab_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_estab_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_estab_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_estab_paisDescricao)
        || '</end>'
        || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_estab_fone2)
        || FUNC_ADD_TAG_XML ('IE', v_estab_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('regimeTrib', v_estab_regimeTributario)
      || '</prest>';

    -- Tomador
    v_xml := v_xml
      || '<TomS>'
        || '<'|| UPPER (v_pess_tipo) || '>' || v_pess_cnpjCpfIdEstrangeiro || '</'|| UPPER (v_pess_tipo) || '>'
        || FUNC_ADD_TAG_XML ('xNome', v_pess_nomeRazaoSocial)
        || '<ender>'
          || 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)
          || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_pess_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_pess_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_pess_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_pess_paisDescricao)
        || '</ender>'
        || FUNC_ADD_TAG_XML ('xEmail', v_pess_email)
        || FUNC_ADD_TAG_XML ('IE', v_pess_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_pess_fone2)
      || '</TomS>';

    -- Construção Civil
    v_xml := v_xml
      || '<dadosDaObra>'
        || FUNC_ADD_TAG_XML ('xLogObra', v_entr_logradouro)
        || FUNC_ADD_TAG_XML ('xComplObra', v_entr_complemento)
        || FUNC_ADD_TAG_XML ('vNumeroObra', v_entr_numero)
        || FUNC_ADD_TAG_XML ('xBairroObra', v_entr_bairroDistrito)
        || FUNC_ADD_TAG_XML ('xCepObra', v_entr_cep)
        || FUNC_ADD_TAG_XML ('cCidadeObra', v_entr_municipio)
        || FUNC_ADD_TAG_XML ('xCidadeObra', v_entr_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfObra', v_entr_uf)
        || FUNC_ADD_TAG_XML ('cPaisObra', v_entr_pais)
        || FUNC_ADD_TAG_XML ('xPaisObra', v_entr_paisDescricao)
        || '<numeroArt>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</numeroArt>'
        || '<numeroCei>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</numeroCei>'
        || '<numeroProj/>'
        || '<numeroMatri/>'
      || '</dadosDaObra>';

    -- Transportadora
    v_xml := v_xml
      || '<transportadora>'
        || '<xNomeTrans>' || v_estab_nomeRazaoSocial || '</xNomeTrans>'
        || '<xCpfCnpjTrans>' || v_estab_cnpjCpfIdEstrangeiro || '</xCpfCnpjTrans>'
        || FUNC_ADD_TAG_XML ('xInscEstTrans', v_estab_inscricaoEstadual)
        || '<xPlacaTrans/>'
        || FUNC_ADD_TAG_XML ('xEndTrans', v_estab_logradouro)
        || FUNC_ADD_TAG_XML ('cMunTrans', v_estab_municipio)
        || FUNC_ADD_TAG_XML ('xMunTrans', v_estab_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfTrans', v_estab_uf)
        || FUNC_ADD_TAG_XML ('cPaisTrans', v_estab_pais)
        || FUNC_ADD_TAG_XML ('xPaisTrans', v_estab_paisDescricao)
        || '<vTipoFreteTrans>0</vTipoFreteTrans>'
      || '</transportadora>';

    -- Itens
      v_xml := v_xml
      || '<det>'
        || '<nItem>1</nItem>'
        || '<serv>'
          || '<cServ>' || COALESCE (CASE WHEN v_codigoServicoMunicipio = ' ' THEN '0' ELSE v_codigoServicoMunicipio END, '0') || '</cServ>'
          || '<cLCServ>' || REPLACE (v_listaServicos, '.', '') || '</cLCServ>'
          || '<xServ>' || COALESCE (TRIM (SUBSTR (v_descricaoServico, 1, 256)), ' ') || '</xServ>'          
          || '<localTributacao>' || v_municipioIncidencia || '</localTributacao>'
          || '<localVerifResServ>1</localVerifResServ>'
          || '<uTrib>UN</uTrib>'
          || '<qTrib>1</qTrib>'
          || '<vUnit>' || v_valorTotal || '</vUnit>'
          || '<vServ>' || v_valorTotal || '</vServ>'
          || '<vDesc>0.00</vDesc>'
          || '<vBCISS>' || v_baseIssqn || '</vBCISS>'
          || '<pISS>' || v_aliquotaIssqn || '</pISS>'
          || '<vISS>' || v_valorIssqn || '</vISS>'
          || '<vBCINSS>' || v_baseRetInss || '</vBCINSS>'
          || '<pRetINSS>' || v_retencaoInss || '</pRetINSS>'
          || '<vRetINSS>' || v_valorRetInss || '</vRetINSS>'
          || '<vRed>0.00</vRed>'
          || '<vBCRetIR>' || v_baseRetIrrf || '</vBCRetIR>'
          || '<pRetIR>' || v_retencaoIrrf || '</pRetIR>'
          || '<vRetIR>' || v_valorRetIrrf || '</vRetIR>'
          || '<vBCCOFINS>' || v_baseRetCofins || '</vBCCOFINS>'
          || '<pRetCOFINS>' || v_retencaoCofins || '</pRetCOFINS>'
          || '<vRetCOFINS>' || v_valorRetCofins || '</vRetCOFINS>'
          || '<vBCCSLL>' || v_baseRetCsll || '</vBCCSLL>'
          || '<pRetCSLL>' || v_retencaoCsll || '</pRetCSLL>'
          || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
          || '<vBCPISPASEP>' || v_baseRetPis || '</vBCPISPASEP>'
          || '<pRetPISPASEP>' || v_retencaoPis || '</pRetPISPASEP>'
          || '<vRetPISPASEP>' || v_valorRetPis || '</vRetPISPASEP>'
        || '</serv>'
      || '</det>';

    -- Totais
    v_xml := v_xml
      || '<total>'
        || '<vServ>' || v_valorTotal  || '</vServ>'
        || '<vDesc>0.00</vDesc>'
        || '<vtNF>' || v_valorTotal || '</vtNF>'
        || '<vtLiq>' || v_valorTotal || '</vtLiq>'
        || '<Ret>'
          || '<vRetIR>' || v_valorRetIrrf || '</vRetIR>'
          || '<vRetPISPASEP>' || v_valorRetPis || '</vRetPISPASEP>'
          || '<vRetCOFINS>' || v_valorRetCofins || '</vRetCOFINS>'
          || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
          || '<vRetINSS>' || v_valorRetInss || '</vRetINSS>'
        || '</Ret>'
        || '<vtLiqFaturas>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vtLiqFaturas>'
        || '<ISS>'
          || '<vBCISS>' || v_baseIssqn || '</vBCISS>'
          || '<vISS>' || v_valorIssqn || '</vISS>'
        || '</ISS>'
      || '</total>';

    -- Faturas
    v_xml := v_xml
      || '<faturas>';
    v_sequencia := 0;
    v_saldo := v_valorLiquidoItem;
    FOR a IN (
      SELECT
        fin.vencimento,
        fin.valor
      FROM MODOCFISCALXPAGAMENTOS a
      JOIN MOFINANCEIROS fin
      ON fin.idPagamentoDocFiscal = a.idPagamentoDocFiscal
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.pagamentoTroco = 'P'
      ORDER BY
        a.sequencia,
        fin.parcelaAtual)
    LOOP
      v_valor := a.valor;
      IF v_valor > v_saldo THEN
        v_valor := v_saldo;
      END IF;
      v_saldo := v_saldo - v_valor;
      IF v_valor > 0 THEN
        v_sequencia := v_sequencia + 1;
        v_xml := v_xml
        || '<fat>'
          || '<nItem>' || TO_CHAR (v_sequencia) || '</nItem>'
          || '<nFat>' || v_numeroRPS || '/' || TO_CHAR (v_sequencia) || '</nFat>'
          || '<dVenc>' || CASE WHEN a.vencimento IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.vencimento, 'YYYY-MM-DD') END || '</dVenc>'
          || '<vFat>' || REPLACE (TO_CHAR (v_valor, 'FM9999999999990D00'), ',', '.') || '</vFat>'
        || '</fat>';
      END IF;
    END LOOP;
    v_xml := v_xml
      || '</faturas>';

    -- Outros
    v_xml := v_xml
      || '<infAdicLT>' || v_municipioIncidencia || '</infAdicLT>'
      || FUNC_ADD_TAG_XML ('infAdic',v_outrasInformacoes)
    || '</infNFSe>'
  || '</NFS-e>'
|| '</envioLote>';

-- Município: 4308607 - Garibaldi - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4308607' 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>' || v_serieFiscal || '</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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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 := '<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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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>'
            || '<Art>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</Art>'
          || '</ConstrucaoCivil>';
    END IF;

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

-- 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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</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 := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">'
      || '<LoteRps Id="L' || p_loteWebService || '">'
        || '<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="R' || v_numeroRPS || '00000">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>00000</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE
                  -- 6.9 Prestação outro Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '69'
                  -- 5.9 Prestação no Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                  THEN '59'
                  -- 6.8 Prestação outro Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação  pelo ISS. 
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '68'
                  -- 5.8 Prestação no Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação pelo ISS.
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                  THEN '58'
                  -- 6.3 Prestação outro Município: Imposto devido fora de São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                    AND v_issRetido = '1'
                  THEN '63'
                  -- 6.4 Prestação outro Município: Imposto devido fora de São Leopoldo, sem obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '64'
                  -- 6.1 Prestação outro Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                    AND v_issRetido = '1'
--                  THEN '61'
                  -- 6.2 Prestação outro Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                  THEN '62'
                  -- 5.1 Prestação no Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_issRetido = '1'
                  THEN '51'
                  -- 5.2 Prestação no Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;  
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  ELSE '52'
                  -- NÃO TRATADOS:
                  -- 7.8 Prestação no Exterior: Não tributável; Utilizar quando o serviço prestado não sofrer tributação
                END || '</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_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<BaseCalculo>' || v_baseIssqn || '</BaseCalculo>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<ValorLiquidoNfse>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</ValorLiquidoNfse>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
--                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</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>'
                || '<Contato>'
                  || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                  || FUNC_ADD_TAG_XML ('Email', v_pess_email)
                || '</Contato>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
                || '<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>'
                || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

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

-- 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_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</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_codigoServicoMunicipio || '</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;

/

