DROP TABLE TEMPFORMPRECOPRODUTOS;

-- TEMPFORMPRECOPRODUTOS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOPRODUTOS
  (
    sessaoClient                   VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id                             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    legenda                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    selecionado                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imagem                         VARCHAR (256) DEFAULT ' ' NOT NULL,
    gradeProduto                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    cor                            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    tamanho                        VARCHAR (10) DEFAULT ' ' NOT NULL,
    personalizacao                 NUMERIC (7,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    quantidade                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    idProdutoXCustoAnterior        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoCustoAnterior             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    idProdutoXCustoAtualizado      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoCustoAtualizado           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUltimaCompraNovo          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoNovo                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percentualVariacao             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    preDocumento                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumento                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idDocumento                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntrada                    DATE,
    idCenarioCalculoPreco          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    compraComST                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    retidoISSQN                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    valorISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetIRRF                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetINSS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetOutros                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMercantil NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesaAduaneira          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJuros                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesas            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOperacional  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOperacional NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtemporaneo     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    prazoMedioPonderado            NUMERIC (6,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOPRODUTOS_PK1 ON TEMPFORMPRECOPRODUTOS (sessaoClient, contadorSessao, id);
CREATE INDEX TEMPFORMPRECOPRODUTOS_K2 ON TEMPFORMPRECOPRODUTOS (sessaoClient, contadorSessao, idPai, id);

DROP TABLE TEMPFORMPRECOTABELAS;

-- TEMPFORMPRECOTABELAS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOTABELAS
  (
    sessaoClient              VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tabelaPreco               VARCHAR (10) DEFAULT ' ' NOT NULL,
    selecionado               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idCenarioCalculoPreco     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscal            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormacaoPrecoTabela     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPrecoTabelaAtual        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioAtual        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percMargemAdicionalAtual  NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicionalAtual NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkupAtual         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    idPrecoTabelaNovo         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioNovo         NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percMargemAdicionalNovo   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargemAdicionalNovo  NUMERIC (15,7) DEFAULT 0 NOT NULL,
    margemMarkupNovo          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percentualVariacao        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    margemMarkupIdeal         NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOTABELAS_PK1 ON TEMPFORMPRECOTABELAS (sessaoClient, contadorSessao, id);
CREATE INDEX TEMPFORMPRECOTABELAS_K2 ON TEMPFORMPRECOTABELAS (sessaoClient, contadorSessao, idPai, id);

DROP TABLE TEMPFORMPRECOINCIDENCIAS;

-- TEMPFORMPRECOINCIDENCIAS
CREATE GLOBAL TEMPORARY TABLE TEMPFORMPRECOINCIDENCIAS
  (
    sessaoClient            VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPai                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (120) DEFAULT ' ' NOT NULL,
    somaDiminuiIgnora       CHAR (1) DEFAULT ' ' NOT NULL,
    percentualBase          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBase               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    indicadorConta          CHAR (1) DEFAULT ' ' NOT NULL,
    valor                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percSobreReceita        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreReceitaLiquida NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreCusto          NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPFORMPRECOINCIDENCIAS_PK1 ON TEMPFORMPRECOINCIDENCIAS (sessaoClient, contadorSessao, idPai, ordenacao);

UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'ISSQN não Retido' WHERE incidenciaFormacaoPreco = 2008;
UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'ISSQN Retido' WHERE incidenciaFormacaoPreco = 2009;
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2010, 'IRRF Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2011, 'INSS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2012, 'COFINS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2013, 'PIS Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2014, 'CSLL Retido', 1, 20, 1, 1, 0, ' ');
INSERT INTO SIINCIDENCIASFORMACAOPREC (incidenciaFormacaoPreco, descricao, ativo, categoriaFormacaoPreco, permiteBuscarDocumento, validoCompra, validoVenda, observacoes) values (2015, 'Outras Retenções', 1, 20, 1, 1, 0, ' ');
UPDATE PACENARIOCALCPRECOINCID SET incidenciaFormacaoPreco = 2010 WHERE incidenciaFormacaoPreco = 2008;
UPDATE PACENARIOCALCPRECOINCID SET incidenciaFormacaoPreco = 2014 WHERE incidenciaFormacaoPreco = 2009;
UPDATE CAPRODUTOXCUSTOXALIQUOTAS SET incidenciaFormacaoPreco = 2010 WHERE incidenciaFormacaoPreco = 2008;
UPDATE CAPRODUTOXCUSTOXALIQUOTAS SET incidenciaFormacaoPreco = 2014 WHERE incidenciaFormacaoPreco = 2009;

COMMIT;

-- SIENTRADASAIDADRE
CREATE TABLE SIENTRADASAIDADRE
  (
    entradaSaidaDre CHAR (1) DEFAULT ' ' NOT NULL,
    descricao       VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes     VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIENTRADASAIDADRE ADD CONSTRAINT SIENTRADASAIDADRE_PK1 PRIMARY KEY (entradaSaidaDre);
CREATE INDEX SIENTRADASAIDADRE_K2 ON SIENTRADASAIDADRE (descricao);

INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values (' ','SELECIONE', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('D','DRE', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('E','Entrada', 1, ' ');
INSERT INTO SIENTRADASAIDADRE (entradaSaidaDre, descricao, ativo, observacoes) values ('S','Saída', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIENTRADASAIDADRE', 'Entrada / Saída / DRE', 1, 803, 'SI', 'entradaSaidaDre', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqEntradaSaidaDre', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (991, 'Entrada / Saída / DRE', 1, 9090009910, 90, 'SIS', 0, 991, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqEntradaSaidaDre', ' ', 0, 0, NULL, ' ');

COMMIT;

-- 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,
    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 (operacaoFiscalEntrada) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MOAVALIAMARGENSPRODUTOS ADD CONSTRAINT MOAVALIAMARGENSPRODUTOS_FK19 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, 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, ' ');

COMMIT;

-- MOAVALIAMARGEMPRODXINCID
CREATE TABLE MOAVALIAMARGEMPRODXINCID
  (
    id                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    entradaSaidaDre         CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (120) DEFAULT ' ' NOT NULL,
    somaDiminuiIgnora       CHAR (1) DEFAULT ' ' NOT NULL,
    percentualBase          NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBase               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    indicadorConta          CHAR (1) DEFAULT ' ' NOT NULL,
    valor                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percSobreReceita        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreReceitaLiquida NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percSobreCusto          NUMERIC (15,8) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXINCID_K2 ON MOAVALIAMARGEMPRODXINCID (idAvaliaMargemProduto, entradaSaidaDre, ordenacao);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK2 FOREIGN KEY (entradaSaidaDre) REFERENCES SIENTRADASAIDADRE (entradaSaidaDre);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK3 FOREIGN KEY (somaDiminuiIgnora) REFERENCES SISOMADIMINUIIGNORA (somaDiminuiIgnora);
ALTER TABLE MOAVALIAMARGEMPRODXINCID ADD CONSTRAINT MOAVALIAMARGEMPRODXINCID_FK4 FOREIGN KEY (indicadorConta) REFERENCES SIINDICADORCONTA (indicadorConta);

INSERT INTO MOAVALIAMARGEMPRODXINCID (id, idAvaliaMargemProduto, entradaSaidaDre, ordenacao, descricao, somaDiminuiIgnora, percentualBase, valorBase, indicadorConta, valor, percSobreReceita, percSobreReceitaLiquida, percSobreCusto) VALUES (0, 0, ' ', 0, ' ', ' ', 0, 0, ' ', 0, 0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXORCAM
CREATE TABLE MOAVALIAMARGEMPRODXORCAM
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento       NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXORCAM_K2 ON MOAVALIAMARGEMPRODXORCAM (idAvaliaMargemProduto, idItemOrcamento);
CREATE INDEX MOAVALIAMARGEMPRODXORCAM_K3 ON MOAVALIAMARGEMPRODXORCAM (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXORCAM_K4 ON MOAVALIAMARGEMPRODXORCAM (idItemOrcamento);
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXORCAM ADD CONSTRAINT MOAVALIAMARGEMPRODXORCAM_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

INSERT INTO MOAVALIAMARGEMPRODXORCAM (id, idAvaliaMargemProduto, idItemOrcamento) VALUES (0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXPREDOC
CREATE TABLE MOAVALIAMARGEMPRODXPREDOC
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento    NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXPREDOC_K2 ON MOAVALIAMARGEMPRODXPREDOC (idAvaliaMargemProduto, idItemPreDocumento);
CREATE INDEX MOAVALIAMARGEMPRODXPREDOC_K3 ON MOAVALIAMARGEMPRODXPREDOC (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXPREDOC_K4 ON MOAVALIAMARGEMPRODXPREDOC (idItemPreDocumento);
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXPREDOC ADD CONSTRAINT MOAVALIAMARGEMPRODXPREDOC_FK2 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);

INSERT INTO MOAVALIAMARGEMPRODXPREDOC (id, idAvaliaMargemProduto, idItemPreDocumento) VALUES (0, 0, 0);

COMMIT;

-- MOAVALIAMARGEMPRODXDOCFISC
CREATE TABLE MOAVALIAMARGEMPRODXDOCFISC
  (
    id                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAvaliaMargemProduto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal       NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOAVALIAMARGEMPRODXDOCFISC_K2 ON MOAVALIAMARGEMPRODXDOCFISC (idAvaliaMargemProduto, idItemDocFiscal);
CREATE INDEX MOAVALIAMARGEMPRODXDOCFISC_K3 ON MOAVALIAMARGEMPRODXDOCFISC (idAvaliaMargemProduto);
CREATE INDEX MOAVALIAMARGEMPRODXDOCFISC_K4 ON MOAVALIAMARGEMPRODXDOCFISC (idItemDocFiscal);
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK1 FOREIGN KEY (idAvaliaMargemProduto) REFERENCES MOAVALIAMARGENSPRODUTOS (idAvaliaMargemProduto);
ALTER TABLE MOAVALIAMARGEMPRODXDOCFISC ADD CONSTRAINT MOAVALIAMARGEMPRODXDOCFISC_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

INSERT INTO MOAVALIAMARGEMPRODXDOCFISC (id, idAvaliaMargemProduto, idItemDocFiscal) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGENSPRODUTOS', 'Avalia Margens Produtos', 1, 50509, 'MO', 'idAvaliaMargemProduto', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXINCID', 'Avalia Margem Produto X Índices', 1, 50510, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXORCAM', 'Avalia Margem Produto X Orçamentos', 1, 50511, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXPREDOC', 'Avalia Margem Produto X Pré-Documentos', 1, 50512, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOAVALIAMARGEMPRODXDOCFISC', 'Avalia Margem Produto X Documentos Fiscais', 1, 50513, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

UPDATE SITABELASSISTEMA SET ordenacao = 50515 WHERE tabelaSistema= 'MOLINKSPAGAMENTO'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50516 WHERE tabelaSistema= 'MOLINKPAGAMENTOXBAIXAS'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50517 WHERE tabelaSistema= 'MOLINKPAGAMENTOXORCAMENTO'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50518 WHERE tabelaSistema= 'MOLINKPAGAMENTOXPREDOCUM'; 
UPDATE SITABELASSISTEMA SET ordenacao = 50519 WHERE tabelaSistema= 'MOLINKPAGAMENTOXDOCFISCAL'; 

COMMIT;

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_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_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.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,
    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.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 PROCEDURE ADD_AVALMARG_INCIDENCIA_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_entradaSaidaDre           IN CHAR,
  p_ordenacao                 IN NUMBER,
  p_descricao                 IN VARCHAR,
  p_somaDiminuiIgnora         IN CHAR,
  p_percentualBase            IN NUMBER,
  p_valorBase                 IN NUMBER,
  p_indicadorConta            IN CHAR,
  p_valor                     IN NUMBER,
  p_percSobreReceita          IN NUMBER,
  p_percSobreReceitaLiquida   IN NUMBER,
  p_percSobreCusto            IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOAVALIAMARGEMPRODXINCID
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND entradaSaidaDre         = p_entradaSaidaDre
    AND ordenacao               = p_ordenacao;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXINCID',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXINCID a 
  USING (
    SELECT
      r_id                      id,
      p_idAvaliaMargemProduto   idAvaliaMargemProduto,
      p_entradaSaidaDre         entradaSaidaDre,
      p_ordenacao               ordenacao,
      p_descricao               descricao,
      p_somaDiminuiIgnora       somaDiminuiIgnora,
      p_percentualBase          percentualBase,
      p_valorBase               valorBase,
      p_indicadorConta          indicadorConta,
      p_valor                   valor,
      p_percSobreReceita        percSobreReceita,
      p_percSobreReceitaLiquida percSobreReceitaLiquida,
      p_percSobreCusto          percSobreCusto
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto   = b.idAvaliaMargemProduto,
    a.entradaSaidaDre         = b.entradaSaidaDre,
    a.ordenacao               = b.ordenacao,
    a.descricao               = b.descricao,
    a.somaDiminuiIgnora       = b.somaDiminuiIgnora,
    a.percentualBase          = b.percentualBase,
    a.valorBase               = b.valorBase,
    a.indicadorConta          = b.indicadorConta,
    a.valor                   = b.valor,
    a.percSobreReceita        = b.percSobreReceita,
    a.percSobreReceitaLiquida = b.percSobreReceitaLiquida,
    a.percSobreCusto          = b.percSobreCusto
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    entradaSaidaDre,
    ordenacao,
    descricao,
    somaDiminuiIgnora,
    percentualBase,
    valorBase,
    indicadorConta,
    valor,
    percSobreReceita,
    percSobreReceitaLiquida,
    percSobreCusto)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.entradaSaidaDre,
    b.ordenacao,
    b.descricao,
    b.somaDiminuiIgnora,
    b.percentualBase,
    b.valorBase,
    b.indicadorConta,
    b.valor,
    b.percSobreReceita,
    b.percSobreReceitaLiquida,
    b.percSobreCusto);
END ADD_AVALMARG_INCIDENCIA_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_ORCAMENTO_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemOrcamento           IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOAVALIAMARGEMPRODXORCAM
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemOrcamento         = p_idItemOrcamento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXORCAM',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXORCAM a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemOrcamento       idItemOrcamento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemOrcamento       = b.idItemOrcamento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemOrcamento)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemOrcamento);
END ADD_AVALMARG_ORCAMENTO_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_PRE_DOC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemPreDocumento        IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOAVALIAMARGEMPRODXPREDOC
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemPreDocumento      = p_idItemPreDocumento;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXPREDOC',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXPREDOC a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemPreDocumento    idItemPreDocumento
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemPreDocumento    = b.idItemPreDocumento
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemPreDocumento)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemPreDocumento);
END ADD_AVALMARG_PRE_DOC_GRAVA;

/

create or replace PROCEDURE ADD_AVALMARG_DOC_FISC_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idAvaliaMargemProduto     IN NUMBER,
  p_idItemDocFiscal           IN NUMBER,
  r_id                        OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE (MAX (id), 0)
    INTO r_id
    FROM MOAVALIAMARGEMPRODXDOCFISC
    WHERE idAvaliaMargemProduto = p_idAvaliaMargemProduto
    AND idItemDocFiscal         = p_idItemDocFiscal;
  END IF;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOAVALIAMARGEMPRODXDOCFISC',
      'id',
      14);
  END IF;
  MERGE INTO MOAVALIAMARGEMPRODXDOCFISC a 
  USING (
    SELECT
      r_id                    id,
      p_idAvaliaMargemProduto idAvaliaMargemProduto,
      p_idItemDocFiscal       idItemDocFiscal
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idAvaliaMargemProduto = b.idAvaliaMargemProduto,
    a.idItemDocFiscal       = b.idItemDocFiscal
  WHEN NOT MATCHED THEN INSERT (
    id,
    idAvaliaMargemProduto,
    idItemDocFiscal)
  VALUES (
    b.id,
    b.idAvaliaMargemProduto,
    b.idItemDocFiscal);
END ADD_AVALMARG_DOC_FISC_GRAVA;

/

UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Bruta' WHERE categoriaFormacaoPreco = 50;
UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Antes Desp./Rec. Financ.' WHERE categoriaFormacaoPreco = 75;
UPDATE SICATEGORIASFORMACAOPRECO SET descricao = '(=) Margem Contribuição' WHERE categoriaFormacaoPreco = 90;

COMMIT;

UPDATE SIINCIDENCIASFORMACAOPREC SET descricao = 'Comissão Média' WHERE incidenciaFormacaoPreco = 6503;

COMMIT;

create or replace FUNCTION FUNC_ADD_BUSCA_OPERAC_FISC_NCM (
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_pessoa                   IN NUMBER,
  p_cab_vendaConsumidor          IN NUMBER,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_est_grupoFiscal              IN NUMBER,
  p_pessEst_regimeTributario     IN CHAR,
  p_endPessEstMun_uf             IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  p_endPessMun_uf                IN CHAR,
  p_produto                      IN NUMBER,
  p_prod_idNcm                   IN NUMBER)
  RETURN NUMBER
IS
  v_operacaoFiscal NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT a.operacaoFiscal
    FROM (
      SELECT a.operacaoFiscal,
        ROW_NUMBER() OVER (
          ORDER BY
            a.filtrarPessoas DESC,
            CASE
              WHEN a.agrupadorFiscal = 0
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM PAAGRUPFISCXPRODUTOS opX
                WHERE opX.agrupadorFiscal = a.agrupadorFiscal
                AND opX.produto = p_produto
                AND opX.ativo = 1)
              THEN 2
              ELSE 1
            END DESC,
            CASE
              WHEN filtrProd.filtroProduto = 0
              THEN 0
              WHEN filtrProd.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
                WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
                AND filtrProdX.produto = p_produto
                AND filtrProdX.ativo = 1)
              THEN 2
              ELSE 1
            END DESC,
            a.ufDestino DESC,
            a.ufOrigem DESC,
            a.regimeTributario DESC,
            a.indicadorInscricaoEstadual DESC,
            a.indicadorConsumidorFinal DESC,
            a.grupoFiscal DESC,
            a.origemMercadoria DESC,
            a.tipoProduto DESC,
            a.operacaoFiscal DESC) ordenacao
      FROM PAOPERACOESFISCAIS a
      JOIN CAPRODUTOS prod
      ON prod.produto = p_produto
      JOIN PASUBCATEGORIASPRODUTO subCat
      ON subCat.subcategoriaProduto = prod.subcategoriaProduto
      JOIN SICFOPS cfop
      ON cfop.cfop = a.cfop
      JOIN SINATUREZASOPERACAO natOp
      ON natOp.naturezaOperacao = cfop.naturezaOperacao
      JOIN SICAPITULOSNATUREZAOPERAC capNatFisc
      ON capNatFisc.capituloNaturezaOperacao = natOp.capituloNaturezaOperacao
      JOIN PAFILTROSPRODUTO filtrProd
      ON filtrProd.filtroProduto = a.filtroProduto
      WHERE a.operacaoFiscal > 0
      AND a.ativo = 1
      AND a.cfop BETWEEN
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3000 ELSE 7000 END
          WHEN p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1000 ELSE 5000 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2000 ELSE 6000 END
        END
        AND
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3999 ELSE 7999 END
          WHEN p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1999 ELSE 5999 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2999 ELSE 6999 END
        END
      AND TRUNC(a.dataValidadeInicial) <= TRUNC(SYSDATE)
      AND TRUNC(a.dataValidadeFinal)   >= TRUNC(SYSDATE)
      AND capNatFisc.entradaSaida = p_cab_entradaSaida
      AND (a.regimeTributario = ' '
        OR a.regimeTributario = p_pessEst_regimeTributario)
      AND (a.tipoProduto = '  '
        OR a.tipoProduto = prod.tipoProduto)
      AND (a.origemMercadoria = ' '
        OR a.origemMercadoria = prod.origemMercadoria)
      AND (a.grupoFiscal = 0
        OR a.grupoFiscal = p_est_grupoFiscal)
      AND (a.ufOrigem = '  '
        OR a.ufOrigem =
          CASE
            WHEN p_cab_entradaSaida = 'S'
            OR p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.ufDestino = '  '
        OR a.ufDestino =
          CASE
            WHEN p_cab_entradaSaida = 'E'
            OR p_endPessMun_uf = '  '
            OR p_cab_vendaConsumidor = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.indicadorConsumidorFinal = ' '
        OR p_cab_indicadorConsumidorFinal = ' '
        OR a.indicadorConsumidorFinal = p_cab_indicadorConsumidorFinal)
      AND (a.indicadorInscricaoEstadual = ' '
        OR p_pess_indicadorInscricaoEstad = ' '
        OR a.indicadorInscricaoEstadual = p_pess_indicadorInscricaoEstad)
      AND (p_cab_modeloDocumento = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXMODELOSDOCUM opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.modeloDocumento = p_cab_modeloDocumento
          AND opX.ativo = 1))
      AND (a.filtrarPessoas = 0
        OR p_cab_vendaConsumidor = 0 
        AND EXISTS (
          SELECT 1
          FROM PAOPERFISCALXPESSOAS opX
          WHERE opX.operacaoFiscal = a.operacaoFiscal
          AND opX.pessoa = p_cab_pessoa
          AND opX.ativo = 1))
      AND (a.agrupadorFiscal = 0
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXPRODUTOS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.produto = p_produto
          AND opX.ativo = 1)
        OR EXISTS (
          SELECT 1
          FROM PAAGRUPFISCXNCMS opX
          WHERE opX.agrupadorFiscal = a.agrupadorFiscal
          AND opX.idNcm = p_prod_idNcm
          AND opX.ativo = 1))
      AND (a.filtroProduto = 0
        OR filtrProd.filtrarProdutos = 0
        AND filtrProd.filtrarCategoriasProdutos = 0
        AND filtrProd.filtrarSubcategoriasProdutos = 0
        AND filtrProd.filtrarMarcas = 0
        AND filtrProd.filtrarCaracteristicasA = 0
        AND filtrProd.filtrarCaracteristicasB = 0
        AND filtrProd.filtrarCaracteristicasC = 0
        AND filtrProd.filtrarCaracteristicasD = 0
        AND filtrProd.filtrarCaracteristicasE = 0
        AND filtrProd.filtrarCores = 0
        AND filtrProd.filtrarTamanhos = 0
        AND filtrProd.filtrarNCMs = 0
        AND filtrProd.filtrarListasServicos = 0
        OR filtrProd.filtrarProdutos = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.produto = p_produto
          AND filtrProdX.ativo = 1)
        OR (filtrProd.filtrarCategoriasProdutos = 1
          OR filtrProd.filtrarSubcategoriasProdutos = 1
          OR filtrProd.filtrarMarcas = 1
          OR filtrProd.filtrarCaracteristicasA = 1
          OR filtrProd.filtrarCaracteristicasB = 1
          OR filtrProd.filtrarCaracteristicasC = 1
          OR filtrProd.filtrarCaracteristicasD = 1
          OR filtrProd.filtrarCaracteristicasE = 1
          OR filtrProd.filtrarCores = 1
          OR filtrProd.filtrarTamanhos = 1
          OR filtrProd.filtrarNCMs = 1
          OR filtrProd.filtrarListasServicos = 1)
        AND (filtrProd.filtrarCategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.categoriaProduto = subCat.categoriaProduto
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarSubcategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarMarcas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXMARCAS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.marca = prod.marca
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasA = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERA filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaA = prod.caracteristicaA
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasB = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERB filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaB = prod.caracteristicaB
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasC = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERC filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaC = prod.caracteristicaC
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasD = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERD filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaD = prod.caracteristicaD
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarCaracteristicasE = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.caracteristicaE = prod.caracteristicaE
            AND filtrProdX.ativo = 1))
        AND filtrProd.filtrarCores = 0
        AND filtrProd.filtrarTamanhos = 0
        AND (filtrProd.filtrarNCMs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXNCMS filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.idNcm = p_prod_idNcm
            AND filtrProdX.ativo = 1))
        AND (filtrProd.filtrarListasServicos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXLISTASSE filtrProdX
            WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
            AND filtrProdX.listaServicos = prod.listaServicos
            AND filtrProdX.ativo = 1)))) a
    WHERE a.ordenacao = 1), 0)
  INTO v_operacaoFiscal
  FROM DUAL;
  RETURN v_operacaoFiscal;
END;

/

DROP TABLE TEMPQUESTIONARIO;

-- TEMPQUESTIONARIO
CREATE GLOBAL TEMPORARY TABLE TEMPQUESTIONARIO
  (
    sessaoClient                 VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contador                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    excluido                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    subOrdenacao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idSalvar                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idQuestionario               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeCampo                    VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoCampo                    CHAR (1) DEFAULT ' ' NOT NULL,
    mascara                      VARCHAR (30) DEFAULT ' ' NOT NULL,
    exibirCampo                  CHAR (1) DEFAULT ' ' NOT NULL,
    obrigatorio                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tabelaSistema                VARCHAR (30) DEFAULT ' ' NOT NULL,
    numeroDigitosCampoId         NUMERIC (6,0) DEFAULT 0 NOT NULL,
    conteudoId                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    conteudoCodigo               VARCHAR (256) DEFAULT ' ' NOT NULL,
    conteudoCodigoDescricao      VARCHAR (300) DEFAULT ' ' NOT NULL,
    conteudoCombo                VARCHAR (256) DEFAULT ' ' NOT NULL,
    conteudoComboItemList        CLOB,
    conteudoComboDisplayList     CLOB,
    conteudoData                 DATE,
    conteudoHora                 CHAR (6),
    conteudoLogico               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    conteudoNumerico             NUMERIC (16,8) DEFAULT 0 NOT NULL,
    conteudoEdit                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPQUESTIONARIO_PK1 ON TEMPQUESTIONARIO (sessaoClient, contadorSessao, contador);
CREATE INDEX TEMPQUESTIONARIO_K2 ON TEMPQUESTIONARIO (sessaoClient, contadorSessao, excluido, ordenacao, subOrdenacao);

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_EFETIVA (
  p_sessaoClient                IN VARCHAR,
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_contadorSessao              IN NUMERIC,
  p_DocFisc_PreDoc_Orcam_Tarefa IN CHAR,
  p_idPai                       IN NUMBER)
IS
  v_idSalvar  NUMBER;
  v_ordenacao NUMBER;
BEGIN
  FOR a IN (
    SELECT
      contador,
      idSalvar
    FROM TEMPQUESTIONARIO
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessao
    AND excluido = 1
    AND idSalvar > 0)
  LOOP
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      DELETE MODOCFISCALXPERSPROJETO b
      WHERE b.idPersonProjetoDocFiscal = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      DELETE MOPREDOCUMXPERSPROJETO b
      WHERE b.idPersonProjetoPreDocumento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      DELETE MOORCAMENTOXPERSPROJETO b
      WHERE b.idPersonProjetoOrcamento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      DELETE MOORCAMENTOXTAREFAS b
      WHERE b.idTarefaOrcamento = a.idSalvar;
    END IF;
  END LOOP;
  FOR a IN (
    SELECT
      a.contador,
      a.idSalvar,
      a.idQuestionario,
      CASE
        WHEN a.tabelaSistema <> ' '
        THEN
          CASE
            WHEN tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
              OR tabSist.tipoCampoCodigo = 'N'
            THEN CASE WHEN a.conteudoId = 0 THEN ' ' ELSE TRIM (TO_CHAR (a.conteudoId)) END
            ELSE a.conteudoCodigo
          END
        WHEN a.tipoCampo = 'D'
        THEN CASE WHEN COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') = '00/00/0000' THEN ' ' ELSE COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') END
        WHEN a.tipoCampo = 'H'
        THEN CASE WHEN COALESCE (conteudoHora, '000000') = '000000' THEN ' ' ELSE COALESCE (SUBSTR (a.conteudoHora, 1, 2) || ':' || SUBSTR (a.conteudoHora, 3, 2) || ':' || SUBSTR (a.conteudoHora, 5, 2), '00:00:00') END 
        WHEN a.tipoCampo = 'L'
        THEN
          CASE
            WHEN a.conteudoLogico = '1'
            THEN 'S'
            ELSE ' '
          END
        WHEN a.tipoCampo = 'N'
        THEN CASE WHEN a.conteudoNumerico = 0 THEN ' ' ELSE REPLACE (TRIM (TO_CHAR (a.conteudoNumerico, 'FM99999999999999999990D99999999999999999990')), '.', ',') END
        WHEN a.exibirCampo = 'P'
        THEN a.conteudoCombo
        ELSE a.conteudoEdit
      END conteudo,
      a.observacoes
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_idSalvar  := a.idSalvar;
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      ADD_DOC_FISC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoDocFiscal
        p_idPai, -- p_idDocumentoFiscal
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      ADD_PRE_DOC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoPreDocumento
        p_idPai, -- p_preDocumento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      ADD_ORCAMENTO_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoOrcamento
        p_idPai, -- p_orcamento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      v_ordenacao := 0;
      IF v_idSalvar > 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0)
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idTarefaOrcamento = v_idSalvar;
      END IF;
      IF v_ordenacao <= 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0) + 1
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idAtividadePrevOrcamento = p_idPai
        AND idCheckListXTarefas = a.idQuestionario;
      END IF;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        v_idSalvar, -- p_idTarefaOrcamento
        p_idPai, -- p_idAtividadePrevOrcamento
        a.idQuestionario, -- p_idCheckListXTarefas
        v_ordenacao,
        a.conteudo,
        a.observacoes,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    END IF;
  END LOOP;
  DELETE TEMPQUESTIONARIO b
  WHERE b.sessaoClient = p_sessaoClient
  AND b.contadorSessao = p_contadorSessao;
END ADD_TEMPQUESTIONARIO_EFETIVA;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_DOC (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_idDocumentoFiscal            IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoDocFiscal, 0) idPersonProjetoDocFiscal,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MODOCFISCALXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.idDocumentoFiscal = p_idDocumentoFiscal
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoDocFiscal IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoDocFiscal, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoDocFiscal;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoDocFiscal, -- subOrdenacao
        a.idPersonProjetoDocFiscal, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_DOC;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_ORC (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_orcamento                    IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.tipoArquivo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoOrcamento, 0) idPersonProjetoOrcamento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOORCAMENTOXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.orcamento = p_orcamento
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoOrcamento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoOrcamento, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoOrcamento;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoOrcamento, -- subOrdenacao
        a.idPersonProjetoOrcamento, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_ORC;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_PRE (
  p_sessaoClient                 IN VARCHAR,
  p_contadorSessao               IN NUMERIC,
  p_preDocumento                 IN NUMBER,
  p_categoriaProjeto             IN NUMBER,
  r_numeroPersonalizacoesProjeto OUT NUMBER)
IS
  v_contadorCriar            NUMBER;
  v_contadorSalvar           NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  r_numeroPersonalizacoesProjeto := 0;
  UPDATE TEMPQUESTIONARIO
  SET excluido = 1
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  SELECT COALESCE (MAX (contador), 0)
  INTO v_contadorCriar
  FROM TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  FOR a IN (
    SELECT
      a.personalizacaoProjeto,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idPersonProjetoPreDocumento, 0) idPersonProjetoPreDocumento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo
    FROM PAPERSONALIZACOESPROJETO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOPREDOCUMXPERSPROJETO b
    ON b.personalizacaoProjeto = a.personalizacaoProjeto
    AND b.preDocumento = p_preDocumento
    WHERE a.categoriaProjeto = p_categoriaProjeto
    AND (a.ativo = 1
      OR b.idPersonProjetoPreDocumento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idPersonProjetoPreDocumento, 0))
  LOOP
    r_numeroPersonalizacoesProjeto := r_numeroPersonalizacoesProjeto + 1;
    SELECT COALESCE (MAX (b.contador), 0)
    INTO v_contadorSalvar
    FROM TEMPQUESTIONARIO b
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.idQuestionario = a.personalizacaoProjeto
    AND b.idSalvar = a.idPersonProjetoPreDocumento;
    IF v_contadorSalvar > 0 THEN
      UPDATE TEMPQUESTIONARIO b
      SET b.excluido = 0
      WHERE b.sessaoClient = p_sessaoClient
      AND b.contadorSessao = p_contadorSessao
      AND b.contador = v_contadorSalvar;
    ELSE
      v_contadorCriar            := v_contadorCriar + 1;
      v_conteudoComboItemList    := NULL;
      v_conteudoComboDisplayList := NULL;
      IF a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
      THEN
        SELECT
          TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
          TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
        INTO
          v_conteudoComboItemList,
          v_conteudoComboDisplayList
        FROM PAOPCOESCOMBOPERSPROJETO opcoes
        WHERE opcoes.personalizacaoProjeto = a.personalizacaoProjeto
        AND opcoes.ativo = 1;
      END IF;
      INSERT INTO TEMPQUESTIONARIO (
        sessaoClient,
        contadorSessao,
        contador,
        excluido,
        ordenacao,
        subOrdenacao,
        idSalvar,
        idQuestionario,
        nomeCampo,
        tipoCampo,
        mascara,
        exibirCampo,
        obrigatorio,
        tabelaSistema,
        conteudoId,
        conteudoCodigo,
        conteudoCodigoDescricao,
        conteudoCombo,
        conteudoComboItemList,
        conteudoComboDisplayList,
        conteudoData,
        conteudoHora,
        conteudoLogico,
        conteudoNumerico,
        conteudoEdit,
        observacoes)
      VALUES (
        p_sessaoClient,
        p_contadorSessao,
        v_contadorCriar,
        0, -- excluido
        a.sequencia, -- ordenacao
        a.idPersonProjetoPreDocumento, -- subOrdenacao
        a.idPersonProjetoPreDocumento, -- idSalvar
        a.personalizacaoProjeto, -- idQuestionario
        a.descricao, -- nomeCampo,
        a.tipoCampo,
        a.mascara,
        a.exibirCampo,
        a.obrigatorio,
        a.tabelaSistema,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
            OR a.tipoCampoCodigo = 'N')
          AND a.conteudo <> ' '
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoId
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.nomeCampoIdSeDiferenteCodigo = ' '
          AND a.tipoCampoCodigo <> 'N'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCodigo,
        CASE
          WHEN a.tabelaSistema <> ' '
          AND a.conteudo <> ' '
          THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
            a.tabelaSistema,
            a.conteudo,
            a.nomeCampoCodigo,
            a.tipoCampoCodigo,
            a.numeroDigitosCodigo,
            a.nomeCampoDescricao,
            a.adicionarCodigoNaDescricao,
            a.nomeCampoIdSeDiferenteCodigo,
            a.numeroDigitosCampoId)
          ELSE ' '
        END, -- conteudoCodigoDescricao,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo = 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoCombo,
        v_conteudoComboItemList,
        v_conteudoComboDisplayList,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'D'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00/00/0000'
          THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
          ELSE NULL
        END, -- conteudoData,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'H'
          AND a.conteudo <> ' '
          AND a.conteudo <> '00:00:00'
          THEN REPLACE (a.conteudo, ':', '')
          ELSE '000000'
        END, -- conteudoHora,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'L'
          AND a.conteudo = 'S'
          THEN 1
          ELSE 0
        END, -- conteudoLogico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'N'
          AND a.conteudo <> ' '
          AND a.conteudo <> '0'
          THEN TO_NUMBER (a.conteudo)
          ELSE 0
        END, -- conteudoNumerico,
        CASE
          WHEN a.tabelaSistema = ' '
          AND a.tipoCampo = 'A'
          AND a.exibirCampo <> 'P'
          AND a.conteudo <> ' '
          THEN a.conteudo
          ELSE ' '
        END, -- conteudoEdit,
        ' '); -- observacoes
    END IF;
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_PRE;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_GERA_TAR (
  p_sessaoClient             IN VARCHAR,
  p_contadorSessao           IN NUMERIC,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_checkList                IN NUMBER)
IS
  v_contador                 NUMBER;
  v_conteudoComboItemList    CLOB;
  v_conteudoComboDisplayList CLOB;
BEGIN
  DELETE TEMPQUESTIONARIO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  v_contador := 0;
  FOR a IN (
    SELECT
      a.idCheckListXTarefas,
      a.sequencia,
      a.descricao,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      tabSist.nomeCampoCodigo,
      tabSist.tipoCampoCodigo,
      tabSist.numeroDigitosCodigo,
      tabSist.nomeCampoDescricao,
      tabSist.adicionarCodigoNaDescricao,
      tabSist.nomeCampoIdSeDiferenteCodigo,
      tabSist.numeroDigitosCampoId,
      COALESCE (b.idTarefaOrcamento, 0) idTarefaOrcamento,
      COALESCE (b.conteudo, a.conteudoSugestao) conteudo,
      COALESCE (b.observacoes, ' ') observacoes
    FROM PACHECKLISTXTAREFAS a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    LEFT JOIN MOORCAMENTOXTAREFAS b
    ON b.idCheckListXTarefas = a.idCheckListXTarefas
    AND b.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    WHERE a.checkList = p_checkList
    AND (a.ativo = 1
      OR b.idTarefaOrcamento IS NOT NULL)
    ORDER BY
      a.sequencia,
      COALESCE (b.idTarefaOrcamento, 0))
  LOOP
    v_contador                 := v_contador + 1;
    v_conteudoComboItemList    := NULL;
    v_conteudoComboDisplayList := NULL;
    IF a.tabelaSistema = ' '
      AND a.tipoCampo = 'A'
      AND a.exibirCampo = 'P'
    THEN
      SELECT
        TO_CLOB (LISTAGG (opcoes.conteudo, ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',',''))),
        TO_CLOB (LISTAGG (REPLACE(opcoes.descricao,',',''), ',') WITHIN GROUP (ORDER BY opcoes.ordenacao, opcoes.conteudo, REPLACE(opcoes.descricao,',','')))
      INTO
        v_conteudoComboItemList,
        v_conteudoComboDisplayList
      FROM PACHECKLISTXTAREFAXOPCOES opcoes
      WHERE opcoes.idCheckListXTarefas = a.idCheckListXTarefas
      AND opcoes.ativo = 1;
    END IF;
    INSERT INTO TEMPQUESTIONARIO (
      sessaoClient,
      contadorSessao,
      contador,
      excluido,
      ordenacao,
      subOrdenacao,
      idSalvar,
      idQuestionario,
      nomeCampo,
      tipoCampo,
      mascara,
      exibirCampo,
      obrigatorio,
      tabelaSistema,
      conteudoId,
      conteudoCodigo,
      conteudoCodigoDescricao,
      conteudoCombo,
      conteudoComboItemList,
      conteudoComboDisplayList,
      conteudoData,
      conteudoHora,
      conteudoLogico,
      conteudoNumerico,
      conteudoEdit,
      observacoes)
    VALUES (
      p_sessaoClient,
      p_contadorSessao,
      v_contador,
      0, -- excluido
      a.sequencia, -- ordenacao
      a.idTarefaOrcamento, -- subOrdenacao
      a.idTarefaOrcamento, -- idSalvar
      a.idCheckListXTarefas, -- idQuestionario
      a.descricao, -- nomeCampo,
      a.tipoCampo,
      a.mascara,
      a.exibirCampo,
      a.obrigatorio,
      a.tabelaSistema,
      CASE
        WHEN a.tabelaSistema <> ' '
        AND (a.nomeCampoIdSeDiferenteCodigo <> ' '
          OR a.tipoCampoCodigo = 'N')
        AND a.conteudo <> ' '
        THEN TO_NUMBER (a.conteudo)
        ELSE 0
      END, -- conteudoId
      CASE
        WHEN a.tabelaSistema <> ' '
        AND a.nomeCampoIdSeDiferenteCodigo = ' '
        AND a.tipoCampoCodigo <> 'N'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoCodigo,
      CASE
        WHEN a.tabelaSistema <> ' '
        AND a.conteudo <> ' '
        THEN BUSCA_CODIGO_DESCRICAO_CAMPO (
          a.tabelaSistema,
          a.conteudo,
          a.nomeCampoCodigo,
          a.tipoCampoCodigo,
          a.numeroDigitosCodigo,
          a.nomeCampoDescricao,
          a.adicionarCodigoNaDescricao,
          a.nomeCampoIdSeDiferenteCodigo,
          a.numeroDigitosCampoId)
        ELSE ' '
      END, -- conteudoCodigoDescricao,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo = 'P'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoCombo,
      v_conteudoComboItemList,
      v_conteudoComboDisplayList,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'D'
        AND a.conteudo <> ' '
        AND a.conteudo <> '00/00/0000'
        THEN TO_DATE (a.conteudo, 'DD/MM/YYYY')
        ELSE NULL
      END, -- conteudoData,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'H'
        AND a.conteudo <> ' '
        AND a.conteudo <> '00:00:00'
        THEN REPLACE (a.conteudo, ':', '')
        ELSE '000000'
      END, -- conteudoHora,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'L'
        AND a.conteudo = 'S'
        THEN 1
        ELSE 0
      END, -- conteudoLogico,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'N'
        AND a.conteudo <> ' '
        AND a.conteudo <> '0'
        THEN TO_NUMBER (a.conteudo)
        ELSE 0
      END, -- conteudoNumerico,
      CASE
        WHEN a.tabelaSistema = ' '
        AND a.tipoCampo = 'A'
        AND a.exibirCampo <> 'P'
        AND a.conteudo <> ' '
        THEN a.conteudo
        ELSE ' '
      END, -- conteudoEdit,
      a.observacoes);
  END LOOP;
END ADD_TEMPQUESTIONARIO_GERA_TAR;

/

create or replace FUNCTION FUNC_ADD_TEMPQUESTION_VALIDA (
  p_sessaoClient   IN VARCHAR,
  p_contadorSessao IN NUMERIC)
  RETURN CLOB
IS
  v_mensagemErro           CLOB;
  v_mensagemMultiplosErros CLOB;
  v_contador               NUMBER;
BEGIN
  v_mensagemErro := '';
  v_mensagemMultiplosErros := 'Os seguintes campos devem ser informados:';
  v_contador := 0;
  FOR a IN (
    SELECT a.nomeCampo
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    AND a.obrigatorio = 1
    AND (a.tabelaSistema <> ' '
      AND ((tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
          OR tabSist.tipoCampoCodigo = 'N')
        AND a.conteudoId = 0
        OR  tabSist.nomeCampoIdSeDiferenteCodigo = ' '
        AND tabSist.tipoCampoCodigo = 'N'
        AND a.conteudoCodigo = ' ')
      OR a.tabelaSistema = ' '
      AND (a.tipoCampo = 'D'
        AND (a.conteudoData IS NULL
          OR TO_CHAR (a.conteudoData, 'DD/MM/YYYY') = '00/00/0000')
        OR a.tipoCampo = 'H'
        AND (a.conteudoHora IS NULL
          OR a.conteudoHora = '000000')
        OR a.tipoCampo = 'N'
        AND a.conteudoNumerico = 0
        OR a.tipoCampo = 'A'
        AND (a.exibirCampo = 'P'
          AND a.conteudoCombo = ' '
          OR a.exibirCampo <> 'P'
          AND a.conteudoEdit = ' ')))
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_mensagemErro := 'O campo "' || TRIM(a.nomeCampo) || '" deve ser informado.';
    v_mensagemMultiplosErros := v_mensagemMultiplosErros || '
' || TRIM(a.nomeCampo);
    v_contador := v_contador + 1;
  END LOOP;
  RETURN CASE WHEN v_contador > 2 THEN v_mensagemMultiplosErros ELSE v_mensagemErro END;
END;

/

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;

/

CREATE TABLE PALISTASCRM_2501 AS SELECT * FROM PALISTASCRM;

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

DROP TABLE PALISTASCRM;

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

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

COMMIT;

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

UPDATE SICFOPS SET cfopDevolucaoRetorno = 5902 WHERE cfop = 1201;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 5902 WHERE cfop = 1202;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 6902 WHERE cfop = 2201;
UPDATE SICFOPS SET cfopDevolucaoRetorno = 6902 WHERE cfop = 2202;

COMMIT;

UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'COALESCE ((SELECT MAX (munEndPess.uf) FROM CAENDERECOSPESSOA endPess JOIN SIMUNICIPIOS munEndPess ON munEndPess.municipio = endPess.municipio WHERE endPess.pessoa = pessoa.pessoa AND endPess.ativo = 1 AND endPess.principal = 1),''  '')' WHERE campoComposicaoCredito = 204;

COMMIT;


INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2025001003, '2025.1.3', TO_DATE ('28/05/2025', 'DD/MM/YYYY'), 1, 1, sysdate, 'BETA 1');

COMMIT;

-- FIM BETA 1 - 28/05/2025

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_ORCAMENTO_ITEM_EXCLUI (
  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_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_cancelando_Excluindo_Outros  IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := ' ';
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      a.orcamento,
      a.gradeProduto,
      a.cancelado,
      a.usarPrecoAVista,
      a.geraFinanceiro,
      a.controleQuantidade,
      a.loteMultiplo,
      a.quantidade,
      a.quantidadeConvertida,
      a.controleEntrega,
      a.pesoLiquido,
      a.pesoBruto,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorLiquidoItem,
      prod.tipoProduto,
      contrEntr.habilitaFrete,
      modDoc.somaFreteSeguroPrUnit
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = a.controleEntrega
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idItemOrcamento = p_item_idItemOrcamento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.pessoa,
      cab.enderecoEntregaPessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.transportadora,
      cab.enderecoTransportadora,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem
    INTO
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_pessoa,
      v_cab_enderecoEntregaPessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_transportadora,
      v_cab_enderecoTransportadora,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem
    FROM MOORCAMENTOS cab
    WHERE cab.orcamento = a.orcamento;
    v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
    v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOORCAMENTOXPROMOCOES
      WHERE orcamento = a.orcamento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      IF a.controleEntrega <> 0
        AND a.habilitaFrete <> 0
        AND a.cancelado = 0
        AND a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem <> 0
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0,
          r_calcularImpostos,
          a.orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit,
          p_item_idItemOrcamento,
          0, -- p_item_pesoLiquido,
          0, -- p_item_pesoBruto,
          0, -- p_item_valorProdutoServicoBrut,
          0, -- p_item_valorDescontoItem,
          0, -- p_item_valorAcrescimoItem,
          0, -- p_item_controleEntrega,
          0, -- p_item_valorFreteGeral,
          0, -- p_contrEntr_habilitaFrete,
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_cab_valorFreteGeral,
          v_auxNumber);
      ELSE
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit);
      END IF;
      UPDATE MOORCAMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        transportadora                = v_cab_transportadora,
        enderecoTransportadora        = v_cab_enderecoTransportadora,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem
      WHERE orcamento = a.orcamento;
    END IF;
    FOR b IN (
      SELECT
        id,
        idItemOrcamentoReferenc,
        quantidade
      FROM MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      IF v_cab_tipoDocumento = 103 THEN
        UPDATE MOORCAMENTOXITENS c
        SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
        WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc;
      ELSIF v_cab_tipoDocumento = 201
        AND p_person_138_etapOrcEmProcesso <> 0
        AND p_person_139_etapOrcLiberado <> 0
        AND p_person_138_etapOrcEmProcesso <> p_person_139_etapOrcLiberado
      THEN
        FOR c IN (
          SELECT c.orcamento
          FROM MOORCAMENTOXITENS c
          JOIN MOORCAMENTOS d
          ON d.orcamento = c.orcamento
          WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc
          AND c.cancelado = 0
          AND d.tipoDocumento = 101
          AND d.etapaOrcamento = p_person_138_etapOrcEmProcesso
          GROUP BY c.orcamento)
        LOOP
          UPDATE MOORCAMENTOS d
          SET d.etapaOrcamento = p_person_139_etapOrcLiberado
          WHERE d.orcamento = c.orcamento;
          ADD_ORCAMENTO_CAB_ETAPA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.orcamento,
            p_sys_usuarioLogado,
            p_person_139_etapOrcLiberado,
            ' ');
          ADD_RESERVA_ESTOQUE_ORC_CAB (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.orcamento);
        END LOOP;
      END IF;
      DELETE MOORCAMENTOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- Cancela / Exclui Transferências vinculadas.
    IF p_cancelando_Excluindo_Outros <> 'O' THEN
      FOR b IN (
        SELECT
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND (docXTransf2.entradaSaidaOriginal <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXPREDOCUM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXDOCFISCAL docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        GROUP BY
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal)
      LOOP
        IF b.entradaSaidaOriginal = 'O' THEN
          ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
        ELSIF p_cancelando_Excluindo_Outros = 'C' THEN
          ADD_DOCTRANSF_CAB_SIT_GRAVA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            b.documentoTransferencia,
            'C',
            0,
            'Cancelamento Automático',
            'ADD_ORCAMENTO_ITEM_EXCLUI');
        END IF;
      END LOOP;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      END LOOP;
    END IF;
    -- Desvincula Painel de Compras
    FOR b IN (
      SELECT
        b.idGradePainelCompra,
        b.idItemPainelCompra,
        c.painelCompra
      FROM MOPAINELCOMPRAXGRADE b
      JOIN MOPAINELCOMPRAXITENS c
      ON c.idItemPainelCompra = b.idItemPainelCompra
      WHERE b.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOPAINELCOMPRAXGRADE c
      SET c.idItemOrcamento = 0
      WHERE c.idGradePainelCompra = b.idGradePainelCompra;
      UPDATE MOPAINELCOMPRAXITENS c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.idItemPainelCompra = b.idItemPainelCompra
      AND c.situacaoPainelCompras <> 'E';
      UPDATE MOPAINEISCOMPRA c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.painelCompra = b.painelCompra
      AND c.situacaoPainelCompras <> 'E';
    END LOOP;
    ADD_MOTIVO_ORCAMENTO_ITE_EXCL (
      p_item_idItemOrcamento,
      0,
      v_auxNumber);
    ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
      p_item_idItemOrcamento,
      '',
      v_auxVarchar);
    ADD_ORCAMENTO_ITEM_LISTA_EXCL (p_item_idItemOrcamento);
    DELETE MOORCAMENTOXPROMOCOES
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    DELETE MOINGRESSOS
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    IF p_cancelando_Excluindo_Outros = 'C' THEN
      ADD_ORCAMENTO_ITEM_PREV_CANC (p_item_idItemOrcamento);
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_item_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_EXCLUI - CANCELA');
      END LOOP;
      UPDATE MOORCAMENTOXITENS
      SET cancelado = 1
      WHERE idItemOrcamento = p_item_idItemOrcamento;
    ELSE
      DELETE MOAVALIAMARGEMPRODXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCOMPOSICOESPR
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXNUMEROSSERIE
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXEMBALAGENSTIN
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCENTROSCUSTOS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXATIVIDADEPROJ
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamentoReferenc = p_item_idItemOrcamento;     
      DELETE MOPREDOCUMXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCFISCALXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT idAtividadePrevOrcamento
        FROM MOORCAMENTOXATIVIDADEPREV
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
          b.idAtividadePrevOrcamento,
          '',
          '',
          v_auxVarchar,
          v_auxVarchar);
      END LOOP;
      DELETE MODISTRIBUICAODFEXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCTRANSFXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOENTREGAXSITUACOES
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          b.entrega,
          CASE WHEN p_cancelando_Excluindo_Outros = 'C' THEN 0 ELSE 1 END,
          'ADD_ORCAMENTO_ITEM_EXCLUI');
      END LOOP;
      DELETE MOORCAMENTOXITENS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemOrcamento
          FROM MOORCAMENTOXITENS b
          WHERE b.orcamento = a.orcamento
          AND b.idItemOrcamento <> p_item_idItemOrcamento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOORCAMENTOXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemOrcamento = b.idItemOrcamento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento))
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_PRE_DOC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MOPREDOCUMXATENDIMENTO
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MOPREDOCUMXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOAVALIAMARGEMPRODXPREDOC
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal))
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_DOC_FISC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MODOCFISCALXATENDIMENTO
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MODOCFISCALXATENDIMENTO c
      WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MOAVALIAMARGEMPRODXDOCFISC
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalEntrada = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_PAG_EXCLUI_CORR (
  p_idPagamentoOrcamento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_ORCAMENTO_PAG_EXCL (
    p_idPagamentoOrcamento,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idPrevisaoFinanceira
    FROM MOPREVISOESFINANCEIRAS
    WHERE idPagamentoOrcamento = p_idPagamentoOrcamento)
  LOOP
    ADD_PREVFIN_EXCLUI (a.idPrevisaoFinanceira);
  END LOOP;
  DELETE MOORCAMENTOXPROMOCOES
  WHERE idPagamentoOrcamento = p_idPagamentoOrcamento;  
  DELETE MOLINKPAGAMENTOXORCAMENTO
  WHERE idPagamentoOrcamento = p_idPagamentoOrcamento;  
END ADD_ORCAMENTO_PAG_EXCLUI_CORR;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_EXCLUI_CORREL (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_PRE_DOC_PAG_EXCLUI (
    p_idPagamentoPreDocumento,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  DELETE MOLINKPAGAMENTOXPREDOCUM
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoPreDocumento = 0
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
END ADD_PRE_DOC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_EXCLUI_CORREL (
  p_idPagamentoDocFiscal IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_DOC_FISC_PAG_EXCLUI (
    p_idPagamentoDocFiscal,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MODOCFISCALXPROMOCOES
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  DELETE MOLINKPAGAMENTOXDOCFISCAL
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoDocFiscal = 0
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
END ADD_DOC_FISC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_FINANC_EXCLUI_CORREL (
  p_idFinanceiro IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_FINANCEIRO_EXCLUI (
    p_idFinanceiro,
    0,
    v_auxNumber);
  -- Desvincula Financeiro
  UPDATE MOARQUIVOSCONCILIACOES a
  SET a.situacaoConciliacao = 'I'
  WHERE a.situacaoConciliacao = 'F'
  AND EXISTS (
    SELECT 1
    FROM MOCONCILIACOESCARTOES b
    WHERE b.idArquivoConciliacao = a.idArquivoConciliacao
    AND b.idFinanceiro = p_idFinanceiro);
  UPDATE MOARQUIVOCOBRANCAXFINANC SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOCONCILIACOESCARTOES SET
    idFinanceiro = 0,
    idBaixaFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOSPCREGISTROS
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOPREVFINANCXFINANCEIRO
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOTRANSACOESTEF
  SET idFinanceiro = 0
  WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOORCAMENTOXPAGAMENTOS
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MODOCUMENTOSTROCA
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MOLINKSPAGAMENTO
  SET idFinanceiroAdiantamento = 0
  WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  -- Exclui correlatos
  DELETE MOPREDOCUMXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MODOCFISCALXRESGATEPONTOS a
  WHERE EXISTS(
    SELECT 1
    FROM MOPONTUACOES b
    WHERE b.idPontuacao = a.idPontuacao
    AND b.idFinanceiro = p_idFinanceiro);
  DELETE MOPONTUACOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXBOLETO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTAO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTPROPRIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCHEQUE
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXPIX
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXRATEIO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCOMISSOES
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXDOCUMENTOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXARQUIVOS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXATIVIDADEPROJ
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MONEGDIVIDAXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOREPARCXFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOHISTORICOCOBRANCA
  WHERE idFinanceiro = p_idFinanceiro;
  FOR a IN (
    SELECT evento
    FROM MOEVENTOS
    WHERE tabelaSistema = 'MOFINANCEIROS'
    AND id = p_idFinanceiro)
  LOOP
    ADD_EVENTO_EXCLUI (a.evento);
  END LOOP;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída anteriormente
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCORRELATO
  WHERE idFinanceiroCorrelato = p_idFinanceiro;
  DELETE MOFINANCEIROXBAIXAS
  WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO
  WHERE idNovoFinanceiro = p_idFinanceiro;
  -- Exclui financeiro principal
  DELETE MOFINANCEIROS
  WHERE idFinanceiro = p_idFinanceiro;
END ADD_FINANC_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_AVALMARG_ORC (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemOrcamentoDe         IN NUMBER,
  p_idItemDocFiscalPara       IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT idAvaliaMargemProduto
    FROM MOAVALIAMARGEMPRODXORCAM
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_AVALMARG_DOC_FISC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      a.idAvaliaMargemProduto,
      p_idItemDocFiscalPara,
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_AVALMARG_ORC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_AVALMARG_ORC (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_AVALMARG_ORC (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemOrcamentoDe         IN NUMBER,
  p_idItemPreDocumentoPara    IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT idAvaliaMargemProduto
    FROM MOAVALIAMARGEMPRODXORCAM
    WHERE idItemOrcamento = p_idItemOrcamentoDe)
  LOOP
    ADD_AVALMARG_PRE_DOC_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      a.idAvaliaMargemProduto,
      p_idItemPreDocumentoPara,
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_AVALMARG_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_AVALMARG_ORC (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ROT_EFET_ORCAMENTO (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subSerieFiscal               IN NUMBER,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezone                     IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_comissionadoB                IN NUMBER,
  p_comissionadoC                IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_versaoAplicativo             IN VARCHAR2,
  r_preDocumento                 OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_preDocumento           NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  CURSOR c_itens
  IS SELECT idItemOrcamento, CASE WHEN cancelado = 0 THEN FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXITENS', 'idItemPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL) ELSE 0 END idItemPreDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem
     FROM MOORCAMENTOXITENS
     WHERE orcamento = p_orcamento
     ORDER BY sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOS
    WHERE orcamento = p_orcamento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOORCAMENTOXITENS b ON b.idItemOrcamento = a.idItemOrcamento
    WHERE b.orcamento = p_orcamento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'O'
      AND a.idCabecalho = p_orcamento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXORCAMENTOPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  SELECT
    CASE
      WHEN orc.entradaSaida='E'
      THEN 401
      ELSE 301
    END,
    orc.estabelecimento,
    orc.pessoa,
    CASE
      WHEN orc.tipoDocumento = 102
        AND orc.colaboradorResponsavel <> 0
        AND EXISTS (
          SELECT 1
          FROM CAVENDEDORES vend
          WHERE vend.vendedor = orc.colaboradorResponsavel
          AND vend.ativo = 1)
      THEN orc.colaboradorResponsavel
      ELSE 0
    END
  INTO
    v_tipoDocumento,
    v_estabelecimento,
    v_pessoa,
    v_colaboradorResponsavel
  FROM MOORCAMENTOS orc
  WHERE orcamento = p_orcamento;
  v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOFATOSCONTABEIS (fatoContabil, estabelecimento, data, ordenacao, situacaoTransacao, situacaoContabilizacao, sessao, observacoes) VALUES (v_fatoContabil, v_estabelecimento, p_dataEmissao, 0, 'A', 'N', p_sessao, ' ');
  v_preDocumento := FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMENTOS', 'preDocumento', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOPREDOCUMENTOS (preDocumento, origemDocumento, tipoDocumento, tipoVenda, modeloDocumento, entradaSaida, devolucaoAnulacaoRetorno, finalidadeNota, atualizaCustoMedio, atualizaUltimaCompra, validoFaturamento, usarPrecoAVista, sessao, sessaoCaixa, fatoContabil, idTerminalSiTef, estabelecimentoOriginal, estabelecimento, enderecoRetiradaEstabeleciment, indicadorPresencaComprador, controlaSeparacaoConferencia, serieFiscal, subserieFiscal, documentoFiscal, dataEmissao, timezoneEmissao, dataEntradaSaida, pessoa, indicadorPessoa, indicadorDocumentoPessoa, cnpjCpfIdEstrangeiro, nomeRazaoSocial, fone, indicadorFone, operadoraTelefonia, autorizadoPessoa, enderecoEntregaPessoa, municipioFatoGerador, localDestinoOperacao, indicadorConsumidorFinal, projeto, contratoCompra, comissionadoB, comissionadoC, modalidadeFrete, tipoPagamentoFrete, transportadora, enderecoTransportadora, motorista, placa, vagao, balsa, quantidadeVolume, especieVolume, descricaoMarca, numeracaoVolume, codigoIntegracao, atendimento, statusPreDocumento, ultimoVendedorItem, quantidade, pesoLiquido, pesoBruto, valorProdutosBruto, valorProdutos, valorDescontoProdutos, valorAcrescimoProdutos, valorServicosBruto, valorServicos, valorDescontoServicos, valorAcrescimoServicos, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, condicaoPagamento, contaFinanceira, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorBasePagamento, valorAVistaMinimo, valorEntradaMinima, valorAVistaEntrada, valorPagamentoBruto, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorPagamentoLiquido, valorTroco, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, impostosEditados, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, valorCustoOperacao, valorCMV, versaoAplicativo)
  SELECT v_preDocumento,
    2,
    v_tipoDocumento,
    orc.tipoVenda,
    orc.modeloDocumento,
    orc.entradaSaida,
    0 devolucaoAnulacaoRetorno,
    orc.finalidadeNota,
    orc.atualizaCustoMedio,
    orc.atualizaUltimaCompra,
    orc.validoFaturamento,
    orc.usarPrecoAVista,
    p_sessao,
    p_sessaoCaixa,
    v_fatoContabil,
    p_idTerminalSiTef,
    orc.estabelecimento,
    orc.estabelecimento,
    orc.enderecoRetiradaEstabeleciment,
    orc.indicadorPresencaComprador,
    orc.controlaSeparacaoConferencia,
    p_serieFiscal,
    p_subserieFiscal,
    p_documentoFiscal,
    p_dataEmissao dataEmissao,
    p_timezone timezoneEmissao,
    p_dataEntradaSaida dataEntradaSaida,
    orc.pessoa,
    'F' indicadorPessoa,
    'C' indicadorDocumentoPessoa,
    ' ' cnpjCpfIdEstrangeiro,
    ' ' nomeRazaoSocial,
    ' ' fone,
    0 indicadorFone,
    0 operadoraTelefonia,
    orc.autorizadoPessoa,
    orc.enderecoEntregaPessoa,
    orc.municipioFatoGerador,
    orc.localDestinoOperacao,
    orc.indicadorConsumidorFinal,
    orc.projeto,
    orc.contratoCompra,
    p_comissionadoB comissionadoB,
    p_comissionadoC comissionadoC,
    CASE WHEN orc.modalidadeFrete = ' ' THEN '9' ELSE orc.modalidadeFrete END,
    CASE WHEN orc.tipoPagamentoFrete = ' ' THEN 'N' ELSE orc.tipoPagamentoFrete END,
    orc.transportadora,
    orc.enderecoTransportadora,
    orc.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    'E' statusPreDocumento,
    CASE WHEN orc.ultimoVendedorItem = 0 THEN v_colaboradorResponsavel ELSE orc.ultimoVendedorItem END,
    orc.quantidade,
    orc.pesoLiquido,
    orc.pesoBruto,
    orc.valorProdutosBruto,
    orc.valorProdutos,
    orc.valorDescontoProdutos,
    orc.valorAcrescimoProdutos,
    orc.valorServicosBruto,
    orc.valorServicos,
    orc.valorDescontoServicos,
    orc.valorAcrescimoServicos,
    orc.valorFreteItem,
    orc.valorSeguroItem,
    orc.valorAdicFreteMarinhaMerItem,
    orc.valorDespesasAduaneirasItem,
    orc.valorFreteGeral,
    orc.valorSeguroGeral,
    orc.valorDescontoGeral,
    orc.valorOutrasDespesasGeral,
    orc.valorAdicFreteMarinhaMerGeral,
    orc.valorDespesasAduaneirasGeral,
    orc.condicaoPagamento,
    orc.contaFinanceira,
    0 numeroParcelas,
    0 somaPrazoParcelas,
    0 valorXPrazoParcelas,
    0 prazoMedio,
    0 prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    0 valorEntradaMinima,
    0 valorAVistaEntrada,
    0 valorPagamentoBruto,
    0 valorDescontoPagamento,
    0 valorOutrasDespesasPagamento,
    0 valorJurosPagamento,
    0 valorPagamentoLiquido,
    0 valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal - CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END,
    orc.valorOutrasDespesasTotal - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem + CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    p_versaoAplicativo
  FROM MOORCAMENTOS orc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = orc.estabelecimento
  WHERE orcamento = p_orcamento;
  UPDATE MOORCAMENTOS SET etapaOrcamento = p_novaEtapaOrcamento WHERE orcamento = p_orcamento;
  INSERT INTO MOORCAMENTOXETAPAS (id, orcamento, data, usuario, etapaOrcamento, observacoes) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), p_orcamento, sysdate, p_sys_usuarioLogado, p_novaEtapaOrcamento, ' ');
  INSERT INTO MOPREDOCUMXPERSPROJETO (idPersonProjetoPreDocumento, preDocumento, personalizacaoProjeto, conteudo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPERSPROJETO', 'idPersonProjetoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.personalizacaoProjeto, x.conteudo FROM MOORCAMENTOXPERSPROJETO x WHERE x.orcamento = p_orcamento;
  INSERT INTO MOPREDOCUMXINFOCOMPLENT (id, preDocumento, sequencia, geradoPeloSistema, imprimir, destaque, informacaoComplementar, descInformacaoComplementar) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXINFOCOMPLENT', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOORCAMENTOXINFOCOMPLENT x WHERE x.orcamento = p_orcamento;
